Browse Source

Demonstrate listing the vertex + index buffers to Model so that it can be saved correctly. Lua bindings not added for now due to problem with serializing a vector of object pointers. Closes #1638.

Lasse Öörni 9 years ago
parent
commit
20af1aa85f

+ 13 - 0
Source/Samples/34_DynamicGeometry/DynamicGeometry.cpp

@@ -243,6 +243,19 @@ void DynamicGeometry::CreateScene()
         fromScratchModel->SetGeometry(0, 0, geom);
         fromScratchModel->SetBoundingBox(BoundingBox(Vector3(-0.5f, -0.5f, -0.5f), Vector3(0.5f, 0.5f, 0.5f)));
 
+        // Though not necessary to render, the vertex & index buffers must be listed in the model so that it can be saved properly
+        Vector<SharedPtr<VertexBuffer> > vertexBuffers;
+        Vector<SharedPtr<IndexBuffer> > indexBuffers;
+        vertexBuffers.Push(vb);
+        indexBuffers.Push(ib);
+        // Morph ranges could also be not defined. Here we simply define a zero range (no morphing) for the vertex buffer
+        PODVector<unsigned> morphRangeStarts;
+        PODVector<unsigned> morphRangeCounts;
+        morphRangeStarts.Push(0);
+        morphRangeCounts.Push(0);
+        fromScratchModel->SetVertexBuffers(vertexBuffers, morphRangeStarts, morphRangeCounts);
+        fromScratchModel->SetIndexBuffers(indexBuffers);
+
         Node* node = scene_->CreateChild("FromScratchObject");
         node->SetPosition(Vector3(0.0f, 3.0f, 0.0f));
         StaticModel* object = node->CreateComponent<StaticModel>();

+ 22 - 0
Source/Urho3D/AngelScript/GraphicsAPI.cpp

@@ -972,10 +972,32 @@ static Model* ModelClone(const String& cloneName, Model* ptr)
     return clone.Get();
 }
 
+static bool ModelSetVertexBuffers(CScriptArray* vertexBuffers, CScriptArray* morphRangeStarts, CScriptArray* morphRangeCounts, Model* ptr)
+{
+    Vector<VertexBuffer*> vbRawPtrs = ArrayToVector<VertexBuffer*>(vertexBuffers);
+    Vector<SharedPtr<VertexBuffer> > vbPtrs(vbRawPtrs.Size());
+    for (unsigned i = 0; i < vbRawPtrs.Size(); ++i)
+        vbPtrs[i] = SharedPtr<VertexBuffer>(vbRawPtrs[i]);
+
+    return ptr->SetVertexBuffers(vbPtrs, ArrayToPODVector<unsigned>(morphRangeStarts), ArrayToPODVector<unsigned>(morphRangeCounts));
+}
+
+static bool ModelSetIndexBuffers(CScriptArray* indexBuffers, Model* ptr)
+{
+    Vector<IndexBuffer*> ibRawPtrs = ArrayToVector<IndexBuffer*>(indexBuffers);
+    Vector<SharedPtr<IndexBuffer> > ibPtrs(ibRawPtrs.Size());
+    for (unsigned i = 0; i < ibRawPtrs.Size(); ++i)
+        ibPtrs[i] = SharedPtr<IndexBuffer>(ibRawPtrs[i]);
+
+    return ptr->SetIndexBuffers(ibPtrs);
+}
+
 static void RegisterModel(asIScriptEngine* engine)
 {
     RegisterResource<Model>(engine, "Model");
     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 SetIndexBuffers(Array<IndexBuffer@>@+)", asFUNCTION(ModelSetIndexBuffers), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Model", "bool SetGeometry(uint, uint, Geometry@+)", asMETHOD(Model, SetGeometry), asCALL_THISCALL);
     engine->RegisterObjectMethod("Model", "Geometry@+ GetGeometry(uint, uint) const", asMETHOD(Model, GetGeometry), asCALL_THISCALL);
     engine->RegisterObjectMethod("Model", "void set_boundingBox(const BoundingBox&in)", asMETHOD(Model, SetBoundingBox), asCALL_THISCALL);

+ 13 - 0
bin/Data/Scripts/34_DynamicGeometry.as

@@ -196,6 +196,19 @@ void CreateScene()
         fromScratchModel.SetGeometry(0, 0, geom);
         fromScratchModel.boundingBox = BoundingBox(Vector3(-0.5, -0.5, -0.5), Vector3(0.5, 0.5, 0.5));
 
+        // Though not necessary to render, the vertex & index buffers must be listed in the model so that it can be saved properly
+        Array<VertexBuffer@> vertexBuffers;
+        Array<IndexBuffer@> indexBuffers;
+        vertexBuffers.Push(vb);
+        indexBuffers.Push(ib);
+        // Morph ranges could also be not defined. Here we simply define a zero range (no morphing) for the vertex buffer
+        Array<uint> morphRangeStarts;
+        Array<uint> morphRangeCounts;
+        morphRangeStarts.Push(0);
+        morphRangeCounts.Push(0);
+        fromScratchModel.SetVertexBuffers(vertexBuffers, morphRangeStarts, morphRangeCounts);
+        fromScratchModel.SetIndexBuffers(indexBuffers);
+
         Node@ node = scene_.CreateChild("FromScratchObject");
         node.position = Vector3(0.0, 3.0, 0.0);
         StaticModel@ object = node.CreateComponent("StaticModel");