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

📄 our_3d.c

📁 MTK上3D特效的一些开源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
						j=f/(j*j>>2);
						
						if(j>0x7f)
							j=0x7f;
						f=lit->clor[0] *j;
						lihgt_clr0+=f;
						f=lit->clor[1] *j;
						lihgt_clr1+=f;
					}				
				}
				else if (lit->state_attr == LIT_parallel)//平行光
				{
					
					f=OUR_VECTOR3D_Dot(&(lit->pos_dir_obj),&(p_t[i].NOR_P));
					if(f>0)		
					{
						j=f>>23;
						if(j>0x7f)
							j=0x7f;
						f=lit->clor[0] *j;
						lihgt_clr0+=f;
						f=lit->clor[1] *j;
						lihgt_clr1+=f;
					}				
				}
				else if (lit->state_attr == LIT_condition)//环境光
				{
					lihgt_clr0+=lit->clor[0];
					lihgt_clr1+=lit->clor[1];
				}
				//-----
				lit=lit->lit_next;
			}
			//---------------------------------------------------
			//blue
			j=p_t[i].CC.c[0]*(lihgt_clr1&0xffff);
			if((j) >= (0x1<<21))
				p_t[i].CC_work.clor=OUR_RGB_MASK0008;
			else
				p_t[i].CC_work.clor=(j)>>13;
			//red
			j=p_t[i].CC.c[2]*(lihgt_clr1>>16);
			if((j) >= (0x1<<21))
				p_t[i].CC_work.clor+=OUR_RGB_MASK0800;
			else
				p_t[i].CC_work.clor+=((j)<<3)&OUR_RGB_MASK0800;
			
			//green
			j=p_t[i].CC.c[1]*(lihgt_clr0&0xffff);
			if((j) >= (0x1<<21))
				p_t[i].CC_work.clor+=OUR_RGB_MASK0080;
			else
				p_t[i].CC_work.clor+=((j)>>5)&OUR_RGB_MASK0080;			
			
			/**/
		}
	}
}


//--------------------------------------------------------------------

void OUR_BACHFACE_OBJ_BMP_LIT32(	OUR_3D_OBJ_PTR	obj,//100*n t  需要优化
							OUR_3D_CAM_PTR	cam,
							OUR_3D_LIT_PTR 	lit)
{	
	OUR_3D_TRAG_PTR  p_t;
	FIX_POINT3D_PTR	p_p;	
	FIX_POINT3D n,l;	
	uint32	i,j;
	sint32	f;
	CLR		lihgt_clr0,lihgt_clr1;
	OUR_3D_LIT_PTR 	lit_here;
	lit_here=lit;
	//take cam to the obj
	OUR_FIX_VECTOR3D_SUB(&cam->pos,&obj->pos,&n);
	OUR_FIX_Mat_Mul_VECTOR3D_3X3(&n, &obj->mrot_i,&(cam->pos_obj));//100t
	cam->pos_obj.MM.x=((cam->pos_obj.MM.x))*obj->scale_i>>SCALE_1;
	cam->pos_obj.MM.y=((cam->pos_obj.MM.y))*obj->scale_i>>SCALE_1;
	cam->pos_obj.MM.z=((cam->pos_obj.MM.z))*obj->scale_i>>SCALE_1;
	//take lits to the obj
	
	p_p = obj->pPoints;
	p_t = obj->pTriangle;
	for(i=0;i<obj->triangle_num;i++)
	{
		j=p_t[i].p1;
		OUR_FIX_VECTOR3D_SUB(&(cam->pos_obj),&p_p[j],&l);		
		
		if(OUR_VECTOR3D_Dot(&l,&(p_t[i].NOR_P))>0)		//need to change
		{		
			obj->pTriangle_changed[i]=OUR_D_FrameTH;	
			//j=p_t[i].p1;
			obj->pPoints_changed[j]=OUR_D_FrameTH;
			j=p_t[i].p2;
			obj->pPoints_changed[j]=OUR_D_FrameTH;
			j=p_t[i].p3;
			obj->pPoints_changed[j]=OUR_D_FrameTH;	
			
		}
	}
}
#if 0//hightlightspot						
						//for hilightt
						f>>=15;
						u.MM.x=p_t[i].NOR_P.MM.x*f>>15;
						u.MM.y=p_t[i].NOR_P.MM.y*f>>15;
						u.MM.z=p_t[i].NOR_P.MM.z*f>>15;
						
						OUR_FIX_VECTOR3D_SUB(&u,&n,&n);
						OUR_FIX_VECTOR3D_ADD(&u,&n,&n);
						e=OUR_VECTOR3D_Dot(&n,&l);
						if(e>0)
						{
							d=OUR_FAST_Length(&l);
							e=OUR_Fast_division(e,j);
							if(e>0x3e0)
							{
								f=lit->clor[0] <<6;
								lihgt_clr0+=f;
								f=lit->clor[1] <<6;
								lihgt_clr1+=f;
							}
						}
#endif						
//--------------------------------------------------------------------

void OUR_BACHFACE_OBJ_POINT_LIT32(	OUR_3D_OBJ_PTR	obj,//100*n t  需要优化
							OUR_3D_CAM_PTR	cam,
							OUR_3D_LIT_PTR 	lit)
{	
	OUR_3D_TRAG_PTR  p_t;
	FIX_POINT3D_PTR	p_p;	
	FIX_POINT3D_PTR     p_nor;
	FIX_POINT3D n,l;	
	uint32	i,j;
	sint32	f;
	CLR		lihgt_clr0,lihgt_clr1;
	CLR*		clr_work;
	OUR_3D_LIT_PTR 	lit_here;
	
	lit_here=lit;
	p_nor=obj->pPoint_nor;
	clr_work=obj->clor_work;
	//take cam to the obj
	OUR_FIX_VECTOR3D_SUB(&cam->pos,&obj->pos,&n);
	OUR_FIX_Mat_Mul_VECTOR3D_3X3(&n, &obj->mrot_i,&(cam->pos_obj));//100t
	cam->pos_obj.MM.x=((cam->pos_obj.MM.x))*obj->scale_i>>SCALE_1;
	cam->pos_obj.MM.y=((cam->pos_obj.MM.y))*obj->scale_i>>SCALE_1;
	cam->pos_obj.MM.z=((cam->pos_obj.MM.z))*obj->scale_i>>SCALE_1;
	//take lits to the obj
	while(lit)
	{
		if (lit->state_attr == LIT_point || lit->state_attr == LIT_parallel)
		{
			OUR_FIX_VECTOR3D_SUB(&lit->pos_dir,&obj->pos,&n);
			OUR_FIX_Mat_Mul_VECTOR3D_3X3(&n, &obj->mrot_i,&(lit->pos_dir_obj));//100t
			if (lit->state_attr == LIT_point )
			{						
				lit->pos_dir_obj.MM.x=((lit->pos_dir_obj.MM.x))*obj->scale_i>>SCALE_1;
				lit->pos_dir_obj.MM.y=((lit->pos_dir_obj.MM.y))*obj->scale_i>>SCALE_1;
				lit->pos_dir_obj.MM.z=((lit->pos_dir_obj.MM.z))*obj->scale_i>>SCALE_1;
			}
		}
		lit=lit->lit_next;
	}
	p_p = obj->pPoints;
	p_t = obj->pTriangle;
	for(i=0;i<obj->triangle_num;i++)
	{
		j=p_t[i].p1;
		OUR_FIX_VECTOR3D_SUB(&(cam->pos_obj),&p_p[j],&l);		
		
		if(OUR_VECTOR3D_Dot(&l,&(p_t[i].NOR_P))>0)		//need to change
		{		
			obj->pTriangle_changed[i]=OUR_D_FrameTH;	

			//j=p_t[i].p1;
			if(obj->pPoints_changed[j]!=OUR_D_FrameTH)
			{
				obj->pPoints_changed[j]=OUR_D_FrameTH;
				
				lihgt_clr0=0;
				lihgt_clr1=0;				
				lit=lit_here;
				//if(material_Triangle == obj->material )
				//--------------------------------------------------
				while(lit)
				{
					if (lit->state_attr == LIT_point)	//点光源
					{
						j=p_t[i].p1;
						OUR_FIX_VECTOR3D_SUB(&(lit->pos_dir_obj),&p_p[j],&n);
						f=OUR_VECTOR3D_Dot(&n,&p_nor[j]);
						if(f>0)		
						{
							j=OUR_FAST_Length(&n);//n为 灯到点

							//j=OUR_Fast_division(f,j*j>>2);
							j=f/(j*j>>2);
							
							if(j>0x7f)
								j=0x7f;
							f=lit->clor[0] *j;
							lihgt_clr0+=f;
							f=lit->clor[1] *j;
							lihgt_clr1+=f;
						}				
					}
					else if (lit->state_attr == LIT_parallel)//平行光
					{						
						j=p_t[i].p1;
						f=OUR_VECTOR3D_Dot(&(lit->pos_dir_obj),&p_nor[j]);
						if(f>0)		
						{
							j=f>>23;
							if(j>0x7f)
								j=0x7f;
							f=lit->clor[0] *j;
							lihgt_clr0+=f;
							f=lit->clor[1] *j;
							lihgt_clr1+=f;
						}				
					}
					else if (lit->state_attr == LIT_condition)//环境光
					{
						lihgt_clr0+=lit->clor[0];
						lihgt_clr1+=lit->clor[1];
					}
					//-----
					lit=lit->lit_next;
				}
				//---------------------------------------------------				
				clr_work=obj->clor_work+p_t[i].p1;				
				//blue
				j=obj->CC.c[0]*(lihgt_clr1&0xffff);
				if((j) >= (0x1<<21))
					*clr_work=OUR_RGB_MASK0008;
				else
					*clr_work=(j)>>13;
				//red
				j=obj->CC.c[2]*(lihgt_clr1>>16);
				if((j) >= (0x1<<21))
					*clr_work+=OUR_RGB_MASK0800;
				else
					*clr_work+=((j)<<3)&OUR_RGB_MASK0800;
				
				//green
				j=obj->CC.c[1]*(lihgt_clr0&0xffff);
				if((j) >= (0x1<<21))
					*clr_work+=OUR_RGB_MASK0080;
				else
					*clr_work+=((j)>>5)&OUR_RGB_MASK0080;				
			/**/
			}

			
			j=p_t[i].p2;
			if(obj->pPoints_changed[j]!=OUR_D_FrameTH)
			{
				obj->pPoints_changed[j]=OUR_D_FrameTH;				
				lihgt_clr0=0;
				lihgt_clr1=0;				
				lit=lit_here;
				//if(material_Triangle == obj->material )
				//--------------------------------------------------
				while(lit)
				{
					if (lit->state_attr == LIT_point)	//点光源
					{
						j=p_t[i].p2;
						OUR_FIX_VECTOR3D_SUB(&(lit->pos_dir_obj),&p_p[j],&n);
						f=OUR_VECTOR3D_Dot(&n,&p_nor[j]);
						if(f>0)		
						{
							j=OUR_FAST_Length(&n);//n为 灯到点

							//j=OUR_Fast_division(f,j*j>>2);							
							j=f/(j*j>>2);
                            
							if(j>0x7f)
								j=0x7f;
							f=lit->clor[0] *j;
							lihgt_clr0+=f;
							f=lit->clor[1] *j;
							lihgt_clr1+=f;
						}				
					}
					else if (lit->state_attr == LIT_parallel)//平行光
					{						
						j=p_t[i].p2;
						f=OUR_VECTOR3D_Dot(&(lit->pos_dir_obj),&p_nor[j]);
						if(f>0)		
						{
							j=f>>23;
							if(j>0x7f)
								j=0x7f;
							f=lit->clor[0] *j;
							lihgt_clr0+=f;
							f=lit->clor[1] *j;
							lihgt_clr1+=f;
						}				
					}
					else if (lit->state_attr == LIT_condition)//环境光
					{
						lihgt_clr0+=lit->clor[0];
						lihgt_clr1+=lit->clor[1];
					}
					//-----
					lit=lit->lit_next;
				}
				//---------------------------------------------------				
				clr_work=obj->clor_work+p_t[i].p2;				
				//blue
				j=obj->CC.c[0]*(lihgt_clr1&0xffff);
				if((j) >= (0x1<<21))
					*clr_work=OUR_RGB_MASK0008;
				else
					*clr_work=(j)>>13;
				//red
				j=obj->CC.c[2]*(lihgt_clr1>>16);
				if((j) >= (0x1<<21))
					*clr_work+=OUR_RGB_MASK0800;
				else
					*clr_work+=((j)<<3)&OUR_RGB_MASK0800;				
				//green
				j=obj->CC.c[1]*(lihgt_clr0&0xffff);
				if((j) >= (0x1<<21))
					*clr_work+=OUR_RGB_MASK0080;
				else
					*clr_work+=((j)>>5)&OUR_RGB_MASK0080;				
			/**/
			}

			
			j=p_t[i].p3;
			if(obj->pPoints_changed[j]!=OUR_D_FrameTH)
			{
				obj->pPoints_changed[j]=OUR_D_FrameTH;
				
				lihgt_clr0=0;
				lihgt_clr1=0;				
				lit=lit_here;
				//if(material_Triangle == obj->material )
				//--------------------------------------------------
				while(lit)
				{
					if (lit->state_attr == LIT_point)	//点光源
					{
						j=p_t[i].p3;
						OUR_FIX_VECTOR3D_SUB(&(lit->pos_dir_obj),&p_p[j],&n);
						f=OUR_VECTOR3D_Dot(&n,&p_nor[j]);
						if(f>0)		
						{
							j=OUR_FAST_Length(&n);//n为 灯到点

							//j=OUR_Fast_division(f,j*j>>2);
                            
							j=f/(j*j>>2);
							
							if(j>0x7f)
								j=0x7f;
							f=lit->clor[0] *j;
							lihgt_clr0+=f;
							f=lit->clor[1] *j;
							lihgt_clr1+=f;
						}				
					}
					else if (lit->state_attr == LIT_parallel)//平行光
					{						
						j=p_t[i].p3;
						f=OUR_VECTOR3D_Dot(&(lit->pos_dir_obj),&p_nor[j]);
						if(f>0)		
						{
							j=f>>23;
							if(j>0x7f)
								j=0x7f;
							f=lit->clor[0] *j;
							lihgt_clr0+=f;
							f=lit->clor[1] *j;
							lihgt_clr1+=f;
						}				
					}
					else if (lit->state_attr == LIT_condition)//环境光
					{
						lihgt_clr0+=lit->clor[0];
						lihgt_clr1+=lit->clor[1];
					}
					//-----
					lit=lit->lit_next;
				}
				//---------------------------------------------------				
				clr_work=obj->clor_work+p_t[i].p3;				
				//blue
				j=obj->CC.c[0]*(lihgt_clr1&0xffff);
				if((j) >= (0x1<<21))
					*clr_work=OUR_RGB_MASK0008;
				else
					*clr_work=(j)>>13;
				//red
				j=obj->CC.c[2]*(lihgt_clr1>>16);
				if((j) >= (0x1<<21))
					*clr_work+=OUR_RGB_MASK0800;
				else
					*clr_work+=((j)<<3)&OUR_RGB_MASK0800;				
				//green
				j=obj->CC.c[1]*(lihgt_clr0&0xffff);
				if((j) >= (0x1<<21))
					*clr_work+=OUR_RGB_MASK0080;
				else
					*clr_work+=((j)>>5)&OUR_RGB_MASK0080;				
			/**/
			}
		}
	}
}
//--------------------------------------------------------------------

