/* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. This file is part of Quake III Arena source code. Quake III Arena source code is free software; you can redistribute it and/or modify it under the terms of the GNU bteral Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Quake III Arena source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU bteral Public License for more details. You should have received a copy of the GNU bteral Public License along with Foobar; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ #ifndef BSP_LOADER_H #define BSP_LOADER_H #include "LinearMath/btAlignedObjectArray.h" #define BSPMAXTOKEN 1024 #define BSPMAX_KEY 32 #define BSPMAX_VALUE 1024 #define BSPCONTENTS_SOLID 1 #define BSPCONTENTS_AREAPORTAL 0x8000 #define BSPLUMP_ENTITIES 0 #define BSPLUMP_SHADERS 1 #define BSPLUMP_PLANES 2 #define BSPLUMP_NODES 3 #define BSPLUMP_LEAFS 4 #define BSPLUMP_LEAFSURFACES 5 #define BSPLUMP_LEAFBRUSHES 6 #define LUMP_MODELS 7 #define LUMP_BRUSHES 8 #define LUMP_BRUSHSIDES 9 #define LUMP_DRAWVERTS 10 #define LUMP_DRAWINDEXES 11 #define LUMP_SURFACES 13 #define LUMP_LIGHTMAPS 14 #define LUMP_LIGHTGRID 15 #define LUMP_VISIBILITY 16 #define HEADER_LUMPS 17 #define MAX_QPATH 64 typedef struct { int fileofs, filelen; } BSPLump; typedef float BSPVector3[3]; typedef struct { int ident; int version; BSPLump lumps[HEADER_LUMPS]; } BSPHeader; typedef struct { float mins[3], maxs[3]; int firstSurface, numSurfaces; int firstBrush, numBrushes; } BSPModel; typedef struct { char shader[MAX_QPATH]; int surfaceFlags; int contentFlags; } BSPShader; typedef struct { float normal[3]; float dist; } BSPPlane; typedef struct { int planeNum; int children[2]; int mins[3]; int maxs[3]; } BSPNode; typedef struct { int cluster; int area; int mins[3]; int maxs[3]; int firstLeafSurface; int numLeafSurfaces; int firstLeafBrush; int numLeafBrushes; } BSPLeaf; typedef struct { int planeNum; int shaderNum; } BSPBrushSide; typedef struct { int firstSide; int numSides; int shaderNum; } BSPBrush; typedef struct BSPPair { struct BSPPair *next; char *key; char *value; } BSPKeyValuePair; typedef struct { BSPVector3 origin; struct bspbrush_s *brushes; struct parseMesh_s *patches; int firstDrawSurf; BSPKeyValuePair *epairs; } BSPEntity; typedef enum { MST_BAD, MST_PLANAR, MST_PATCH, MST_TRIANGLE_SOUP, MST_FLARE } BSPMapSurface; typedef struct { int shaderNum; int fogNum; int surfaceType; int firstVert; int numVerts; int firstIndex; int numIndexes; int lightmapNum; int lightmapX, lightmapY; int lightmapWidth, lightmapHeight; BSPVector3 lightmapOrigin; BSPVector3 lightmapVecs[3]; int patchWidth; int patchHeight; } BSPSurface; ///GPL code from IdSofware to parse a Quake 3 BSP file ///check that your platform define __BIG_ENDIAN__ correctly (in BspLoader.cpp) class BspLoader { int m_Endianness; public: BspLoader(); bool loadBSPFile( void* memoryBuffer); const char* getValueForKey( const BSPEntity *ent, const char *key ) const; bool getVectorForKey( const BSPEntity *ent, const char *key, BSPVector3 vec ); float getFloatForKey( const BSPEntity *ent, const char *key ); void parseEntities( void ); bool findVectorByName(float* outvec,const char* name); const BSPEntity * getEntityByValue( const char* name, const char* value); protected: void parseFromMemory (char *buffer, int size); bool isEndOfScript (bool crossline); bool getToken (bool crossline); char *copystring(const char *s); void stripTrailing( char *e ); BSPKeyValuePair * parseEpair( void ); bool parseEntity( void ); short isLittleShort (short l); int isLittleLong (int l); float isLittleFloat (float l); int isBigLong (int l); short isBigShort (short l); float isBigFloat (float l); void swapBlock( int *block, int sizeOfBlock ); int copyLump( BSPHeader *header, int lump, void *dest, int size ); void swapBSPFile( void ); public: //easier for conversion int m_num_entities; btAlignedObjectArray m_entities; int m_nummodels; btAlignedObjectArray m_dmodels; int m_numShaders; btAlignedObjectArray m_dshaders; int m_entdatasize; btAlignedObjectArray m_dentdata; int m_numleafs; btAlignedObjectArray m_dleafs; int m_numplanes; btAlignedObjectArray m_dplanes; int m_numnodes; btAlignedObjectArray m_dnodes; int m_numleafsurfaces; btAlignedObjectArray m_dleafsurfaces; int m_numleafbrushes; btAlignedObjectArray m_dleafbrushes; int m_numbrushes; btAlignedObjectArray m_dbrushes; int m_numbrushsides; btAlignedObjectArray m_dbrushsides; int m_numLightBytes; btAlignedObjectArray m_lightBytes; int m_numGridPoints; btAlignedObjectArray m_gridData; int m_numVisBytes; btAlignedObjectArray m_visBytes; int m_numDrawIndexes; btAlignedObjectArray m_drawIndexes; int m_numDrawSurfaces; btAlignedObjectArray m_drawSurfaces; enum { BSP_LITTLE_ENDIAN = 0, BSP_BIG_ENDIAN = 1 }; //returns machines big endian / little endian // int getMachineEndianness(); inline int machineEndianness() { return m_Endianness; } }; #endif //BSP_LOADER_H