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

📄 our_3d.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 5 页
字号:
#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_1P_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;	
    UINT	i,j;
    int	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_x_i>>SCALE_1;
    cam->pos_obj.MM.y=((cam->pos_obj.MM.y))*obj->scale_y_i>>SCALE_1;
    cam->pos_obj.MM.z=((cam->pos_obj.MM.z))*obj->scale_z_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_x_i>>SCALE_1;
                lit->pos_dir_obj.MM.y=((lit->pos_dir_obj.MM.y))*obj->scale_y_i>>SCALE_1;
                lit->pos_dir_obj.MM.z=((lit->pos_dir_obj.MM.z))*obj->scale_z_i>>SCALE_1;
            }
        }
        lit=lit->lit_next;
    }
    p_p = obj->pPoints;
    p_t = obj->pTriangle;
    obj->pTriangle_num_changed=0;
    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[obj->pTriangle_num_changed]=i;	
            obj->pTriangle_num_changed++;	
            //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;
                j=(obj->clor[i] & OUR_RGB_MASK0008)*(lihgt_clr1&0xffff);
                if((j) >= (0x1<<21))
                    *clr_work=OUR_RGB_MASK0008;
                else
                    *clr_work=(j)>>13;
                //red
                //j=p_t[i].CC.c[2]*(lihgt_clr1>>16);
                j=((obj->clor[i] & OUR_RGB_MASK0800)>>16)*(lihgt_clr1>>16);
                
                if((j) >= (0x1<<21))
                    *clr_work+=OUR_RGB_MASK0800;
                else
                    *clr_work+=((j)<<3)&OUR_RGB_MASK0800;
                
                //green
                j=((obj->clor[i] & OUR_RGB_MASK0080)>>8)*(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;	
                j=(obj->clor[i] & OUR_RGB_MASK0008)*(lihgt_clr1&0xffff);
                if((j) >= (0x1<<21))
                    *clr_work=OUR_RGB_MASK0008;
                else
                    *clr_work=(j)>>13;
                //red
                //j=p_t[i].CC.c[2]*(lihgt_clr1>>16);
                j=((obj->clor[i] & OUR_RGB_MASK0800)>>16)*(lihgt_clr1>>16);
                
                if((j) >= (0x1<<21))
                    *clr_work+=OUR_RGB_MASK0800;
                else
                    *clr_work+=((j)<<3)&OUR_RGB_MASK0800;
                
                //green
                j=((obj->clor[i] & OUR_RGB_MASK0080)>>8)*(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;	
                j=(obj->clor[i] & OUR_RGB_MASK0008)*(lihgt_clr1&0xffff);
                if((j) >= (0x1<<21))
                    *clr_work=OUR_RGB_MASK0008;
                else
                    *clr_work=(j)>>13;
                //red
                //j=p_t[i].CC.c[2]*(lihgt_clr1>>16);
                j=((obj->clor[i] & OUR_RGB_MASK0800)>>16)*(lihgt_clr1>>16);
                
                if((j) >= (0x1<<21))
                    *clr_work+=OUR_RGB_MASK0800;
                else
                    *clr_work+=((j)<<3)&OUR_RGB_MASK0800;
                
                //green
                j=((obj->clor[i] & OUR_RGB_MASK0080)>>8)*(lihgt_clr0&0xffff);
                if((j) >= (0x1<<21))
                    *clr_work+=OUR_RGB_MASK0080;
                else
                    *clr_work+=((j)>>5)&OUR_RGB_MASK0080;	
            }
}
}
}

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

void OUR_BACHFACE_OBJ_POINT_3T_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;	
    UINT	i,j;
    int	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_x_i>>SCALE_1;
    cam->pos_obj.MM.y=((cam->pos_obj.MM.y))*obj->scale_y_i>>SCALE_1;
    cam->pos_obj.MM.z=((cam->pos_obj.MM.z))*obj->scale_z_i>>SCALE_1;
    //take lits to the obj
    while(lit)
    {

⌨️ 快捷键说明

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