BsScriptProjectSettings.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptProjectSettings.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsMonoUtil.h"
  8. #include "BsEditorApplication.h"
  9. #include "Settings/BsProjectSettings.h"
  10. #include "Serialization/BsManagedSerializableObject.h"
  11. #include "Reflection/BsRTTIType.h"
  12. #include "Serialization/BsScriptAssemblyManager.h"
  13. #include "Settings/BsEditorSettings.h"
  14. #include "Serialization/BsBinarySerializer.h"
  15. #include "FileSystem/BsDataStream.h"
  16. namespace bs
  17. {
  18. ScriptProjectSettings::ScriptProjectSettings(MonoObject* instance)
  19. :ScriptObject(instance)
  20. { }
  21. void ScriptProjectSettings::initRuntimeData()
  22. {
  23. metaData.scriptClass->addInternalCall("Internal_GetLastOpenScene", (void*)&ScriptProjectSettings::internal_GetLastOpenScene);
  24. metaData.scriptClass->addInternalCall("Internal_SetLastOpenScene", (void*)&ScriptProjectSettings::internal_SetLastOpenScene);
  25. metaData.scriptClass->addInternalCall("Internal_SetFloat", (void*)&ScriptProjectSettings::internal_SetFloat);
  26. metaData.scriptClass->addInternalCall("Internal_SetInt", (void*)&ScriptProjectSettings::internal_SetInt);
  27. metaData.scriptClass->addInternalCall("Internal_SetBool", (void*)&ScriptProjectSettings::internal_SetBool);
  28. metaData.scriptClass->addInternalCall("Internal_SetString", (void*)&ScriptProjectSettings::internal_SetString);
  29. metaData.scriptClass->addInternalCall("Internal_SetObject", (void*)&ScriptProjectSettings::internal_SetObject);
  30. metaData.scriptClass->addInternalCall("Internal_GetFloat", (void*)&ScriptProjectSettings::internal_GetFloat);
  31. metaData.scriptClass->addInternalCall("Internal_GetInt", (void*)&ScriptProjectSettings::internal_GetInt);
  32. metaData.scriptClass->addInternalCall("Internal_GetBool", (void*)&ScriptProjectSettings::internal_GetBool);
  33. metaData.scriptClass->addInternalCall("Internal_GetString", (void*)&ScriptProjectSettings::internal_GetString);
  34. metaData.scriptClass->addInternalCall("Internal_GetObject", (void*)&ScriptProjectSettings::internal_GetObject);
  35. metaData.scriptClass->addInternalCall("Internal_HasKey", (void*)&ScriptProjectSettings::internal_HasKey);
  36. metaData.scriptClass->addInternalCall("Internal_DeleteKey", (void*)&ScriptProjectSettings::internal_DeleteKey);
  37. metaData.scriptClass->addInternalCall("Internal_DeleteAllKeys", (void*)&ScriptProjectSettings::internal_DeleteAllKeys);
  38. metaData.scriptClass->addInternalCall("Internal_GetHash", (void*)&ScriptProjectSettings::internal_GetHash);
  39. metaData.scriptClass->addInternalCall("Internal_Save", (void*)&ScriptProjectSettings::internal_Save);
  40. }
  41. MonoString* ScriptProjectSettings::internal_GetLastOpenScene()
  42. {
  43. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  44. return MonoUtil::stringToMono(settings->getLastOpenScene());
  45. }
  46. void ScriptProjectSettings::internal_SetLastOpenScene(MonoString* value)
  47. {
  48. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  49. settings->setLastOpenScene(MonoUtil::monoToString(value));
  50. }
  51. void ScriptProjectSettings::internal_SetFloat(MonoString* name, float value)
  52. {
  53. String nativeName = MonoUtil::monoToString(name);
  54. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  55. settings->setFloat(nativeName, value);
  56. }
  57. void ScriptProjectSettings::internal_SetInt(MonoString* name, int value)
  58. {
  59. String nativeName = MonoUtil::monoToString(name);
  60. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  61. settings->setInt(nativeName, value);
  62. }
  63. void ScriptProjectSettings::internal_SetBool(MonoString* name, bool value)
  64. {
  65. String nativeName = MonoUtil::monoToString(name);
  66. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  67. settings->setBool(nativeName, value);
  68. }
  69. void ScriptProjectSettings::internal_SetString(MonoString* name, MonoString* value)
  70. {
  71. String nativeName = MonoUtil::monoToString(name);
  72. String nativeValue = MonoUtil::monoToString(value);
  73. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  74. settings->setString(nativeName, nativeValue);
  75. }
  76. void ScriptProjectSettings::internal_SetObject(MonoString* name, MonoObject* value)
  77. {
  78. String nativeName = MonoUtil::monoToString(name);
  79. SPtr<IReflectable> nativeValue;
  80. if(value != nullptr)
  81. {
  82. nativeValue = ScriptAssemblyManager::instance().getReflectableFromManagedObject(value);
  83. if(!nativeValue)
  84. return;
  85. }
  86. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  87. settings->setObject(nativeName, nativeValue);
  88. }
  89. float ScriptProjectSettings::internal_GetFloat(MonoString* name, float defaultValue)
  90. {
  91. String nativeName = MonoUtil::monoToString(name);
  92. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  93. return settings->getFloat(nativeName, defaultValue);
  94. }
  95. int ScriptProjectSettings::internal_GetInt(MonoString* name, int defaultValue)
  96. {
  97. String nativeName = MonoUtil::monoToString(name);
  98. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  99. return settings->getInt(nativeName, defaultValue);
  100. }
  101. bool ScriptProjectSettings::internal_GetBool(MonoString* name, bool defaultValue)
  102. {
  103. String nativeName = MonoUtil::monoToString(name);
  104. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  105. return settings->getBool(nativeName, defaultValue);
  106. }
  107. MonoString* ScriptProjectSettings::internal_GetString(MonoString* name, MonoString* defaultValue)
  108. {
  109. String nativeName = MonoUtil::monoToString(name);
  110. String nativeDefaultValue = MonoUtil::monoToString(defaultValue);
  111. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  112. String nativeValue = settings->getString(nativeName, nativeDefaultValue);
  113. return MonoUtil::stringToMono(nativeValue);
  114. }
  115. MonoObject* ScriptProjectSettings::internal_GetObject(MonoString* name)
  116. {
  117. String nativeName = MonoUtil::monoToString(name);
  118. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  119. SPtr<IReflectable> obj = settings->getObject(nativeName);
  120. if(!obj)
  121. return nullptr;
  122. if(auto managedSerializableObject = rtti_cast<ManagedSerializableObject>(obj))
  123. {
  124. if (!managedSerializableObject)
  125. return nullptr;
  126. // Make a copy of the object as deserialization modifies the object in-place (in particular in can create
  127. // GC handles, which would then not get released on a potential assembly refresh)
  128. BinarySerializer bs;
  129. SPtr<MemoryDataStream> stream = bs_shared_ptr_new<MemoryDataStream>();
  130. bs.encode(managedSerializableObject.get(), stream);
  131. stream->seek(0);
  132. SPtr<ManagedSerializableObject> clone = std::static_pointer_cast<ManagedSerializableObject>(bs.decode(stream, (UINT32)stream->size()));
  133. return clone->deserialize();
  134. }
  135. else
  136. {
  137. UINT32 rttiId = obj->getRTTI()->getRTTIId();
  138. const ReflectableTypeInfo* reflTypeInfo = ScriptAssemblyManager::instance().getReflectableTypeInfo(rttiId);
  139. if(reflTypeInfo == nullptr)
  140. {
  141. BS_LOG(Error, Script,"Mapping between a reflectable object and a managed type is missing "
  142. "for type \"{0}\"", rttiId);
  143. return nullptr;
  144. }
  145. return reflTypeInfo->createCallback(obj);
  146. }
  147. }
  148. bool ScriptProjectSettings::internal_HasKey(MonoString* name)
  149. {
  150. String nativeName = MonoUtil::monoToString(name);
  151. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  152. return settings->hasKey(nativeName);
  153. }
  154. void ScriptProjectSettings::internal_DeleteKey(MonoString* name)
  155. {
  156. String nativeName = MonoUtil::monoToString(name);
  157. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  158. settings->deleteKey(nativeName);
  159. }
  160. void ScriptProjectSettings::internal_DeleteAllKeys()
  161. {
  162. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  163. settings->deleteAllKeys();
  164. }
  165. UINT32 ScriptProjectSettings::internal_GetHash()
  166. {
  167. SPtr<ProjectSettings> settings = gEditorApplication().getProjectSettings();
  168. return settings->getHash();
  169. }
  170. void ScriptProjectSettings::internal_Save()
  171. {
  172. gEditorApplication().saveProjectSettings();
  173. }
  174. }