Browse Source

Adding submesh geometry names

Josh Engebretson 10 years ago
parent
commit
118896f364

+ 43 - 0
Source/Atomic/Atomic3D/Model.cpp

@@ -91,6 +91,7 @@ bool Model::BeginLoad(Deserializer& source)
     geometries_.Clear();
     geometries_.Clear();
     geometryBoneMappings_.Clear();
     geometryBoneMappings_.Clear();
     geometryCenters_.Clear();
     geometryCenters_.Clear();
+    geometryNames_.Clear();
     morphs_.Clear();
     morphs_.Clear();
     vertexBuffers_.Clear();
     vertexBuffers_.Clear();
     indexBuffers_.Clear();
     indexBuffers_.Clear();
@@ -302,6 +303,13 @@ bool Model::BeginLoad(Deserializer& source)
     // MODEL_VERSION
     // MODEL_VERSION
     unsigned version = source.ReadUInt();
     unsigned version = source.ReadUInt();
 
 
+    // Read geometry names
+    geometryNames_.Resize(geometries_.Size());
+    for (unsigned i = 0; i < geometries_.Size(); ++i)
+    {
+        geometryNames_[i] = source.ReadString();
+    }
+
     SetMemoryUse(memoryUse);
     SetMemoryUse(memoryUse);
     return true;
     return true;
 }
 }
@@ -445,6 +453,10 @@ bool Model::Save(Serializer& dest) const
 
 
     dest.WriteUInt(MODEL_VERSION);
     dest.WriteUInt(MODEL_VERSION);
 
 
+    // Write geometry names
+    for (unsigned i = 0; i < geometryNames_.Size(); ++i)
+        dest.WriteString(geometryNames_[i]);
+
     // ATOMIC END
     // ATOMIC END
 
 
 
 
@@ -512,6 +524,7 @@ void Model::SetNumGeometries(unsigned num)
     geometries_.Resize(num);
     geometries_.Resize(num);
     geometryBoneMappings_.Resize(num);
     geometryBoneMappings_.Resize(num);
     geometryCenters_.Resize(num);
     geometryCenters_.Resize(num);
+    geometryNames_.Resize(num);
 
 
     // For easier creation of from-scratch geometry, ensure that all geometries start with at least 1 LOD level (0 makes no sense)
     // For easier creation of from-scratch geometry, ensure that all geometries start with at least 1 LOD level (0 makes no sense)
     for (unsigned i = 0; i < geometries_.Size(); ++i)
     for (unsigned i = 0; i < geometries_.Size(); ++i)
@@ -653,8 +666,11 @@ SharedPtr<Model> Model::Clone(const String& cloneName) const
 
 
     // Deep copy all the geometry LOD levels and refer to the copied vertex/index buffers
     // Deep copy all the geometry LOD levels and refer to the copied vertex/index buffers
     ret->geometries_.Resize(geometries_.Size());
     ret->geometries_.Resize(geometries_.Size());
+    ret->geometryNames_.Resize(geometryNames_.Size());
     for (unsigned i = 0; i < geometries_.Size(); ++i)
     for (unsigned i = 0; i < geometries_.Size(); ++i)
     {
     {
+        ret->geometryNames_[i] = geometryNames_[i];
+
         ret->geometries_[i].Resize(geometries_[i].Size());
         ret->geometries_[i].Resize(geometries_[i].Size());
         for (unsigned j = 0; j < geometries_[i].Size(); ++j)
         for (unsigned j = 0; j < geometries_[i].Size(); ++j)
         {
         {
@@ -749,4 +765,31 @@ unsigned Model::GetMorphRangeCount(unsigned bufferIndex) const
     return bufferIndex < vertexBuffers_.Size() ? morphRangeCounts_[bufferIndex] : 0;
     return bufferIndex < vertexBuffers_.Size() ? morphRangeCounts_[bufferIndex] : 0;
 }
 }
 
 
+// ATOMIC BEGIN
+
+bool Model::SetGeometryName(unsigned index, const String& name)
+{
+    if (index >= geometryNames_.Size())
+    {
+        LOGERROR("Geometry name index out of bounds");
+        return false;
+    }
+
+    geometryNames_[index] = name;
+
+    return true;
+
+}
+
+const String& Model::GetGeometryName(unsigned index) const
+{
+    if (index >= geometryNames_.Size())
+        return String::EMPTY;
+
+    return geometryNames_[index];
+
+}
+
+// ATOMIC END
+
 }
 }

+ 12 - 0
Source/Atomic/Atomic3D/Model.h

@@ -209,6 +209,14 @@ public:
     /// Return vertex buffer morph range vertex count.
     /// Return vertex buffer morph range vertex count.
     unsigned GetMorphRangeCount(unsigned bufferIndex) const;
     unsigned GetMorphRangeCount(unsigned bufferIndex) const;
 
 
+    // ATOMIC BEGIN
+
+    bool SetGeometryName(unsigned index, const String& name);
+    const String& GetGeometryName(unsigned index) const;
+    const Vector<String>& GetGeometryNames() const { return geometryNames_; }
+
+    // ATOMIC END
+
 private:
 private:
     /// Bounding box.
     /// Bounding box.
     BoundingBox boundingBox_;
     BoundingBox boundingBox_;
@@ -237,6 +245,10 @@ private:
     /// Geometry definitions for asynchronous loading.
     /// Geometry definitions for asynchronous loading.
     Vector<PODVector<GeometryDesc> > loadGeometries_;
     Vector<PODVector<GeometryDesc> > loadGeometries_;
 
 
+    // ATOMIC BEGIN
+    Vector<String> geometryNames_;
+    // ATOMIC END
+
 };
 };
 
 
 }
 }

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

@@ -468,6 +468,8 @@ bool OpenAssetImporter::BuildAndSaveModel(OutModel& model)
         outModel->SetNumGeometryLodLevels(destGeomIndex, 1);
         outModel->SetNumGeometryLodLevels(destGeomIndex, 1);
         outModel->SetGeometry(destGeomIndex, 0, geom);
         outModel->SetGeometry(destGeomIndex, 0, geom);
         outModel->SetGeometryCenter(destGeomIndex, center);
         outModel->SetGeometryCenter(destGeomIndex, center);
+        outModel->SetGeometryName(destGeomIndex, FromAIString(model.meshNodes_[i]->mName));
+
         if (model.bones_.Size() > maxBones_)
         if (model.bones_.Size() > maxBones_)
             allBoneMappings.Push(boneMappings);
             allBoneMappings.Push(boneMappings);