OpenSceneGraph/src/osgPlugins/bsp/Q3BSPLoad.h
Robert Osfield bf8c3cc07e From Jason Daly, "This is a plugin (two, actually) that will allow OSG to load .bsp map files from Valve's Source Engine games (Half-Life 2, etc.). One plugin (called "vbsp" to distinguish it from the Quake 3 bsp loader) reads the .bsp file itself, and the other ("vtf") reads the texture files.
The set up for this to work is a bit more complex than most files, since the engine expects all files to be in a certain place, and it tends to mix case a lot.  I tried to explain everything in the VBSP_README.txt file."

This plugin has been integrated with the pre-exisiting bsp plugin.
2008-11-24 11:39:02 +00:00

213 lines
3.5 KiB
C++

#ifndef Q3BSPLOAD_H
#define Q3BSPLOAD_H
#include <osg/Vec3f>
#include <osg/GL>
#include <vector>
#include <string>
#include <fstream>
namespace bsp
{
//Directory entry in header
class BSP_DIRECTORY_ENTRY
{
public:
int m_offset;
int m_length;
};
//Types of directory entry
enum BSP_DIRECTORY_ENTRY_TYPE
{
bspEntities=0,
bspTextures,
bspPlanes,
bspNodes,
bspLeaves,
bspLeafFaces,
bspLeafBrushes,
bspModels,
bspBrushes,
bspBrushSides,
bspVertices,
bspMeshIndices,
bspEffect,
bspFaces,
bspLightmaps,
bspLightVols,
bspVisData
};
//BSP file header
class BSP_HEADER
{
public:
char m_string[4];
int m_version;
BSP_DIRECTORY_ENTRY m_directoryEntries[17];
};
//vertex as found in file
class BSP_LOAD_VERTEX
{
public:
osg::Vec3f m_position;
float m_decalS, m_decalT;
float m_lightmapS, m_lightmapT;
osg::Vec3f m_normal;
unsigned char m_color[4];
};
struct BSP_LoadPlane
{
osg::Vec3f m_Normal;
float m_Dist;
};
//face as found in the file
class BSP_LOAD_FACE
{
public:
int m_texture;
int m_effect; // No se usa
int m_type;
int m_firstVertexIndex;
int m_numVertices;
unsigned int m_firstMeshIndex;
unsigned int m_numMeshIndices;
int m_lightmapIndex;
int m_lightmapStart[2]; // No se usa
int m_lightmapSize[2]; // No se usa
//VECTOR3D m_lightmapOrigin; // No se usa
//VECTOR3D m_sTangent, m_tTangent; // No se usa
//VECTOR3D m_normal; // No se usa
osg::Vec3f m_lightmapOrigin; // No se usa
osg::Vec3f m_sTangent, m_tTangent; // No se usa
osg::Vec3f m_normal; // No se usa
int m_patchSize[2];
};
//texture as found in file
class BSP_LOAD_TEXTURE
{
public:
char m_name[64];
int m_flags, m_contents; //unknown, no se usa
};
//lightmap as found in file
class BSP_LOAD_LIGHTMAP
{
public:
unsigned char m_lightmapData[128*128*3];
};
//leaf of bsp tree as found in file
class BSP_LOAD_LEAF
{
public:
int m_cluster; //cluster index for visdata
int m_area; //areaportal area, No se usa
int m_mins[3]; //min x,y,z (bounding box)
int m_maxs[3];
int m_firstLeafFace; //first index in leafFaces array
int m_numFaces;
int m_firstLeafBrush; //first index into leaf brushes array, No se usa
int m_numBrushes; // No se usa
};
//node of BSP tree
class BSP_NODE
{
public:
int m_planeIndex;
int m_front, m_back; //child nodes
int m_mins[3]; //min x,y,z (bounding box) No se usa
int m_maxs[3]; // No se usa
};
//VIS data table
class BSP_VISIBILITY_DATA
{
public:
int m_numClusters;
int m_bytesPerCluster;
std::vector<unsigned char> m_bitset;
};
class Q3BSPLoad
{
public:
bool Load(const std::string& filename, int curveTessellation);
void LoadVertices(std::ifstream& aFile);
void LoadFaces(std::ifstream& aFile, int curveTessellation);
void LoadTextures(std::ifstream& aFile);
void LoadLightmaps(std::ifstream& aFile);
void LoadBSPData(std::ifstream& aFile);
std::string m_entityString;
//header
BSP_HEADER m_header;
// Load Data
std::vector<BSP_LOAD_VERTEX> m_loadVertices;
std::vector<GLuint> m_loadMeshIndices;
std::vector<BSP_LOAD_FACE> m_loadFaces;
std::vector<BSP_LOAD_TEXTURE> m_loadTextures;
std::vector<BSP_LOAD_LIGHTMAP> m_loadLightmaps;
std::vector<BSP_LOAD_LEAF> m_loadLeaves;
std::vector<int> m_loadLeafFaces;
std::vector<BSP_LoadPlane> m_loadPlanes;
std::vector<BSP_NODE> m_loadNodes;
BSP_VISIBILITY_DATA m_loadVisibilityData;
};
}
#endif // Q3BSPLOAD_H