📄 flybsp.cpp
字号:
#include "../Fly3D.h"
bsp_node::~bsp_node()
{
if (elem) delete elem;
if (child[0]) delete child[0];
if (child[1]) delete child[1];
}
mesh *bsp_object::ray_intersect(vector& ro,vector& rd,vector& ip,float& dist,int &facenum,float rad)
{
mesh *objmesh=get_mesh();
if (objmesh)
{
static float d1,d2;
vector ro_local=(ro-pos)*mat_t,
rd_local=rd*mat_t;
if (objmesh->bbox.ray_intersect(ro_local,rd_local,d1,d2))
{
facenum=objmesh->ray_intersect(ro_local,rd_local,ip,dist,rad);
if (facenum>-1)
{
ip=ip*mat+pos;
return objmesh;
}
}
}
return 0;
}
int bsp_object::ray_intersect_test(vector& ro,vector& rd,float rad)
{
mesh *objmesh=get_mesh();
if (objmesh)
{
static float d1,d2;
vector ro_local=(ro-pos)*mat_t,
rd_local=rd*mat_t;
if (objmesh->bbox.ray_intersect(ro_local,rd_local,d1,d2))
if (objmesh->ray_intersect_test(ro_local,rd_local,rad))
return 1;
}
return 0;
}
void bsp_object::remove_from_bsp()
{
if (node==0) return;
bsp_object *e=node->elem,*ep=0;
while(e)
{
if (e==this)
{
if (next_elem==0)
if (ep)
node->last_elem=&ep->next_elem;
else node->last_elem=&node->elem;
if (ep)
ep->next_elem=next_elem;
else
node->elem=next_elem;
next_elem=0;
node=0;
return;
}
ep=e;
e=e->next_elem;
}
node=0;
}
void bsp_object::add_to_bsp()
{
float d;
if (node) remove_from_bsp();
node=flyengine->bsp;
while( node && node->leaf==-1)
{
d=node->distance(pos);
if (d>-SMALL)
node=node->child[0];
else node=node->child[1];
}
if (node)
{
next_elem=0;
*node->last_elem=this;
node->last_elem=&next_elem;
}
}
void bsp_object::load_params(fly_pak *file,char *sec)
{
int i,n=get_param_desc(0,0);
param_desc pd;
char ret[256];
for( i=0;i<n;i++ )
{
get_param_desc(i,&pd);
ret[0]=0;
file->get_profile_string(sec,pd.name,ret);
pd.set_string(ret);
}
}
void bsp_object::load_default_params(fly_pak *file,char *sec)
{
int i,n=NUM_DEFAULT_PARAM;
param_desc pd;
char ret[256];
for( i=0;i<n;i++ )
{
get_param_desc(i,&pd);
ret[0]=0;
file->get_profile_string(sec,pd.name,ret);
pd.set_string(ret);
}
}
int bsp_object::get_param_desc(int i,param_desc *pd)
{
if (pd==0)
return NUM_DEFAULT_PARAM+get_custom_param_desc(0,0);
else
if (i>=NUM_DEFAULT_PARAM)
get_custom_param_desc(i-NUM_DEFAULT_PARAM,pd);
else
switch(i)
{
case 0:
pd->type='v';
pd->data=&pos;
strcpy(pd->name,"pos");
break;
case 1:
pd->type='v';
pd->data=&rot;
strcpy(pd->name,"rot");
break;
case 2:
pd->type='v';
pd->data=&vel;
strcpy(pd->name,"vel");
break;
case 3:
pd->type='v';
pd->data=&force;
strcpy(pd->name,"force");
break;
case 4:
pd->type='i';
pd->data=&life;
strcpy(pd->name,"life");
break;
case 5:
pd->type='i';
pd->data=&col_flag;
strcpy(pd->name,"colflag");
break;
case 6:
pd->type='f';
pd->data=&mass;
strcpy(pd->name,"mass");
break;
case 7:
pd->type='f';
pd->data=&radius;
strcpy(pd->name,"radius");
break;
case 8:
pd->type='f';
pd->data=≎
strcpy(pd->name,"bump");
break;
case 9:
pd->type='f';
pd->data=&friction;
strcpy(pd->name,"friction");
break;
case 10:
pd->type='i';
pd->data=&active;
strcpy(pd->name,"active");
break;
case 11:
pd->type='i';
pd->data=&latedraw;
strcpy(pd->name,"latedraw");
break;
}
return 0;
}
char *param_desc::get_string()
{
static char str[256];
str[0]=0;
if (type>255 || type<-255)
{
if (*((bsp_object **)data)!=0)
strcpy(str,(*((bsp_object **)data))->name);
}
else
switch(type)
{
case 'b':
strcpy(str,flyengine->bspfile);
break;
case 'i':
sprintf(str,"%i",*((int *)data));
break;
case 'f':
sprintf(str,"%f",*((float *)data));
break;
case 'a':
sprintf(str,"%f",acos(*((float *)data))*PiUnder180);
break;
case 'c':
case 'v':
sprintf(str,"%f %f %f",
((float *)data)[0],
((float *)data)[1],
((float *)data)[2]);
break;
case 'p':
if (*((int *)data)!=-1)
strcpy(str,flyengine->piclib[*((int *)data)]->name);
break;
case 'o':
if (*((bsp_object **)data)!=0)
strcpy(str,(*((bsp_object **)data))->name);
break;
case 'd':
if (*((bsp_object **)data)!=0)
strcpy(str,(*((bsp_object **)data))->name);
break;
case '3':
if (*((mesh **)data)!=0)
strcpy(str,(*((mesh **)data))->name);
break;
case 'm':
if (*((mesh **)data)!=0)
strcpy(str,(*((mesh **)data))->name);
break;
case 'z':
if (*((bezier_curve **)data)!=0)
strcpy(str,(*((bezier_curve **)data))->name);
break;
case 'h':
if (*((bezier_patch **)data)!=0)
strcpy(str,(*((bezier_patch **)data))->name);
break;
case 'w':
if (*((sound **)data)!=0)
strcpy(str,(*((sound **)data))->name);
break;
case 's':
strcpy(str,(char *)data);
break;
}
return str;
}
void param_desc::set_string(char *str)
{
if (type>255)
(*((bsp_object **)data))=flyengine->get_stock_object(str);
else
if (type<-255)
(*((bsp_object **)data))=flyengine->get_active_object(str);
else
switch(type)
{
case 'i':
*((int *)data)=0;
sscanf(str,"%i",(int *)data);
break;
case 'f':
*((float *)data)=0;
sscanf(str,"%f",(float *)data);
break;
case 'a':
*((float *)data)=0;
sscanf(str,"%f",(float *)data);
*((float *)data)=(float)cos(*((float *)data)*PiOver180);
break;
case 'c':
case 'v':
((float *)data)[0]=
((float *)data)[1]=
((float *)data)[2]=0;
sscanf(str,"%f %f %f",
&((float *)data)[0],
&((float *)data)[1],
&((float *)data)[2]);
break;
case 'p':
*((int *)data)=flyengine->get_picture(str);
break;
case 'o':
*((bsp_object **)data)=flyengine->get_stock_object(str);
break;
case 'd':
*((bsp_object **)data)=flyengine->get_active_object(str);
break;
case '3':
*((mesh **)data)=flyengine->get_model_object(str);
break;
case 'm':
*((mesh **)data)=flyengine->get_model_object(str);
break;
case 'z':
*((bezier_curve **)data)=flyengine->get_bezier_curve(str);
break;
case 'h':
*((bezier_patch **)data)=flyengine->get_bezier_patch(str);
break;
case 'w':
*((sound **)data)=flyengine->get_sound_object(str);
break;
case 'b':
case 's':
strcpy((char *)data,str);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -