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

📄 our_3d.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 5 页
字号:
    triangle_list=obj->pTriangle;
    point_list=obj->pPoints;
    p_nor.MM.x=0;
    p_nor.MM.y=0;
    p_nor.MM.z=0;
    
    for(j=0;j<num_p;j++)
    {
        for(i=0;i<num_t;i++)
        {
            if(j==triangle_list[i].p1 || j==triangle_list[i].p2 || j==triangle_list[i].p3)
            {
                OUR_FIX_VECTOR3D_ADD(&triangle_list[i].NOR_P,&p_nor,&p_nor);
            }
        }
        //OUR_FAST_Normalize(&p_nor);
        OUR_VECTOR3D_Normalize(&p_nor);
        obj->pPoint_nor[j].MM.x=p_nor.MM.x;
        obj->pPoint_nor[j].MM.y=p_nor.MM.y;
        obj->pPoint_nor[j].MM.z=p_nor.MM.z;
    }
}

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

void OUR_BACHFACE_OBJ_OBJ_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;	
    UINT	i,j;
    int	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_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;
            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;	
            
            //lighting
            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);// n  is the v of p 2 lit
                    f=OUR_VECTOR3D_Dot(&n,&(p_t[i].NOR_P));		//
                    if(f>0)		
                    {
                        j=OUR_FAST_Length(&n);// is the v of p 2 lit
                        
                        //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)//平行光
                {
                    
                    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=obj->CC.c[0]*(lihgt_clr1&0xffff);
            if((j) >= (0x1<<21))
                //p_t[i].CC_work.clor=OUR_RGB_MASK0008;
                obj->clor_work[i]=OUR_RGB_MASK0008;
            else
                //p_t[i].CC_work.clor=(j)>>13;
                obj->clor_work[i]=(j)>>13;
            //red
            j=obj->CC.c[2]*(lihgt_clr1>>16);
            if((j) >= (0x1<<21))
                //p_t[i].CC_work.clor+=OUR_RGB_MASK0800;
                obj->clor_work[i]+=OUR_RGB_MASK0800;
            else
                //p_t[i].CC_work.clor+=((j)<<3)&OUR_RGB_MASK0800;
                obj->clor_work[i]+=((j)<<3)&OUR_RGB_MASK0800;
            
            //green
            j=obj->CC.c[1]*(lihgt_clr0&0xffff);
            if((j) >= (0x1<<21))
                //p_t[i].CC_work.clor+=OUR_RGB_MASK0080;
                obj->clor_work[i]+=OUR_RGB_MASK0080;
            else
                //p_t[i].CC_work.clor+=((j)>>5)&OUR_RGB_MASK0080;	
                obj->clor_work[i]+=((j)>>5)&OUR_RGB_MASK0080;			
            //p_t[i].CC.clor+=0xffff00;
            /**/
        }
    }
}

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

void OUR_BACHFACE_OBJ_TRAG_LIT32(	OUR_3D_OBJ_PTR	obj,//100*n t  需要优化
                                 OUR_3D_CAM_PTR	cam,
                                 OUR_3D_LIT_PTR 	lit_here)
{	
    OUR_3D_TRAG_PTR  p_t;
    FIX_POINT3D_PTR	p_p;	
    FIX_POINT3D n,l;	
    UINT	i,j;
    int	f;
    CLR		lihgt_clr0,lihgt_clr1;
    OUR_3D_LIT_PTR 	lit;
    lit=lit_here;
    //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;
            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;	
            
            //lighting
            //lihgt_clr0=0xffffffff;
            //lihgt_clr1=0xffffffff;
            
            lit=lit_here;
            //if(material_Triangle == obj->material )
            //--------------------------------------------------
           // if(lit)
            {
            lihgt_clr0=0;
            lihgt_clr1=0;
            }
            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_t[i].NOR_P));
                    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)//平行光
                {
                    
                    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=(obj->clor[i] & OUR_RGB_MASK0008)*(lihgt_clr1&0xffff);
            if((j) >= (0x1<<21))
                obj->clor_work[i]=OUR_RGB_MASK0008;
            else
                obj->clor_work[i]=(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))
                obj->clor_work[i]+=OUR_RGB_MASK0800;
            else
                obj->clor_work[i]+=((j)<<3)&OUR_RGB_MASK0800;
            
            //green
            j=((obj->clor[i] & OUR_RGB_MASK0080)>>8)*(lihgt_clr0&0xffff);
            if((j) >= (0x1<<21))
                obj->clor_work[i]+=OUR_RGB_MASK0080;
            else
                obj->clor_work[i]+=((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;	
    UINT	i,j;
    int	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_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
    
    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;
            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;	
            
        }
    }
}

⌨️ 快捷键说明

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