Browse Source

Registered XML file creation to script.
Registered component & entity XML load/save to script.
Fixed possible null pointer access in loading XML parameter files.

Lasse Öörni 15 years ago
parent
commit
fd141c7cf1

BIN
Bin/Data/GraphicsTestScene.scn


+ 5 - 2
Engine/Audio/Sound.cpp

@@ -350,8 +350,11 @@ void Sound::loadParameters(ResourceCache* cache)
     if (!cache->exists(xmlName))
     if (!cache->exists(xmlName))
         return;
         return;
     
     
-    XMLFile* xml = cache->getResource<XMLFile>(xmlName);
-    XMLElement rootElem = xml->getRootElement();
+    XMLFile* file = cache->getResource<XMLFile>(xmlName);
+    if (!file)
+        return;
+    
+    XMLElement rootElem = file->getRootElement();
     XMLElement paramElem = rootElem.getChildElement("");
     XMLElement paramElem = rootElem.getChildElement("");
     
     
     while (paramElem)
     while (paramElem)

+ 10 - 3
Engine/Engine/RegisterResource.cpp

@@ -188,7 +188,12 @@ static void registerXMLElement(asIScriptEngine* engine)
     engine->RegisterObjectMethod("XMLElement", "bool setVector3(const string& in, const Vector3& in)", asMETHOD(XMLElement, setVector3), asCALL_THISCALL);
     engine->RegisterObjectMethod("XMLElement", "bool setVector3(const string& in, const Vector3& in)", asMETHOD(XMLElement, setVector3), asCALL_THISCALL);
 }
 }
 
 
-static XMLFile* ConstructXMLFile(const std::string& name)
+static XMLFile* ConstructXMLFile()
+{
+    return new XMLFile();
+}
+
+static XMLFile* ConstructXMLFileWithName(const std::string& name)
 {
 {
     return new XMLFile(name);
     return new XMLFile(name);
 }
 }
@@ -196,7 +201,7 @@ static XMLFile* ConstructXMLFile(const std::string& name)
 static void XMLFileLoad(File* file, XMLFile* ptr)
 static void XMLFileLoad(File* file, XMLFile* ptr)
 {
 {
     if (!file)
     if (!file)
-        SAFE_EXCEPTION("Null XML file source");
+        SAFE_EXCEPTION("Null source file");
     try
     try
     {
     {
         ptr->load(*file);
         ptr->load(*file);
@@ -210,7 +215,7 @@ static void XMLFileLoad(File* file, XMLFile* ptr)
 static void XMLFileSave(File* file, XMLFile* ptr)
 static void XMLFileSave(File* file, XMLFile* ptr)
 {
 {
     if (!file)
     if (!file)
-        SAFE_EXCEPTION("Null XML file for saving");
+        SAFE_EXCEPTION("Null destination file");
     try
     try
     {
     {
         ptr->save(*file);
         ptr->save(*file);
@@ -224,6 +229,8 @@ static void XMLFileSave(File* file, XMLFile* ptr)
 static void registerXMLFile(asIScriptEngine* engine)
 static void registerXMLFile(asIScriptEngine* engine)
 {
 {
     registerResource<XMLFile>(engine, "XMLFile");
     registerResource<XMLFile>(engine, "XMLFile");
+    engine->RegisterObjectBehaviour("XMLFile", asBEHAVE_FACTORY, "XMLFile@+ f()", asFUNCTION(ConstructXMLFile), asCALL_CDECL);
+    engine->RegisterObjectBehaviour("XMLFile", asBEHAVE_FACTORY, "XMLFile@+ f(const string& in)", asFUNCTION(ConstructXMLFileWithName), asCALL_CDECL);
     engine->RegisterObjectMethod("XMLFile", "void load(File@+)", asFUNCTION(XMLFileLoad), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("XMLFile", "void load(File@+)", asFUNCTION(XMLFileLoad), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("XMLFile", "void save(File@+)", asFUNCTION(XMLFileSave), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("XMLFile", "void save(File@+)", asFUNCTION(XMLFileSave), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("XMLFile", "XMLElement createRootElement(const string& in)", asMETHOD(XMLFile, createRootElement), asCALL_THISCALL);
     engine->RegisterObjectMethod("XMLFile", "XMLElement createRootElement(const string& in)", asMETHOD(XMLFile, createRootElement), asCALL_THISCALL);

+ 2 - 0
Engine/Engine/RegisterScene.cpp

@@ -218,6 +218,8 @@ static void registerEntity(asIScriptEngine* engine)
     engine->RegisterObjectType("Scene", 0, asOBJ_REF);
     engine->RegisterObjectType("Scene", 0, asOBJ_REF);
     engine->RegisterObjectBehaviour("Entity", asBEHAVE_ADDREF, "void f()", asMETHOD(Entity, addRef), asCALL_THISCALL);
     engine->RegisterObjectBehaviour("Entity", asBEHAVE_ADDREF, "void f()", asMETHOD(Entity, addRef), asCALL_THISCALL);
     engine->RegisterObjectBehaviour("Entity", asBEHAVE_RELEASE, "void f()", asMETHOD(Entity, releaseRef), asCALL_THISCALL);
     engine->RegisterObjectBehaviour("Entity", asBEHAVE_RELEASE, "void f()", asMETHOD(Entity, releaseRef), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Entity", "void saveXML(XMLElement&)", asFUNCTION(objectSaveXML<Entity>), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectMethod("Entity", "void loadXML(const XMLElement&)", asFUNCTION(objectLoadXML<Entity>), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Entity", "void setName(const string& in)", asMETHOD(Entity, setName), asCALL_THISCALL);
     engine->RegisterObjectMethod("Entity", "void setName(const string& in)", asMETHOD(Entity, setName), asCALL_THISCALL);
     engine->RegisterObjectMethod("Entity", "void setNetFlags(uint8)", asMETHOD(Entity, setNetFlags), asCALL_THISCALL);
     engine->RegisterObjectMethod("Entity", "void setNetFlags(uint8)", asMETHOD(Entity, setNetFlags), asCALL_THISCALL);
     engine->RegisterObjectMethod("Entity", "void setGroupFlags(uint)", asMETHOD(Entity, setGroupFlags), asCALL_THISCALL);
     engine->RegisterObjectMethod("Entity", "void setGroupFlags(uint)", asMETHOD(Entity, setGroupFlags), asCALL_THISCALL);

+ 29 - 2
Engine/Engine/RegisterTemplates.h

@@ -164,7 +164,6 @@ template <class T> CScriptArray* setToArray(const std::set<T>& set, const char*
         return 0;
         return 0;
 }
 }
 
 
-
 //! Template function for registering implicit ref casts between two classes
 //! Template function for registering implicit ref casts between two classes
 template <class T, class U> void registerRefCasts(asIScriptEngine* engine, const char* classNameT, const char* classNameU)
 template <class T, class U> void registerRefCasts(asIScriptEngine* engine, const char* classNameT, const char* classNameU)
 {
 {
@@ -204,7 +203,7 @@ template <class T> void registerSerializer(asIScriptEngine* engine, const char*
     engine->RegisterObjectMethod(className, "void writeVLE(uint)", asMETHODPR(T, writeVLE, (unsigned), void), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "void writeVLE(uint)", asMETHODPR(T, writeVLE, (unsigned), void), asCALL_THISCALL);
 }
 }
 
 
-//! Template function for registering a class derived from Deerializer
+//! Template function for registering a class derived from Deserializer
 template <class T> void registerDeserializer(asIScriptEngine* engine, const char* className)
 template <class T> void registerDeserializer(asIScriptEngine* engine, const char* className)
 {
 {
     engine->RegisterObjectMethod(className, "int readInt()", asMETHODPR(T, readInt, (), int), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "int readInt()", asMETHODPR(T, readInt, (), int), asCALL_THISCALL);
@@ -248,10 +247,38 @@ template <class T> void registerHashedType(asIScriptEngine* engine, const char*
     engine->RegisterObjectMethod(className, "const string& getTypeName() const", asMETHODPR(T, getTypeName, () const, const std::string&), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "const string& getTypeName() const", asMETHODPR(T, getTypeName, () const, const std::string&), asCALL_THISCALL);
 }
 }
 
 
+//! Template function for saving a component or an entity to XML
+template <class T> void objectSaveXML(XMLElement& element, T* ptr)
+{
+    try
+    {
+        ptr->saveXML(element);
+    }
+    catch (Exception& e)
+    {
+        SAFE_RETHROW(e);
+    }
+}
+
+//! Template function for loading a component or an entity from XML
+template <class T> void objectLoadXML(const XMLElement& element, T* ptr)
+{
+    try
+    {
+        ptr->loadXML(element, getEngine()->getResourceCache());
+    }
+    catch (Exception& e)
+    {
+        SAFE_RETHROW(e);
+    }
+}
+
 //! Template function for registering a class derived from Component
 //! Template function for registering a class derived from Component
 template <class T> void registerComponent(asIScriptEngine* engine, const char* className)
 template <class T> void registerComponent(asIScriptEngine* engine, const char* className)
 {
 {
     registerHashedType<T>(engine, className);
     registerHashedType<T>(engine, className);
+    engine->RegisterObjectMethod(className, "void saveXML(XMLElement&)", asFUNCTION(objectSaveXML<T>), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectMethod(className, "void loadXML(const XMLElement&)", asFUNCTION(objectLoadXML<T>), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod(className, "void setName(const string& in)", asMETHODPR(T, setName, (const std::string&), void), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "void setName(const string& in)", asMETHODPR(T, setName, (const std::string&), void), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "void setNetFlags(uint8)", asMETHODPR(T, setNetFlags, (unsigned char), void), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "void setNetFlags(uint8)", asMETHODPR(T, setNetFlags, (unsigned char), void), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "const string& getName() const", asMETHODPR(T, getName, () const, const std::string&), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "const string& getName() const", asMETHODPR(T, getName, () const, const std::string&), asCALL_THISCALL);

+ 4 - 2
Engine/Renderer/PixelShader.cpp

@@ -154,10 +154,12 @@ void PixelShader::loadParameters(ResourceCache* cache)
     std::string shaderGroup = shaderName.substr(0, index);
     std::string shaderGroup = shaderName.substr(0, index);
     
     
     // Load shader information XML file
     // Load shader information XML file
-    XMLFile* xml = cache->getResource<XMLFile>(shaderPath + shaderGroup + ".xml");
+    XMLFile* file = cache->getResource<XMLFile>(shaderPath + shaderGroup + ".xml");
+    if (!file)
+        return;
     
     
     // Update (global) parameter register mappings
     // Update (global) parameter register mappings
-    XMLElement shadersElem = xml->getRootElement();
+    XMLElement shadersElem = file->getRootElement();
     XMLElement paramsElem = shadersElem.getChildElement("psparameters");
     XMLElement paramsElem = shadersElem.getChildElement("psparameters");
     XMLElement paramElem = paramsElem.getChildElement("parameter");
     XMLElement paramElem = paramsElem.getChildElement("parameter");
     
     

+ 7 - 4
Engine/Renderer/Texture.cpp

@@ -149,14 +149,17 @@ void Texture::loadParameters(ResourceCache* cache)
     
     
     if (cache->exists(xmlName))
     if (cache->exists(xmlName))
     {
     {
-        XMLFile* xml = cache->getResource<XMLFile>(xmlName);
-        loadParameters(*xml);
+        XMLFile* file = cache->getResource<XMLFile>(xmlName);
+        loadParameters(file);
     }
     }
 }
 }
 
 
-void Texture::loadParameters(XMLFile& xml)
+void Texture::loadParameters(XMLFile* file)
 {
 {
-    XMLElement rootElem = xml.getRootElement();
+    if (!file)
+        return;
+    
+    XMLElement rootElem = file->getRootElement();
     XMLElement paramElem = rootElem.getChildElement("");
     XMLElement paramElem = rootElem.getChildElement("");
     
     
     while (paramElem)
     while (paramElem)

+ 1 - 1
Engine/Renderer/Texture.h

@@ -96,7 +96,7 @@ protected:
     //! Load parameters
     //! Load parameters
     void loadParameters(ResourceCache* cache);
     void loadParameters(ResourceCache* cache);
     //! Load parameters from an XML file
     //! Load parameters from an XML file
-    void loadParameters(XMLFile& xml);
+    void loadParameters(XMLFile* xml);
     //! Check whether texture memory budget has been exceeded. Free unused materials in that case to release the texture references
     //! Check whether texture memory budget has been exceeded. Free unused materials in that case to release the texture references
     void checkTextureBudget(ShortStringHash type, ResourceCache* cache);
     void checkTextureBudget(ShortStringHash type, ResourceCache* cache);
     
     

+ 1 - 1
Engine/Renderer/TextureCube.cpp

@@ -123,7 +123,7 @@ void TextureCube::load(Deserializer& source, ResourceCache* cache)
     XMLFile xml;
     XMLFile xml;
     xml.load(source, cache);
     xml.load(source, cache);
     
     
-    loadParameters(xml);
+    loadParameters(&xml);
     
     
     XMLElement textureElem = xml.getRootElement();
     XMLElement textureElem = xml.getRootElement();
     XMLElement faceElem = textureElem.getChildElement("face");
     XMLElement faceElem = textureElem.getChildElement("face");

+ 4 - 2
Engine/Renderer/VertexShader.cpp

@@ -153,10 +153,12 @@ void VertexShader::loadParameters(ResourceCache* cache)
     std::string shaderGroup = shaderName.substr(0, index);
     std::string shaderGroup = shaderName.substr(0, index);
     
     
     // Load shader information XML file
     // Load shader information XML file
-    XMLFile* xml = cache->getResource<XMLFile>(shaderPath + shaderGroup + ".xml");
+    XMLFile* file = cache->getResource<XMLFile>(shaderPath + shaderGroup + ".xml");
+    if (!file)
+        return;
     
     
     // Update (global) parameter register mappings
     // Update (global) parameter register mappings
-    XMLElement shadersElem = xml->getRootElement();
+    XMLElement shadersElem = file->getRootElement();
     XMLElement paramsElem = shadersElem.getChildElement("vsparameters");
     XMLElement paramsElem = shadersElem.getChildElement("vsparameters");
     XMLElement paramElem = paramsElem.getChildElement("parameter");
     XMLElement paramElem = paramsElem.getChildElement("parameter");