bugfix:
- fix redundant checks against nullptr ( see https://github.com/assimp/assimp/issues/241 ). Signed-off-by: Kim Kulling <kim.kulling@googlemail.com>pull/251/head
parent
f9d5852ef9
commit
38de6a658d
|
@ -42,10 +42,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace Assimp
|
namespace Assimp {
|
||||||
{
|
namespace Q3BSP {
|
||||||
namespace Q3BSP
|
|
||||||
{
|
|
||||||
|
|
||||||
static const unsigned int CE_BSP_LIGHTMAPWIDTH = 128;
|
static const unsigned int CE_BSP_LIGHTMAPWIDTH = 128;
|
||||||
static const unsigned int CE_BSP_LIGHTMAPHEIGHT = 128;
|
static const unsigned int CE_BSP_LIGHTMAPHEIGHT = 128;
|
||||||
|
@ -54,8 +52,7 @@ static const unsigned int CE_BSP_LIGHTMAPSIZE = 128*128*3; ///< = 128( width ) *
|
||||||
static const int VERION_Q3LEVEL = 46; ///< Supported version.
|
static const int VERION_Q3LEVEL = 46; ///< Supported version.
|
||||||
|
|
||||||
/// Geometric type enumeration
|
/// Geometric type enumeration
|
||||||
enum Q3BSPGeoType
|
enum Q3BSPGeoType {
|
||||||
{
|
|
||||||
Polygon = 1,
|
Polygon = 1,
|
||||||
Patch,
|
Patch,
|
||||||
TriangleMesh,
|
TriangleMesh,
|
||||||
|
@ -63,25 +60,23 @@ enum Q3BSPGeoType
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Integer vector.
|
/// Integer vector.
|
||||||
struct ceVec3i
|
struct ceVec3i {
|
||||||
{
|
|
||||||
int x, y, z;
|
int x, y, z;
|
||||||
ceVec3i(): x( 0 ), y( 0 ), z( 0 ) { /* empty */ }
|
ceVec3i(): x( 0 ), y( 0 ), z( 0 ) { /* empty */ }
|
||||||
ceVec3i( int iX, int iY=0, int iZ=0) : x( iX ), y( iY ), z( iZ ) { /* empty */ }
|
ceVec3i( int iX, int iY=0, int iZ=0) : x( iX ), y( iY ), z( iZ ) { /* empty */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Fileheader
|
/// the file header
|
||||||
struct sQ3BSPHeader
|
struct sQ3BSPHeader {
|
||||||
{
|
char strID[ 4 ]; ///< Should be "IBSP"
|
||||||
char strID[ 4 ]; //!< Should be "IBSP"
|
int iVersion; ///< 46 for standard levels
|
||||||
int iVersion; //!< 46 for standard levels
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Descripes an entry.
|
/// Describes an entry.
|
||||||
struct sQ3BSPLump
|
struct sQ3BSPLump
|
||||||
{
|
{
|
||||||
int iOffset; ///< Offset from startpointer of file
|
int iOffset; ///< Offset from start pointer of file
|
||||||
int iSize; ///< Size fo part
|
int iSize; ///< Size of part
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vec2f
|
struct vec2f
|
||||||
|
@ -108,47 +103,42 @@ struct sQ3BSPVertex
|
||||||
struct sQ3BSPFace
|
struct sQ3BSPFace
|
||||||
{
|
{
|
||||||
int iTextureID; ///< Index in texture array
|
int iTextureID; ///< Index in texture array
|
||||||
int iEffect; ///< Index in effectarray (-1 = no effect)
|
int iEffect; ///< Index in effect array (-1 = no effect)
|
||||||
int iType; ///< 1=Polygon, 2=Patch, 3=Mesh, 4=Billboard
|
int iType; ///< 1=Polygon, 2=Patch, 3=Mesh, 4=Billboard
|
||||||
int iVertexIndex; ///< Start index of polygon
|
int iVertexIndex; ///< Start index of polygon
|
||||||
int iNumOfVerts; ///< Number of vertices
|
int iNumOfVerts; ///< Number of vertices
|
||||||
int iFaceVertexIndex; ///< Index of first mesh vertex
|
int iFaceVertexIndex; ///< Index of first mesh vertex
|
||||||
int iNumOfFaceVerts; ///< Anzahl der Meshvertices
|
int iNumOfFaceVerts; ///< number of mesh vertices
|
||||||
int iLightmapID; ///< Index to the lightmap array
|
int iLightmapID; ///< Index to the light-map array
|
||||||
int iLMapCorner[ 2 ]; ///< Die Ecke der Lightmap in der Textur
|
int iLMapCorner[ 2 ]; ///< edge of the light-map in texture
|
||||||
int iLMapSize[ 2 ]; ///< Size of the lightmap stored on the texture
|
int iLMapSize[ 2 ]; ///< Size of the light-map stored on the texture
|
||||||
vec3f vLMapPos; ///< 3D-Ursprung der Lightmap
|
vec3f vLMapPos; ///< 3D origin of the light-map
|
||||||
vec3f vLMapVecs[ 2 ]; ///< 3D-s-t-Vektoren
|
vec3f vLMapVecs[ 2 ]; ///< 3D-s-t-vectors
|
||||||
vec3f vNormal; ///< Polygonnormale
|
vec3f vNormal; ///< Polygon normals
|
||||||
int patchWidth, patchHeight; ///< bezier patch
|
int patchWidth, patchHeight; ///< bezier patch
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A quake3 texture name.
|
/// A quake3 texture name.
|
||||||
struct sQ3BSPTexture
|
struct sQ3BSPTexture {
|
||||||
{
|
char strName[ 64 ]; ///< Name of the texture without extension
|
||||||
char strName[ 64 ]; ///< Name of the texture without extention
|
|
||||||
int iFlags; ///< Not used
|
int iFlags; ///< Not used
|
||||||
int iContents; ///< Not used
|
int iContents; ///< Not used
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A lightmap of the level, size 128 x 128, RGB components.
|
/// A light-map of the level, size 128 x 128, RGB components.
|
||||||
struct sQ3BSPLightmap
|
struct sQ3BSPLightmap {
|
||||||
{
|
|
||||||
unsigned char bLMapData[ CE_BSP_LIGHTMAPSIZE ];
|
unsigned char bLMapData[ CE_BSP_LIGHTMAPSIZE ];
|
||||||
sQ3BSPLightmap()
|
sQ3BSPLightmap() {
|
||||||
{
|
::memset(bLMapData, 0, CE_BSP_LIGHTMAPSIZE );
|
||||||
memset(bLMapData, 0, CE_BSP_LIGHTMAPSIZE );
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SubPatch
|
struct SubPatch {
|
||||||
{
|
|
||||||
std::vector<size_t> indices;
|
std::vector<size_t> indices;
|
||||||
int lightmapID;
|
int lightmapID;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eLumps
|
enum eLumps {
|
||||||
{
|
|
||||||
kEntities = 0,
|
kEntities = 0,
|
||||||
kTextures,
|
kTextures,
|
||||||
kPlanes,
|
kPlanes,
|
||||||
|
@ -169,8 +159,7 @@ enum eLumps
|
||||||
kMaxLumps
|
kMaxLumps
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Q3BSPModel
|
struct Q3BSPModel {
|
||||||
{
|
|
||||||
std::vector<unsigned char> m_Data;
|
std::vector<unsigned char> m_Data;
|
||||||
std::vector<sQ3BSPLump*> m_Lumps;
|
std::vector<sQ3BSPLump*> m_Lumps;
|
||||||
std::vector<sQ3BSPVertex*> m_Vertices;
|
std::vector<sQ3BSPVertex*> m_Vertices;
|
||||||
|
@ -195,24 +184,22 @@ struct Q3BSPModel
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
~Q3BSPModel()
|
~Q3BSPModel() {
|
||||||
{
|
for ( unsigned int i=0; i<m_Lumps.size(); i++ ) {
|
||||||
for ( unsigned int i=0; i<m_Lumps.size(); i++ )
|
delete m_Lumps[ i ];
|
||||||
if ( NULL != m_Lumps[i] )
|
}
|
||||||
delete m_Lumps[i];
|
for ( unsigned int i=0; i<m_Vertices.size(); i++ ) {
|
||||||
|
delete m_Vertices[ i ];
|
||||||
for ( unsigned int i=0; i<m_Vertices.size(); i++ )
|
}
|
||||||
if ( NULL != m_Vertices[ i ] )
|
for ( unsigned int i=0; i<m_Faces.size(); i++ ) {
|
||||||
delete m_Vertices[ i ];
|
delete m_Faces[ i ];
|
||||||
for ( unsigned int i=0; i<m_Faces.size(); i++ )
|
}
|
||||||
if ( NULL != m_Faces[ i ] )
|
for ( unsigned int i=0; i<m_Textures.size(); i++ ) {
|
||||||
delete m_Faces[ i ];
|
delete m_Textures[ i ];
|
||||||
for ( unsigned int i=0; i<m_Textures.size(); i++ )
|
}
|
||||||
if ( NULL != m_Textures[ i ] )
|
for ( unsigned int i=0; i<m_Lightmaps.size(); i++ ) {
|
||||||
delete m_Textures[ i ];
|
delete m_Lightmaps[ i ];
|
||||||
for ( unsigned int i=0; i<m_Lightmaps.size(); i++ )
|
}
|
||||||
if ( NULL != m_Lightmaps[ i ] )
|
|
||||||
delete m_Lightmaps[ i ];
|
|
||||||
|
|
||||||
m_Lumps.clear();
|
m_Lumps.clear();
|
||||||
m_Vertices.clear();
|
m_Vertices.clear();
|
||||||
|
|
|
@ -71,9 +71,14 @@ static const aiImporterDesc desc = {
|
||||||
"pk3"
|
"pk3"
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Assimp
|
namespace Assimp {
|
||||||
{
|
|
||||||
|
|
||||||
|
static void getSupportedExtensions(std::vector<std::string> &supportedExtensions) {
|
||||||
|
supportedExtensions.push_back( ".jpg" );
|
||||||
|
supportedExtensions.push_back( ".png" );
|
||||||
|
supportedExtensions.push_back( ".tga" );
|
||||||
|
}
|
||||||
|
|
||||||
using namespace Q3BSP;
|
using namespace Q3BSP;
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
@ -86,7 +91,7 @@ static void createKey( int id1, int id2, std::string &rKey )
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Local function to extract the texture ids from a material keyname.
|
// Local function to extract the texture ids from a material key-name.
|
||||||
static void extractIds( const std::string &rKey, int &rId1, int &rId2 )
|
static void extractIds( const std::string &rKey, int &rId1, int &rId2 )
|
||||||
{
|
{
|
||||||
rId1 = -1;
|
rId1 = -1;
|
||||||
|
@ -146,24 +151,16 @@ Q3BSPFileImporter::Q3BSPFileImporter() :
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Destructor.
|
// Destructor.
|
||||||
Q3BSPFileImporter::~Q3BSPFileImporter()
|
Q3BSPFileImporter::~Q3BSPFileImporter() {
|
||||||
{
|
|
||||||
// For lint
|
|
||||||
m_pCurrentMesh = NULL;
|
m_pCurrentMesh = NULL;
|
||||||
m_pCurrentFace = NULL;
|
m_pCurrentFace = NULL;
|
||||||
|
|
||||||
// Clear face-to-material map
|
// Clear face-to-material map
|
||||||
for ( FaceMap::iterator it = m_MaterialLookupMap.begin(); it != m_MaterialLookupMap.end();
|
for ( FaceMap::iterator it = m_MaterialLookupMap.begin(); it != m_MaterialLookupMap.end(); ++it ) {
|
||||||
++it )
|
const std::string &matName = it->first;
|
||||||
{
|
if ( !matName.empty() ) {
|
||||||
const std::string matName = (*it).first;
|
delete it->second;
|
||||||
if ( matName.empty() )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Q3BSP::sQ3BSPFace*> *pCurFaceArray = (*it).second;
|
|
||||||
delete pCurFaceArray;
|
|
||||||
}
|
}
|
||||||
m_MaterialLookupMap.clear();
|
m_MaterialLookupMap.clear();
|
||||||
}
|
}
|
||||||
|
@ -566,7 +563,7 @@ size_t Q3BSPFileImporter::countFaces( const std::vector<Q3BSP::sQ3BSPFace*> &rAr
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Counts the number of triangles in a Q3-facearray.
|
// Counts the number of triangles in a Q3-face-array.
|
||||||
size_t Q3BSPFileImporter::countTriangles( const std::vector<Q3BSP::sQ3BSPFace*> &rArray ) const
|
size_t Q3BSPFileImporter::countTriangles( const std::vector<Q3BSP::sQ3BSPFace*> &rArray ) const
|
||||||
{
|
{
|
||||||
size_t numTriangles = 0;
|
size_t numTriangles = 0;
|
||||||
|
@ -617,16 +614,11 @@ void Q3BSPFileImporter::createMaterialMap( const Q3BSP::Q3BSPModel *pModel )
|
||||||
// Returns the next face.
|
// Returns the next face.
|
||||||
aiFace *Q3BSPFileImporter::getNextFace( aiMesh *pMesh, unsigned int &rFaceIdx )
|
aiFace *Q3BSPFileImporter::getNextFace( aiMesh *pMesh, unsigned int &rFaceIdx )
|
||||||
{
|
{
|
||||||
aiFace *pFace = NULL;
|
aiFace *pFace( NULL );
|
||||||
if ( rFaceIdx < pMesh->mNumFaces )
|
if ( rFaceIdx < pMesh->mNumFaces ) {
|
||||||
{
|
|
||||||
pFace = &pMesh->mFaces[ rFaceIdx ];
|
pFace = &pMesh->mFaces[ rFaceIdx ];
|
||||||
rFaceIdx++;
|
rFaceIdx++;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
pFace = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pFace;
|
return pFace;
|
||||||
}
|
}
|
||||||
|
@ -634,34 +626,30 @@ aiFace *Q3BSPFileImporter::getNextFace( aiMesh *pMesh, unsigned int &rFaceIdx )
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Imports a texture file.
|
// Imports a texture file.
|
||||||
bool Q3BSPFileImporter::importTextureFromArchive( const Q3BSP::Q3BSPModel *pModel,
|
bool Q3BSPFileImporter::importTextureFromArchive( const Q3BSP::Q3BSPModel *pModel,
|
||||||
Q3BSP::Q3BSPZipArchive *pArchive, aiScene* /*pScene*/,
|
Q3BSP::Q3BSPZipArchive *pArchive, aiScene*,
|
||||||
aiMaterial *pMatHelper, int textureId )
|
aiMaterial *pMatHelper, int textureId ) {
|
||||||
{
|
if ( NULL == pArchive || NULL == pArchive || NULL == pMatHelper ) {
|
||||||
std::vector<std::string> supportedExtensions;
|
|
||||||
supportedExtensions.push_back( ".jpg" );
|
|
||||||
supportedExtensions.push_back( ".png" );
|
|
||||||
supportedExtensions.push_back( ".tga" );
|
|
||||||
if ( NULL == pArchive || NULL == pArchive || NULL == pMatHelper )
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( textureId < 0 || textureId >= static_cast<int>( pModel->m_Textures.size() ) )
|
if ( textureId < 0 || textureId >= static_cast<int>( pModel->m_Textures.size() ) ) {
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool res = true;
|
bool res = true;
|
||||||
sQ3BSPTexture *pTexture = pModel->m_Textures[ textureId ];
|
sQ3BSPTexture *pTexture = pModel->m_Textures[ textureId ];
|
||||||
if ( NULL == pTexture )
|
if ( !pTexture ) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> supportedExtensions;
|
||||||
|
supportedExtensions.push_back( ".jpg" );
|
||||||
|
supportedExtensions.push_back( ".png" );
|
||||||
|
supportedExtensions.push_back( ".tga" );
|
||||||
std::string textureName, ext;
|
std::string textureName, ext;
|
||||||
if ( expandFile( pArchive, pTexture->strName, supportedExtensions, textureName, ext ) )
|
if ( expandFile( pArchive, pTexture->strName, supportedExtensions, textureName, ext ) ) {
|
||||||
{
|
|
||||||
IOStream *pTextureStream = pArchive->Open( textureName.c_str() );
|
IOStream *pTextureStream = pArchive->Open( textureName.c_str() );
|
||||||
if ( NULL != pTextureStream )
|
if ( !pTextureStream ) {
|
||||||
{
|
|
||||||
size_t texSize = pTextureStream->FileSize();
|
size_t texSize = pTextureStream->FileSize();
|
||||||
aiTexture *pTexture = new aiTexture;
|
aiTexture *pTexture = new aiTexture;
|
||||||
pTexture->mHeight = 0;
|
pTexture->mHeight = 0;
|
||||||
|
@ -685,9 +673,7 @@ bool Q3BSPFileImporter::importTextureFromArchive( const Q3BSP::Q3BSPModel *pMode
|
||||||
|
|
||||||
pMatHelper->AddProperty( &name, AI_MATKEY_TEXTURE_DIFFUSE( 0 ) );
|
pMatHelper->AddProperty( &name, AI_MATKEY_TEXTURE_DIFFUSE( 0 ) );
|
||||||
mTextures.push_back( pTexture );
|
mTextures.push_back( pTexture );
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// If it doesn't exist in the archive, it is probably just a reference to an external file.
|
// If it doesn't exist in the archive, it is probably just a reference to an external file.
|
||||||
// We'll leave it up to the user to figure out which extension the file has.
|
// We'll leave it up to the user to figure out which extension the file has.
|
||||||
aiString name;
|
aiString name;
|
||||||
|
|
|
@ -141,8 +141,8 @@ struct aiMetadata
|
||||||
/** Destructor */
|
/** Destructor */
|
||||||
~aiMetadata()
|
~aiMetadata()
|
||||||
{
|
{
|
||||||
if (mKeys)
|
delete[] mKeys;
|
||||||
delete [] mKeys;
|
mKeys = NULL;
|
||||||
if (mValues)
|
if (mValues)
|
||||||
{
|
{
|
||||||
// Delete each metadata entry
|
// Delete each metadata entry
|
||||||
|
@ -177,8 +177,8 @@ struct aiMetadata
|
||||||
|
|
||||||
// Delete the metadata array
|
// Delete the metadata array
|
||||||
delete [] mValues;
|
delete [] mValues;
|
||||||
|
mValues = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -206,8 +206,9 @@ struct aiMetadata
|
||||||
|
|
||||||
// Return false if the output data type does
|
// Return false if the output data type does
|
||||||
// not match the found value's data type
|
// not match the found value's data type
|
||||||
if (GetAiType(value) != mValues[index].mType)
|
if ( GetAiType( value ) != mValues[ index ].mType ) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Otherwise, output the found value and
|
// Otherwise, output the found value and
|
||||||
// return true
|
// return true
|
||||||
|
@ -226,10 +227,12 @@ struct aiMetadata
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline bool Get( const std::string& key, T& value )
|
inline bool Get( const std::string& key, T& value ) {
|
||||||
{ return Get(aiString(key), value); }
|
return Get(aiString(key), value);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __AI_METADATA_H_INC__
|
#endif // __AI_METADATA_H_INC__
|
||||||
|
|
Loading…
Reference in New Issue