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

📄 our_3d.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 5 页
字号:
                            
                            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 &MATERIAL_MASK)
    {
    case MATERIAL_point_1:
        OUR_BACHFACE_OBJ_POINT_1_LIT32(obj,cam,lit);
        break;
    case MATERIAL_point_1P:
        OUR_BACHFACE_OBJ_POINT_1P_LIT32(obj,cam,lit);
        break;
    case MATERIAL_point_3T:
        OUR_BACHFACE_OBJ_POINT_3T_LIT32(obj,cam,lit);//not ready
        break;
    case MATERIAL_Triangle_T:
        OUR_BACHFACE_OBJ_TRAG_LIT32(obj,cam,lit);
        break;
    case MATERIAL_Triangle_1:	
        OUR_BACHFACE_OBJ_OBJ_LIT32(obj,cam,lit);
        break;
    case MATERIAL_wire:
        OUR_BACHFACE_OBJ_TRAG_LIT32(obj,cam,lit);
        break;
    case MATERIAL_bmp:
        OUR_BACHFACE_OBJ_BMP_LIT32(obj,cam,lit);
        break;	 
    default:
        break;	 
    }
    
}
int OUR_OBJ_INIT32(	OUR_3D_OBJ_PTR 	obj,	
                   UINT			material,
                   FIX_POINT3D_PTR	pos,
                   FIXP16			scale,		
                   UINT 			point_num,	
                   UINT 			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,
                   UINT*				pPoints_changed,
                   UINT*				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_x=scale;
    obj->scale_y=scale;
    obj->scale_z=scale;
    obj->scale_x_i=(1<<(2*SCALE_1))/scale;
    obj->scale_y_i=(1<<(2*SCALE_1))/scale;
    obj->scale_z_i=(1<<(2*SCALE_1))/scale;
    obj->CC.clor=clor & OUR_RGB_MASK7777>>1;
    
    obj->clor=clor_work;
    if( MATERIAL_point_1== (material&MATERIAL_MASK))
    {
        obj->clor_work=clor_work;
    }
    else if( MATERIAL_point_1P== (material&MATERIAL_MASK))
    {
        obj->clor_work=clor_work+point_num;
    }
    else if( MATERIAL_point_3T== (material&MATERIAL_MASK))
    {
        obj->clor_work=clor_work+3*triagle_num;
    }
    
    else if( MATERIAL_Triangle_T== (material&MATERIAL_MASK))
    {
        obj->clor_work=clor_work+triagle_num;
    }
    else if( MATERIAL_Triangle_1== (material&MATERIAL_MASK))
    {
        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_OBJ_SET_SCALE_X(	OUR_3D_OBJ_PTR 	obj,	
                                FIXP16		scale)
{
    obj->scale_x=scale;
    obj->scale_x_i=(1<<(2*SCALE_1))/scale;
    return 1;
}
int OUR_OBJ_SET_SCALE_Y(	OUR_3D_OBJ_PTR 	obj,	
                                FIXP16		scale)
{
    obj->scale_y=scale;
    obj->scale_y_i=(1<<(2*SCALE_1))/scale;
    return 1;
}
int OUR_OBJ_SET_SCALE_Z(	OUR_3D_OBJ_PTR 	obj,	
                                FIXP16		scale)
{
    obj->scale_z=scale;
    obj->scale_z_i=(1<<(2*SCALE_1))/scale;
    return 1;
}
int OUR_OBJ_SET_SCALE_XYZ(	OUR_3D_OBJ_PTR 	obj,	
                                FIXP16		scale)
{
    obj->scale_y=scale;
    obj->scale_y_i=(1<<(2*SCALE_1))/scale;
    obj->scale_z=scale;
    obj->scale_z_i=(1<<(2*SCALE_1))/scale;
    obj->scale_z=scale;
    obj->scale_z

⌨️ 快捷键说明

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