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

📄 our_draw16.c

📁 MTK上3D特效的一些开源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				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);
				for(;xinc<=y1;)	
				{
					FILE_GOURAUD;
				}
				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_MASK0800)-(color3&OUR_RGB_MASK0800))>>16)*xs;
			kre=(((color2&OUR_RGB_MASK0800)-(color1&OUR_RGB_MASK0800))>>16)*xe;
			
			kgs=(((color1&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xs;
			kge=(((color2&OUR_RGB_MASK0080)-(color1&OUR_RGB_MASK0080))>>8)*xe;
			
			kbs=(((color1&OUR_RGB_MASK0008)-(color3&OUR_RGB_MASK0008)))*xs;
			kbe=(((color2&OUR_RGB_MASK0008)-(color1&OUR_RGB_MASK0008)))*xe;
			
			rs=(color1&OUR_RGB_MASK0800)<<(SHIFR_L-16);			
			gs=(color1&OUR_RGB_MASK0080)<<(SHIFR_L-8);			
			bs=(color1&OUR_RGB_MASK0008)<<SHIFR_L;

			xs=x1<<SHIFR_L;
			xe=x2<<SHIFR_L;
		}	
		else if(ks<ke)	
		{
			xe=((1<<SHIFR_L))/(x1-x2);	
			krs=(((color2&OUR_RGB_MASK0800)-(color3&OUR_RGB_MASK0800))>>16)*xs;
			kre=(((color1&OUR_RGB_MASK0800)-(color2&OUR_RGB_MASK0800))>>16)*xe;
			
			kgs=(((color2&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xs;
			kge=(((color1&OUR_RGB_MASK0080)-(color2&OUR_RGB_MASK0080))>>8)*xe;
			
			kbs=(((color2&OUR_RGB_MASK0008)-(color3&OUR_RGB_MASK0008)))*xs;
			kbe=(((color1&OUR_RGB_MASK0008)-(color2&OUR_RGB_MASK0008)))*xe;
			
			OUR_SWAP(ks,ke,xs);			
			
			rs=(color2&OUR_RGB_MASK0800)<<(SHIFR_L-16);			
			gs=(color2&OUR_RGB_MASK0080)<<(SHIFR_L-8);			
			bs=(color2&OUR_RGB_MASK0008)<<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);
			for(;xinc<=y1;)	
			{
				FILE_GOURAUD;
			}
			rs+=krs;			
			gs+=kgs;			
			bs+=kbs;
			
			dest+=mempitch;			//point to next line
			xs+=ks;					//next line xs
			xe+=ke;	
		}		
		return;
	}
		
}
//------------------------------------------------------

//------------------------------------------------------
#define FILE_BMP	{\
				dest[xinc++] =bmp->bmp_data[(((k_r_inc>>(SHIFR_L))&OUR_RGB_MASK0008)*bmp->width+(k_b_inc>>SHIFR_L))];\
				\
				k_r_inc+=kre;\
				k_g_inc+=kge;\
				k_b_inc+=kbe;\
						}
//------------------------------------------------------
void OUR_Draw_BMP_2D16(	int x1,int y1,
				                        int x2,int y2,
				                        int x3,int y3,
				                        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;
	CLR *dest;
/*
	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
	if(y1>y2)
	{
		OUR_SWAP(y1,y2,xs);
		OUR_SWAP(x1,x2,xs);
		OUR_SWAP(color1,color2,rs);
	}
	if(y1>y3)
	{
		OUR_SWAP(y1,y3,xs);
		OUR_SWAP(x1,x3,xs);
		OUR_SWAP(color1,color3,rs);
	}
	if(y2>y3)
	{
		OUR_SWAP(y2,y3,xs);
		OUR_SWAP(x2,x3,xs);
		OUR_SWAP(color2,color3,rs);
	}								//18t

	//mempitch>>=2;					//(sizeof(dest)/2);
	dest = (CLR*)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);	
		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
			//---------------------------------------------
			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);
			//---------------------------------------------
			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;
		for(yinc=y1;yinc<y2;yinc++)		//scan lines
		{	
			k_r_inc=rs;
			k_g_inc=gs;
			k_b_inc=bs;
//------------------------------------------------------	
			xinc=xs>>(DRAW_P_SHFT_X);
			y1=(xe>>(DRAW_P_SHFT_X));
			dest[xinc++] =bmp->bmp_data[(((k_r_inc>>(SHIFR_L))&OUR_RGB_MASK0008)*bmp->width+(k_b_inc>>SHIFR_L))];
			for(;xinc<=y1;)	
			{
				FILE_BMP;
			}		
			rs+=krs;			
			gs+=kgs;			
			bs+=kbs;
			
			dest+=mempitch;			//point to next line
			xs+=ks;					//next line xs
			xe+=ke;					//next line xe
		}
		if(y2<y3)						//the butt part
		{	
			y1=(1<<(DRAW_P_SHFT_X))/(y2-y3);
			x1=((x2-x3))*y1;
			y1>>=(DRAW_P_SHFT_X-SHIFR_L);
			if(x1>ke)
			{
				ks=x1;

				krs=(((color2&OUR_RGB_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*y1;			
				kgs=(((color2&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*y1;				
				kbs=(((color2&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*y1;
			}
			else
			{
				ke=x1;
			}
			for(;yinc<=y3;yinc++)
			{			
				k_r_inc=rs;
				k_g_inc=gs;
				k_b_inc=bs;
	//------------------------------------------------------
				xinc=xs>>(DRAW_P_SHFT_X);
				y1=(xe>>(DRAW_P_SHFT_X));
			
				dest[xinc++] =bmp->bmp_data[(((k_r_inc>>(SHIFR_L))&OUR_RGB_MASK0008)*bmp->width+(k_b_inc>>SHIFR_L))];
				for(;xinc<=y1;)	
				{
					FILE_BMP;
				}	
				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_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*xs;
			kre=(((color2&OUR_RGB_MASK8800)-(color1&OUR_RGB_MASK8800))>>16)*xe;
			
			kgs=(((color1&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xs;
			kge=(((color2&OUR_RGB_MASK0080)-(color1&OUR_RGB_MASK0080))>>8)*xe;
			
			kbs=(((color1&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*xs;
			kbe=(((color2&OUR_RGB_MASK0088)-(color1&OUR_RGB_MASK0088)))*xe;
			
			rs=(color1&OUR_RGB_MASK8800)<<(SHIFR_L-16);			
			gs=(color1&OUR_RGB_MASK0080)<<(SHIFR_L-8);			
			bs=(color1&OUR_RGB_MASK0088)<<SHIFR_L;

			xs=x1<<SHIFR_L;
			xe=x2<<SHIFR_L;
		}	
		else if(ks<ke)	
		{
			xe=((1<<SHIFR_L))/(x1-x2);	
			krs=(((color2&OUR_RGB_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*xs;
			kre=(((color1&OUR_RGB_MASK8800)-(color2&OUR_RGB_MASK8800))>>16)*xe;
			
			kgs=(((color2&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xs;
			kge=(((color1&OUR_RGB_MASK0080)-(color2&OUR_RGB_MASK0080))>>8)*xe;
			
			kbs=(((color2&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*xs;
			kbe=(((color1&OUR_RGB_MASK0088)-(color2&OUR_RGB_MASK0088)))*xe;
			
			OUR_SWAP(ks,ke,xs);			
			
			rs=(color2&OUR_RGB_MASK8800)<<(SHIFR_L-16);			
			gs=(color2&OUR_RGB_MASK0080)<<(SHIFR_L-8);			
			bs=(color2&OUR_RGB_MASK0088)<<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++] =bmp->bmp_data[(((k_r_inc>>(SHIFR_L))&OUR_RGB_MASK0008)*bmp->width+(k_b_inc>>SHIFR_L))];
			for(;xinc<=y1;)	
			{
				FILE_BMP;
			}
			rs+=krs;			
			gs+=kgs;			
			bs+=kbs;
			
			dest+=mempitch;			//point to next line
			xs+=ks;					//next line xs
			xe+=ke;	
		}		
		return;
	}
		
}


//=======================================================================

void OUR_Draw_flat16( OUR_3D_OBJ_PTR	obj,UCHAR *video_buffer, int lpitch)
{

uint32 i1,i2,i3;
uint32 poly;
uint32 num;
FIX_POINT3D_PTR     point_work=obj->pPoints_work;
OUR_3D_TRAG_PTR      triangle_work=obj->pTriangle;
num=obj->triangle_num;
for (poly=0; poly <num; poly++)
    {
    if(OUR_D_FrameTH==obj->pTriangle_changed[poly])
    	{
	    i1=triangle_work[poly].p1;
	    i2=triangle_work[poly].p2;
	    i3=triangle_work[poly].p3;


		OUR_Draw_Triangle_2D16(point_work[i1].MM.x, 
				               point_work[i1].MM.y,
				               point_work[i2].MM.x, 
				               point_work[i2].MM.y,
				                point_work[i3].MM.x, 
				                point_work[i3].MM.y,
				                triangle_work[poly].CC.clor,
				                video_buffer, lpitch);
		
		OUR_D_triangle_drawed_num++;

    	}
    }
} 
void OUR_Draw_Gouraud16( OUR_3D_OBJ_PTR	obj,UCHAR *video_buffer, int lpitch)
{

uint32 i1,i2,i3;
uint32 poly;
uint32 num;
FIX_POINT3D_PTR point_work=obj->pPoints_work;
OUR_3D_TRAG_PTR  	triangle_work=obj->pTriangle;
num=obj->triangle_num;
for (poly=0; poly <num; poly++)
    {//poly=0x4a;
    if(OUR_D_FrameTH==obj->pTriangle_changed[poly])
    	{
	    i1=triangle_work[poly].p1;
	    i2=triangle_work[poly].p2;
	    i3=triangle_work[poly].p3;


OUR_Draw_Gouraud_2D16(point_work[i1].MM.x, 
				               point_work[i1].MM.y,
				               point_work[i2].MM.x, 
				               point_work[i2].MM.y,
				                point_work[i3].MM.x, 
				                point_work[i3].MM.y,
				                obj->clor_work[i1],
				                obj->clor_work[i2],
				                obj->clor_work[i3],
				                video_buffer, lpitch);

		OUR_D_triangle_drawed_num++;

    	}
    }
} 

void OUR_Draw_bmp16( OUR_3D_OBJ_PTR	obj,UCHAR *video_buffer, int lpitch)
{

uint32 i1,i2,i3;
uint32 poly;
uint32 num;
FIX_POINT3D_PTR point_work=obj->pPoints_work;
OUR_3D_TRAG_PTR  	triangle_work=obj->pTriangle;
num=obj->triangle_num;
for (poly=0; poly <num; poly++)
    {//poly=0x4a;
    if(OUR_D_FrameTH==obj->pTriangle_changed[poly])
    	{
	    i1=triangle_work[poly].p1;
	    i2=triangle_work[poly].p2;
	    i3=triangle_work[poly].p3;

OUR_Draw_BMP_2D16(point_work[i1].MM.x, 
				               point_work[i1].MM.y,
				               point_work[i2].MM.x, 
				               point_work[i2].MM.y,
				                point_work[i3].MM.x, 
				                point_work[i3].MM.y,
				                triangle_work[poly].uv1,
				                triangle_work[poly].uv2,
				                triangle_work[poly].uv3,
				                video_buffer, lpitch,
				                obj->bmp_info);

		OUR_D_triangle_drawed_num++;

    	}
    }
} 



//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

⌨️ 快捷键说明

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