📄 our_3d.c
字号:
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=p_t[i].CC.c[0]*(lihgt_clr1&0xffff);
if((j) >= (0x1<<21))
p_t[i].CC_work.clor=OUR_RGB_MASK0008;
else
p_t[i].CC_work.clor=(j)>>13;
//red
j=p_t[i].CC.c[2]*(lihgt_clr1>>16);
if((j) >= (0x1<<21))
p_t[i].CC_work.clor+=OUR_RGB_MASK0800;
else
p_t[i].CC_work.clor+=((j)<<3)&OUR_RGB_MASK0800;
//green
j=p_t[i].CC.c[1]*(lihgt_clr0&0xffff);
if((j) >= (0x1<<21))
p_t[i].CC_work.clor+=OUR_RGB_MASK0080;
else
p_t[i].CC_work.clor+=((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;
uint32 i,j;
sint32 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_i>>SCALE_1;
cam->pos_obj.MM.y=((cam->pos_obj.MM.y))*obj->scale_i>>SCALE_1;
cam->pos_obj.MM.z=((cam->pos_obj.MM.z))*obj->scale_i>>SCALE_1;
//take lits to the obj
p_p = obj->pPoints;
p_t = obj->pTriangle;
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[i]=OUR_D_FrameTH;
//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;
}
}
}
#if 0//hightlightspot
//for hilightt
f>>=15;
u.MM.x=p_t[i].NOR_P.MM.x*f>>15;
u.MM.y=p_t[i].NOR_P.MM.y*f>>15;
u.MM.z=p_t[i].NOR_P.MM.z*f>>15;
OUR_FIX_VECTOR3D_SUB(&u,&n,&n);
OUR_FIX_VECTOR3D_ADD(&u,&n,&n);
e=OUR_VECTOR3D_Dot(&n,&l);
if(e>0)
{
d=OUR_FAST_Length(&l);
e=OUR_Fast_division(e,j);
if(e>0x3e0)
{
f=lit->clor[0] <<6;
lihgt_clr0+=f;
f=lit->clor[1] <<6;
lihgt_clr1+=f;
}
}
#endif
//--------------------------------------------------------------------
void OUR_BACHFACE_OBJ_POINT_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_PTR p_nor;
FIX_POINT3D n,l;
uint32 i,j;
sint32 f;
CLR lihgt_clr0,lihgt_clr1;
CLR* clr_work;
OUR_3D_LIT_PTR lit_here;
lit_here=lit;
p_nor=obj->pPoint_nor;
clr_work=obj->clor_work;
//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_i>>SCALE_1;
cam->pos_obj.MM.y=((cam->pos_obj.MM.y))*obj->scale_i>>SCALE_1;
cam->pos_obj.MM.z=((cam->pos_obj.MM.z))*obj->scale_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_i>>SCALE_1;
lit->pos_dir_obj.MM.y=((lit->pos_dir_obj.MM.y))*obj->scale_i>>SCALE_1;
lit->pos_dir_obj.MM.z=((lit->pos_dir_obj.MM.z))*obj->scale_i>>SCALE_1;
}
}
lit=lit->lit_next;
}
p_p = obj->pPoints;
p_t = obj->pTriangle;
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[i]=OUR_D_FrameTH;
//j=p_t[i].p1;
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].p1;
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].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)
{
case MATERIAL_point:
OUR_BACHFACE_OBJ_POINT_LIT32(obj,cam,lit);
break;
case MATERIAL_Triangle:
OUR_BACHFACE_OBJ_TRAG_LIT32(obj,cam,lit);
break;
case MATERIAL_obj:
OUR_BACHFACE_OBJ_OBJ_LIT32(obj,cam,lit);
case MATERIAL_wire:
OUR_BACHFACE_OBJ_TRAG_LIT32(obj,cam,lit);
break;
case MATERIAL_bmp:
OUR_BACHFACE_OBJ_BMP_LIT32(obj,cam,lit);
default:
break;
}
}
int OUR_OBJ_INIT32( OUR_3D_OBJ_PTR obj,
uint32 material,
FIX_POINT3D_PTR pos,
FIXP16 scale,
uint32 point_num,
uint32 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,
uint32* pPoints_changed,
uint32* 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=scale;
obj->scale_i=(1<<(2*SCALE_1))/scale;
obj->CC.clor=clor & OUR_RGB_MASK7777>>1;
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_CAM_INIT()
{
return 1;
}
int OUR_LIT_INIT32(OUR_3D_LIT_PTR lit,FIX_POINT3D_PTR pos_dir,CLR clr,uint32 sta)
{
lit->pos_dir.MM.x=pos_dir->MM.x;
lit->pos_dir.MM.y=pos_dir->MM.y;
lit->pos_dir.MM.z=pos_dir->MM.z;
lit->clor[0] = (clr & OUR_RGB_MASK7070)>>9;//a and g
lit->clor[1] = clr & OUR_RGB_MASK0707;//r and b
//lit->clor[0] = OUR_LIGHT_CLR565(0,255,255);
lit->state_attr=sta;
if(sta == LIT_parallel)
{
OUR_VECTOR3D_Normalize(&lit->pos_dir);
}
if(sta == LIT_condition)
{
lit->clor[0] <<=7;
lit->clor[1] <<=7;
}
return 1;
}
int OUR_LIT_INSERT(OUR_3D_LIT_PTR *_lit_list,OUR_3D_LIT_PTR lit)
{
lit->lit_next = *_lit_list;
*_lit_list = lit;
return 1;
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void OUR_3Dengin_start(void)
{
//-----------------------------
OUR_Build_Sin_Cos_Tables();
OUR_Build_reciprocal_look();
OUR_D_FrameTH=0;
OUR_D_point_changed_num=0;
OUR_D_triangle_drawed_num=0;
OUR_D_screem_w=LCD_W;
OUR_D_screem_h=LCD_H;
//-----------------------------
}
void OUR_new_frame_start(void)
{
//-----------------------------
OUR_D_FrameTH++;
OUR_D_point_changed_num=0;
OUR_D_triangle_drawed_num=0;
//-----------------------------
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -