Fixing bugs related to 64-bit upgrade in materials
authorChris Russ <christoph.russ@roames.com.au>
Sat, 16 Jul 2016 23:49:28 +0000 (09:49 +1000)
committerChris Russ <christoph.russ@roames.com.au>
Tue, 16 Aug 2016 06:03:56 +0000 (16:03 +1000)
code/3DSExporter.cpp
code/3DSExporter.h
code/3DSHelper.h
code/3DSLoader.cpp
code/MaterialSystem.cpp
code/ValidateDataStructure.cpp
include/assimp/material.h
include/assimp/material.inl
samples/SimpleOpenGL/Sample_SimpleOpenGL.c
samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp

index 5bb7940..9bef335 100644 (file)
@@ -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
index 321539c..4d9b39d 100644 (file)
@@ -80,6 +80,7 @@ private:
     void WriteString(const aiString& s);
     void WriteColor(const aiColor3D& color);
     void WritePercentChunk(float f);
+    void WritePercentChunk(double f);
 
 private:
 
index e2979bd..b1de4ee 100644 (file)
@@ -129,6 +129,7 @@ public:
 
         CHUNK_PERCENTW  = 0x0030,       // int2   percentage
         CHUNK_PERCENTF  = 0x0031,       // float4  percentage
+        CHUNK_PERCENTD  = 0x0032,       // float8  percentage
         // ********************************************************************
 
         // Prj master chunk
index 59d598f..bae3cb1 100644 (file)
@@ -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();
index 94ca436..088336e 100644 (file)
@@ -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<float> ( reinterpret_cast<float*>(prop->mData)[a] );
+            pOut[a] = static_cast<ai_real> ( reinterpret_cast<float*>(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<ai_real> ( reinterpret_cast<double*>(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<float> ( reinterpret_cast<int32_t*>(prop->mData)[a] );
+            pOut[a] = static_cast<ai_real> ( reinterpret_cast<int32_t*>(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<float>(cur,pOut[a]);
+            cur = fast_atoreal_move<ai_real>(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*/
index 48647f3..fd68670 100644 (file)
@@ -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)");
     }
 
index 9eb76a8..1f97096 100644 (file)
@@ -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*/);
index 800c542..cd610fd 100644 (file)
@@ -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 ...
 }
 
 // ---------------------------------------------------------------------------
@@ -295,6 +295,19 @@ inline aiReturn aiMaterial::AddProperty<float>(const float* pInput,
 
 // ---------------------------------------------------------------------------
 template<>
+inline aiReturn aiMaterial::AddProperty<double>(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<aiUVTransform>(const aiUVTransform* pInput,
     const unsigned int pNumValues,
     const char* pKey,
index 2f8c1a7..2dec5bc 100644 (file)
@@ -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;
 }
-
index 98ed439..083650f 100644 (file)
@@ -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