📄 our_draw32.c
字号:
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 + -