RegisterResource.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2011 Lasse Öörni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #include "Precompiled.h"
  24. #include "Engine.h"
  25. #include "Log.h"
  26. #include "RegisterTemplates.h"
  27. #include "ScriptInstance.h"
  28. #include "Scene.h"
  29. void registerResource(asIScriptEngine* engine)
  30. {
  31. registerResource<Resource>(engine, "Resource");
  32. }
  33. static Resource* ResourceCacheGetResource(const std::string& type, const std::string& name, ResourceCache* ptr)
  34. {
  35. return ptr->getResource(ShortStringHash(type), name);
  36. }
  37. static File* ResourceCacheGetFile(const std::string& name, ResourceCache* ptr)
  38. {
  39. try
  40. {
  41. SharedPtr<File> file = ptr->getFile(name);
  42. // The shared pointer will go out of scope, so have to increment the reference count
  43. // (here an auto handle can not be used)
  44. if (file)
  45. file->addRef();
  46. return file.getPtr();
  47. }
  48. catch (Exception& e)
  49. {
  50. SAFE_RETHROW_RET(e, 0);
  51. }
  52. }
  53. static void ResourceCacheReleaseResource(const std::string& type, const std::string& name, bool force, ResourceCache* ptr)
  54. {
  55. ptr->releaseResource(ShortStringHash(type), name, force);
  56. }
  57. static void ResourceCacheReleaseResources(const std::string& type, bool force, ResourceCache* ptr)
  58. {
  59. ptr->releaseResources(ShortStringHash(type), force);
  60. }
  61. static void ResourceCacheReleaseResourcesPartial(const std::string& type, const std::string& partialName, bool force, ResourceCache* ptr)
  62. {
  63. ptr->releaseResources(ShortStringHash(type), partialName, force);
  64. }
  65. static void ResourceCacheSetMemoryBudget(const std::string& type, unsigned budget, ResourceCache* ptr)
  66. {
  67. ptr->setMemoryBudget(ShortStringHash(type), budget);
  68. }
  69. static unsigned ResourceCacheGetMemoryBudget(const std::string& type, ResourceCache* ptr)
  70. {
  71. return ptr->getMemoryBudget(ShortStringHash(type));
  72. }
  73. static unsigned ResourceCacheGetMemoryUse(const std::string& type, ResourceCache* ptr)
  74. {
  75. return ptr->getMemoryUse(ShortStringHash(type));
  76. }
  77. static ResourceCache* GetResourceCache()
  78. {
  79. return getEngine()->getResourceCache();
  80. }
  81. static void registerResourceCache(asIScriptEngine* engine)
  82. {
  83. engine->RegisterObjectType("ResourceCache", 0, asOBJ_REF);
  84. engine->RegisterObjectBehaviour("ResourceCache", asBEHAVE_ADDREF, "void f()", asMETHOD(ResourceCache, addRef), asCALL_THISCALL);
  85. engine->RegisterObjectBehaviour("ResourceCache", asBEHAVE_RELEASE, "void f()", asMETHOD(ResourceCache, releaseRef), asCALL_THISCALL);
  86. engine->RegisterObjectMethod("ResourceCache", "void addResourcePath(const string& in)", asMETHOD(ResourceCache, addResourcePath), asCALL_THISCALL);
  87. engine->RegisterObjectMethod("ResourceCache", "void addPackageFile(PackageFile@+)", asMETHOD(ResourceCache, addPackageFile), asCALL_THISCALL);
  88. engine->RegisterObjectMethod("ResourceCache", "void removeResourcePath(const string& in)", asMETHOD(ResourceCache, removeResourcePath), asCALL_THISCALL);
  89. engine->RegisterObjectMethod("ResourceCache", "void removePackageFile(PackageFile@+, bool, bool)", asMETHODPR(ResourceCache, removePackageFile, (PackageFile*, bool, bool), void), asCALL_THISCALL);
  90. engine->RegisterObjectMethod("ResourceCache", "void removePackageFile(const string& in, bool, bool)", asMETHODPR(ResourceCache, removePackageFile, (const std::string&, bool, bool), void), asCALL_THISCALL);
  91. engine->RegisterObjectMethod("ResourceCache", "void releaseResource(const string& in, const string& in, bool)", asFUNCTION(ResourceCacheReleaseResource), asCALL_CDECL_OBJLAST);
  92. engine->RegisterObjectMethod("ResourceCache", "void releaseResources(const string& in, bool)", asFUNCTION(ResourceCacheReleaseResources), asCALL_CDECL_OBJLAST);
  93. engine->RegisterObjectMethod("ResourceCache", "void releaseResources(const string& in, const string& in, bool)", asFUNCTION(ResourceCacheReleaseResourcesPartial), asCALL_CDECL_OBJLAST);
  94. engine->RegisterObjectMethod("ResourceCache", "bool reloadResource(Resource@+)", asMETHOD(ResourceCache, reloadResource), asCALL_THISCALL);
  95. engine->RegisterObjectMethod("ResourceCache", "void setMemoryBudget(const string& in, uint)", asFUNCTION(ResourceCacheSetMemoryBudget), asCALL_CDECL_OBJLAST);
  96. engine->RegisterObjectMethod("ResourceCache", "bool exists(const string& in) const", asMETHODPR(ResourceCache, exists, (const std::string&) const, bool), asCALL_THISCALL);
  97. engine->RegisterObjectMethod("ResourceCache", "File@ getFile(const string& in)", asFUNCTION(ResourceCacheGetFile), asCALL_CDECL_OBJLAST);
  98. engine->RegisterObjectMethod("ResourceCache", "Resource@+ getResource(const string& in, const string& in)", asFUNCTION(ResourceCacheGetResource), asCALL_CDECL_OBJLAST);
  99. engine->RegisterObjectMethod("ResourceCache", "uint getMemoryBudget(const string& in) const", asFUNCTION(ResourceCacheGetMemoryBudget), asCALL_CDECL_OBJLAST);
  100. engine->RegisterObjectMethod("ResourceCache", "uint getMemoryUse(const string& in) const", asFUNCTION(ResourceCacheGetMemoryUse), asCALL_CDECL_OBJLAST);
  101. engine->RegisterObjectMethod("ResourceCache", "uint getTotalMemoryUse() const", asMETHOD(ResourceCache, getTotalMemoryUse), asCALL_THISCALL);
  102. engine->RegisterGlobalFunction("ResourceCache@+ getResourceCache()", asFUNCTION(GetResourceCache), asCALL_CDECL);
  103. engine->RegisterGlobalFunction("ResourceCache@+ get_resourceCache()", asFUNCTION(GetResourceCache), asCALL_CDECL);
  104. engine->RegisterGlobalFunction("ResourceCache@+ get_cache()", asFUNCTION(GetResourceCache), asCALL_CDECL);
  105. }
  106. static Image* ConstructImage(const std::string& name)
  107. {
  108. return new Image(name);
  109. }
  110. static void registerImage(asIScriptEngine* engine)
  111. {
  112. registerResource<Image>(engine, "Image");
  113. engine->RegisterObjectMethod("Image", "void saveBMP(const string& in)", asMETHOD(Image, saveBMP), asCALL_THISCALL);
  114. engine->RegisterObjectMethod("Image", "void saveTGA(const string& in)", asMETHOD(Image, saveTGA), asCALL_THISCALL);
  115. engine->RegisterObjectMethod("Image", "int getWidth() const", asMETHOD(Image, getWidth), asCALL_THISCALL);
  116. engine->RegisterObjectMethod("Image", "int getHeight() const", asMETHOD(Image, getHeight), asCALL_THISCALL);
  117. engine->RegisterObjectMethod("Image", "uint getComponents() const", asMETHOD(Image, getComponents), asCALL_THISCALL);
  118. engine->RegisterObjectMethod("Image", "bool isCompressed() const", asMETHOD(Image, isCompressed), asCALL_THISCALL);
  119. registerRefCasts<Resource, Image>(engine, "Resource", "Image");
  120. }
  121. static void ConstructXMLElement(XMLElement* ptr)
  122. {
  123. new(ptr) XMLElement();
  124. }
  125. static void ConstructXMLElementCopy(const XMLElement& element, XMLElement* ptr)
  126. {
  127. new(ptr) XMLElement(element);
  128. }
  129. static void registerXMLElement(asIScriptEngine* engine)
  130. {
  131. engine->RegisterObjectType("XMLElement", sizeof(XMLElement), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_C);
  132. engine->RegisterObjectBehaviour("XMLElement", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructXMLElement), asCALL_CDECL_OBJLAST);
  133. engine->RegisterObjectBehaviour("XMLElement", asBEHAVE_CONSTRUCT, "void f(const XMLElement& in)", asFUNCTION(ConstructXMLElementCopy), asCALL_CDECL_OBJLAST);
  134. engine->RegisterObjectMethod("XMLElement", "bool isNull() const", asMETHOD(XMLElement, isNull), asCALL_THISCALL);
  135. engine->RegisterObjectMethod("XMLElement", "bool notNull() const", asMETHOD(XMLElement, notNull), asCALL_THISCALL);
  136. engine->RegisterObjectMethod("XMLElement", "XMLElement createChildElement(const string& in)", asMETHOD(XMLElement, createChildElement), asCALL_THISCALL);
  137. engine->RegisterObjectMethod("XMLElement", "string getAttribute(const string& in) const", asMETHOD(XMLElement, getAttribute), asCALL_THISCALL);
  138. engine->RegisterObjectMethod("XMLElement", "bool getBool(const string& in) const", asMETHOD(XMLElement, getBool), asCALL_THISCALL);
  139. engine->RegisterObjectMethod("XMLElement", "BoundingBox getBoundingBox() const", asMETHOD(XMLElement, getBoundingBox), asCALL_THISCALL);
  140. engine->RegisterObjectMethod("XMLElement", "XMLElement getChildElement(const string& in) const", asMETHOD(XMLElement, getChildElement), asCALL_THISCALL);
  141. engine->RegisterObjectMethod("XMLElement", "Color getColor(const string& in) const", asMETHOD(XMLElement, getColor), asCALL_THISCALL);
  142. engine->RegisterObjectMethod("XMLElement", "float getFloat(const string& in) const", asMETHOD(XMLElement, getFloat), asCALL_THISCALL);
  143. engine->RegisterObjectMethod("XMLElement", "int getInt(const string& in) const", asMETHOD(XMLElement, getInt), asCALL_THISCALL);
  144. engine->RegisterObjectMethod("XMLElement", "string getName() const", asMETHOD(XMLElement, getName), asCALL_THISCALL);
  145. engine->RegisterObjectMethod("XMLElement", "XMLElement getNextElement(const string& in) const", asMETHOD(XMLElement, getNextElement), asCALL_THISCALL);
  146. engine->RegisterObjectMethod("XMLElement", "Quaternion getQuaternion(const string& in) const", asMETHOD(XMLElement, getQuaternion), asCALL_THISCALL);
  147. engine->RegisterObjectMethod("XMLElement", "string getString(const string& in) const", asMETHOD(XMLElement, getString), asCALL_THISCALL);
  148. engine->RegisterObjectMethod("XMLElement", "string getStringLower(const string& in) const", asMETHOD(XMLElement, getStringLower), asCALL_THISCALL);
  149. engine->RegisterObjectMethod("XMLElement", "string getStringUpper(const string& in) const", asMETHOD(XMLElement, getStringUpper), asCALL_THISCALL);
  150. engine->RegisterObjectMethod("XMLElement", "string getText() const", asMETHOD(XMLElement, getText), asCALL_THISCALL);
  151. engine->RegisterObjectMethod("XMLElement", "Variant getVariant() const", asMETHOD(XMLElement, getVariant), asCALL_THISCALL);
  152. engine->RegisterObjectMethod("XMLElement", "VariantMap getVariantMap() const", asMETHOD(XMLElement, getVariantMap), asCALL_THISCALL);
  153. engine->RegisterObjectMethod("XMLElement", "Vector2 getVector2(const string& in) const", asMETHOD(XMLElement, getVector2), asCALL_THISCALL);
  154. engine->RegisterObjectMethod("XMLElement", "Vector3 getVector3(const string& in) const", asMETHOD(XMLElement, getVector3), asCALL_THISCALL);
  155. engine->RegisterObjectMethod("XMLElement", "bool hasAttribute(const string& in) const", asMETHOD(XMLElement, hasAttribute), asCALL_THISCALL);
  156. engine->RegisterObjectMethod("XMLElement", "bool hasChildElement(const string& in) const", asMETHOD(XMLElement, hasChildElement), asCALL_THISCALL);
  157. engine->RegisterObjectMethod("XMLElement", "bool removeChildElement(const string& in, bool)", asMETHOD(XMLElement,removeChildElement), asCALL_THISCALL);
  158. engine->RegisterObjectMethod("XMLElement", "bool setAttribute(const string& in, const string& in)", asMETHOD(XMLElement,setAttribute), asCALL_THISCALL);
  159. engine->RegisterObjectMethod("XMLElement", "bool setBool(const string& in, bool)", asMETHOD(XMLElement,setBool), asCALL_THISCALL);
  160. engine->RegisterObjectMethod("XMLElement", "bool setBoundingBox(const BoundingBox& in)", asMETHOD(XMLElement,setBoundingBox), asCALL_THISCALL);
  161. engine->RegisterObjectMethod("XMLElement", "bool setColor(const string& in, const Color& in)", asMETHOD(XMLElement, setColor), asCALL_THISCALL);
  162. engine->RegisterObjectMethod("XMLElement", "bool setFloat(const string& in, float)", asMETHOD(XMLElement, setFloat), asCALL_THISCALL);
  163. engine->RegisterObjectMethod("XMLElement", "bool setInt(const string& in, int)", asMETHOD(XMLElement, setInt), asCALL_THISCALL);
  164. engine->RegisterObjectMethod("XMLElement", "bool setQuaternion(const string& in, const Quaternion& in)", asMETHOD(XMLElement, setQuaternion), asCALL_THISCALL);
  165. engine->RegisterObjectMethod("XMLElement", "bool setString(const string& in, const string& in)", asMETHOD(XMLElement, setString), asCALL_THISCALL);
  166. engine->RegisterObjectMethod("XMLElement", "bool setVariant(const Variant& in)", asMETHOD(XMLElement, setVariant), asCALL_THISCALL);
  167. engine->RegisterObjectMethod("XMLElement", "bool setVariantMap(const VariantMap& in)", asMETHOD(XMLElement, setVariantMap), asCALL_THISCALL);
  168. engine->RegisterObjectMethod("XMLElement", "bool setVector2(const string& in, const Vector2& in)", asMETHOD(XMLElement, setVector2), asCALL_THISCALL);
  169. engine->RegisterObjectMethod("XMLElement", "bool setVector3(const string& in, const Vector3& in)", asMETHOD(XMLElement, setVector3), asCALL_THISCALL);
  170. }
  171. static XMLFile* ConstructXMLFile(const std::string& name)
  172. {
  173. return new XMLFile(name);
  174. }
  175. static void XMLFileLoad(File* file, XMLFile* ptr)
  176. {
  177. if (!file)
  178. SAFE_EXCEPTION("Null XML file source");
  179. try
  180. {
  181. ptr->load(*file);
  182. }
  183. catch (Exception& e)
  184. {
  185. SAFE_RETHROW(e);
  186. }
  187. }
  188. static void XMLFileSave(File* file, XMLFile* ptr)
  189. {
  190. if (!file)
  191. SAFE_EXCEPTION("Null XML file for saving");
  192. try
  193. {
  194. ptr->save(*file);
  195. }
  196. catch (Exception& e)
  197. {
  198. SAFE_RETHROW(e);
  199. }
  200. }
  201. static void registerXMLFile(asIScriptEngine* engine)
  202. {
  203. registerResource<XMLFile>(engine, "XMLFile");
  204. engine->RegisterObjectMethod("XMLFile", "void load(File@+)", asFUNCTION(XMLFileLoad), asCALL_CDECL_OBJLAST);
  205. engine->RegisterObjectMethod("XMLFile", "void save(File@+)", asFUNCTION(XMLFileSave), asCALL_CDECL_OBJLAST);
  206. engine->RegisterObjectMethod("XMLFile", "XMLElement createRootElement(const string& in)", asMETHOD(XMLFile, createRootElement), asCALL_THISCALL);
  207. engine->RegisterObjectMethod("XMLFile", "XMLElement getRootElement(const string& in, bool)", asMETHOD(XMLFile, getRootElement), asCALL_THISCALL);
  208. registerRefCasts<Resource, XMLFile>(engine, "Resource", "XMLFile");
  209. }
  210. void registerResourceLibrary(asIScriptEngine* engine)
  211. {
  212. registerResource(engine);
  213. registerResourceCache(engine);
  214. registerImage(engine);
  215. registerXMLElement(engine);
  216. registerXMLFile(engine);
  217. }