void OUR_BACHFACE_OBJ_LIT32(	OUR_3D_OBJ_PTR	obj,//100*n t  需要优化
							OUR_3D_CAM_PTR	cam,
							OUR_3D_LIT_PTR 	lit)
{
	switch(obj->material)
	{
	case MATERIAL_point:
		 OUR_BACHFACE_OBJ_POINT_LIT32(obj,cam,lit);
		 break;
	case MATERIAL_Triangle:
		OUR_BACHFACE_OBJ_TRAG_LIT32(obj,cam,lit);
		break;
	case MATERIAL_obj:	
		OUR_BACHFACE_OBJ_OBJ_LIT32(obj,cam,lit);
	case MATERIAL_wire:
		OUR_BACHFACE_OBJ_TRAG_LIT32(obj,cam,lit);
		break;
	case MATERIAL_bmp:
		OUR_BACHFACE_OBJ_BMP_LIT32(obj,cam,lit);
	default:
        	break;	 
	}

}
int OUR_OBJ_INIT32(	OUR_3D_OBJ_PTR 	obj,	
				   uint32			material,
				   FIX_POINT3D_PTR	pos,
				   FIXP16			scale,		
				   uint32 			point_num,	
				   uint32 			triagle_num,			
				   FIX_POINT3D_PTR	pPoint,
				   FIX_POINT3D_PTR	pPoint_nor,
				   FIX_POINT3D_PTR	pPoint_work,
				   OUR_3D_TRAG_PTR	pTriagle,				
				   CLR 				clor,		
				   CLR* 				clor_work,
				   OUR_BMP_INFO*     	bmp_info,
				   uint32*				pPoints_changed,
				   uint32*				pTriangle_changed
				   )
{
	obj->material=material;

	obj->pos.MM.x=pos->MM.x;
	obj->pos.MM.y=pos->MM.y;
	obj->pos.MM.z=pos->MM.z;
	
	obj->pPoints=pPoint;
	obj->point_num=point_num;
	obj->pPoint_nor=pPoint_nor;
	
	obj->pTriangle=pTriagle;
	obj->triangle_num=triagle_num;
	obj->scale=scale;
	obj->scale_i=(1<<(2*SCALE_1))/scale;
	obj->CC.clor=clor & OUR_RGB_MASK7777>>1;
	
	obj->clor_work=clor_work;
	obj->bmp_info=bmp_info;
	
	obj->pPoints_changed =pPoints_changed;
	obj->pTriangle_changed=pTriangle_changed;
	obj->pPoints_work =pPoint_work;
	
	return 1;
}
int OUR_CAM_INIT()
{
	return 1;
}
int OUR_LIT_INIT32(OUR_3D_LIT_PTR lit,FIX_POINT3D_PTR pos_dir,CLR clr,uint32 sta)
{
	lit->pos_dir.MM.x=pos_dir->MM.x;
	lit->pos_dir.MM.y=pos_dir->MM.y;
	lit->pos_dir.MM.z=pos_dir->MM.z;
	
	lit->clor[0] = (clr & OUR_RGB_MASK7070)>>9;//a and g
	lit->clor[1] = clr & OUR_RGB_MASK0707;//r and b
	//lit->clor[0] = OUR_LIGHT_CLR565(0,255,255);
	
	lit->state_attr=sta;
	if(sta == LIT_parallel)
	{
		OUR_VECTOR3D_Normalize(&lit->pos_dir);
	}
	if(sta == LIT_condition)
	{
		lit->clor[0] <<=7;
		lit->clor[1] <<=7;
	}
	return 1;
}
int OUR_LIT_INSERT(OUR_3D_LIT_PTR *_lit_list,OUR_3D_LIT_PTR lit)
{
	lit->lit_next = *_lit_list;
	*_lit_list = lit;		
	return 1;
}

//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void OUR_3Dengin_start(void)
{
	//-----------------------------


	OUR_Build_Sin_Cos_Tables();
	OUR_Build_reciprocal_look();
    OUR_D_FrameTH=0;
    OUR_D_point_changed_num=0;
    OUR_D_triangle_drawed_num=0;

	OUR_D_screem_w=LCD_W;
	OUR_D_screem_h=LCD_H;


	//-----------------------------
}
void OUR_new_frame_start(void)
{
	//-----------------------------

        OUR_D_FrameTH++;
        OUR_D_point_changed_num=0;
        OUR_D_triangle_drawed_num=0;

	//-----------------------------
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

⌨️ 快捷键说明

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