📄 flyengine.cpp
字号:
if (type==0 || type==o->type)
break;
o=(bsp_object *)o->next_obj;
}
return o;
}
void flyEngine::compute_node_light()
{
int i,x,y;
unsigned char *uc;
vector point;
bsp_node *node;
light_map_pic *lmp;
if (nlm==0)
{
for( i=0;i<nleaf;i++ )
leaf[i]->color.vec(1,1,1,1);
return;
}
for( i=0;i<nleaf;i++ )
{
leaf[i]->color.null();
leaf[i]->leaf=0;
}
for( i=0;i<nlm;i++ )
{
lmp=lmpic[lm[i]->pic];
for( y=0;y<lm[i]->sizey;y++ )
{
uc=&lmp->bmp[(y+lm[i]->offsety)*lmp->bytesx+lm[i]->offsetx];
for( x=0;x<lm[i]->sizex;x++ )
{
lm[i]->map_point((float)x/lm[i]->sizex+1.0f/(lm[i]->sizex*2),(float)y/lm[i]->sizey+1.0f/(lm[i]->sizey*2),point);
node=find_node(bsp,point,0);
if (node)
{
node->color.x+=*(uc++);
node->color.y+=*(uc++);
node->color.z+=*(uc++);
node->leaf++;
}
else uc+=3;
}
}
}
for( i=0;i<nleaf;i++ )
{
if (leaf[i]->leaf)
leaf[i]->color/=leaf[i]->leaf*255.0f;
leaf[i]->color.w=1.0f;
leaf[i]->leaf=i;
}
}
void flyEngine::load_level()
{
char str[256];
strcpy(str,flydatapath);
strcat(str,bspfile);
strcat(str,".tex");
load_pictures(str);
strcpy(str,flydatapath);
strcat(str,bspfile);
strcat(str,".bsp");
load_bsp(str);
strcpy(str,flydatapath);
strcat(str,bspfile);
strcat(str,".pvs");
load_pvs(str);
strcpy(str,flydatapath);
strcat(str,bspfile);
strcat(str,".lmp");
load_lightmaps(str);
}
int flyEngine::load_data()
{
char ret[256],str[256];
int i,j;
param_desc pd;
fly_pak fly_file;
if (!fly_file.open(flyfilename))
return 0;
fly_file.get_profile_string("fly", "bspfile", bspfile);
load_level();
j=get_global_param_desc(0,0);
for( i=0;i<j;i++ )
{
get_global_param_desc(i,&pd);
fly_file.get_profile_string("fly",pd.name,ret);
pd.set_string(ret);
}
if (fontspic!=-1)
{
strcpy(str,flydatapath);
strcat(str,"maps\\");
strcat(str,piclib[fontspic]->name);
if (strrchr(str,'.'))
*strrchr(str,'.')=0;
strcat(str,".txt");
fly_pak fp;
if (fp.open(str))
for( int i=0;i<64;i++ )
fonts_width[i]=fp.get_int();
else
for( int i=0;i<64;i++ )
fonts_width[i]=FONTS_SIZE/2;
}
i=0;
while(1)
{
sprintf(str,"dll%i",i++);
fly_file.get_profile_string("classes",str,ret);
if (ret[0]==0) break;
dll.add_dll(ret);
}
dll.load_all_classes(&fly_file);
bsp_object *o=active_obj0;
while(o)
{
o->load_params(&fly_file,o->name);
o=(bsp_object *)o->next_obj;
}
o=stock_obj0;
while(o)
{
o->load_params(&fly_file,o->name);
o=(bsp_object *)o->next_obj;
}
fly_file.get_profile_string("fly","camera",ret);
cam=get_active_object(ret);
fly_file.get_profile_string("fly","player",ret);
player=get_active_object(ret);
if (directx)
directx->players[0].data=player;
bsp_object *s=0,*n;
o=stock_obj0;
while(o)
{
n=(bsp_object *)o->next_obj;
o->next_obj=s;
s=o;
o=n;
}
stock_obj0=s;
o=stock_obj0;
while(o)
{
cur_step++;
o->init();
o=(bsp_object *)o->next_obj;
}
o=active_obj0;
while(o)
{
cur_step++;
o->init();
o->add_to_bsp();
o=(bsp_object *)o->next_obj;
}
compute_node_light();
dll.send_message(FLYM_INITSCENE,0,0);
return 1;
}
int flyEngine::add_lightmap(int sx,int sy)
{
int x=0,y=0,i,j;
int sizes[]={ 1,2,4,8,16,32,64,128,256 };
for( i=0,j=256;i<9;i++ )
if (abs(sizes[i]-sx)<j)
{
j=abs(sizes[i]-sx);
x=i;
}
for( i=0,j=256;i<9;i++ )
if (abs(sizes[i]-sy)<j)
{
j=abs(sizes[i]-sy);
y=i;
}
lmpic[nlmpic]=new light_map_pic(sizes[x],sizes[y],3);
fmpic[nlmpic]=new light_map_pic(sizes[x],sizes[y],4);
lm[nlm]=new light_map(-1,nlmpic,0,0,sizes[x],sizes[y],3);
fm[nlm]=new light_map(-1,nlmpic,0,0,sizes[x],sizes[y],4);
nlmpic++;
return nlm++;
}
int flyEngine::get_obj_param(char *objname,char *param,char *value)
{
value[0]=0;
bsp_object *obj;
obj=active_obj0;
while(obj)
{
if (!stricmp(objname,obj->long_name))
break;
obj=(bsp_object *)obj->next_obj;
}
if (obj==0)
{
obj=stock_obj0;
while(obj)
{
if (!stricmp(objname,obj->long_name))
break;
obj=(bsp_object *)obj->next_obj;
}
}
if (obj==0) return 1;
int i,n;
param_desc pd;
n=obj->get_param_desc(0,0);
for( i=0;i<n;i++ )
{
obj->get_param_desc(i,&pd);
if (!stricmp(pd.name,param))
break;
}
if (i==n)
return 2;
strcpy(value,pd.get_string());
return 0;
}
int flyEngine::set_global_param(char *name,char *value)
{
param_desc pd;
int i,n;
n=get_global_param_desc(0,0);
for( i=0;i<n;i++ )
{
get_global_param_desc(i,&pd);
if (!stricmp(name,pd.name))
break;
}
if (i==n)
return 0;
pd.set_string(value);
if (pd.type=='p' || pd.type=='3' || pd.type=='m')
{
close_texture_cache();
init_texture_cache();
}
bsp_object *obj;
obj=stock_obj0;
while(obj)
{
obj->message(vector(0,0,0),0,FLYOBJM_CHANGEPARAM,-i-1,&pd);
obj=(bsp_object *)obj->next_obj;
}
obj=active_obj0;
while(obj)
{
obj->message(vector(0,0,0),0,FLYOBJM_CHANGEPARAM,-i-1,&pd);
obj=(bsp_object *)obj->next_obj;
}
return 1;
}
int flyEngine::set_obj_param(char *objname,char *param,char *value)
{
bsp_object *obj=stock_obj0;
int ret=0;
while(obj)
{
if (!stricmp(objname,obj->long_name))
break;
obj=(bsp_object *)obj->next_obj;
}
if (obj==0) return 1;
param_desc pd;
int i,j,n;
n=obj->get_param_desc(0,0);
for( i=0;i<n;i++ )
{
obj->get_param_desc(i,&pd);
if (!stricmp(pd.name,param))
break;
}
if (i==n)
return 2;
j=4;
if (pd.type=='d' || pd.type<-255)
{
bsp_object *o=active_obj0;
while(o)
{
if (!stricmp(o->long_name,value))
break;
o=(bsp_object *)o->next_obj;
}
*((bsp_object **)pd.data)=o;
}
else
if (pd.type=='o' || pd.type>255)
{
bsp_object *o=stock_obj0;
while(o)
{
if (!stricmp(o->long_name,value))
break;
o=(bsp_object *)o->next_obj;
}
*((bsp_object **)pd.data)=o;
}
else pd.set_string(value);
switch(pd.type)
{
case 'i':
case 'f':
case 'a':
case 'w':
case 'd':
case 'o':
case 'z':
case 'h':
break;
case 'v':
case 'c':
j=12;
break;
case 's':
j=strlen(value)+1;
break;
case 'p':
case '3':
case 'm':
close_texture_cache();
init_texture_cache();
break;
default:
return 3;
}
obj->message(vector(0,0,0),0,FLYOBJM_CHANGEPARAM,0,0);
char *data=(char *)pd.data;
obj=active_obj0;
while(obj)
{
if (!stricmp(objname,obj->long_name))
{
obj->get_param_desc(i,&pd);
memcpy(pd.data,data,j);
obj->message(vector(0,0,0),0,FLYOBJM_CHANGEPARAM,i,&pd);
}
obj=(bsp_object *)obj->next_obj;
}
return ret;
}
int flyEngine::get_global_param_desc(int i,param_desc *pd)
{
if (pd!=0)
switch(i)
{
case 0:
pd->type='c';
pd->data=&background;
strcpy(pd->name,"background");
break;
case 1:
pd->type='b';
pd->data=&bspfile;
strcpy(pd->name,"bspfile");
break;
case 2:
pd->type='f';
pd->data=&viewmindist;
strcpy(pd->name,"viewmindist");
break;
case 3:
pd->type='f';
pd->data=&viewmaxdist;
strcpy(pd->name,"viewmaxdist");
break;
case 4:
pd->type='f';
pd->data=&camangle;
strcpy(pd->name,"camangle");
break;
case 5:
pd->type='d';
pd->data=&cam;
strcpy(pd->name,"camera");
break;
case 6:
pd->type='d';
pd->data=&player;
strcpy(pd->name,"player");
break;
case 7:
pd->type=' ';
pd->data=0;
strcpy(pd->name,"");
break;
case 8:
pd->type='i';
pd->data=&amblight;
strcpy(pd->name,"amblight");
break;
case 9:
pd->type='f';
pd->data=&curveerr;
strcpy(pd->name,"curveerr");
break;
case 10:
pd->type='f';
pd->data=&geomdetail;
strcpy(pd->name,"geomdetail");
break;
case 11:
pd->type='f';
pd->data=&lmpxsize;
strcpy(pd->name,"lmpxsize");
break;
case 12:
pd->type='i';
pd->data=&mapmode;
strcpy(pd->name,"mapmode");
break;
case 13:
pd->type='i';
pd->data=&mpdelay;
strcpy(pd->name,"mpdelay");
break;
case 14:
pd->type='c';
pd->data=&shadowcolor;
strcpy(pd->name,"shadowcolor");
break;
case 15:
pd->type='f';
pd->data=&shadowdepth;
strcpy(pd->name,"shadowdepth");
break;
case 16:
pd->type=' ';
pd->data=0;
strcpy(pd->name,"");
break;
case 17:
pd->type='p';
pd->data=&consolepic;
strcpy(pd->name,"consolepic");
break;
case 18:
pd->type='p';
pd->data=&fontspic;
strcpy(pd->name,"fontspic");
break;
case 19:
pd->type='p';
pd->data=&intropic;
strcpy(pd->name,"intropic");
break;
case 20:
pd->type='p';
pd->data=&crosshairpic;
strcpy(pd->name,"crosshairpic");
break;
case 21:
pd->type='i';
pd->data=&crosshairsize;
strcpy(pd->name,"crosshairsize");
break;
case 22:
pd->type='p';
pd->data=&cartoonpicbsp;
strcpy(pd->name,"cartoonpicbsp");
break;
case 23:
pd->type='p';
pd->data=&cartoonpic;
strcpy(pd->name,"cartoonpic");
break;
case 24:
pd->type='c';
pd->data=&cartooncolor;
strcpy(pd->name,"cartooncolor");
break;
case 25:
pd->type='f';
pd->data=&cartoonwidth;
strcpy(pd->name,"cartoonwidth");
break;
case 26:
pd->type='p';
pd->data=&detailpic;
strcpy(pd->name,"detailpic");
break;
case 27:
pd->type='f';
pd->data=&detailtile;
strcpy(pd->name,"detailtile");
break;
case 28:
pd->type=' ';
pd->data=0;
strcpy(pd->name,"");
break;
case 29:
pd->type='i';
pd->data=&antialias;
strcpy(pd->name,"antialias");
break;
case 30:
pd->type='i';
pd->data=&clearbk;
strcpy(pd->name,"clearbk");
break;
case 31:
pd->type='i';
pd->data=&fog;
strcpy(pd->name,"fog");
break;
case 32:
pd->type='i';
pd->data=&hwlights;
strcpy(pd->name,"hwlights");
break;
case 33:
pd->type='i';
pd->data=&mouse;
strcpy(pd->name,"mouse");
break;
case 34:
pd->type='i';
pd->data=&mipmap;
strcpy(pd->name,"mipmap");
break;
case 35:
pd->type='i';
pd->data=&multitexture;
strcpy(pd->name,"multitexture");
break;
case 36:
pd->type='i';
pd->data=&mute;
strcpy(pd->name,"mute");
break;
case 37:
pd->type='i';
pd->data=&nodeonly;
strcpy(pd->name,"nodeonly");
break;
case 38:
pd->type='i';
pd->data=&pvsoff;
strcpy(pd->name,"pvsoff");
break;
case 39:
pd->type='i';
pd->data=&shadows;
strcpy(pd->name,"shadows");
break;
case 40:
pd->type='i';
pd->data=&status;
strcpy(pd->name,"status");
break;
case 41:
pd->type='i';
pd->data=&stencil;
strcpy(pd->name,"stencil");
break;
case 42:
pd->type='i';
pd->data=&textfilter;
strcpy(pd->name,"textfilter");
break;
case 43:
pd->type='i';
pd->data=&wireframe;
strcpy(pd->name,"wireframe");
break;
}
return 44;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -