2
0

BsScriptGUITextureField.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/GUI/BsScriptGUITextureField.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoManager.h"
  7. #include "BsMonoMethod.h"
  8. #include "BsMonoUtil.h"
  9. #include "BsGUITextureField.h"
  10. #include "GUI/BsGUIOptions.h"
  11. #include "GUI/BsGUIContent.h"
  12. #include "BsScriptResourceManager.h"
  13. #include "Resources/BsResources.h"
  14. #include "Generated/BsScriptGUIContent.generated.h"
  15. #include "Generated/BsScriptTexture.generated.h"
  16. #include "Wrappers/BsScriptRRefBase.h"
  17. #include "BsScriptSpriteTexture.generated.h"
  18. using namespace std::placeholders;
  19. namespace bs
  20. {
  21. ScriptGUITextureField::OnChangedThunkDef ScriptGUITextureField::onChangedThunk;
  22. ScriptGUITextureField::ScriptGUITextureField(MonoObject* instance, GUITextureField* resourceField)
  23. :TScriptGUIElement(instance, resourceField)
  24. {
  25. }
  26. void ScriptGUITextureField::initRuntimeData()
  27. {
  28. metaData.scriptClass->addInternalCall("Internal_CreateInstance", (void*)&ScriptGUITextureField::internal_createInstance);
  29. metaData.scriptClass->addInternalCall("Internal_GetTexture", (void*)&ScriptGUITextureField::internal_getTexture);
  30. metaData.scriptClass->addInternalCall("Internal_SetTexture", (void*)&ScriptGUITextureField::internal_setTexture);
  31. metaData.scriptClass->addInternalCall("Internal_GetTextureRef", (void*)&ScriptGUITextureField::internal_getTextureRef);
  32. metaData.scriptClass->addInternalCall("Internal_SetTextureRef", (void*)&ScriptGUITextureField::internal_setTextureRef);
  33. metaData.scriptClass->addInternalCall("Internal_GetSpriteTexture", (void*)&ScriptGUITextureField::internal_getSpriteTexture);
  34. metaData.scriptClass->addInternalCall("Internal_SetSpriteTexture", (void*)&ScriptGUITextureField::internal_setSpriteTexture);
  35. metaData.scriptClass->addInternalCall("Internal_GetSpriteTextureRef", (void*)&ScriptGUITextureField::internal_getSpriteTextureRef);
  36. metaData.scriptClass->addInternalCall("Internal_SetSpriteTextureRef", (void*)&ScriptGUITextureField::internal_setSpriteTextureRef);
  37. metaData.scriptClass->addInternalCall("Internal_GetValue", (void*)&ScriptGUITextureField::internal_getValue);
  38. metaData.scriptClass->addInternalCall("Internal_SetValue", (void*)&ScriptGUITextureField::internal_setValue);
  39. metaData.scriptClass->addInternalCall("Internal_GetValueRef", (void*)&ScriptGUITextureField::internal_getValueRef);
  40. metaData.scriptClass->addInternalCall("Internal_SetValueRef", (void*)&ScriptGUITextureField::internal_setValueRef);
  41. metaData.scriptClass->addInternalCall("Internal_SetTint", (void*)&ScriptGUITextureField::internal_setTint);
  42. onChangedThunk = (OnChangedThunkDef)metaData.scriptClass->getMethod("Internal_DoOnChanged", 1)->getThunk();
  43. }
  44. void ScriptGUITextureField::internal_createInstance(MonoObject* instance, GUITextureFieldType type,
  45. __GUIContentInterop* title, UINT32 titleWidth, MonoString* style, MonoArray* guiOptions, bool withTitle)
  46. {
  47. GUIOptions options;
  48. ScriptArray scriptArray(guiOptions);
  49. UINT32 arrayLen = scriptArray.size();
  50. for (UINT32 i = 0; i < arrayLen; i++)
  51. options.addOption(scriptArray.get<GUIOption>(i));
  52. String styleName = MonoUtil::monoToString(style);
  53. GUITextureField* guiTextureField = nullptr;
  54. if (withTitle)
  55. {
  56. GUIContent nativeContent = ScriptGUIContent::fromInterop(*title);
  57. guiTextureField = GUITextureField::create(type, GUIFieldOptions(nativeContent, titleWidth, options, styleName));
  58. }
  59. else
  60. {
  61. guiTextureField = GUITextureField::create(type, GUIFieldOptions(options, styleName));
  62. }
  63. auto nativeInstance = new (bs_alloc<ScriptGUITextureField>()) ScriptGUITextureField(instance, guiTextureField);
  64. guiTextureField->onValueChanged.connect(std::bind(&ScriptGUITextureField::onChanged, nativeInstance, _1));
  65. }
  66. void ScriptGUITextureField::internal_getTexture(ScriptGUITextureField* nativeInstance, MonoObject** output)
  67. {
  68. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  69. HTexture resource = textureField->getTexture();
  70. if(resource)
  71. {
  72. const ResourceLoadFlags loadFlags = ResourceLoadFlag::Default | ResourceLoadFlag::KeepSourceData;
  73. resource = static_resource_cast<Texture>(Resources::instance().loadFromUUID(resource.getUUID(), false, loadFlags));
  74. }
  75. MonoUtil::referenceCopy(output, nativeToManagedResource(resource));
  76. }
  77. void ScriptGUITextureField::internal_setTexture(ScriptGUITextureField* nativeInstance, MonoObject* value)
  78. {
  79. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  80. if (value == nullptr)
  81. textureField->setTexture(HTexture());
  82. else
  83. {
  84. ScriptTexture* scriptResource = ScriptTexture::toNative(value);
  85. textureField->setTexture(scriptResource->getHandle());
  86. }
  87. }
  88. void ScriptGUITextureField::internal_getTextureRef(ScriptGUITextureField* nativeInstance, MonoObject** output)
  89. {
  90. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  91. HTexture resource = textureField->getTexture();
  92. ScriptRRefBase* scriptRRef = ScriptResourceManager::instance().getScriptRRef(resource);
  93. if(scriptRRef)
  94. MonoUtil::referenceCopy(output, scriptRRef->getManagedInstance());
  95. else
  96. MonoUtil::referenceCopy(output, nullptr);
  97. }
  98. void ScriptGUITextureField::internal_setTextureRef(ScriptGUITextureField* nativeInstance, MonoObject* value)
  99. {
  100. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  101. if (value == nullptr)
  102. textureField->setTexture(HTexture());
  103. else
  104. {
  105. ScriptRRefBase* scriptRRef = ScriptRRefBase::toNative(value);
  106. textureField->setTexture(static_resource_cast<Texture>(scriptRRef->getHandle()));
  107. }
  108. }
  109. void ScriptGUITextureField::internal_getSpriteTexture(ScriptGUITextureField* nativeInstance, MonoObject** output)
  110. {
  111. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  112. HSpriteTexture resource = textureField->getSpriteTexture();
  113. if(resource)
  114. {
  115. const ResourceLoadFlags loadFlags = ResourceLoadFlag::Default | ResourceLoadFlag::KeepSourceData;
  116. resource = static_resource_cast<SpriteTexture>(
  117. Resources::instance().loadFromUUID(resource.getUUID(), false, loadFlags));
  118. }
  119. MonoUtil::referenceCopy(output, nativeToManagedResource(resource));
  120. }
  121. void ScriptGUITextureField::internal_setSpriteTexture(ScriptGUITextureField* nativeInstance, MonoObject* value)
  122. {
  123. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  124. if (value == nullptr)
  125. textureField->setSpriteTexture(HSpriteTexture());
  126. else
  127. {
  128. ScriptSpriteTexture* scriptResource = ScriptSpriteTexture::toNative(value);
  129. textureField->setSpriteTexture(scriptResource->getHandle());
  130. }
  131. }
  132. void ScriptGUITextureField::internal_getSpriteTextureRef(ScriptGUITextureField* nativeInstance, MonoObject** output)
  133. {
  134. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  135. HSpriteTexture resource = textureField->getSpriteTexture();
  136. ScriptRRefBase* scriptRRef = ScriptResourceManager::instance().getScriptRRef(resource);
  137. if(scriptRRef)
  138. MonoUtil::referenceCopy(output, scriptRRef->getManagedInstance());
  139. else
  140. MonoUtil::referenceCopy(output, nullptr);
  141. }
  142. void ScriptGUITextureField::internal_setSpriteTextureRef(ScriptGUITextureField* nativeInstance, MonoObject* value)
  143. {
  144. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  145. if (value == nullptr)
  146. textureField->setSpriteTexture(HSpriteTexture());
  147. else
  148. {
  149. ScriptRRefBase* scriptRRef = ScriptRRefBase::toNative(value);
  150. textureField->setSpriteTexture(static_resource_cast<SpriteTexture>(scriptRRef->getHandle()));
  151. }
  152. }
  153. void ScriptGUITextureField::internal_getValue(ScriptGUITextureField* nativeInstance, MonoObject** output)
  154. {
  155. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  156. HResource resource = textureField->getValue();
  157. if(resource)
  158. {
  159. const ResourceLoadFlags loadFlags = ResourceLoadFlag::Default | ResourceLoadFlag::KeepSourceData;
  160. resource = Resources::instance().loadFromUUID(resource.getUUID(), false, loadFlags);
  161. }
  162. MonoUtil::referenceCopy(output, nativeToManagedResource(resource));
  163. }
  164. void ScriptGUITextureField::internal_setValue(ScriptGUITextureField* nativeInstance, MonoObject* value)
  165. {
  166. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  167. if (value == nullptr)
  168. textureField->setValue(HResource());
  169. else
  170. {
  171. ScriptResource* scriptResource = ScriptResource::toNative(value);
  172. textureField->setValue(scriptResource->getGenericHandle());
  173. }
  174. }
  175. void ScriptGUITextureField::internal_getValueRef(ScriptGUITextureField* nativeInstance, MonoObject** output)
  176. {
  177. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  178. HResource resource = textureField->getValue();
  179. ScriptRRefBase* scriptRRef = ScriptResourceManager::instance().getScriptRRef(resource);
  180. if(scriptRRef)
  181. MonoUtil::referenceCopy(output, scriptRRef->getManagedInstance());
  182. else
  183. MonoUtil::referenceCopy(output, nullptr);
  184. }
  185. void ScriptGUITextureField::internal_setValueRef(ScriptGUITextureField* nativeInstance, MonoObject* value)
  186. {
  187. GUITextureField* textureField = static_cast<GUITextureField*>(nativeInstance->getGUIElement());
  188. if (value == nullptr)
  189. textureField->setValue(HResource());
  190. else
  191. {
  192. ScriptRRefBase* scriptRRef = ScriptRRefBase::toNative(value);
  193. textureField->setValue(scriptRRef->getHandle());
  194. }
  195. }
  196. void ScriptGUITextureField::internal_setTint(ScriptGUITextureField* nativeInstance, Color* color)
  197. {
  198. GUITextureField* textureField = (GUITextureField*)nativeInstance->getGUIElement();
  199. textureField->setTint(*color);
  200. }
  201. void ScriptGUITextureField::onChanged(const HResource& newHandle)
  202. {
  203. ScriptRRefBase* scriptRRef = ScriptResourceManager::instance().getScriptRRef(newHandle);
  204. MonoObject* managedObj = nullptr;
  205. if(scriptRRef)
  206. managedObj = scriptRRef->getManagedInstance();
  207. MonoUtil::invokeThunk(onChangedThunk, getManagedInstance(), managedObj);
  208. }
  209. MonoObject* ScriptGUITextureField::nativeToManagedResource(const HResource& instance)
  210. {
  211. if (instance == nullptr)
  212. return nullptr;
  213. ScriptResourceBase* scriptResource = ScriptResourceManager::instance().getScriptResource(instance, true);
  214. return scriptResource->getManagedInstance();
  215. }
  216. }