📄 flyengine.cpp
字号:
{
picture *p=new picture;
char name[256];
strcpy(name,flydatapath);
strcat(name,"maps\\");
strcat(name,file);
if (p->LoadPIC(name))
{
piclib[npiclib]=p;
strcpy(piclib[npiclib]->name,file);
return npiclib++;
}
else
{
delete p;
return -1;
}
}
return j;
}
int flyEngine::load_pictures(char *namef)
{
fly_pak fp;
int i,n;
char name[256],str[256];
if(!fp.open(namef))
return 0;
n=fp.get_int();
fp.get_string(str);
for(i=0;i<n;i++)
{
fp.get_string(str);
piclib[i]=new picture;
strcpy(name,flydatapath);
strcat(name,"maps\\");
strcat(name,str);
piclib[npiclib+i]->LoadPIC(name);
strcpy(piclib[npiclib+i]->name,str);
}
npiclib+=n;
return 1;
}
int flyEngine::load_bsp(char *file)
{
unsigned char uc;
int w[3];
int i,nv;
fly_pak fp;
if (!fp.open(file))
return 0;
fp.read(&nv,sizeof(int));
nvert=abs(nv);
vert=new vector[nvert];
for( i=0;i<nvert;i++ )
fp.read(&vert[i],3*sizeof(float));
if (nv<0)
{
vertcolor=new vector[nvert];
for( i=0;i<nvert;i++ )
{
fp.read(&uc,1);
vertcolor[i].x=uc/255.0f;
fp.read(&uc,1);
vertcolor[i].y=uc/255.0f;
fp.read(&uc,1);
vertcolor[i].z=uc/255.0f;
fp.read(&uc,1);
vertcolor[i].w=1.0f;
}
}
fp.read(&nfaces,sizeof(int));
faces=new face[nfaces];
facedraw=new int[nfaces];
facedrawtransp=new int[nfaces];
for( i=0;i<nfaces;i++ )
{
fp.read(w,sizeof(int)*3);
faces[i].vert[0]=&vert[w[0]];
faces[i].vert[1]=&vert[w[1]];
faces[i].vert[2]=&vert[w[2]];
fp.read(&faces[i].texpic,sizeof(int));
fp.read(&faces[i].emmradius,sizeof(float));
fp.read(faces[i].uv,sizeof(float)*6);
fp.read(&uc,1);
faces[i].color.x=uc/255.0f;
fp.read(&uc,1);
faces[i].color.y=uc/255.0f;
fp.read(&uc,1);
faces[i].color.z=uc/255.0f;
fp.read(&uc,1);
faces[i].color.w=uc/255.0f;
faces[i].indx=i;
}
load_bsp(&bsp,&fp);
fp.close();
compute_normals();
return 1;
}
void flyEngine::load_bsp(bsp_node **n,fly_pak *fp)
{
char c;
int f,i;
int w;
fp->read(&c,1);
if (c==0)
return;
*n=new bsp_node;
fp->read(&(*n)->leaf,sizeof(int));
fp->read(&(*n)->normal,3*sizeof(float));
fp->read(&(*n)->d0,sizeof(float));
fp->read(&f,sizeof(int));
if (f)
{
static_mesh *so=new static_mesh;
so->objmesh->pivotpos.null();
so->objmesh->nf=f;
so->objmesh->faces=new face *[so->objmesh->nf];
for( i=0;i<so->objmesh->nf;i++ )
{
fp->read(&w,sizeof(int));
so->objmesh->faces[i]=&faces[w];
so->objmesh->faces[i]->lastdraw=0;
}
so->objmesh->compute_normals(MESH_FACENORM|MESH_VERTNORM|MESH_BBOX);
so->next_elem=(*n)->elem;
(*n)->elem=so;
(*n)->last_elem=&so->next_elem;
}
load_bsp(&(*n)->child[0],fp);
load_bsp(&(*n)->child[1],fp);
}
void flyEngine::save_bsp(bsp_node *n,FILE *fp)
{
char c;
int i;
int w;
if (n==0)
{
c=0;
fwrite(&c,1,1,fp);
return;
}
c=1;
fwrite(&c,1,1,fp);
fwrite(&n->leaf,1,sizeof(int),fp);
fwrite(&n->normal, 3, sizeof(float), fp);
fwrite(&n->d0, 1, sizeof(float), fp);
bsp_object *e=n->elem;
while(e)
{
if (e->type==TYPE_STATIC_MESH)
break;
e=e->next_elem;
}
static_mesh *so=(static_mesh *)e;
if (so)
{
fwrite(&so->objmesh->nf,1,sizeof(int),fp);
for( i=0;i<so->objmesh->nf;i++ )
{
w=so->objmesh->faces[i]->indx;
fwrite(&w,1,sizeof(int),fp);
}
}
else
{
i=0;
fwrite(&i,1,sizeof(int),fp);
}
save_bsp(n->child[0],fp);
save_bsp(n->child[1],fp);
}
int flyEngine::save_bsp(char *file)
{
if (bsp==0)
return 0;
FILE *fp;
unsigned char uc;
int w[3];
int i,nv;
fp=fopen(file,"wb");
if (!fp)
return 0;
if (vertcolor)
nv=-nvert;
else nv=nvert;
fwrite(&nv,1,sizeof(int),fp);
for( i=0;i<nvert;i++ )
fwrite(&vert[i],3,sizeof(float),fp);
if (nv<0)
for( i=0;i<nvert;i++ )
{
uc=(unsigned char)(vertcolor[i].x*255);
fwrite(&uc,1,1,fp);
uc=(unsigned char)(vertcolor[i].y*255);
fwrite(&uc,1,1,fp);
uc=(unsigned char)(vertcolor[i].z*255);
fwrite(&uc,1,1,fp);
uc=255;
fwrite(&uc,1,1,fp);
}
fwrite(&nfaces,1,sizeof(int),fp);
for( i=0;i<nfaces;i++ )
{
faces[i].indx=i;
w[0]=(int)(faces[i].vert[0]-vert);
w[1]=(int)(faces[i].vert[1]-vert);
w[2]=(int)(faces[i].vert[2]-vert);
fwrite(w,sizeof(int),3,fp);
fwrite(&faces[i].texpic,sizeof(int),1,fp);
fwrite(&faces[i].emmradius,sizeof(float),1,fp);
fwrite(faces[i].uv,sizeof(float),6,fp);
uc=(unsigned char)(faces[i].color.x*255);
fwrite(&uc,1,1,fp);
uc=(unsigned char)(faces[i].color.y*255);
fwrite(&uc,1,1,fp);
uc=(unsigned char)(faces[i].color.z*255);
fwrite(&uc,1,1,fp);
uc=(unsigned char)(faces[i].color.w*255);
fwrite(&uc,1,1,fp);
}
save_bsp(bsp,fp);
fclose(fp);
return 1;
}
int flyEngine::load_lightmaps(char *file)
{
if (nfaces==0)
return 0;
int i,x,y,sx,sy,f,p;
fly_pak fp;
if (!fp.open(file)) return 0;
fp.read(&i,sizeof(int));
if (i!=nfaces)
{ fp.close(); return 0;};
for( i=0;i<nfaces;i++ )
{
fp.read(&faces[i].lm,sizeof(int));
fp.read(&faces[i].lmuv,sizeof(float)*6);
}
fp.read(&nlmpic,sizeof(int));
for( i=0;i<nlmpic;i++ )
{
fp.read(&sx,sizeof(int));
fp.read(&sy,sizeof(int));
lmpic[i]=new light_map_pic(sx,sy);
fp.read(lmpic[i]->bmp,lmpic[i]->bytesxy);
}
fp.read(&nlm,sizeof(int));
for( i=0;i<nlm;i++ )
{
fp.read(&f,sizeof(int));
fp.read(&p,sizeof(int));
fp.read(&x,sizeof(int));
fp.read(&y,sizeof(int));
fp.read(&sx,sizeof(int));
fp.read(&sy,sizeof(int));
lm[i]=new light_map(f,p,x,y,sx,sy,3);
lm[i]->load(lmpic[p]);
}
fp.close();
for( i=0;i<nlmpic;i++ )
{
fmpic[i]=new light_map_pic(lmpic[i]->sizex,lmpic[i]->sizey,4);
memset(fmpic[i]->bmp,0,fmpic[i]->bytesxy);
}
for( i=0;i<nlm;i++ )
{
fm[i]=new light_map(lm[i]->facenum,lm[i]->pic,lm[i]->offsetx,lm[i]->offsety,lm[i]->sizex,lm[i]->sizey,4);
memset(fm[i]->bmp,0,fm[i]->bytesxy);
if (lm[i]->facenum!=-1)
lm[i]->set_base(&faces[lm[i]->facenum],lmpic[lm[i]->pic]);
if (fm[i]->facenum!=-1)
fm[i]->set_base(&faces[fm[i]->facenum],fmpic[fm[i]->pic]);
}
return 1;
}
int flyEngine::save_lightmaps(char *file)
{
if (nfaces==0)
return 0;
FILE *fp;
int i;
fp=fopen(file,"wb");
if (fp==0) return 0;
fwrite(&nfaces,1,sizeof(int),fp);
for (i=0;i<nfaces;i++ )
{
fwrite(&faces[i].lm,sizeof(int),1,fp);
fwrite(&faces[i].lmuv,sizeof(int),6,fp);
}
fwrite(&nlmpic,1,sizeof(int),fp);
for( i=0;i<nlmpic;i++ )
{
fwrite(&lmpic[i]->sizex,sizeof(int),1,fp);
fwrite(&lmpic[i]->sizey,sizeof(int),1,fp);
fwrite(lmpic[i]->bmp,lmpic[i]->bytesxy,1,fp);
}
fwrite(&nlm,1,sizeof(int),fp);
for( i=0;i<nlm;i++ )
{
fwrite(&lm[i]->facenum,sizeof(int),1,fp);
fwrite(&lm[i]->pic,sizeof(int),1,fp);
fwrite(&lm[i]->offsetx,sizeof(int),2,fp);
fwrite(&lm[i]->sizex,sizeof(int),2,fp);
}
fclose(fp);
return 1;
}
int flyEngine::load_pvs(char *file)
{
int i;
fly_pak fp;
alloc_pvs((char)255);
if (pvssize==0) return 0;
if (!fp.open(file)) return 0;
fp.read(&i,sizeof(int));
if (i==nleaf)
fp.read(pvs,pvssize);
fp.close();
for( i=0;i<nleaf;i++ )
if (leaf[i]->leaf!=i)
break;
return 1;
}
int flyEngine::save_pvs(char *file)
{
FILE *fp;
if (pvssize==0) return 0;
fp=fopen(file,"wb");
if (fp==0) return 0;
fwrite(&nleaf,1,sizeof(int),fp);
fwrite(pvs,pvssize,1,fp);
fclose(fp);
return 1;
}
void WriteProfileInt(char *sec,char *key,int value)
{
char str[256];
sprintf(str,"%i",value);
WriteProfileString(sec,key,str);
}
int GetProfileInt(char *sec,char *key,int value)
{
char str[256];
GetProfileString(sec,key,"",str,128);
if (str[0]!=0)
sscanf(str,"%i",&value);
return value;
}
bsp_object *flyEngine::get_active_object(char *name)
{
bsp_object *o=active_obj0;
while(o)
{
if (!stricmp(name,o->name))
break;
o=(bsp_object *)o->next_obj;
}
return o;
}
bsp_object *flyEngine::get_stock_object(char *name)
{
if (name[0]==0) return 0;
bsp_object *o=stock_obj0;
while(o)
{
if (!stricmp(name,o->name))
break;
o=(bsp_object *)o->next_obj;
}
return o;
}
bezier_curve *flyEngine::get_bezier_curve(char *name)
{
if (name[0]==0) return 0;
bezier_curve *o=bezier_curve0;
while(o)
{
if (!stricmp(name,o->name))
break;
o=(bezier_curve *)o->next_obj;
}
if (o==0)
{
char tmp[256];
o=new bezier_curve;
strcpy(o->name,name);
strcpy(o->long_name,name);
strcpy(tmp,flydatapath);
strcat(tmp,"objects\\");
strcat(tmp,name);
if (o->load_bez(tmp)==0)
{
delete o;
return 0;
}
o->next_obj=bezier_curve0;
bezier_curve0=o;
}
return o;
}
bezier_patch *flyEngine::get_bezier_patch(char *name)
{
if (name[0]==0) return 0;
bezier_patch *o=bezier_patch0;
while(o)
{
if (!stricmp(name,o->name))
break;
o=(bezier_patch *)o->next_obj;
}
if (o==0)
{
char tmp[256];
o=new bezier_patch;
strcpy(o->name,name);
strcpy(o->long_name,name);
strcpy(tmp,flydatapath);
strcat(tmp,"objects\\");
strcat(tmp,name);
if (o->load_pch(tmp)==0)
{
delete o;
return 0;
}
o->next_obj=bezier_patch0;
bezier_patch0=o;
}
return o;
}
mesh *flyEngine::get_model_object(char *name)
{
if (name[0]==0) return 0;
mesh *o=model_obj0;
while(o)
{
if (!stricmp(name,o->name))
break;
o=(mesh *)o->next_obj;
}
if (o==0)
{
if (strrchr(name,'.'))
if (!stricmp(strrchr(name,'.'),".3ds"))
{
char tmp[256];
o=new mesh;
strcpy(o->name,name);
strcpy(o->long_name,name);
strcpy(tmp,flydatapath);
strcat(tmp,"objects\\");
strcat(tmp,name);
if (o->load_3ds(tmp)==0)
{
delete o;
return 0;
}
o->next_obj=model_obj0;
model_obj0=o;
}
else
if (!stricmp(strrchr(name,'.'),".fao"))
{
char tmp[256];
o=new anim_mesh;
strcpy(o->name,name);
strcpy(o->long_name,name);
strcpy(tmp,flydatapath);
strcat(tmp,"objects\\");
strcat(tmp,name);
if (((anim_mesh *)o)->load_fao(tmp)==0)
{
delete o;
return 0;
}
o->next_obj=model_obj0;
model_obj0=o;
}
}
return o;
}
sound *flyEngine::get_sound_object(char *name)
{
if (name[0]==0) return 0;
sound *s=sound_obj0;
while(s)
{
if (!stricmp(name,s->name))
break;
s=(sound *)s->next_obj;
}
if (s==0)
{
if (strrchr(name,'.'))
if (!stricmp(strrchr(name,'.'),".wav"))
{
char tmp[256];
s=new sound;
strcpy(s->name,name);
strcpy(s->long_name,name);
strcpy(tmp,flydatapath);
strcat(tmp,"sounds\\");
strcat(tmp,name);
if (s->load_wav(tmp)==0)
{
delete s;
return 0;
}
s->next_obj=sound_obj0;
sound_obj0=s;
}
}
return s;
}
bsp_object *flyEngine::get_next_stock_object(bsp_object *o,int type)
{
if (o==0)
o=stock_obj0;
else o=(bsp_object *)o->next_obj;
while(o)
{
if (type==0 || type==o->type)
break;
o=(bsp_object *)o->next_obj;
}
return o;
}
bsp_object *flyEngine::get_next_active_object(bsp_object *o,int type)
{
if (o==0)
o=active_obj0;
else o=(bsp_object *)o->next_obj;
while(o)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -