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