From 63a4591683dc3e3d8e043ec57b0137347e051210 Mon Sep 17 00:00:00 2001 From: Chris Russ Date: Sun, 17 Jul 2016 09:49:28 +1000 Subject: [PATCH] Fixing bugs related to 64-bit upgrade in materials --- code/3DSExporter.cpp | 8 ++++- code/3DSExporter.h | 1 + code/3DSHelper.h | 1 + code/3DSLoader.cpp | 5 +++ code/MaterialSystem.cpp | 31 +++++++++++++------ code/ValidateDataStructure.cpp | 4 +-- include/assimp/material.h | 20 ++++++------ include/assimp/material.inl | 29 ++++++++++++----- samples/SimpleOpenGL/Sample_SimpleOpenGL.c | 27 ++++++++-------- .../src/model_loading.cpp | 16 +++++----- 10 files changed, 90 insertions(+), 52 deletions(-) diff --git a/code/3DSExporter.cpp b/code/3DSExporter.cpp index 5bb79408f..9bef33525 100644 --- a/code/3DSExporter.cpp +++ b/code/3DSExporter.cpp @@ -365,7 +365,7 @@ void Discreet3DSExporter::WriteTexture(const aiMaterial& mat, aiTextureType type aiTextureMapMode map_mode[2] = { aiTextureMapMode_Wrap, aiTextureMapMode_Wrap }; - float blend = 1.0f; + ai_real blend = 1.0; if (mat.GetTexture(type, 0, &path, NULL, NULL, &blend, NULL, map_mode) != AI_SUCCESS || !path.length) { return; } @@ -560,6 +560,12 @@ void Discreet3DSExporter::WritePercentChunk(float f) { writer.PutF4(f); } +// ------------------------------------------------------------------------------------------------ +void Discreet3DSExporter::WritePercentChunk(double f) { + ChunkWriter chunk(writer, Discreet3DS::CHUNK_PERCENTD); + writer.PutF8(f); +} + #endif // ASSIMP_BUILD_NO_3DS_EXPORTER #endif // ASSIMP_BUILD_NO_EXPORT diff --git a/code/3DSExporter.h b/code/3DSExporter.h index 321539cff..4d9b39d53 100644 --- a/code/3DSExporter.h +++ b/code/3DSExporter.h @@ -80,6 +80,7 @@ private: void WriteString(const aiString& s); void WriteColor(const aiColor3D& color); void WritePercentChunk(float f); + void WritePercentChunk(double f); private: diff --git a/code/3DSHelper.h b/code/3DSHelper.h index e2979bd0f..b1de4ee77 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -129,6 +129,7 @@ public: CHUNK_PERCENTW = 0x0030, // int2 percentage CHUNK_PERCENTF = 0x0031, // float4 percentage + CHUNK_PERCENTD = 0x0032, // float8 percentage // ******************************************************************** // Prj master chunk diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index 59d598f20..bae3cb1e6 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -1270,6 +1270,11 @@ void Discreet3DSImporter::ParseTextureChunk(D3DS::Texture* pcOut) break; + case Discreet3DS::CHUNK_PERCENTD: + // Manually parse the blend factor + pcOut->mTextureBlend = stream->GetF8(); + break; + case Discreet3DS::CHUNK_PERCENTF: // Manually parse the blend factor pcOut->mTextureBlend = stream->GetF4(); diff --git a/code/MaterialSystem.cpp b/code/MaterialSystem.cpp index 94ca4364e..088336ef3 100644 --- a/code/MaterialSystem.cpp +++ b/code/MaterialSystem.cpp @@ -93,7 +93,7 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, const char* pKey, unsigned int type, unsigned int index, - float* pOut, + ai_real* pOut, unsigned int* pMax) { ai_assert (pOut != NULL); @@ -105,7 +105,7 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, return AI_FAILURE; } - // data is given in floats, simply copy it + // data is given in floats, convert to ai_real unsigned int iWrite = 0; if( aiPTI_Float == prop->mType || aiPTI_Buffer == prop->mType) { iWrite = prop->mDataLength / sizeof(float); @@ -113,7 +113,20 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, iWrite = std::min(*pMax,iWrite); ; } for (unsigned int a = 0; a < iWrite;++a) { - pOut[a] = static_cast ( reinterpret_cast(prop->mData)[a] ); + pOut[a] = static_cast ( reinterpret_cast(prop->mData)[a] ); + } + if (pMax) { + *pMax = iWrite; + } + } + // data is given in doubles, convert to float + else if( aiPTI_Double == prop->mType) { + iWrite = prop->mDataLength / sizeof(double); + if (pMax) { + iWrite = std::min(*pMax,iWrite); ; + } + for (unsigned int a = 0; a < iWrite;++a) { + pOut[a] = static_cast ( reinterpret_cast(prop->mData)[a] ); } if (pMax) { *pMax = iWrite; @@ -126,7 +139,7 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, iWrite = std::min(*pMax,iWrite); ; } for (unsigned int a = 0; a < iWrite;++a) { - pOut[a] = static_cast ( reinterpret_cast(prop->mData)[a] ); + pOut[a] = static_cast ( reinterpret_cast(prop->mData)[a] ); } if (pMax) { *pMax = iWrite; @@ -141,7 +154,7 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, const char* cur = prop->mData+4; ai_assert(prop->mDataLength>=5 && !prop->mData[prop->mDataLength-1]); for (unsigned int a = 0; ;++a) { - cur = fast_atoreal_move(cur,pOut[a]); + cur = fast_atoreal_move(cur,pOut[a]); if(a==iWrite-1) { break; } @@ -241,11 +254,11 @@ aiReturn aiGetMaterialColor(const aiMaterial* pMat, aiColor4D* pOut) { unsigned int iMax = 4; - const aiReturn eRet = aiGetMaterialFloatArray(pMat,pKey,type,index,(float*)pOut,&iMax); + const aiReturn eRet = aiGetMaterialFloatArray(pMat,pKey,type,index,(ai_real*)pOut,&iMax); // if no alpha channel is defined: set it to 1.0 if (3 == iMax) { - pOut->a = 1.0f; + pOut->a = 1.0; } return eRet; @@ -260,7 +273,7 @@ aiReturn aiGetMaterialUVTransform(const aiMaterial* pMat, aiUVTransform* pOut) { unsigned int iMax = 4; - return aiGetMaterialFloatArray(pMat,pKey,type,index,(float*)pOut,&iMax); + return aiGetMaterialFloatArray(pMat,pKey,type,index,(ai_real*)pOut,&iMax); } // ------------------------------------------------------------------------------------------------ @@ -326,7 +339,7 @@ aiReturn aiGetMaterialTexture(const C_STRUCT aiMaterial* mat, C_STRUCT aiString* path, aiTextureMapping* _mapping /*= NULL*/, unsigned int* uvindex /*= NULL*/, - float* blend /*= NULL*/, + ai_real* blend /*= NULL*/, aiTextureOp* op /*= NULL*/, aiTextureMapMode* mapmode /*= NULL*/, unsigned int* flags /*= NULL*/ diff --git a/code/ValidateDataStructure.cpp b/code/ValidateDataStructure.cpp index 48647f344..fd6867012 100644 --- a/code/ValidateDataStructure.cpp +++ b/code/ValidateDataStructure.cpp @@ -719,7 +719,7 @@ void ValidateDSProcess::Validate( const aiMaterial* pMaterial) } // make some more specific tests - float fTemp; + ai_real fTemp; int iShading; if (AI_SUCCESS == aiGetMaterialInteger( pMaterial,AI_MATKEY_SHADING_MODEL,&iShading)) { switch ((aiShadingMode)iShading) @@ -741,7 +741,7 @@ void ValidateDSProcess::Validate( const aiMaterial* pMaterial) }; } - if (AI_SUCCESS == aiGetMaterialFloat( pMaterial,AI_MATKEY_OPACITY,&fTemp) && (!fTemp || fTemp > 1.01f)) { + if (AI_SUCCESS == aiGetMaterialFloat( pMaterial,AI_MATKEY_OPACITY,&fTemp) && (!fTemp || fTemp > 1.01)) { ReportWarning("Invalid opacity value (must be 0 < opacity < 1.0)"); } diff --git a/include/assimp/material.h b/include/assimp/material.h index 9eb76a80f..1f97096b2 100644 --- a/include/assimp/material.h +++ b/include/assimp/material.h @@ -669,7 +669,7 @@ public: unsigned int idx, int* pOut, unsigned int* pMax) const; aiReturn Get(const char* pKey,unsigned int type, - unsigned int idx, float* pOut, unsigned int* pMax) const; + unsigned int idx, ai_real* pOut, unsigned int* pMax) const; // ------------------------------------------------------------------- /** @brief Retrieve a Type value with a specific key @@ -690,7 +690,7 @@ public: unsigned int idx, int& pOut) const; aiReturn Get(const char* pKey,unsigned int type, - unsigned int idx, float& pOut) const; + unsigned int idx, ai_real& pOut) const; aiReturn Get(const char* pKey,unsigned int type, unsigned int idx, aiString& pOut) const; @@ -747,7 +747,7 @@ public: C_STRUCT aiString* path, aiTextureMapping* mapping = NULL, unsigned int* uvindex = NULL, - float* blend = NULL, + ai_real* blend = NULL, aiTextureOp* op = NULL, aiTextureMapMode* mapmode = NULL) const; @@ -1329,9 +1329,9 @@ extern "C" { * structure or NULL if the key has not been found. */ // --------------------------------------------------------------------------- ASSIMP_API C_ENUM aiReturn aiGetMaterialProperty( - const C_STRUCT aiMaterial* pMat, + const C_STRUCT aiMaterial* pMat, const char* pKey, - unsigned int type, + unsigned int type, unsigned int index, const C_STRUCT aiMaterialProperty** pPropOut); @@ -1366,7 +1366,7 @@ ASSIMP_API C_ENUM aiReturn aiGetMaterialFloatArray( const char* pKey, unsigned int type, unsigned int index, - float* pOut, + ai_real* pOut, unsigned int* pMax); @@ -1395,7 +1395,7 @@ inline aiReturn aiGetMaterialFloat(const aiMaterial* pMat, const char* pKey, unsigned int type, unsigned int index, - float* pOut) + ai_real* pOut) { return aiGetMaterialFloatArray(pMat,pKey,type,index,pOut,(unsigned int*)0x0); } @@ -1432,7 +1432,7 @@ ASSIMP_API C_ENUM aiReturn aiGetMaterialIntegerArray(const C_STRUCT aiMaterial* inline aiReturn aiGetMaterialInteger(const C_STRUCT aiMaterial* pMat, const char* pKey, unsigned int type, - unsigned int index, + unsigned int index, int* pOut) { return aiGetMaterialIntegerArray(pMat,pKey,type,index,pOut,(unsigned int*)0x0); @@ -1537,7 +1537,7 @@ ASSIMP_API aiReturn aiGetMaterialTexture(const C_STRUCT aiMaterial* mat, aiString* path, aiTextureMapping* mapping = NULL, unsigned int* uvindex = NULL, - float* blend = NULL, + ai_real* blend = NULL, aiTextureOp* op = NULL, aiTextureMapMode* mapmode = NULL, unsigned int* flags = NULL); @@ -1548,7 +1548,7 @@ C_ENUM aiReturn aiGetMaterialTexture(const C_STRUCT aiMaterial* mat, C_STRUCT aiString* path, C_ENUM aiTextureMapping* mapping /*= NULL*/, unsigned int* uvindex /*= NULL*/, - float* blend /*= NULL*/, + ai_real* blend /*= NULL*/, C_ENUM aiTextureOp* op /*= NULL*/, C_ENUM aiTextureMapMode* mapmode /*= NULL*/, unsigned int* flags /*= NULL*/); diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 800c54272..cd610fd58 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -55,7 +55,7 @@ inline aiReturn aiMaterial::GetTexture( aiTextureType type, C_STRUCT aiString* path, aiTextureMapping* mapping /*= NULL*/, unsigned int* uvindex /*= NULL*/, - float* blend /*= NULL*/, + ai_real* blend /*= NULL*/, aiTextureOp* op /*= NULL*/, aiTextureMapMode* mapmode /*= NULL*/) const { @@ -123,7 +123,7 @@ inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, // --------------------------------------------------------------------------- inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, - unsigned int idx,float* pOut, + unsigned int idx,ai_real* pOut, unsigned int* pMax) const { return ::aiGetMaterialFloatArray(this,pKey,type,idx,pOut,pMax); @@ -137,7 +137,7 @@ inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, } // --------------------------------------------------------------------------- inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, - unsigned int idx,float& pOut) const + unsigned int idx,ai_real& pOut) const { return aiGetMaterialFloat(this,pKey,type,idx,&pOut); } @@ -209,7 +209,7 @@ inline aiReturn aiMaterial::AddProperty(const double* pInput, unsigned int index) { return AddBinaryProperty((const void*)pInput, - pNumValues * sizeof(float), + pNumValues * sizeof(double), pKey,type,index,aiPTI_Double); } @@ -222,7 +222,7 @@ inline aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, { return AddBinaryProperty((const void*)pInput, pNumValues * sizeof(aiUVTransform), - pKey,type,index,aiPTI_Float); + pKey,type,index,aiPTI_Float); //TODO could be Double ... } // --------------------------------------------------------------------------- @@ -234,7 +234,7 @@ inline aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, { return AddBinaryProperty((const void*)pInput, pNumValues * sizeof(aiColor4D), - pKey,type,index,aiPTI_Float); + pKey,type,index,aiPTI_Float); //TODO could be Double ... } // --------------------------------------------------------------------------- @@ -246,7 +246,7 @@ inline aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, { return AddBinaryProperty((const void*)pInput, pNumValues * sizeof(aiColor3D), - pKey,type,index,aiPTI_Float); + pKey,type,index,aiPTI_Float); //TODO could be Double ... } // --------------------------------------------------------------------------- @@ -258,7 +258,7 @@ inline aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, { return AddBinaryProperty((const void*)pInput, pNumValues * sizeof(aiVector3D), - pKey,type,index,aiPTI_Float); + pKey,type,index,aiPTI_Float); //TODO could be Double ... } // --------------------------------------------------------------------------- @@ -293,6 +293,19 @@ inline aiReturn aiMaterial::AddProperty(const float* pInput, pKey,type,index,aiPTI_Float); } +// --------------------------------------------------------------------------- +template<> +inline aiReturn aiMaterial::AddProperty(const double* pInput, + const unsigned int pNumValues, + const char* pKey, + unsigned int type, + unsigned int index) +{ + return AddBinaryProperty((const void*)pInput, + pNumValues * sizeof(double), + pKey,type,index,aiPTI_Double); +} + // --------------------------------------------------------------------------- template<> inline aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, diff --git a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c index 2f8c1a76a..2dec5bc01 100644 --- a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c +++ b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c @@ -3,7 +3,7 @@ // It takes a file name as command line parameter, loads it using standard // settings and displays it. // -// If you intend to _use_ this code sample in your app, do yourself a favour +// If you intend to _use_ this code sample in your app, do yourself a favour // and replace immediate mode calls with VBOs ... // // The vc8 solution links against assimp-release-dll_win32 - be sure to @@ -49,9 +49,9 @@ void reshape(int width, int height) } /* ---------------------------------------------------------------------------- */ -void get_bounding_box_for_node (const struct aiNode* nd, - struct aiVector3D* min, - struct aiVector3D* max, +void get_bounding_box_for_node (const struct aiNode* nd, + struct aiVector3D* min, + struct aiVector3D* max, struct aiMatrix4x4* trafo ){ struct aiMatrix4x4 prev; @@ -123,7 +123,7 @@ void apply_material(const struct aiMaterial *mtl) struct aiColor4D specular; struct aiColor4D ambient; struct aiColor4D emission; - float shininess, strength; + ai_real shininess, strength; int two_sided; int wireframe; unsigned int max; @@ -174,7 +174,7 @@ void apply_material(const struct aiMaterial *mtl) max = 1; if((AI_SUCCESS == aiGetMaterialIntegerArray(mtl, AI_MATKEY_TWOSIDED, &two_sided, &max)) && two_sided) glDisable(GL_CULL_FACE); - else + else glEnable(GL_CULL_FACE); } @@ -219,7 +219,7 @@ void recursive_render (const struct aiScene *sc, const struct aiNode* nd) int index = face->mIndices[i]; if(mesh->mColors[0] != NULL) glColor4fv((GLfloat*)&mesh->mColors[0][index]); - if(mesh->mNormals != NULL) + if(mesh->mNormals != NULL) glNormal3fv(&mesh->mNormals[index].x); glVertex3fv(&mesh->mVertices[index].x); } @@ -347,11 +347,11 @@ int main(int argc, char **argv) aiAttachLogStream(&stream); /* the model name can be specified on the command line. If none - is specified, we try to locate one of the more expressive test - models from the repository (/models-nonbsd may be missing in + is specified, we try to locate one of the more expressive test + models from the repository (/models-nonbsd may be missing in some distributions so we need a fallback from /models!). */ if( 0 != loadasset( argc >= 2 ? argv[1] : "../../test/models-nonbsd/X/dwarf.x")) { - if( argc != 1 || (0 != loadasset( "../../../../test/models-nonbsd/X/dwarf.x") && 0 != loadasset( "../../test/models/X/Testwuson.X"))) { + if( argc != 1 || (0 != loadasset( "../../../../test/models-nonbsd/X/dwarf.x") && 0 != loadasset( "../../test/models/X/Testwuson.X"))) { return -1; } } @@ -367,7 +367,7 @@ int main(int argc, char **argv) glEnable(GL_NORMALIZE); /* XXX docs say all polygons are emitted CCW, but tests show that some aren't. */ - if(getenv("MODEL_IS_BROKEN")) + if(getenv("MODEL_IS_BROKEN")) glFrontFace(GL_CW); glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); @@ -375,8 +375,8 @@ int main(int argc, char **argv) glutGet(GLUT_ELAPSED_TIME); glutMainLoop(); - /* cleanup - calling 'aiReleaseImport' is important, as the library - keeps internal resources until the scene is freed again. Not + /* cleanup - calling 'aiReleaseImport' is important, as the library + keeps internal resources until the scene is freed again. Not doing so can cause severe resource leaking. */ aiReleaseImport(scene); @@ -386,4 +386,3 @@ int main(int argc, char **argv) aiDetachAllLogStreams(); return 0; } - diff --git a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp index 98ed43915..083650f96 100644 --- a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp +++ b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp @@ -142,13 +142,13 @@ bool Import3DFromFile( const std::string& pFile) } // Resize And Initialize The GL Window -void ReSizeGLScene(GLsizei width, GLsizei height) +void ReSizeGLScene(GLsizei width, GLsizei height) { // Prevent A Divide By Zero By - if (height==0) + if (height==0) { // Making Height Equal One - height=1; + height=1; } glViewport(0, 0, width, height); // Reset The Current Viewport @@ -236,7 +236,7 @@ int LoadGLTextures(const aiScene* scene) if (success) /* If no error occurred: */ { - // Convert every colour component into unsigned byte.If your image contains + // Convert every colour component into unsigned byte.If your image contains // alpha channel you can replace IL_RGB with IL_RGBA success = ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE); if (!success) @@ -246,7 +246,7 @@ int LoadGLTextures(const aiScene* scene) return -1; } // Binding of texture name - glBindTexture(GL_TEXTURE_2D, textureIds[i]); + glBindTexture(GL_TEXTURE_2D, textureIds[i]); // redefine standard texture values // We will use linear interpolation for magnification filter glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); @@ -255,7 +255,7 @@ int LoadGLTextures(const aiScene* scene) // Texture specification glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, - ilGetData()); + ilGetData()); // we also want to be able to deal with odd texture dimensions glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); @@ -269,7 +269,7 @@ int LoadGLTextures(const aiScene* scene) } } // Because we have already copied image data into texture data we can release memory used by image. - ilDeleteImages(numTextures, imageIds); + ilDeleteImages(numTextures, imageIds); // Cleanup delete [] imageIds; @@ -342,7 +342,7 @@ void apply_material(const aiMaterial *mtl) aiColor4D specular; aiColor4D ambient; aiColor4D emission; - float shininess, strength; + ai_real shininess, strength; int two_sided; int wireframe; unsigned int max; // changed: to unsigned