Browse Source

Fix the scene loading/saving to work from Lua. Before, casts to Deserializer/Serializer would crash due to File's multiple-inheritance. Note that the file still needs to be closed manually.

Lasse Öörni 12 years ago
parent
commit
39fc6dfd64

+ 9 - 4
Bin/Data/LuaScripts/12_PhysicsStressTest.lua

@@ -210,12 +210,17 @@ function MoveCamera(timeStep)
     -- Check for loading/saving the scene. Save the scene to the file Data/Scenes/Physics.xml relative to the executable
     -- directory
     if input:GetKeyPress(KEY_F5) then
-        -- local saveFile = File(context, fileSystem:GetProgramDir():CString().."Data/Scenes/PhysicsStressTest.xml", FILE_WRITE)
-        -- scene_:SaveXML(saveFile)
+        print("Filepath " .. fileSystem:GetProgramDir().."Data/Scenes/PhysicsStressTest.xml")
+        local saveFile = File(context, fileSystem:GetProgramDir().."Data/Scenes/PhysicsStressTest.xml", FILE_WRITE)
+        scene_:SaveXML(saveFile)
+        -- Make sure the file gets closed
+        saveFile:Close()
     end
     if input:GetKeyPress(KEY_F7) then
-        -- local loadFile = File(context, fileSystem:GetProgramDir():CString().."Data/Scenes/PhysicsStressTest.xml", FILE_READ)
-        -- scene_:LoadXML(loadFile)
+        local loadFile = File(context, fileSystem:GetProgramDir().."Data/Scenes/PhysicsStressTest.xml", FILE_READ)
+        scene_:LoadXML(loadFile)
+        -- Make sure the file gets closed
+        loadFile:Close()
     end
 
     -- Toggle debug geometry with space

+ 3 - 3
Docs/LuaScriptAPI.dox

@@ -3694,7 +3694,7 @@ Node : Serializable
 Methods:<br>
 - Node(Context* context)
 - virtual ~Node()
-- bool SaveXML(Serializer& dest) const
+- bool SaveXML(File* dest) const
 - void SetName(const String name)
 - void SetPosition(const Vector3& position)
 - void SetPositionXYZ(float x, float y, float z)
@@ -3833,8 +3833,8 @@ Scene : Node
 Methods:<br>
 - Scene(Context* context)
 - virtual ~Scene()
-- bool LoadXML(Deserializer& source)
-- bool SaveXML(Serializer& dest) const
+- bool LoadXML(File* source)
+- bool SaveXML(File* dest) const
 - bool LoadAsync(File* file)
 - bool LoadAsyncXML(File* file)
 - void StopAsyncLoading()

+ 7 - 1
Source/Extras/LuaScript/pkgs/Scene/Node.pkg

@@ -1,3 +1,4 @@
+$#include "File.h"
 $#include "Node.h"
 
 enum CreateMode
@@ -11,7 +12,7 @@ class Node : public Serializable
     Node(Context* context);
     virtual ~Node();
 
-    bool SaveXML(Serializer& dest) const;
+    tolua_outside bool NodeSaveXML @ SaveXML(File* dest) const;
     void SetName(const String name);
     
     void SetPosition(const Vector3& position);
@@ -190,6 +191,11 @@ class Node : public Serializable
 };
 
 ${
+static bool NodeSaveXML(const Node* node, File* file)
+{
+    return file ? node->SaveXML(*file) : false;
+}
+
 static void NodeSetPositionXYZ(Node* node, float x, float y, float z)
 {
     node->SetPosition(Vector3(x, y, z));

+ 15 - 2
Source/Extras/LuaScript/pkgs/Scene/Scene.pkg

@@ -10,8 +10,8 @@ class Scene : public Node
     Scene(Context* context);
     virtual ~Scene();
     
-    bool LoadXML(Deserializer& source);
-    bool SaveXML(Serializer& dest) const;
+    tolua_outside bool SceneLoadXML @ LoadXML(File* source);
+    tolua_outside bool SceneSaveXML @ SaveXML(File* dest) const;
     bool LoadAsync(File* file);
     bool LoadAsyncXML(File* file);
     void StopAsyncLoading();
@@ -67,3 +67,16 @@ class Scene : public Node
     tolua_readonly tolua_property__is_set bool threadedUpdate;
     tolua_property__get_set String varNamesAttr;
 };
+
+${
+static bool SceneLoadXML(Scene* scene, File* file)
+{
+    return file ? scene->LoadXML(*file) : false;
+}
+
+static bool SceneSaveXML(const Scene* scene, File* file)
+{
+    return file ? scene->SaveXML(*file) : false;
+}
+$}
+