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

📄 our_draw32.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 4 页
字号:
                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_BMP32;
                }	
                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_BMP32;
        }
        rs+=krs;			
        gs+=kgs;			
        bs+=kbs;
        
        dest+=mempitch;			//point to next line
        xs+=ks;					//next line xs
        xe+=ke;	
    }		
    return;
}

}


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

void OUR_Draw_flat32( OUR_3D_OBJ_PTR	obj,UCHAR *video_buffer, int lpitch)
{
    UINT i1,i2,i3;
    UINT poly;
    UINT num;
    UINT poly_change;
    FIX_POINT3D_PTR     point_work=obj->pPoints_work;
    OUR_3D_TRAG_PTR      triangle_work=obj->pTriangle;
    num=obj->pTriangle_num_changed;
    for (poly=0; poly <num; poly++)
    {
        //if(OUR_D_FrameTH==obj->pTriangle_changed[poly])
        {
            poly_change=obj->pTriangle_changed[poly];
            i1=triangle_work[poly_change].p1;
            i2=triangle_work[poly_change].p2;
            i3=triangle_work[poly_change].p3;
            
            OUR_Draw_Triangle_2D32(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_change].CC_work.clor,
                obj->clor_work[poly_change],
                video_buffer, lpitch);
            
            OUR_D_triangle_drawed_num++;
            
        }
    }
} 
void OUR_Draw_Gouraud32( OUR_3D_OBJ_PTR	obj,UCHAR *video_buffer, int lpitch)
{
    UINT i1,i2,i3;
    UINT poly;
    UINT num;
    UINT poly_change;
    FIX_POINT3D_PTR     point_work=obj->pPoints_work;
    OUR_3D_TRAG_PTR      triangle_work=obj->pTriangle;
    num=obj->pTriangle_num_changed;
    for (poly=0; poly <num; poly++)
    {
        //if(OUR_D_FrameTH==obj->pTriangle_changed[poly])
        {
            poly_change=obj->pTriangle_changed[poly];
            i1=triangle_work[poly_change].p1;
            i2=triangle_work[poly_change].p2;
            i3=triangle_work[poly_change].p3;
            
            OUR_Draw_Gouraud_2D32(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_bmp32( OUR_3D_OBJ_PTR	obj,UCHAR *video_buffer, int lpitch)
{
    UINT i1,i2,i3;
    UINT poly;
    UINT num;
    UINT poly_change;
    FIX_POINT3D_PTR     point_work=obj->pPoints_work;
    OUR_3D_TRAG_PTR      triangle_work=obj->pTriangle;
    num=obj->pTriangle_num_changed;				//how many t would be draw
    for (poly=0; poly <num; poly++)
    {
        //if(OUR_D_FrameTH==obj->pTriangle_changed[poly])
        {
            poly_change=obj->pTriangle_changed[poly];	//whitch t would be draw, see the function backface.....
            i1=triangle_work[poly_change].p1;
            i2=triangle_work[poly_change].p2;
            i3=triangle_work[poly_change].p3;
            
            OUR_Draw_BMP_2D32(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_change].uv1,
                triangle_work[poly_change].uv2,
                triangle_work[poly_change].uv3,
                video_buffer, lpitch,
                obj->bmp_info);
            
            OUR_D_triangle_drawed_num++;
            
        }
    }
} 

#endif
//------------------------------------------------------
typedef struct OUR_3D_CMP_Z
{
    short  z_order;
    short  meb;
} OUR_3D_CMP_Z;

OUR_3D_CMP_Z  z_cmp[1000];
void OUR_OBJ_CMP_Z(OUR_3D_OBJ_PTR	obj)
{
    UINT i1,i2,i3;
    int poly;
    int num,num2;
    int poly_change;
    FIX_POINT3D_PTR     point_work=obj->pPoints_work;
    OUR_3D_TRAG_PTR      triangle_work=obj->pTriangle;
    num=obj->pTriangle_num_changed;		//how many t would be draw
    num2=0;
    for (poly=0; poly <num; poly++)
    {
        
        poly_change=obj->pTriangle_changed[poly];//whitch t would be draw, see the function backface.....
        i1=triangle_work[poly_change].p1;
        i2=triangle_work[poly_change].p2;
        i3=triangle_work[poly_change].p3;
        z_cmp[poly-num2].z_order=point_work[i1].MM.z+point_work[i2].MM.z+	point_work[i3].MM.z;
        z_cmp[poly-num2].meb=poly_change;
        if(z_cmp[poly-num2].z_order<800)
        {
            num2++;
        }
        else if(z_cmp[poly-num2].z_order>30000)
        {
            num2++;
        }
        else if(point_work[i1].MM.x>2*LCD_W)
        {
            num2++;
        }
        else if(point_work[i1].MM.x<-LCD_W)
        {
            num2++;
        }
        else if(point_work[i1].MM.y>2*LCD_H)
        {
            num2++;
        }
        else if(point_work[i1].MM.y<-LCD_H)
        {
            num2++;
        }
    }
    for (poly=0; poly <num-1-num2; poly++)
    {
        for (i1=poly+1; i1 <num-num2; i1++)
        {
            if(z_cmp[poly].z_order <z_cmp[i1].z_order )
            {
                i2=z_cmp[poly].z_order ;
                z_cmp[poly].z_order=z_cmp[i1].z_order;
                z_cmp[i1].z_order=i2;
                
                i2=z_cmp[poly].meb;
                z_cmp[poly].meb=z_cmp[i1].meb;
                z_cmp[i1].meb=i2;
            }
            
        }
    }
    for (poly=0; poly <num-num2; poly++)
    {
        
        obj->pTriangle_changed[poly]=z_cmp[poly].meb;//whitch t would be draw, see the function backface.....	
    }
    obj->pTriangle_num_changed-= num2;
}


void OUR_Draw_OBJ( OUR_3D_OBJ_PTR	obj,UCHAR *video_buffer, int lpitch,int clor_mod)
{
    if(obj->material &MATERIAL_cmp_z)
    { 
        OUR_OBJ_CMP_Z(obj);
    }
    if(clor_mod==CLOR_MOD_8888)
    {
#if 0
        switch(obj->material &MATERIAL_MASK)
        {
        case MATERIAL_point_1P:
        case MATERIAL_point_1:
            OUR_Draw_Gouraud32(obj,video_buffer,lpitch);
            return;
        case MATERIAL_point_3T:
            //OUR_Draw_Gouraud32(obj,video_buffer,lpitch);
            return;
        case MATERIAL_Triangle_T:
        case MATERIAL_Triangle_1:
            OUR_Draw_flat32(obj,video_buffer,lpitch);
            return;
        case MATERIAL_wire:
            OUR_Draw_Wire32(obj,video_buffer,lpitch);
            return;
        case MATERIAL_bmp:
            OUR_Draw_bmp32(obj,video_buffer,lpitch);
            return;
        default:
            return;
        }
#endif
    }
    
    else if(clor_mod==CLOR_MOD_565)
    {
        switch(obj->material &MATERIAL_MASK)
        {
        case MATERIAL_point_1P:
        case MATERIAL_point_1:
            OUR_Draw_Gouraud16(obj,video_buffer,lpitch);
            return;
        case MATERIAL_Triangle_T:
        case MATERIAL_Triangle_1:
            OUR_Draw_flat16(obj,video_buffer,lpitch);
            return;
        case MATERIAL_wire:
            //	OUR_Draw_Wire16(obj,video_buffer,lpitch);
            return;
        case MATERIAL_bmp:
            OUR_Draw_bmp16(obj,video_buffer,lpitch);
            return;
        default:
            return;
        }
    }
    
} 

//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
#endif
#endif

⌨️ 快捷键说明

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