fix invalid check

pull/3012/head
Kim Kulling 2020-03-22 14:21:24 +01:00
parent 14860f3822
commit c0ae9b6040
4 changed files with 248 additions and 329 deletions

View File

@ -41,38 +41,34 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/** @file Implementation of the material part of the MDL importer class */
#ifndef ASSIMP_BUILD_NO_MDL_IMPORTER
// internal headers
#include "MDLLoader.h"
#include "MDLDefaultColorMap.h"
#include <assimp/StringUtils.h>
#include <assimp/texture.h>
#include <assimp/IOSystem.hpp>
#include <assimp/DefaultLogger.hpp>
#include <assimp/scene.h>
#include "MDLLoader.h"
#include <assimp/Defines.h>
#include <assimp/StringUtils.h>
#include <assimp/qnan.h>
#include <assimp/scene.h>
#include <assimp/texture.h>
#include <assimp/DefaultLogger.hpp>
#include <assimp/IOSystem.hpp>
#include <memory>
using namespace Assimp;
static aiTexel *const bad_texel = reinterpret_cast<aiTexel *>(SIZE_MAX);
// ------------------------------------------------------------------------------------------------
// Find a suitable palette file or take the default one
void MDLImporter::SearchPalette(const unsigned char** pszColorMap)
{
void MDLImporter::SearchPalette(const unsigned char **pszColorMap) {
// now try to find the color map in the current directory
IOStream *pcStream = mIOHandler->Open(configPalette, "rb");
const unsigned char *szColorMap = (const unsigned char *)::g_aclrDefaultColorMap;
if(pcStream)
{
if (pcStream->FileSize() >= 768)
{
if (pcStream) {
if (pcStream->FileSize() >= 768) {
size_t len = 256 * 3;
unsigned char *colorMap = new unsigned char[len];
szColorMap = colorMap;
@ -81,24 +77,23 @@ void MDLImporter::SearchPalette(const unsigned char** pszColorMap)
"It will be used to decode embedded textures in palletized formats.");
}
delete pcStream;
pcStream = NULL;
pcStream = nullptr;
}
*pszColorMap = szColorMap;
}
// ------------------------------------------------------------------------------------------------
// Free the palette again
void MDLImporter::FreePalette(const unsigned char* szColorMap)
{
if (szColorMap != (const unsigned char*)::g_aclrDefaultColorMap)
void MDLImporter::FreePalette(const unsigned char *szColorMap) {
if (szColorMap != (const unsigned char *)::g_aclrDefaultColorMap) {
delete[] szColorMap;
}
}
// ------------------------------------------------------------------------------------------------
// Check whether we can replace a texture with a single color
aiColor4D MDLImporter::ReplaceTextureWithColor(const aiTexture* pcTexture)
{
ai_assert(NULL != pcTexture);
aiColor4D MDLImporter::ReplaceTextureWithColor(const aiTexture *pcTexture) {
ai_assert(nullptr != pcTexture);
aiColor4D clrOut;
clrOut.r = get_qnan();
@ -109,17 +104,14 @@ aiColor4D MDLImporter::ReplaceTextureWithColor(const aiTexture* pcTexture)
const aiTexel *pcTexel = pcTexture->pcData + 1;
const aiTexel *const pcTexelEnd = &pcTexture->pcData[iNumPixels];
while (pcTexel != pcTexelEnd)
{
if (*pcTexel != *(pcTexel-1))
{
pcTexel = NULL;
while (pcTexel != pcTexelEnd) {
if (*pcTexel != *(pcTexel - 1)) {
pcTexel = nullptr;
break;
}
++pcTexel;
}
if (pcTexel)
{
if (pcTexel) {
clrOut.r = pcTexture->pcData->r / 255.0f;
clrOut.g = pcTexture->pcData->g / 255.0f;
clrOut.b = pcTexture->pcData->b / 255.0f;
@ -130,8 +122,7 @@ aiColor4D MDLImporter::ReplaceTextureWithColor(const aiTexture* pcTexture)
// ------------------------------------------------------------------------------------------------
// Read a texture from a MDL3 file
void MDLImporter::CreateTextureARGB8_3DGS_MDL3(const unsigned char* szData)
{
void MDLImporter::CreateTextureARGB8_3DGS_MDL3(const unsigned char *szData) {
const MDL::Header *pcHeader = (const MDL::Header *)mBuffer; //the endianness is already corrected in the InternReadFile_3DGS_MDL345 function
VALIDATE_FILE_SIZE(szData + pcHeader->skinwidth *
@ -148,8 +139,7 @@ void MDLImporter::CreateTextureARGB8_3DGS_MDL3(const unsigned char* szData)
this->SearchPalette(&szColorMap);
// copy texture data
for (unsigned int i = 0; i < pcNew->mWidth*pcNew->mHeight;++i)
{
for (unsigned int i = 0; i < pcNew->mWidth * pcNew->mHeight; ++i) {
const unsigned char val = szData[i];
const unsigned char *sz = &szColorMap[val * 3];
@ -170,21 +160,18 @@ void MDLImporter::CreateTextureARGB8_3DGS_MDL3(const unsigned char* szData)
pScene->mTextures[this->pScene->mNumTextures] = pcNew;
pScene->mNumTextures++;
delete[] pc;
return;
}
// ------------------------------------------------------------------------------------------------
// Read a texture from a MDL4 file
void MDLImporter::CreateTexture_3DGS_MDL4(const unsigned char *szData,
unsigned int iType,
unsigned int* piSkip)
{
ai_assert(NULL != piSkip);
unsigned int *piSkip) {
ai_assert(nullptr != piSkip);
const MDL::Header *pcHeader = (const MDL::Header *)mBuffer; //the endianness is already corrected in the InternReadFile_3DGS_MDL345 function
if (iType == 1 || iType > 3)
{
if (iType == 1 || iType > 3) {
ASSIMP_LOG_ERROR("Unsupported texture file format");
return;
}
@ -200,16 +187,12 @@ void MDLImporter::CreateTexture_3DGS_MDL4(const unsigned char* szData,
ParseTextureColorData(szData, iType, piSkip, pcNew);
// store the texture
if (!bNoRead)
{
if (!this->pScene->mNumTextures)
{
if (!bNoRead) {
if (!this->pScene->mNumTextures) {
pScene->mNumTextures = 1;
pScene->mTextures = new aiTexture *[1];
pScene->mTextures[0] = pcNew;
}
else
{
} else {
aiTexture **pc = pScene->mTextures;
pScene->mTextures = new aiTexture *[pScene->mNumTextures + 1];
for (unsigned int i = 0; i < this->pScene->mNumTextures; ++i)
@ -218,9 +201,8 @@ void MDLImporter::CreateTexture_3DGS_MDL4(const unsigned char* szData,
pScene->mNumTextures++;
delete[] pc;
}
}
else {
pcNew->pcData = NULL;
} else {
pcNew->pcData = nullptr;
delete pcNew;
}
return;
@ -231,8 +213,7 @@ void MDLImporter::CreateTexture_3DGS_MDL4(const unsigned char* szData,
void MDLImporter::ParseTextureColorData(const unsigned char *szData,
unsigned int iType,
unsigned int *piSkip,
aiTexture* pcNew)
{
aiTexture *pcNew) {
const bool do_read = bad_texel != pcNew->pcData;
// allocate storage for the texture image
@ -242,16 +223,13 @@ void MDLImporter::ParseTextureColorData(const unsigned char* szData,
// R5G6B5 format (with or without MIPs)
// ****************************************************************
if (2 == iType || 10 == iType)
{
if (2 == iType || 10 == iType) {
VALIDATE_FILE_SIZE(szData + pcNew->mWidth * pcNew->mHeight * 2);
// copy texture data
unsigned int i;
if (do_read)
{
for (i = 0; i < pcNew->mWidth*pcNew->mHeight;++i)
{
if (do_read) {
for (i = 0; i < pcNew->mWidth * pcNew->mHeight; ++i) {
MDL::RGB565 val = ((MDL::RGB565 *)szData)[i];
AI_SWAP2(val);
@ -260,29 +238,26 @@ void MDLImporter::ParseTextureColorData(const unsigned char* szData,
pcNew->pcData[i].g = (unsigned char)val.g << 2;
pcNew->pcData[i].b = (unsigned char)val.r << 3;
}
} else {
i = pcNew->mWidth * pcNew->mHeight;
}
else i = pcNew->mWidth*pcNew->mHeight;
*piSkip = i * 2;
// apply MIP maps
if (10 == iType)
{
if (10 == iType) {
*piSkip += ((i >> 2) + (i >> 4) + (i >> 6)) << 1;
VALIDATE_FILE_SIZE(szData + *piSkip);
}
}
// ARGB4 format (with or without MIPs)
// ****************************************************************
else if (3 == iType || 11 == iType)
{
else if (3 == iType || 11 == iType) {
VALIDATE_FILE_SIZE(szData + pcNew->mWidth * pcNew->mHeight * 4);
// copy texture data
unsigned int i;
if (do_read)
{
for (i = 0; i < pcNew->mWidth*pcNew->mHeight;++i)
{
if (do_read) {
for (i = 0; i < pcNew->mWidth * pcNew->mHeight; ++i) {
MDL::ARGB4 val = ((MDL::ARGB4 *)szData)[i];
AI_SWAP2(val);
@ -291,29 +266,25 @@ void MDLImporter::ParseTextureColorData(const unsigned char* szData,
pcNew->pcData[i].g = (unsigned char)val.g << 4;
pcNew->pcData[i].b = (unsigned char)val.b << 4;
}
}
else i = pcNew->mWidth*pcNew->mHeight;
} else
i = pcNew->mWidth * pcNew->mHeight;
*piSkip = i * 2;
// apply MIP maps
if (11 == iType)
{
if (11 == iType) {
*piSkip += ((i >> 2) + (i >> 4) + (i >> 6)) << 1;
VALIDATE_FILE_SIZE(szData + *piSkip);
}
}
// RGB8 format (with or without MIPs)
// ****************************************************************
else if (4 == iType || 12 == iType)
{
else if (4 == iType || 12 == iType) {
VALIDATE_FILE_SIZE(szData + pcNew->mWidth * pcNew->mHeight * 3);
// copy texture data
unsigned int i;
if (do_read)
{
for (i = 0; i < pcNew->mWidth*pcNew->mHeight;++i)
{
if (do_read) {
for (i = 0; i < pcNew->mWidth * pcNew->mHeight; ++i) {
const unsigned char *_szData = &szData[i * 3];
pcNew->pcData[i].a = 0xFF;
@ -321,30 +292,25 @@ void MDLImporter::ParseTextureColorData(const unsigned char* szData,
pcNew->pcData[i].g = *_szData++;
pcNew->pcData[i].r = *_szData;
}
}
else i = pcNew->mWidth*pcNew->mHeight;
} else
i = pcNew->mWidth * pcNew->mHeight;
// apply MIP maps
*piSkip = i * 3;
if (12 == iType)
{
if (12 == iType) {
*piSkip += ((i >> 2) + (i >> 4) + (i >> 6)) * 3;
VALIDATE_FILE_SIZE(szData + *piSkip);
}
}
// ARGB8 format (with ir without MIPs)
// ****************************************************************
else if (5 == iType || 13 == iType)
{
else if (5 == iType || 13 == iType) {
VALIDATE_FILE_SIZE(szData + pcNew->mWidth * pcNew->mHeight * 4);
// copy texture data
unsigned int i;
if (do_read)
{
for (i = 0; i < pcNew->mWidth*pcNew->mHeight;++i)
{
if (do_read) {
for (i = 0; i < pcNew->mWidth * pcNew->mHeight; ++i) {
const unsigned char *_szData = &szData[i * 4];
pcNew->pcData[i].b = *_szData++;
@ -352,32 +318,29 @@ void MDLImporter::ParseTextureColorData(const unsigned char* szData,
pcNew->pcData[i].r = *_szData++;
pcNew->pcData[i].a = *_szData;
}
} else {
i = pcNew->mWidth * pcNew->mHeight;
}
else i = pcNew->mWidth*pcNew->mHeight;
// apply MIP maps
*piSkip = i << 2;
if (13 == iType)
{
if (13 == iType) {
*piSkip += ((i >> 2) + (i >> 4) + (i >> 6)) << 2;
}
}
// palletized 8 bit texture. As for Quake 1
// ****************************************************************
else if (0 == iType)
{
else if (0 == iType) {
VALIDATE_FILE_SIZE(szData + pcNew->mWidth * pcNew->mHeight);
// copy texture data
unsigned int i;
if (do_read)
{
if (do_read) {
const unsigned char *szColorMap;
SearchPalette(&szColorMap);
for (i = 0; i < pcNew->mWidth*pcNew->mHeight;++i)
{
for (i = 0; i < pcNew->mWidth * pcNew->mHeight; ++i) {
const unsigned char val = szData[i];
const unsigned char *sz = &szColorMap[val * 3];
@ -388,8 +351,8 @@ void MDLImporter::ParseTextureColorData(const unsigned char* szData,
}
this->FreePalette(szColorMap);
}
else i = pcNew->mWidth*pcNew->mHeight;
} else
i = pcNew->mWidth * pcNew->mHeight;
*piSkip = i;
// FIXME: Also support for MIP maps?
@ -400,8 +363,7 @@ void MDLImporter::ParseTextureColorData(const unsigned char* szData,
// Get a texture from a MDL5 file
void MDLImporter::CreateTexture_3DGS_MDL5(const unsigned char *szData,
unsigned int iType,
unsigned int* piSkip)
{
unsigned int *piSkip) {
ai_assert(NULL != piSkip);
bool bNoRead = *piSkip == UINT_MAX;
@ -427,14 +389,12 @@ void MDLImporter::CreateTexture_3DGS_MDL5(const unsigned char* szData,
// however, one can easily try out what MED does if you have
// a model with a DDS texture and export it to MDL5 ...
// yeah, it embedds the DDS file.
if (6 == iType)
{
if (6 == iType) {
// this is a compressed texture in DDS format
*piSkip = pcNew->mWidth;
VALIDATE_FILE_SIZE(szData + *piSkip);
if (!bNoRead)
{
if (!bNoRead) {
// place a hint and let the application know that this is a DDS file
pcNew->mHeight = 0;
pcNew->achFormatHint[0] = 'd';
@ -445,25 +405,19 @@ void MDLImporter::CreateTexture_3DGS_MDL5(const unsigned char* szData,
pcNew->pcData = (aiTexel *)new unsigned char[pcNew->mWidth];
::memcpy(pcNew->pcData, szData, pcNew->mWidth);
}
}
else
{
} else {
// parse the color data of the texture
ParseTextureColorData(szData, iType, piSkip, pcNew);
}
*piSkip += sizeof(uint32_t) * 2;
if (!bNoRead)
{
if (!bNoRead) {
// store the texture
if (!this->pScene->mNumTextures)
{
if (!this->pScene->mNumTextures) {
pScene->mNumTextures = 1;
pScene->mTextures = new aiTexture *[1];
pScene->mTextures[0] = pcNew;
}
else
{
} else {
aiTexture **pc = pScene->mTextures;
pScene->mTextures = new aiTexture *[pScene->mNumTextures + 1];
for (unsigned int i = 0; i < pScene->mNumTextures; ++i)
@ -473,8 +427,7 @@ void MDLImporter::CreateTexture_3DGS_MDL5(const unsigned char* szData,
pScene->mNumTextures++;
delete[] pc;
}
}
else {
} else {
pcNew->pcData = NULL;
delete pcNew;
}
@ -489,24 +442,19 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
aiMaterial *pcMatOut,
unsigned int iType,
unsigned int iWidth,
unsigned int iHeight)
{
unsigned int iHeight) {
std::unique_ptr<aiTexture> pcNew;
// get the type of the skin
unsigned int iMasked = (unsigned int)(iType & 0xF);
if (0x1 == iMasked)
{
if (0x1 == iMasked) {
// ***** REFERENCE TO ANOTHER SKIN INDEX *****
int referrer = (int)iWidth;
pcMatOut->AddProperty<int>(&referrer, 1, AI_MDL7_REFERRER_MATERIAL);
}
else if (0x6 == iMasked)
{
} else if (0x6 == iMasked) {
// ***** EMBEDDED DDS FILE *****
if (1 != iHeight)
{
if (1 != iHeight) {
ASSIMP_LOG_WARN("Found a reference to an embedded DDS texture, "
"but texture height is not equal to 1, which is not supported by MED");
}
@ -524,12 +472,9 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
pcNew->pcData = (aiTexel *)new unsigned char[pcNew->mWidth];
memcpy(pcNew->pcData, szCurrent, pcNew->mWidth);
szCurrent += iWidth;
}
else if (0x7 == iMasked)
{
} else if (0x7 == iMasked) {
// ***** REFERENCE TO EXTERNAL FILE *****
if (1 != iHeight)
{
if (1 != iHeight) {
ASSIMP_LOG_WARN("Found a reference to an external texture, "
"but texture height is not equal to 1, which is not supported by MED");
}
@ -545,22 +490,17 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
// place this as diffuse texture
pcMatOut->AddProperty(&szFile, AI_MATKEY_TEXTURE_DIFFUSE(0));
}
else if (iMasked || !iType || (iType && iWidth && iHeight))
{
} else if (iMasked || !iType || (iType && iWidth && iHeight)) {
pcNew.reset(new aiTexture());
if (!iHeight || !iWidth)
{
if (!iHeight || !iWidth) {
ASSIMP_LOG_WARN("Found embedded texture, but its width "
"an height are both 0. Is this a joke?");
// generate an empty chess pattern
pcNew->mWidth = pcNew->mHeight = 8;
pcNew->pcData = new aiTexel[64];
for (unsigned int x = 0; x < 8;++x)
{
for (unsigned int y = 0; y < 8;++y)
{
for (unsigned int x = 0; x < 8; ++x) {
for (unsigned int y = 0; y < 8; ++y) {
const bool bSet = ((0 == x % 2 && 0 != y % 2) ||
(0 != x % 2 && 0 == y % 2));
@ -569,9 +509,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
pc->a = 0xFF;
}
}
}
else
{
} else {
// it is a standard color texture. Fill in width and height
// and call the same function we used for loading MDL5 files
@ -590,12 +528,13 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
// texture instead of material colors ... posssible they have
// been converted to MDL7 from other formats, such as MDL5
aiColor4D clrTexture;
if (pcNew)clrTexture = ReplaceTextureWithColor(pcNew.get());
else clrTexture.r = get_qnan();
if (pcNew)
clrTexture = ReplaceTextureWithColor(pcNew.get());
else
clrTexture.r = get_qnan();
// check whether a material definition is contained in the skin
if (iType & AI_MDL7_SKINTYPE_MATERIAL)
{
if (iType & AI_MDL7_SKINTYPE_MATERIAL) {
BE_NCONST MDL::Material_MDL7 *pcMatIn = (BE_NCONST MDL::Material_MDL7 *)szCurrent;
szCurrent = (unsigned char *)(pcMatIn + 1);
VALIDATE_FILE_SIZE(szCurrent);
@ -603,8 +542,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
aiColor3D clrTemp;
#define COLOR_MULTIPLY_RGB() \
if (is_not_qnan(clrTexture.r)) \
{ \
if (is_not_qnan(clrTexture.r)) { \
clrTemp.r *= clrTexture.r; \
clrTemp.g *= clrTexture.g; \
clrTemp.b *= clrTexture.b; \
@ -664,31 +602,26 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
// read phong power
int iShadingMode = (int)aiShadingMode_Gouraud;
AI_SWAP4(pcMatIn->Power);
if (0.0f != pcMatIn->Power)
{
if (0.0f != pcMatIn->Power) {
iShadingMode = (int)aiShadingMode_Phong;
// pcMatIn is packed, we can't form pointers to its members
float power = pcMatIn->Power;
pcMatOut->AddProperty<float>(&power, 1, AI_MATKEY_SHININESS);
}
pcMatOut->AddProperty<int>(&iShadingMode, 1, AI_MATKEY_SHADING_MODEL);
}
else if (is_not_qnan(clrTexture.r))
{
} else if (is_not_qnan(clrTexture.r)) {
pcMatOut->AddProperty<aiColor4D>(&clrTexture, 1, AI_MATKEY_COLOR_DIFFUSE);
pcMatOut->AddProperty<aiColor4D>(&clrTexture, 1, AI_MATKEY_COLOR_SPECULAR);
}
// if the texture could be replaced by a single material color
// we don't need the texture anymore
if (is_not_qnan(clrTexture.r))
{
if (is_not_qnan(clrTexture.r)) {
pcNew.reset();
}
// If an ASCII effect description (HLSL?) is contained in the file,
// we can simply ignore it ...
if (iType & AI_MDL7_SKINTYPE_MATERIAL_ASCDEF)
{
if (iType & AI_MDL7_SKINTYPE_MATERIAL_ASCDEF) {
VALIDATE_FILE_SIZE(szCurrent);
int32_t iMe = *((int32_t *)szCurrent);
AI_SWAP4(iMe);
@ -698,8 +631,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
// If an embedded texture has been loaded setup the corresponding
// data structures in the aiScene instance
if (pcNew && pScene->mNumTextures <= 999)
{
if (pcNew && pScene->mNumTextures <= 999) {
// place this as diffuse texture
char current[5];
ai_snprintf(current, 5, "*%i", this->pScene->mNumTextures);
@ -712,14 +644,11 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
pcMatOut->AddProperty(&szFile, AI_MATKEY_TEXTURE_DIFFUSE(0));
// store the texture
if (!pScene->mNumTextures)
{
if (!pScene->mNumTextures) {
pScene->mNumTextures = 1;
pScene->mTextures = new aiTexture *[1];
pScene->mTextures[0] = pcNew.release();
}
else
{
} else {
aiTexture **pc = pScene->mTextures;
pScene->mTextures = new aiTexture *[pScene->mNumTextures + 1];
for (unsigned int i = 0; i < pScene->mNumTextures; ++i) {
@ -742,24 +671,18 @@ void MDLImporter::SkipSkinLump_3DGS_MDL7(
const unsigned char **szCurrentOut,
unsigned int iType,
unsigned int iWidth,
unsigned int iHeight)
{
unsigned int iHeight) {
// get the type of the skin
const unsigned int iMasked = (unsigned int)(iType & 0xF);
if (0x6 == iMasked)
{
if (0x6 == iMasked) {
szCurrent += iWidth;
}
if (0x7 == iMasked)
{
const size_t iLen = ::strlen((const char*)szCurrent);
if (0x7 == iMasked) {
const size_t iLen = std::strlen((const char *)szCurrent);
szCurrent += iLen + 1;
}
else if (iMasked || !iType)
{
if (iMasked || !iType || (iType && iWidth && iHeight))
{
} else if (iMasked || !iType) {
if (iMasked || !iType || (iType && iWidth && iHeight)) {
// ParseTextureColorData(..., aiTexture::pcData == bad_texel) will simply
// return the size of the color data in bytes in iSkip
unsigned int iSkip = 0;
@ -771,7 +694,7 @@ void MDLImporter::SkipSkinLump_3DGS_MDL7(
ParseTextureColorData(szCurrent, iMasked, &iSkip, &tex);
// FIX: Important, otherwise the destructor will crash
tex.pcData = NULL;
tex.pcData = nullptr;
// skip length of texture data
szCurrent += iSkip;
@ -779,16 +702,14 @@ void MDLImporter::SkipSkinLump_3DGS_MDL7(
}
// check whether a material definition is contained in the skin
if (iType & AI_MDL7_SKINTYPE_MATERIAL)
{
if (iType & AI_MDL7_SKINTYPE_MATERIAL) {
BE_NCONST MDL::Material_MDL7 *pcMatIn = (BE_NCONST MDL::Material_MDL7 *)szCurrent;
szCurrent = (unsigned char *)(pcMatIn + 1);
}
// if an ASCII effect description (HLSL?) is contained in the file,
// we can simply ignore it ...
if (iType & AI_MDL7_SKINTYPE_MATERIAL_ASCDEF)
{
if (iType & AI_MDL7_SKINTYPE_MATERIAL_ASCDEF) {
int32_t iMe = *((int32_t *)szCurrent);
AI_SWAP4(iMe);
szCurrent += sizeof(char) * iMe + sizeof(int32_t);
@ -800,10 +721,9 @@ void MDLImporter::SkipSkinLump_3DGS_MDL7(
void MDLImporter::ParseSkinLump_3DGS_MDL7(
const unsigned char *szCurrent,
const unsigned char **szCurrentOut,
std::vector<aiMaterial*>& pcMats)
{
ai_assert(NULL != szCurrent);
ai_assert(NULL != szCurrentOut);
std::vector<aiMaterial *> &pcMats) {
ai_assert(nullptr != szCurrent);
ai_assert(nullptr != szCurrentOut);
*szCurrentOut = szCurrent;
BE_NCONST MDL::Skin_MDL7 *pcSkin = (BE_NCONST MDL::Skin_MDL7 *)szCurrent;
@ -822,8 +742,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7(
pcSkin->typ, pcSkin->width, pcSkin->height);
// place the name of the skin in the material
if (pcSkin->texture_name[0])
{
if (pcSkin->texture_name[0]) {
// the 0 termination could be there or not - we can't know
aiString szFile;
::memcpy(szFile.data, pcSkin->texture_name, sizeof(pcSkin->texture_name));

View File

@ -356,7 +356,7 @@ TEST_F(utObjImportExport, homogeneous_coordinates_divide_by_zero_Test) {
"f 1 2 3\nB";
Assimp::Importer myimporter;
const aiScene *scene = myimporter.ReadFileFromMemory(curObjModel, strlen(curObjModel), aiProcess_ValidateDataStructure);
const aiScene *scene = myimporter.ReadFileFromMemory(curObjModel, std::strlen(curObjModel), aiProcess_ValidateDataStructure);
EXPECT_EQ(nullptr, scene);
}

View File

@ -63,7 +63,7 @@ const char *AICMD_MSG_DUMP_HELP =
#include <memory>
FILE *out = NULL;
FILE *out = nullptr;
bool shortened = false;
// -----------------------------------------------------------------------------------
@ -108,7 +108,7 @@ int Assimp_Dump(const char *const *params, unsigned int num) {
if (!strcmp(params[i], "-b") || !strcmp(params[i], "--binary")) {
binary = true;
} else if (!strcmp(params[i], "-s") || !strcmp(params[i], "--short")) {
shortened = true;
cur_shortened = true;
} else if (!strcmp(params[i], "-z") || !strcmp(params[i], "--compressed")) {
compressed = true;
}