Browse Source

Merge pull request #1979 from eugeneko/master

Add Model metadata support.
Eugene Kozlov 8 years ago
parent
commit
00eb0c6ff0

+ 1 - 1
Source/Urho3D/AngelScript/GraphicsAPI.cpp

@@ -995,7 +995,7 @@ static bool ModelSetIndexBuffers(CScriptArray* indexBuffers, Model* ptr)
 
 
 static void RegisterModel(asIScriptEngine* engine)
 static void RegisterModel(asIScriptEngine* engine)
 {
 {
-    RegisterResource<Model>(engine, "Model");
+    RegisterResourceWithMetadata<Model>(engine, "Model");
     engine->RegisterObjectMethod("Model", "Model@ Clone(const String&in cloneName = String()) const", asFUNCTION(ModelClone), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Model", "Model@ Clone(const String&in cloneName = String()) const", asFUNCTION(ModelClone), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Model", "bool SetVertexBuffers(Array<VertexBuffer@>@+, Array<uint>@+, Array<uint>@+)", asFUNCTION(ModelSetVertexBuffers), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Model", "bool SetVertexBuffers(Array<VertexBuffer@>@+, Array<uint>@+, Array<uint>@+)", asFUNCTION(ModelSetVertexBuffers), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Model", "bool SetIndexBuffers(Array<IndexBuffer@>@+)", asFUNCTION(ModelSetIndexBuffers), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Model", "bool SetIndexBuffers(Array<IndexBuffer@>@+)", asFUNCTION(ModelSetIndexBuffers), asCALL_CDECL_OBJLAST);

+ 30 - 1
Source/Urho3D/Graphics/Model.cpp

@@ -31,6 +31,9 @@
 #include "../Graphics/VertexBuffer.h"
 #include "../Graphics/VertexBuffer.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
 #include "../IO/File.h"
 #include "../IO/File.h"
+#include "../IO/FileSystem.h"
+#include "../Resource/ResourceCache.h"
+#include "../Resource/XMLFile.h"
 
 
 #include "../DebugNew.h"
 #include "../DebugNew.h"
 
 
@@ -58,7 +61,7 @@ unsigned LookupIndexBuffer(IndexBuffer* buffer, const Vector<SharedPtr<IndexBuff
 }
 }
 
 
 Model::Model(Context* context) :
 Model::Model(Context* context) :
-    Resource(context)
+    ResourceWithMetadata(context)
 {
 {
 }
 }
 
 
@@ -306,6 +309,13 @@ bool Model::BeginLoad(Deserializer& source)
         geometryCenters_.Push(Vector3::ZERO);
         geometryCenters_.Push(Vector3::ZERO);
     memoryUse += sizeof(Vector3) * geometries_.Size();
     memoryUse += sizeof(Vector3) * geometries_.Size();
 
 
+    // Read metadata
+    ResourceCache* cache = GetSubsystem<ResourceCache>();
+    String xmlName = ReplaceExtension(GetName(), ".xml");
+    SharedPtr<XMLFile> file(cache->GetTempResource<XMLFile>(xmlName, false));
+    if (file)
+        LoadMetadataFromXML(file->GetRoot());
+
     SetMemoryUse(memoryUse);
     SetMemoryUse(memoryUse);
     return true;
     return true;
 }
 }
@@ -453,6 +463,25 @@ bool Model::Save(Serializer& dest) const
     for (unsigned i = 0; i < geometryCenters_.Size(); ++i)
     for (unsigned i = 0; i < geometryCenters_.Size(); ++i)
         dest.WriteVector3(geometryCenters_[i]);
         dest.WriteVector3(geometryCenters_[i]);
 
 
+    // Write metadata
+    if (HasMetadata())
+    {
+        File* destFile = dynamic_cast<File*>(&dest);
+        if (destFile)
+        {
+            String xmlName = ReplaceExtension(destFile->GetName(), ".xml");
+
+            SharedPtr<XMLFile> xml(new XMLFile(context_));
+            XMLElement rootElem = xml->CreateRoot("model");
+            SaveMetadataToXML(rootElem);
+
+            File xmlFile(context_, xmlName, FILE_WRITE);
+            xml->Save(xmlFile);
+        }
+        else
+            URHO3D_LOGWARNING("Can not save model metadata when not saving into a file");
+    }
+
     return true;
     return true;
 }
 }
 
 

+ 2 - 2
Source/Urho3D/Graphics/Model.h

@@ -105,9 +105,9 @@ struct GeometryDesc
 };
 };
 
 
 /// 3D model resource.
 /// 3D model resource.
-class URHO3D_API Model : public Resource
+class URHO3D_API Model : public ResourceWithMetadata
 {
 {
-    URHO3D_OBJECT(Model, Resource);
+    URHO3D_OBJECT(Model, ResourceWithMetadata);
 
 
 public:
 public:
     /// Construct.
     /// Construct.

+ 1 - 1
Source/Urho3D/LuaScript/pkgs/Graphics/Model.pkg

@@ -1,6 +1,6 @@
 $#include "Graphics/Model.h"
 $#include "Graphics/Model.h"
 
 
-class Model : public Resource
+class Model : public ResourceWithMetadata
 {
 {
     Model();
     Model();
     ~Model();
     ~Model();