Browse Source

add support for vertex color import

ctrauma 9 years ago
parent
commit
8841fd3697

+ 4 - 2
Source/ToolCore/Import/ImportConfig.cpp

@@ -70,6 +70,8 @@ bool ImportConfig::LoadModelImporterConfig(const JSONValue& jModelImporterConfig
             valueMap_["ImportMaterials"] = GetBoolValue(jvalue, true);
             valueMap_["ImportMaterials"] = GetBoolValue(jvalue, true);
         else if (key == "includeNonSkinningBones")
         else if (key == "includeNonSkinningBones")
             valueMap_["IncludeNonSkinningBones"] = GetBoolValue(jvalue, true);
             valueMap_["IncludeNonSkinningBones"] = GetBoolValue(jvalue, true);
+        else if (key == "useVertexColors")
+            valueMap_["useVertexColors"] = GetBoolValue(jvalue, false);
     }
     }
 
 
     return true;
     return true;
@@ -99,7 +101,7 @@ bool ImportConfig::LoadDesktopConfig(JSONValue root)
     const JSONValue& jModelImporterConfig = jdesktop["ModelImporter"];
     const JSONValue& jModelImporterConfig = jdesktop["ModelImporter"];
     if (jModelImporterConfig.IsObject())
     if (jModelImporterConfig.IsObject())
         LoadModelImporterConfig(jModelImporterConfig);
         LoadModelImporterConfig(jModelImporterConfig);
- 
+
     const JSONValue& jTextureImporterConfig = jdesktop["TextureImporter"];
     const JSONValue& jTextureImporterConfig = jdesktop["TextureImporter"];
     if (jTextureImporterConfig.IsObject())
     if (jTextureImporterConfig.IsObject())
         LoadTextureImporterConfig(jTextureImporterConfig);
         LoadTextureImporterConfig(jTextureImporterConfig);
@@ -107,4 +109,4 @@ bool ImportConfig::LoadDesktopConfig(JSONValue root)
     return true;
     return true;
 }
 }
 
 
-}
+}

+ 34 - 0
Source/ToolCore/Import/OpenAssetImporter.cpp

@@ -73,6 +73,7 @@ OpenAssetImporter::OpenAssetImporter(Context* context) : Object(context) ,
     noOverwriteTexture_(true),
     noOverwriteTexture_(true),
     noOverwriteNewerTexture_(true),
     noOverwriteNewerTexture_(true),
     checkUniqueModel_(true),
     checkUniqueModel_(true),
+    useVertexColors_(false),
     scale_(1.0f),
     scale_(1.0f),
     maxBones_(64),
     maxBones_(64),
     defaultTicksPerSecond_(4800.0f),
     defaultTicksPerSecond_(4800.0f),
@@ -572,6 +573,7 @@ String OpenAssetImporter::GetMeshMaterialName(aiMesh* mesh)
     aiMaterial* material = scene_->mMaterials[mesh->mMaterialIndex];
     aiMaterial* material = scene_->mMaterials[mesh->mMaterialIndex];
     aiString matNameStr;
     aiString matNameStr;
     material->Get(AI_MATKEY_NAME, matNameStr);
     material->Get(AI_MATKEY_NAME, matNameStr);
+
     String matName = SanitateAssetName(FromAIString(matNameStr));
     String matName = SanitateAssetName(FromAIString(matNameStr));
     if (matName.Trimmed().Empty())
     if (matName.Trimmed().Empty())
         matName = GenerateMaterialName(material);
         matName = GenerateMaterialName(material);
@@ -909,6 +911,15 @@ void OpenAssetImporter::SetOveriddenFlags(VariantMap& aiFlagParameters)
             importMaterialsDefault_ = itr->second_.GetBool();
             importMaterialsDefault_ = itr->second_.GetBool();
         else if (itr->first_ == "IncludeNonSkinningBones")
         else if (itr->first_ == "IncludeNonSkinningBones")
             includeNonSkinningBonesDefault_ = itr->second_.GetBool();
             includeNonSkinningBonesDefault_ = itr->second_.GetBool();
+        else if (itr->first_ == "useVertexColors")
+        {
+            PrintLine("*** GOT VERTEX SETTING ***");
+
+            useVertexColors_ = itr->second_.GetBool();
+
+            if(useVertexColors_) PrintLine("**** VERTEX TRUE ****");
+                    else PrintLine("**** VERTEX FALSE ****");
+        }
 
 
         itr++;
         itr++;
     }
     }
@@ -1235,12 +1246,16 @@ bool OpenAssetImporter::BuildAndSaveMaterial(aiMaterial* material, HashSet<Strin
 
 
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE, 0), stringVal) == AI_SUCCESS)
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE, 0), stringVal) == AI_SUCCESS)
         diffuseTexName = GetFileNameAndExtension(FromAIString(stringVal));
         diffuseTexName = GetFileNameAndExtension(FromAIString(stringVal));
+
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_NORMALS, 0), stringVal) == AI_SUCCESS)
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_NORMALS, 0), stringVal) == AI_SUCCESS)
         normalTexName = GetFileNameAndExtension(FromAIString(stringVal));
         normalTexName = GetFileNameAndExtension(FromAIString(stringVal));
+
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_SPECULAR, 0), stringVal) == AI_SUCCESS)
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_SPECULAR, 0), stringVal) == AI_SUCCESS)
         specularTexName = GetFileNameAndExtension(FromAIString(stringVal));
         specularTexName = GetFileNameAndExtension(FromAIString(stringVal));
+
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_LIGHTMAP, 0), stringVal) == AI_SUCCESS)
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_LIGHTMAP, 0), stringVal) == AI_SUCCESS)
         specularTexName = GetFileNameAndExtension(FromAIString(stringVal));
         specularTexName = GetFileNameAndExtension(FromAIString(stringVal));
+
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_EMISSIVE, 0), stringVal) == AI_SUCCESS)
     if (material->Get(AI_MATKEY_TEXTURE(aiTextureType_EMISSIVE, 0), stringVal) == AI_SUCCESS)
         emissiveTexName = GetFileNameAndExtension(FromAIString(stringVal));
         emissiveTexName = GetFileNameAndExtension(FromAIString(stringVal));
 
 
@@ -1286,6 +1301,25 @@ bool OpenAssetImporter::BuildAndSaveMaterial(aiMaterial* material, HashSet<Strin
     if (hasAlpha)
     if (hasAlpha)
         techniqueName += "Alpha";
         techniqueName += "Alpha";
 
 
+    // See if any mesh that uses this material has vertex colors
+    // and set the technique accordingly, if enabled
+    for (unsigned i = 0; i < scene_->mNumMeshes && useVertexColors_; i++)
+    {
+        aiMesh* mesh = scene_->mMeshes[i];
+        aiMaterial* mesh_material = scene_->mMaterials[mesh->mMaterialIndex];
+        aiString meshMatNameStr;
+        mesh_material->Get(AI_MATKEY_NAME, meshMatNameStr);
+
+        if(mesh->GetNumColorChannels() > 0)
+        {
+             if(matNameStr == meshMatNameStr)
+             {
+                 techniqueName += "VCol";
+                 break;
+             }
+        }
+    }
+
     XMLElement techniqueElem = materialElem.CreateChild("technique");
     XMLElement techniqueElem = materialElem.CreateChild("technique");
     techniqueElem.SetString("name", techniqueName + ".xml");
     techniqueElem.SetString("name", techniqueName + ".xml");
 
 

+ 1 - 0
Source/ToolCore/Import/OpenAssetImporter.h

@@ -131,6 +131,7 @@ private:
     bool noOverwriteTexture_;
     bool noOverwriteTexture_;
     bool noOverwriteNewerTexture_;
     bool noOverwriteNewerTexture_;
     bool checkUniqueModel_;
     bool checkUniqueModel_;
+    bool useVertexColors_;
     float scale_;
     float scale_;
     unsigned maxBones_;
     unsigned maxBones_;