Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

l_bsp_hl.c

Go to the documentation of this file.
00001 /*
00002 ===========================================================================
00003 Copyright (C) 1999-2005 Id Software, Inc.
00004 
00005 This file is part of Quake III Arena source code.
00006 
00007 Quake III Arena source code is free software; you can redistribute it
00008 and/or modify it under the terms of the GNU General Public License as
00009 published by the Free Software Foundation; either version 2 of the License,
00010 or (at your option) any later version.
00011 
00012 Quake III Arena source code is distributed in the hope that it will be
00013 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Foobar; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 ===========================================================================
00021 */
00022 #include "l_cmd.h"
00023 #include "l_math.h"
00024 #include "l_mem.h"
00025 #include "l_log.h"
00026 #include "../botlib/l_script.h"
00027 #include "l_bsp_hl.h"
00028 #include "l_bsp_ent.h"
00029 
00030 //=============================================================================
00031 
00032 int             hl_nummodels;
00033 hl_dmodel_t     *hl_dmodels;//[HL_MAX_MAP_MODELS];
00034 int             hl_dmodels_checksum;
00035 
00036 int             hl_visdatasize;
00037 byte                *hl_dvisdata;//[HL_MAX_MAP_VISIBILITY];
00038 int             hl_dvisdata_checksum;
00039 
00040 int             hl_lightdatasize;
00041 byte                *hl_dlightdata;//[HL_MAX_MAP_LIGHTING];
00042 int             hl_dlightdata_checksum;
00043 
00044 int             hl_texdatasize;
00045 byte                *hl_dtexdata;//[HL_MAX_MAP_MIPTEX]; // (dmiptexlump_t)
00046 int             hl_dtexdata_checksum;
00047 
00048 int             hl_entdatasize;
00049 char                *hl_dentdata;//[HL_MAX_MAP_ENTSTRING];
00050 int             hl_dentdata_checksum;
00051 
00052 int             hl_numleafs;
00053 hl_dleaf_t      *hl_dleafs;//[HL_MAX_MAP_LEAFS];
00054 int             hl_dleafs_checksum;
00055 
00056 int             hl_numplanes;
00057 hl_dplane_t     *hl_dplanes;//[HL_MAX_MAP_PLANES];
00058 int             hl_dplanes_checksum;
00059 
00060 int             hl_numvertexes;
00061 hl_dvertex_t    *hl_dvertexes;//[HL_MAX_MAP_VERTS];
00062 int             hl_dvertexes_checksum;
00063 
00064 int             hl_numnodes;
00065 hl_dnode_t      *hl_dnodes;//[HL_MAX_MAP_NODES];
00066 int             hl_dnodes_checksum;
00067 
00068 int             hl_numtexinfo;
00069 hl_texinfo_t    *hl_texinfo;//[HL_MAX_MAP_TEXINFO];
00070 int             hl_texinfo_checksum;
00071 
00072 int             hl_numfaces;
00073 hl_dface_t      *hl_dfaces;//[HL_MAX_MAP_FACES];
00074 int             hl_dfaces_checksum;
00075 
00076 int             hl_numclipnodes;
00077 hl_dclipnode_t  *hl_dclipnodes;//[HL_MAX_MAP_CLIPNODES];
00078 int             hl_dclipnodes_checksum;
00079 
00080 int             hl_numedges;
00081 hl_dedge_t      *hl_dedges;//[HL_MAX_MAP_EDGES];
00082 int             hl_dedges_checksum;
00083 
00084 int             hl_nummarksurfaces;
00085 unsigned short  *hl_dmarksurfaces;//[HL_MAX_MAP_MARKSURFACES];
00086 int             hl_dmarksurfaces_checksum;
00087 
00088 int             hl_numsurfedges;
00089 int             *hl_dsurfedges;//[HL_MAX_MAP_SURFEDGES];
00090 int             hl_dsurfedges_checksum;
00091 
00092 //int               num_entities;
00093 //entity_t          entities[HL_MAX_MAP_ENTITIES];
00094 
00095 
00096 //#ifdef //ME
00097 
00098 int hl_bspallocated = false;
00099 int hl_allocatedbspmem = 0;
00100 
00101 void HL_AllocMaxBSP(void)
00102 {
00103     //models
00104     hl_nummodels = 0;
00105     hl_dmodels = (hl_dmodel_t *) GetMemory(HL_MAX_MAP_MODELS * sizeof(hl_dmodel_t));
00106     hl_allocatedbspmem = HL_MAX_MAP_MODELS * sizeof(hl_dmodel_t);
00107     //visibility
00108     hl_visdatasize = 0;
00109     hl_dvisdata = (byte *) GetMemory(HL_MAX_MAP_VISIBILITY * sizeof(byte));
00110     hl_allocatedbspmem += HL_MAX_MAP_VISIBILITY * sizeof(byte);
00111     //light data
00112     hl_lightdatasize = 0;
00113     hl_dlightdata = (byte *) GetMemory(HL_MAX_MAP_LIGHTING * sizeof(byte));
00114     hl_allocatedbspmem += HL_MAX_MAP_LIGHTING * sizeof(byte);
00115     //texture data
00116     hl_texdatasize = 0;
00117     hl_dtexdata = (byte *) GetMemory(HL_MAX_MAP_MIPTEX * sizeof(byte)); // (dmiptexlump_t)
00118     hl_allocatedbspmem += HL_MAX_MAP_MIPTEX * sizeof(byte);
00119     //entities
00120     hl_entdatasize = 0;
00121     hl_dentdata = (char *) GetMemory(HL_MAX_MAP_ENTSTRING * sizeof(char));
00122     hl_allocatedbspmem += HL_MAX_MAP_ENTSTRING * sizeof(char);
00123     //leaves
00124     hl_numleafs = 0;
00125     hl_dleafs = (hl_dleaf_t *) GetMemory(HL_MAX_MAP_LEAFS * sizeof(hl_dleaf_t));
00126     hl_allocatedbspmem += HL_MAX_MAP_LEAFS * sizeof(hl_dleaf_t);
00127     //planes
00128     hl_numplanes = 0;
00129     hl_dplanes = (hl_dplane_t *) GetMemory(HL_MAX_MAP_PLANES * sizeof(hl_dplane_t));
00130     hl_allocatedbspmem += HL_MAX_MAP_PLANES * sizeof(hl_dplane_t);
00131     //vertexes
00132     hl_numvertexes = 0;
00133     hl_dvertexes = (hl_dvertex_t *) GetMemory(HL_MAX_MAP_VERTS * sizeof(hl_dvertex_t));
00134     hl_allocatedbspmem += HL_MAX_MAP_VERTS * sizeof(hl_dvertex_t);
00135     //nodes
00136     hl_numnodes = 0;
00137     hl_dnodes = (hl_dnode_t *) GetMemory(HL_MAX_MAP_NODES * sizeof(hl_dnode_t));
00138     hl_allocatedbspmem += HL_MAX_MAP_NODES * sizeof(hl_dnode_t);
00139     //texture info
00140     hl_numtexinfo = 0;
00141     hl_texinfo = (hl_texinfo_t *) GetMemory(HL_MAX_MAP_TEXINFO * sizeof(hl_texinfo_t));
00142     hl_allocatedbspmem += HL_MAX_MAP_TEXINFO * sizeof(hl_texinfo_t);
00143     //faces
00144     hl_numfaces = 0;
00145     hl_dfaces = (hl_dface_t *) GetMemory(HL_MAX_MAP_FACES * sizeof(hl_dface_t));
00146     hl_allocatedbspmem += HL_MAX_MAP_FACES * sizeof(hl_dface_t);
00147     //clip nodes
00148     hl_numclipnodes = 0;
00149     hl_dclipnodes = (hl_dclipnode_t *) GetMemory(HL_MAX_MAP_CLIPNODES * sizeof(hl_dclipnode_t));
00150     hl_allocatedbspmem += HL_MAX_MAP_CLIPNODES * sizeof(hl_dclipnode_t);
00151     //edges
00152     hl_numedges = 0;
00153     hl_dedges = (hl_dedge_t *) GetMemory(HL_MAX_MAP_EDGES * sizeof(hl_dedge_t));
00154     hl_allocatedbspmem += HL_MAX_MAP_EDGES, sizeof(hl_dedge_t);
00155     //mark surfaces
00156     hl_nummarksurfaces = 0;
00157     hl_dmarksurfaces = (unsigned short *) GetMemory(HL_MAX_MAP_MARKSURFACES * sizeof(unsigned short));
00158     hl_allocatedbspmem += HL_MAX_MAP_MARKSURFACES * sizeof(unsigned short);
00159     //surface edges
00160     hl_numsurfedges = 0;
00161     hl_dsurfedges = (int *) GetMemory(HL_MAX_MAP_SURFEDGES * sizeof(int));
00162     hl_allocatedbspmem += HL_MAX_MAP_SURFEDGES * sizeof(int);
00163     //print allocated memory
00164     Log_Print("allocated ");
00165     PrintMemorySize(hl_allocatedbspmem);
00166     Log_Print(" of BSP memory\n");
00167 } //end of the function HL_AllocMaxBSP
00168 
00169 void HL_FreeMaxBSP(void)
00170 {
00171     //models
00172     hl_nummodels = 0;
00173     FreeMemory(hl_dmodels);
00174     hl_dmodels = NULL;
00175     //visibility
00176     hl_visdatasize = 0;
00177     FreeMemory(hl_dvisdata);
00178     hl_dvisdata = NULL;
00179     //light data
00180     hl_lightdatasize = 0;
00181     FreeMemory(hl_dlightdata);
00182     hl_dlightdata = NULL;
00183     //texture data
00184     hl_texdatasize = 0;
00185     FreeMemory(hl_dtexdata);
00186     hl_dtexdata = NULL;
00187     //entities
00188     hl_entdatasize = 0;
00189     FreeMemory(hl_dentdata);
00190     hl_dentdata = NULL;
00191     //leaves
00192     hl_numleafs = 0;
00193     FreeMemory(hl_dleafs);
00194     hl_dleafs = NULL;
00195     //planes
00196     hl_numplanes = 0;
00197     FreeMemory(hl_dplanes);
00198     hl_dplanes = NULL;
00199     //vertexes
00200     hl_numvertexes = 0;
00201     FreeMemory(hl_dvertexes);
00202     hl_dvertexes = NULL;
00203     //nodes
00204     hl_numnodes = 0;
00205     FreeMemory(hl_dnodes);
00206     hl_dnodes = NULL;
00207     //texture info
00208     hl_numtexinfo = 0;
00209     FreeMemory(hl_texinfo);
00210     hl_texinfo = NULL;
00211     //faces
00212     hl_numfaces = 0;
00213     FreeMemory(hl_dfaces);
00214     hl_dfaces = NULL;
00215     //clip nodes
00216     hl_numclipnodes = 0;
00217     FreeMemory(hl_dclipnodes);
00218     hl_dclipnodes = NULL;
00219     //edges
00220     hl_numedges = 0;
00221     FreeMemory(hl_dedges);
00222     hl_dedges = NULL;
00223     //mark surfaces
00224     hl_nummarksurfaces = 0;
00225     FreeMemory(hl_dmarksurfaces);
00226     hl_dmarksurfaces = NULL;
00227     //surface edges
00228     hl_numsurfedges = 0;
00229     FreeMemory(hl_dsurfedges);
00230     hl_dsurfedges = NULL;
00231     //
00232     Log_Print("freed ");
00233     PrintMemorySize(hl_allocatedbspmem);
00234     Log_Print(" of BSP memory\n");
00235     hl_allocatedbspmem = 0;
00236 } //end of the function HL_FreeMaxBSP
00237 //#endif //ME
00238 
00239 /*
00240 ===============
00241 FastChecksum
00242 ===============
00243 */
00244 
00245 int FastChecksum(void *buffer, int bytes)
00246 {
00247     int checksum = 0;
00248 
00249     while( bytes-- )  
00250         checksum = (checksum << 4) ^ *((char *)buffer)++;
00251 
00252     return checksum;
00253 }
00254 
00255 /*
00256 ===============
00257 HL_CompressVis
00258 ===============
00259 */
00260 int HL_CompressVis(byte *vis, byte *dest)
00261 {
00262     int     j;
00263     int     rep;
00264     int     visrow;
00265     byte    *dest_p;
00266     
00267     dest_p = dest;
00268     visrow = (hl_numleafs + 7)>>3;
00269     
00270     for (j=0 ; j<visrow ; j++)
00271     {
00272         *dest_p++ = vis[j];
00273         if (vis[j])
00274             continue;
00275 
00276         rep = 1;
00277         for ( j++; j<visrow ; j++)
00278             if (vis[j] || rep == 255)
00279                 break;
00280             else
00281                 rep++;
00282         *dest_p++ = rep;
00283         j--;
00284     }
00285     
00286     return dest_p - dest;
00287 }
00288 
00289 
00290 /*
00291 ===================
00292 HL_DecompressVis
00293 ===================
00294 */
00295 void HL_DecompressVis (byte *in, byte *decompressed)
00296 {
00297     int     c;
00298     byte    *out;
00299     int     row;
00300 
00301     row = (hl_numleafs+7)>>3;   
00302     out = decompressed;
00303 
00304     do
00305     {
00306         if (*in)
00307         {
00308             *out++ = *in++;
00309             continue;
00310         }
00311     
00312         c = in[1];
00313         in += 2;
00314         while (c)
00315         {
00316             *out++ = 0;
00317             c--;
00318         }
00319     } while (out - decompressed < row);
00320 }
00321 
00322 //=============================================================================
00323 
00324 /*
00325 =============
00326 HL_SwapBSPFile
00327 
00328 Byte swaps all data in a bsp file.
00329 =============
00330 */
00331 void HL_SwapBSPFile (qboolean todisk)
00332 {
00333     int i, j, c;
00334     hl_dmodel_t *d;
00335     hl_dmiptexlump_t *mtl;
00336 
00337     
00338 // models   
00339     for (i = 0; i < hl_nummodels; i++)
00340     {
00341         d = &hl_dmodels[i];
00342 
00343         for (j = 0; j < HL_MAX_MAP_HULLS; j++)
00344             d->headnode[j] = LittleLong(d->headnode[j]);
00345 
00346         d->visleafs = LittleLong(d->visleafs);
00347         d->firstface = LittleLong(d->firstface);
00348         d->numfaces = LittleLong(d->numfaces);
00349         
00350         for (j = 0; j < 3; j++)
00351         {
00352             d->mins[j] = LittleFloat(d->mins[j]);
00353             d->maxs[j] = LittleFloat(d->maxs[j]);
00354             d->origin[j] = LittleFloat(d->origin[j]);
00355         }
00356     }
00357 
00358 //
00359 // vertexes
00360 //
00361     for (i = 0; i < hl_numvertexes; i++)
00362     {
00363         for (j = 0; j < 3; j++)
00364             hl_dvertexes[i].point[j] = LittleFloat (hl_dvertexes[i].point[j]);
00365     }
00366         
00367 //
00368 // planes
00369 //  
00370     for (i=0 ; i<hl_numplanes ; i++)
00371     {
00372         for (j=0 ; j<3 ; j++)
00373             hl_dplanes[i].normal[j] = LittleFloat (hl_dplanes[i].normal[j]);
00374         hl_dplanes[i].dist = LittleFloat (hl_dplanes[i].dist);
00375         hl_dplanes[i].type = LittleLong (hl_dplanes[i].type);
00376     }
00377     
00378 //
00379 // texinfos
00380 //  
00381     for (i=0 ; i<hl_numtexinfo ; i++)
00382     {
00383         for (j=0 ; j<8 ; j++)
00384             hl_texinfo[i].vecs[0][j] = LittleFloat (hl_texinfo[i].vecs[0][j]);
00385         hl_texinfo[i].miptex = LittleLong (hl_texinfo[i].miptex);
00386         hl_texinfo[i].flags = LittleLong (hl_texinfo[i].flags);
00387     }
00388     
00389 //
00390 // faces
00391 //
00392     for (i=0 ; i<hl_numfaces ; i++)
00393     {
00394         hl_dfaces[i].texinfo = LittleShort (hl_dfaces[i].texinfo);
00395         hl_dfaces[i].planenum = LittleShort (hl_dfaces[i].planenum);
00396         hl_dfaces[i].side = LittleShort (hl_dfaces[i].side);
00397         hl_dfaces[i].lightofs = LittleLong (hl_dfaces[i].lightofs);
00398         hl_dfaces[i].firstedge = LittleLong (hl_dfaces[i].firstedge);
00399         hl_dfaces[i].numedges = LittleShort (hl_dfaces[i].numedges);
00400     }
00401 
00402 //
00403 // nodes
00404 //
00405     for (i=0 ; i<hl_numnodes ; i++)
00406     {
00407         hl_dnodes[i].planenum = LittleLong (hl_dnodes[i].planenum);
00408         for (j=0 ; j<3 ; j++)
00409         {
00410             hl_dnodes[i].mins[j] = LittleShort (hl_dnodes[i].mins[j]);
00411             hl_dnodes[i].maxs[j] = LittleShort (hl_dnodes[i].maxs[j]);
00412         }
00413         hl_dnodes[i].children[0] = LittleShort (hl_dnodes[i].children[0]);
00414         hl_dnodes[i].children[1] = LittleShort (hl_dnodes[i].children[1]);
00415         hl_dnodes[i].firstface = LittleShort (hl_dnodes[i].firstface);
00416         hl_dnodes[i].numfaces = LittleShort (hl_dnodes[i].numfaces);
00417     }
00418 
00419 //
00420 // leafs
00421 //
00422     for (i=0 ; i<hl_numleafs ; i++)
00423     {
00424         hl_dleafs[i].contents = LittleLong (hl_dleafs[i].contents);
00425         for (j=0 ; j<3 ; j++)
00426         {
00427             hl_dleafs[i].mins[j] = LittleShort (hl_dleafs[i].mins[j]);
00428             hl_dleafs[i].maxs[j] = LittleShort (hl_dleafs[i].maxs[j]);
00429         }
00430 
00431         hl_dleafs[i].firstmarksurface = LittleShort (hl_dleafs[i].firstmarksurface);
00432         hl_dleafs[i].nummarksurfaces = LittleShort (hl_dleafs[i].nummarksurfaces);
00433         hl_dleafs[i].visofs = LittleLong (hl_dleafs[i].visofs);
00434     }
00435 
00436 //
00437 // clipnodes
00438 //
00439     for (i=0 ; i<hl_numclipnodes ; i++)
00440     {
00441         hl_dclipnodes[i].planenum = LittleLong (hl_dclipnodes[i].planenum);
00442         hl_dclipnodes[i].children[0] = LittleShort (hl_dclipnodes[i].children[0]);
00443         hl_dclipnodes[i].children[1] = LittleShort (hl_dclipnodes[i].children[1]);
00444     }
00445 
00446 //
00447 // miptex
00448 //
00449     if (hl_texdatasize)
00450     {
00451         mtl = (hl_dmiptexlump_t *)hl_dtexdata;
00452         if (todisk)
00453             c = mtl->nummiptex;
00454         else
00455             c = LittleLong(mtl->nummiptex);
00456         mtl->nummiptex = LittleLong (mtl->nummiptex);
00457         for (i=0 ; i<c ; i++)
00458             mtl->dataofs[i] = LittleLong(mtl->dataofs[i]);
00459     }
00460     
00461 //
00462 // marksurfaces
00463 //
00464     for (i=0 ; i<hl_nummarksurfaces ; i++)
00465         hl_dmarksurfaces[i] = LittleShort (hl_dmarksurfaces[i]);
00466 
00467 //
00468 // surfedges
00469 //
00470     for (i=0 ; i<hl_numsurfedges ; i++)
00471         hl_dsurfedges[i] = LittleLong (hl_dsurfedges[i]);
00472 
00473 //
00474 // edges
00475 //
00476     for (i=0 ; i<hl_numedges ; i++)
00477     {
00478         hl_dedges[i].v[0] = LittleShort (hl_dedges[i].v[0]);
00479         hl_dedges[i].v[1] = LittleShort (hl_dedges[i].v[1]);
00480     }
00481 } //end of the function HL_SwapBSPFile
00482 
00483 
00484 hl_dheader_t    *hl_header;
00485 int             hl_fileLength;
00486 
00487 int HL_CopyLump (int lump, void *dest, int size, int maxsize)
00488 {
00489     int     length, ofs;
00490 
00491     length = hl_header->lumps[lump].filelen;
00492     ofs = hl_header->lumps[lump].fileofs;
00493     
00494     if (length % size) {
00495         Error ("LoadBSPFile: odd lump size");
00496     }
00497     // somehow things got out of range
00498     if ((length/size) > maxsize) {
00499         printf("WARNING: exceeded max size for lump %d size %d > maxsize %d\n", lump, (length/size), maxsize);
00500         length = maxsize * size;
00501     }
00502     if ( ofs + length > hl_fileLength ) {
00503         printf("WARNING: exceeded file length for lump %d\n", lump);
00504         length = hl_fileLength - ofs;
00505         if ( length <= 0 ) {
00506             return 0;
00507         }
00508     }
00509 
00510     memcpy (dest, (byte *)hl_header + ofs, length);
00511 
00512     return length / size;
00513 }
00514 
00515 /*
00516 =============
00517 HL_LoadBSPFile
00518 =============
00519 */
00520 void    HL_LoadBSPFile (char *filename, int offset, int length)
00521 {
00522     int         i;
00523     
00524 //
00525 // load the file header
00526 //
00527     hl_fileLength = LoadFile (filename, (void **)&hl_header, offset, length);
00528 
00529 // swap the header
00530     for (i=0 ; i< sizeof(hl_dheader_t)/4 ; i++)
00531         ((int *)hl_header)[i] = LittleLong ( ((int *)hl_header)[i]);
00532 
00533     if (hl_header->version != HL_BSPVERSION)
00534         Error ("%s is version %i, not %i", filename, hl_header->version, HL_BSPVERSION);
00535 
00536     hl_nummodels = HL_CopyLump (HL_LUMP_MODELS, hl_dmodels, sizeof(hl_dmodel_t), HL_MAX_MAP_MODELS );
00537     hl_numvertexes = HL_CopyLump (HL_LUMP_VERTEXES, hl_dvertexes, sizeof(hl_dvertex_t), HL_MAX_MAP_VERTS );
00538     hl_numplanes = HL_CopyLump (HL_LUMP_PLANES, hl_dplanes, sizeof(hl_dplane_t), HL_MAX_MAP_PLANES );
00539     hl_numleafs = HL_CopyLump (HL_LUMP_LEAFS, hl_dleafs, sizeof(hl_dleaf_t), HL_MAX_MAP_LEAFS );
00540     hl_numnodes = HL_CopyLump (HL_LUMP_NODES, hl_dnodes, sizeof(hl_dnode_t), HL_MAX_MAP_NODES );
00541     hl_numtexinfo = HL_CopyLump (HL_LUMP_TEXINFO, hl_texinfo, sizeof(hl_texinfo_t), HL_MAX_MAP_TEXINFO );
00542     hl_numclipnodes = HL_CopyLump (HL_LUMP_CLIPNODES, hl_dclipnodes, sizeof(hl_dclipnode_t), HL_MAX_MAP_CLIPNODES );
00543     hl_numfaces = HL_CopyLump (HL_LUMP_FACES, hl_dfaces, sizeof(hl_dface_t), HL_MAX_MAP_FACES );
00544     hl_nummarksurfaces = HL_CopyLump (HL_LUMP_MARKSURFACES, hl_dmarksurfaces, sizeof(hl_dmarksurfaces[0]), HL_MAX_MAP_MARKSURFACES );
00545     hl_numsurfedges = HL_CopyLump (HL_LUMP_SURFEDGES, hl_dsurfedges, sizeof(hl_dsurfedges[0]), HL_MAX_MAP_SURFEDGES );
00546     hl_numedges = HL_CopyLump (HL_LUMP_EDGES, hl_dedges, sizeof(hl_dedge_t), HL_MAX_MAP_EDGES );
00547 
00548     hl_texdatasize = HL_CopyLump (HL_LUMP_TEXTURES, hl_dtexdata, 1, HL_MAX_MAP_MIPTEX );
00549     hl_visdatasize = HL_CopyLump (HL_LUMP_VISIBILITY, hl_dvisdata, 1, HL_MAX_MAP_VISIBILITY );
00550     hl_lightdatasize = HL_CopyLump (HL_LUMP_LIGHTING, hl_dlightdata, 1, HL_MAX_MAP_LIGHTING );
00551     hl_entdatasize = HL_CopyLump (HL_LUMP_ENTITIES, hl_dentdata, 1, HL_MAX_MAP_ENTSTRING );
00552 
00553     FreeMemory(hl_header);      // everything has been copied out
00554         
00555 //
00556 // swap everything
00557 //  
00558     HL_SwapBSPFile (false);
00559 
00560     hl_dmodels_checksum = FastChecksum( hl_dmodels, hl_nummodels*sizeof(hl_dmodels[0]) );
00561     hl_dvertexes_checksum = FastChecksum( hl_dvertexes, hl_numvertexes*sizeof(hl_dvertexes[0]) );
00562     hl_dplanes_checksum = FastChecksum( hl_dplanes, hl_numplanes*sizeof(hl_dplanes[0]) );
00563     hl_dleafs_checksum = FastChecksum( hl_dleafs, hl_numleafs*sizeof(hl_dleafs[0]) );
00564     hl_dnodes_checksum = FastChecksum( hl_dnodes, hl_numnodes*sizeof(hl_dnodes[0]) );
00565     hl_texinfo_checksum = FastChecksum( hl_texinfo, hl_numtexinfo*sizeof(hl_texinfo[0]) );
00566     hl_dclipnodes_checksum = FastChecksum( hl_dclipnodes, hl_numclipnodes*sizeof(hl_dclipnodes[0]) );
00567     hl_dfaces_checksum = FastChecksum( hl_dfaces, hl_numfaces*sizeof(hl_dfaces[0]) );
00568     hl_dmarksurfaces_checksum = FastChecksum( hl_dmarksurfaces, hl_nummarksurfaces*sizeof(hl_dmarksurfaces[0]) );
00569     hl_dsurfedges_checksum = FastChecksum( hl_dsurfedges, hl_numsurfedges*sizeof(hl_dsurfedges[0]) );
00570     hl_dedges_checksum = FastChecksum( hl_dedges, hl_numedges*sizeof(hl_dedges[0]) );
00571     hl_dtexdata_checksum = FastChecksum( hl_dtexdata, hl_numedges*sizeof(hl_dtexdata[0]) );
00572     hl_dvisdata_checksum = FastChecksum( hl_dvisdata, hl_visdatasize*sizeof(hl_dvisdata[0]) );
00573     hl_dlightdata_checksum = FastChecksum( hl_dlightdata, hl_lightdatasize*sizeof(hl_dlightdata[0]) );
00574     hl_dentdata_checksum = FastChecksum( hl_dentdata, hl_entdatasize*sizeof(hl_dentdata[0]) );
00575 
00576 }
00577 
00578 //============================================================================
00579 
00580 FILE        *wadfile;
00581 hl_dheader_t    outheader;
00582 
00583 void HL_AddLump (int lumpnum, void *data, int len)
00584 {
00585     hl_lump_t *lump;
00586 
00587     lump = &hl_header->lumps[lumpnum];
00588     
00589     lump->fileofs = LittleLong( ftell(wadfile) );
00590     lump->filelen = LittleLong(len);
00591     SafeWrite (wadfile, data, (len+3)&~3);
00592 }
00593 
00594 /*
00595 =============
00596 HL_WriteBSPFile
00597 
00598 Swaps the bsp file in place, so it should not be referenced again
00599 =============
00600 */
00601 void HL_WriteBSPFile (char *filename)
00602 {       
00603     hl_header = &outheader;
00604     memset (hl_header, 0, sizeof(hl_dheader_t));
00605     
00606     HL_SwapBSPFile (true);
00607 
00608     hl_header->version = LittleLong (HL_BSPVERSION);
00609     
00610     wadfile = SafeOpenWrite (filename);
00611     SafeWrite (wadfile, hl_header, sizeof(hl_dheader_t));   // overwritten later
00612 
00613     HL_AddLump (HL_LUMP_PLANES, hl_dplanes, hl_numplanes*sizeof(hl_dplane_t));
00614     HL_AddLump (HL_LUMP_LEAFS, hl_dleafs, hl_numleafs*sizeof(hl_dleaf_t));
00615     HL_AddLump (HL_LUMP_VERTEXES, hl_dvertexes, hl_numvertexes*sizeof(hl_dvertex_t));
00616     HL_AddLump (HL_LUMP_NODES, hl_dnodes, hl_numnodes*sizeof(hl_dnode_t));
00617     HL_AddLump (HL_LUMP_TEXINFO, hl_texinfo, hl_numtexinfo*sizeof(hl_texinfo_t));
00618     HL_AddLump (HL_LUMP_FACES, hl_dfaces, hl_numfaces*sizeof(hl_dface_t));
00619     HL_AddLump (HL_LUMP_CLIPNODES, hl_dclipnodes, hl_numclipnodes*sizeof(hl_dclipnode_t));
00620     HL_AddLump (HL_LUMP_MARKSURFACES, hl_dmarksurfaces, hl_nummarksurfaces*sizeof(hl_dmarksurfaces[0]));
00621     HL_AddLump (HL_LUMP_SURFEDGES, hl_dsurfedges, hl_numsurfedges*sizeof(hl_dsurfedges[0]));
00622     HL_AddLump (HL_LUMP_EDGES, hl_dedges, hl_numedges*sizeof(hl_dedge_t));
00623     HL_AddLump (HL_LUMP_MODELS, hl_dmodels, hl_nummodels*sizeof(hl_dmodel_t));
00624 
00625     HL_AddLump (HL_LUMP_LIGHTING, hl_dlightdata, hl_lightdatasize);
00626     HL_AddLump (HL_LUMP_VISIBILITY, hl_dvisdata, hl_visdatasize);
00627     HL_AddLump (HL_LUMP_ENTITIES, hl_dentdata, hl_entdatasize);
00628     HL_AddLump (HL_LUMP_TEXTURES, hl_dtexdata, hl_texdatasize);
00629     
00630     fseek (wadfile, 0, SEEK_SET);
00631     SafeWrite (wadfile, hl_header, sizeof(hl_dheader_t));
00632     fclose (wadfile);   
00633 }
00634 
00635 //============================================================================
00636 
00637 #define ENTRIES(a)      (sizeof(a)/sizeof(*(a)))
00638 #define ENTRYSIZE(a)    (sizeof(*(a)))
00639 
00640 ArrayUsage( char *szItem, int items, int maxitems, int itemsize )
00641 {
00642     float   percentage = maxitems ? items * 100.0 / maxitems : 0.0;
00643 
00644    qprintf("%-12s  %7i/%-7i  %7i/%-7i  (%4.1f%%)", 
00645                 szItem, items, maxitems, items * itemsize, maxitems * itemsize, percentage );
00646     if ( percentage > 80.0 )
00647         qprintf( "VERY FULL!\n" );
00648     else if ( percentage > 95.0 )
00649         qprintf( "SIZE DANGER!\n" );
00650     else if ( percentage > 99.9 )
00651         qprintf( "SIZE OVERFLOW!!!\n" );
00652     else
00653         qprintf( "\n" );
00654     return items * itemsize;
00655 }
00656 
00657 GlobUsage( char *szItem, int itemstorage, int maxstorage )
00658 {
00659     float   percentage = maxstorage ? itemstorage * 100.0 / maxstorage : 0.0;
00660 
00661     qprintf("%-12s     [variable]    %7i/%-7i  (%4.1f%%)", 
00662                 szItem, itemstorage, maxstorage, percentage );
00663     if ( percentage > 80.0 )
00664         qprintf( "VERY FULL!\n" );
00665     else if ( percentage > 95.0 )
00666         qprintf( "SIZE DANGER!\n" );
00667     else if ( percentage > 99.9 )
00668         qprintf( "SIZE OVERFLOW!!!\n" );
00669     else
00670         qprintf( "\n" );
00671     return itemstorage;
00672 }
00673 
00674 /*
00675 =============
00676 HL_PrintBSPFileSizes
00677 
00678 Dumps info about current file
00679 =============
00680 */
00681 void HL_PrintBSPFileSizes(void)
00682 {
00683     int numtextures = hl_texdatasize ? ((hl_dmiptexlump_t*)hl_dtexdata)->nummiptex : 0;
00684     int totalmemory = 0;
00685 
00686     qprintf("\n");
00687     qprintf("Object names  Objects/Maxobjs  Memory / Maxmem  Fullness\n" );
00688     qprintf("------------  ---------------  ---------------  --------\n" );
00689 
00690     totalmemory += ArrayUsage( "models",        hl_nummodels,       ENTRIES(hl_dmodels),        ENTRYSIZE(hl_dmodels) );
00691     totalmemory += ArrayUsage( "planes",        hl_numplanes,       ENTRIES(hl_dplanes),        ENTRYSIZE(hl_dplanes) );
00692     totalmemory += ArrayUsage( "vertexes",      hl_numvertexes, ENTRIES(hl_dvertexes),  ENTRYSIZE(hl_dvertexes) );
00693     totalmemory += ArrayUsage( "nodes",         hl_numnodes,        ENTRIES(hl_dnodes),     ENTRYSIZE(hl_dnodes) );
00694     totalmemory += ArrayUsage( "texinfos",      hl_numtexinfo,      ENTRIES(hl_texinfo),        ENTRYSIZE(hl_texinfo) );
00695     totalmemory += ArrayUsage( "faces",         hl_numfaces,        ENTRIES(hl_dfaces),     ENTRYSIZE(hl_dfaces) );
00696     totalmemory += ArrayUsage( "clipnodes", hl_numclipnodes,    ENTRIES(hl_dclipnodes), ENTRYSIZE(hl_dclipnodes) );
00697     totalmemory += ArrayUsage( "leaves",        hl_numleafs,        ENTRIES(hl_dleafs),     ENTRYSIZE(hl_dleafs) );
00698     totalmemory += ArrayUsage( "marksurfaces",hl_nummarksurfaces,ENTRIES(hl_dmarksurfaces),ENTRYSIZE(hl_dmarksurfaces) );
00699     totalmemory += ArrayUsage( "surfedges", hl_numsurfedges,    ENTRIES(hl_dsurfedges), ENTRYSIZE(hl_dsurfedges) );
00700     totalmemory += ArrayUsage( "edges",         hl_numedges,        ENTRIES(hl_dedges),     ENTRYSIZE(hl_dedges) );
00701 
00702     totalmemory += GlobUsage( "texdata",        hl_texdatasize, sizeof(hl_dtexdata) );
00703     totalmemory += GlobUsage( "lightdata",      hl_lightdatasize,   sizeof(hl_dlightdata) );
00704     totalmemory += GlobUsage( "visdata",        hl_visdatasize, sizeof(hl_dvisdata) );
00705     totalmemory += GlobUsage( "entdata",        hl_entdatasize, sizeof(hl_dentdata) );
00706 
00707     qprintf( "=== Total BSP file data space used: %d bytes ===\n\n", totalmemory );
00708 }
00709 
00710 
00711 
00712 /*
00713 =================
00714 ParseEpair
00715 =================
00716 * /
00717 epair_t *ParseEpair (void)
00718 {
00719     epair_t *e;
00720     
00721     e = malloc (sizeof(epair_t));
00722     memset (e, 0, sizeof(epair_t));
00723     
00724     if (strlen(token) >= MAX_KEY-1)
00725         Error ("ParseEpar: token too long");
00726     e->key = copystring(token);
00727     GetToken (false);
00728     if (strlen(token) >= MAX_VALUE-1)
00729         Error ("ParseEpar: token too long");
00730     e->value = copystring(token);
00731 
00732     return e;
00733 } //*/
00734 
00735 
00736 /*
00737 ================
00738 ParseEntity
00739 ================
00740 * /
00741 qboolean    ParseEntity (void)
00742 {
00743     epair_t     *e;
00744     entity_t    *mapent;
00745 
00746     if (!GetToken (true))
00747         return false;
00748 
00749     if (strcmp (token, "{") )
00750         Error ("ParseEntity: { not found");
00751     
00752     if (num_entities == HL_MAX_MAP_ENTITIES)
00753         Error ("num_entities == HL_MAX_MAP_ENTITIES");
00754 
00755     mapent = &entities[num_entities];
00756     num_entities++;
00757 
00758     do
00759     {
00760         if (!GetToken (true))
00761             Error ("ParseEntity: EOF without closing brace");
00762         if (!strcmp (token, "}") )
00763             break;
00764         e = ParseEpair ();
00765         e->next = mapent->epairs;
00766         mapent->epairs = e;
00767     } while (1);
00768     
00769     return true;
00770 } //*/
00771 
00772 /*
00773 ================
00774 ParseEntities
00775 
00776 Parses the dentdata string into entities
00777 ================
00778 */
00779 void HL_ParseEntities (void)
00780 {
00781     script_t *script;
00782 
00783     num_entities = 0;
00784     script = LoadScriptMemory(hl_dentdata, hl_entdatasize, "*Half-Life bsp file");
00785     SetScriptFlags(script, SCFL_NOSTRINGWHITESPACES |
00786                                     SCFL_NOSTRINGESCAPECHARS);
00787 
00788     while(ParseEntity(script))
00789     {
00790     } //end while
00791 
00792     FreeScript(script);
00793 } //end of the function HL_ParseEntities
00794 
00795 
00796 /*
00797 ================
00798 UnparseEntities
00799 
00800 Generates the dentdata string from all the entities
00801 ================
00802 */
00803 void HL_UnparseEntities (void)
00804 {
00805     char *buf, *end;
00806     epair_t *ep;
00807     char line[2048];
00808     int i;
00809     
00810     buf = hl_dentdata;
00811     end = buf;
00812     *end = 0;
00813     
00814     for (i=0 ; i<num_entities ; i++)
00815     {
00816         ep = entities[i].epairs;
00817         if (!ep)
00818             continue;   // ent got removed
00819         
00820         strcat (end,"{\n");
00821         end += 2;
00822                 
00823         for (ep = entities[i].epairs ; ep ; ep=ep->next)
00824         {
00825             sprintf (line, "\"%s\" \"%s\"\n", ep->key, ep->value);
00826             strcat (end, line);
00827             end += strlen(line);
00828         }
00829         strcat (end,"}\n");
00830         end += 2;
00831 
00832         if (end > buf + HL_MAX_MAP_ENTSTRING)
00833             Error ("Entity text too long");
00834     }
00835     hl_entdatasize = end - buf + 1;
00836 } //end of the function HL_UnparseEntities
00837 
00838 
00839 /*
00840 void    SetKeyValue (entity_t *ent, char *key, char *value)
00841 {
00842     epair_t *ep;
00843     
00844     for (ep=ent->epairs ; ep ; ep=ep->next)
00845         if (!strcmp (ep->key, key) )
00846         {
00847             free (ep->value);
00848             ep->value = copystring(value);
00849             return;
00850         }
00851     ep = malloc (sizeof(*ep));
00852     ep->next = ent->epairs;
00853     ent->epairs = ep;
00854     ep->key = copystring(key);
00855     ep->value = copystring(value);
00856 }
00857 
00858 char    *ValueForKey (entity_t *ent, char *key)
00859 {
00860     epair_t *ep;
00861     
00862     for (ep=ent->epairs ; ep ; ep=ep->next)
00863         if (!strcmp (ep->key, key) )
00864             return ep->value;
00865     return "";
00866 }
00867 
00868 vec_t   FloatForKey (entity_t *ent, char *key)
00869 {
00870     char    *k;
00871     
00872     k = ValueForKey (ent, key);
00873     return atof(k);
00874 }
00875 
00876 void    GetVectorForKey (entity_t *ent, char *key, vec3_t vec)
00877 {
00878     char    *k;
00879     double  v1, v2, v3;
00880 
00881     k = ValueForKey (ent, key);
00882 // scanf into doubles, then assign, so it is vec_t size independent
00883     v1 = v2 = v3 = 0;
00884     sscanf (k, "%lf %lf %lf", &v1, &v2, &v3);
00885     vec[0] = v1;
00886     vec[1] = v2;
00887     vec[2] = v3;
00888 } //*/

Generated on Thu Aug 25 12:37:15 2005 for Quake III Arena by  doxygen 1.3.9.1