⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 our_draw16.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 5 页
字号:
                y1=(xe>>(DRAW_P_SHFT_X));
                //dest[xinc++] =((k_r_inc>>(SHIFR_L-16))&OUR_RGB_MASK0800)+\
                //	((k_g_inc>>(SHIFR_L-8))&OUR_RGB_MASK0080)+((k_b_inc>>SHIFR_L)&OUR_RGB_MASK0008);
                dest[xinc++] =((k_r_inc>>(SHIFR_L-8))&OUR_RGB_MASK500)+\
                    ((k_g_inc>>(SHIFR_L-3))&OUR_RGB_MASK060)+((k_b_inc>>(SHIFR_L+3))&OUR_RGB_MASK005);
#if OUR_FAST_2D
                for(;xinc<=y1-8;)	
                {
                    FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
                    FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
                }	
                
                if(xinc<=y1-4)	
                {
                    FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
                }	
                for(;xinc<=y1;)	
                {
                    FILE_GOURAUD;
                }	
#else
                for(;xinc<=y1;)	
                {
                    FILE_GOURAUD;
                }	
#endif
                rs+=krs;			
                gs+=kgs;			
                bs+=kbs;
                
                dest+=mempitch;			//point to next line
                xs+=ks;					//next line xs
                xe+=ke;					//next line xe
            }		
            
        }
        return;
}
#else

#endif
//---------------------------------------------------------------------
else if(y2<y3)//the butt part
{		
    
    xs=((1<<SHIFR_L))/(y1-y3);	//y1=y2
    ks=((x1-x3))*xs;				//slope 1 --> 2
    ke=((x2-x3))*xs;				//slope 1 --> 3
    if(ks>ke)						//start slope must be smaller than the end one
    {
        xe=((1<<SHIFR_L))/(x2-x1);	
        krs=(((color1&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*xs;
        kre=(((color2&OUR_RGB_MASK0500)-(color1&OUR_RGB_MASK0500))>>16)*xe;
        
        kgs=(((color1&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*xs;
        kge=(((color2&OUR_RGB_MASK0060)-(color1&OUR_RGB_MASK0060))>>8)*xe;
        
        kbs=(((color1&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*xs;
        kbe=(((color2&OUR_RGB_MASK0005)-(color1&OUR_RGB_MASK0005)))*xe;
        
        rs=(color1&OUR_RGB_MASK0500)<<(SHIFR_L-16);			
        gs=(color1&OUR_RGB_MASK0060)<<(SHIFR_L-8);			
        bs=(color1&OUR_RGB_MASK0005)<<SHIFR_L;
        
        xs=x1<<SHIFR_L;
        xe=x2<<SHIFR_L;
    }	
    else if(ks<ke)	
    {
        xe=((1<<SHIFR_L))/(x1-x2);	
        krs=(((color2&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*xs;
        kre=(((color1&OUR_RGB_MASK0500)-(color2&OUR_RGB_MASK0500))>>16)*xe;
        
        kgs=(((color2&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*xs;
        kge=(((color1&OUR_RGB_MASK0060)-(color2&OUR_RGB_MASK0060))>>8)*xe;
        
        kbs=(((color2&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*xs;
        kbe=(((color1&OUR_RGB_MASK0005)-(color2&OUR_RGB_MASK0005)))*xe;
        
        OUR_SWAP(ks,ke,xs);			
        
        rs=(color2&OUR_RGB_MASK0500)<<(SHIFR_L-16);			
        gs=(color2&OUR_RGB_MASK0060)<<(SHIFR_L-8);			
        bs=(color2&OUR_RGB_MASK0005)<<SHIFR_L;
        
        xe=x1<<SHIFR_L;
        xs=x2<<SHIFR_L;
    }
    else
    {
        return;
    }								
    for(yinc=y1;yinc<y3;yinc++)		//scan lines
    {	
        
        k_r_inc=rs;
        k_g_inc=gs;
        k_b_inc=bs;
        //------------------------------------------------------
        
        xinc=xs>>SHIFR_L;
        y1=(xe>>SHIFR_L);
        //dest[xinc++] =((k_r_inc>>(SHIFR_L-16))&OUR_RGB_MASK0800)+\
        //	((k_g_inc>>(SHIFR_L-8))&OUR_RGB_MASK0080)+((k_b_inc>>SHIFR_L)&OUR_RGB_MASK0008);
        dest[xinc++] =((k_r_inc>>(SHIFR_L-8))&OUR_RGB_MASK500)+\
            ((k_g_inc>>(SHIFR_L-3))&OUR_RGB_MASK060)+((k_b_inc>>(SHIFR_L+3))&OUR_RGB_MASK005);
#if OUR_FAST_2D
        for(;xinc<=y1-8;)	
        {
            FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
            FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
        }	
        
        if(xinc<=y1-4)	
        {
            FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
        }	
        for(;xinc<=y1;)	
        {
            FILE_GOURAUD;
        }	
#else
        for(;xinc<=y1;)	
        {
            FILE_GOURAUD;
        }	
#endif
        rs+=krs;			
        gs+=kgs;			
        bs+=kbs;
        
        dest+=mempitch;			//point to next line
        xs+=ks;					//next line xs
        xe+=ke;	
    }		
    return;
}

}
#endif
//------------------------------------------------------


#define FILE_BMP16_1	{*dest_++ =\
    bmp_pt[((((k_r_inc&0xffc0000)>>(SHIFR_L-bmp->bits)))+(k_b_inc>>SHIFR_L))];\
}

#define FILE_BMP16	{\
    FILE_BMP16_1;\
    k_r_inc+=kre;\
    k_b_inc+=kbe;\
}
//------------------------------------------------------
void OUR_Draw_BMP_CLIP_PRE_2D16_Q(	int x1,int y1,int z1,
				                        int x2,int y2,int z2,
				                        int x3,int y3,int z3,
				                        CLR color1,
				                        CLR color2,
				                        CLR color3,
						    	UCHAR *dest_buffer, int mempitch,
						    	OUR_BMP_INFO* bmp
						    	)
{
	int xs,xe,ks,ke,xinc;
	int yinc;
	CLR rs,re,gs,ge,bs,be;
	int krs,kre,kgs,kge,kbs,kbe;
	int  k_r_inc;
	int  k_g_inc;
	int  k_b_inc;
	CLR16 *dest;
	CLR16 *dest_;
	CLR16 *bmp_pt;
/*
	x1=10<<1;
	y1=10<<1;
	x2=10<<1;
	y2=265<<1;
	x3=265<<1;
	y3=265<<1;



	color3 = 0x000080;
	color1 = 0x008080;
	color2 = 0x000000;
*/
	//make sure y1<y2<y3
	bmp_pt=((CLR16 *)bmp->bmp_data);
	if(y1>y2)
	{
		OUR_SWAP(y1,y2,xs);
		OUR_SWAP(x1,x2,xs);
		OUR_SWAP(z1,z2,xs);
		OUR_SWAP(color1,color2,rs);
	}
	if(y1>y3)
	{
		OUR_SWAP(y1,y3,xs);
		OUR_SWAP(x1,x3,xs);
		OUR_SWAP(z1,z3,xs);
		OUR_SWAP(color1,color3,rs);
	}
	if(y2>y3)
	{
		OUR_SWAP(y2,y3,xs);
		OUR_SWAP(x2,x3,xs);
		OUR_SWAP(z2,z3,xs);
		OUR_SWAP(color2,color3,rs);
	}								//18t

	//mempitch>>=2;					//(sizeof(dest)/2);
	dest = (CLR16*)dest_buffer +y1*mempitch;		//point to the line of y1
#if 1
	if(y1<y2 )						//the top part
	{
		xs=(1<<(DRAW_P_SHFT_X))/(y1-y2);
		xe=(1<<(DRAW_P_SHFT_X))/(y1-y3);	
		//xs=-reciprocal_look[-(y1-y2)];
		//xe=-reciprocal_look[-(y1-y3)];	
		ks=((x1-x2))*xs;				//slope 1 --> 2
		ke=((x1-x3))*xe;				//slope 1 --> 3
		xs>>=(DRAW_P_SHFT_X-SHIFR_L);
		xe>>=(DRAW_P_SHFT_X-SHIFR_L);
		if(ks>ke)						//start slope must be smaller than the end one
		{
			kre=(((color1&OUR_RGB_MASK8800)-(color2&OUR_RGB_MASK8800))>>16)*xs;
			krs=(((color1&OUR_RGB_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*xe;
			
			//kge=(((color1&OUR_RGB_MASK0080)-(color2&OUR_RGB_MASK0080))>>8)*xs;
			//kgs=(((color1&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xe;
			
			kbe=(((color1&OUR_RGB_MASK0088)-(color2&OUR_RGB_MASK0088)))*xs;
			kbs=(((color1&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*xe;
			OUR_SWAP(ks,ke,xs);
		}	
		else if(ks<ke)	
		{
			krs=(((color1&OUR_RGB_MASK8800)-(color2&OUR_RGB_MASK8800))>>16)*xs;
			kre=(((color1&OUR_RGB_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*xe;
			
			//kgs=(((color1&OUR_RGB_MASK0080)-(color2&OUR_RGB_MASK0080))>>8)*xs;
			//kge=(((color1&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xe;
			
			kbs=(((color1&OUR_RGB_MASK0088)-(color2&OUR_RGB_MASK0088)))*xs;
			kbe=(((color1&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*xe;
		}
		else
		{
			return;
		}
#define BMP_KKKK 5
//this place must be carefull
		if((ke-ks)<(1<<DRAW_P_SHFT_X))
		{
			xs=((1<<(SHIFT+DRAW_P_SHFT_X-SHIFR_L-2)))/((ke-ks));// 28  -- 10 -20 =18 -10
			//xs=reciprocal_look[((ke-ks)>>8)]<<2;// 28  -- 10 -20 =18 -10
			//---------------------------------------------
			kre= (kre-krs);
			if(kre>(-(1<<DRAW_P_SHFT_X)) && kre<(1<<DRAW_P_SHFT_X) )
				kre=(((kre)>>5)*xs)>>(SHIFT-SHIFR_L-5-2);
			else
				kre=(((kre)>>10)*xs)>>(SHIFT-SHIFR_L-10-2);
			//----------------------------------------------
			//kge= (kge-kgs);
			//if(kge>(-(1<<DRAW_P_SHFT_X)) && kge<(1<<DRAW_P_SHFT_X))
			//	kge=(((kge)>>5)*xs)>>(SHIFT-SHIFR_L-5-2);	
			//else
			//	kge=(((kge)>>10)*xs)>>(SHIFT-SHIFR_L-10-2);
			//----------------------------------------------
			kbe= (kbe-kbs);
			if(kbe>(-(1<<DRAW_P_SHFT_X)) && kbe<(1<<DRAW_P_SHFT_X))
				kbe=(((kbe)>>5)*xs)>>(SHIFT-SHIFR_L-5-2);
			else
				kbe=(((kbe)>>10)*xs)>>(SHIFT-SHIFR_L-10-2);	
			
		}
		else
		{
			xs=((1<<(SHIFT+DRAW_P_SHFT_X-SHIFR_L)))/((ke-ks)>>3);
			//xs=reciprocal_look[((ke-ks)>>18)]>>6;
			//---------------------------------------------
			kre= (kre-krs);
			if(kre>(-(1<<DRAW_P_SHFT_X)) && kre<(1<<DRAW_P_SHFT_X))
				kre=(((kre)>>5)*xs)>>(SHIFT-SHIFR_L-5+3);
			else
				kre=(((kre)>>10)*xs)>>(SHIFT-SHIFR_L-10+3);
			//----------------------------------------------
			//kge= (kge-kgs);
			//if(kge>(-(1<<DRAW_P_SHFT_X)) && kge<(1<<DRAW_P_SHFT_X))
			//	kge=(((kge)>>5)*xs)>>(SHIFT-SHIFR_L-5+3);	
			//else
			//	kge=(((kge)>>10)*xs)>>(SHIFT-SHIFR_L-10+3);
			//----------------------------------------------
			kbe= (kbe-kbs);
			if(kbe>(-(1<<DRAW_P_SHFT_X)) && kbe<(1<<DRAW_P_SHFT_X))
				kbe=(((kbe)>>5)*xs)>>(SHIFT-SHIFR_L-5+3);
			else
				kbe=(((kbe)>>10)*xs)>>(SHIFT-SHIFR_L-10+3);	
		}
		xs=(x1<<(DRAW_P_SHFT_X));
		xe=(x1<<(DRAW_P_SHFT_X));

		rs=(color1&OUR_RGB_MASK8800)<<(SHIFR_L-16);		
		//gs=(color1&OUR_RGB_MASK0080)<<(SHIFR_L-8);		
		bs=(color1&OUR_RGB_MASK0088)<<SHIFR_L;
		//clip ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
		yinc=y1;
		if(y1<0)
		{
			if(y2>0)
			{
				rs-=y1*krs;			
				//gs-=y1*kgs;			
				bs-=y1*kbs;
				
				dest-=y1*mempitch;			//point to next line
				xs-=y1*ks;					//next line xs
				xe-=y1*ke;					//next line xe
				yinc=0;
			}
			else
			{
				y1=y1-y2;
				rs-=y1*krs;			
				//gs-=y1*kgs;			
				bs-=y1*kbs;
				
				dest-=y1*mempitch;			//point to next line
				xs-=y1*ks;					//next line xs
				xe-=y1*ke;					//next line xe
				yinc=0;
				goto P3;
			}/**/
		}
		if(y2>=OUR_D_screem_h)
		{
			for(;yinc<OUR_D_screem_h;yinc++)		//scan lines
			{	
				//k_r_inc=rs;
				//k_g_inc=gs;
				//k_b_inc=bs;
                 k_r_inc=rs+(((kre*(xs<<12))>>20)>>8);
                //k_g_inc=gs;
                 k_b_inc=bs+(((kbe*(xs<<12))>>20)>>8);
				//------------------------------------------------------	
				xinc=xs>>(DRAW_P_SHFT_X);
				if(xinc<0)
				{
					k_r_inc-=xinc*kre;
					//k_g_inc-=xinc*kge;
					k_b_inc-=xinc*kbe;
					xinc=0;
				}
				y1=(xe>>(DRAW_P_SHFT_X));
				dest_=dest+xinc;
				if(y1>=OUR_D_screem_w)
				{
					y1=OUR_D_screem_w-1;
				}
				else if(y1>0)
				{
					//dest[xinc++] =((CLR16 *)bmp->bmp_data)[((((k_r_inc>>(SHIFR_L))&OUR_RGB_MASK0008)<<bmp->width)+(k_b_inc>>SHIFR_L))];
                                //FILE_BMP16_1;
				}
				(CLR16*)y1=dest+y1;
				for(;dest_<=(CLR16*)y1;)	
				{
					FILE_BMP16;
				}		
				rs+=krs;			
				//gs+=kgs;			
				bs+=kbs;
				
				dest+=mempitch;			//point to next line
				xs+=ks;					//next line xs
				xe+=ke;					//next line xe
			}
			return;
		}
		//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
		//else if(y2>0)			
		{
			for(;yinc<y2;yinc++)		//scan lines
			{	
					//k_r_inc=rs;
				//k_g_inc=gs;
				//k_b_inc=bs;
                 k_r_inc=rs+(((kre*(xs<<12))>>20)>>8);
                //k_g_inc=gs;
                 k_b_inc=bs+(((kbe*(xs<<12))>>20)>>8);
				//------------------------------------------------------	
				xinc=xs>>(DRAW_P_SHFT_X);
				if(xinc<0)
				{
					k_r_inc-=xinc*kre;
					//k_g_inc-=xinc*kge;
					k_b_inc-=xinc*kbe;
					xinc=0;
				}
				y1=(xe>>(DRAW_P_SHFT_X));
				dest_=dest+xinc;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -