BsScriptGUI.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "BsScriptGUI.h"
  2. #include "BsScriptGUISkin.h"
  3. #include "BsScriptGUILayout.h"
  4. #include "BsGUIWidget.h"
  5. #include "BsSceneManager.h"
  6. #include "BsScriptObjectManager.h"
  7. #include "BsBuiltinResources.h"
  8. #include "BsMonoMethod.h"
  9. namespace BansheeEngine
  10. {
  11. SPtr<GUIWidget> ScriptGUI::sGUIWidget;
  12. ScriptGUILayout* ScriptGUI::sPanel = nullptr;
  13. HEvent ScriptGUI::sDomainUnloadConn;
  14. HEvent ScriptGUI::sDomainLoadConn;
  15. MonoMethod* ScriptGUI::sGUIPanelMethod = nullptr;
  16. ScriptGUI::ScriptGUI(MonoObject* managedInstance)
  17. :ScriptObject(managedInstance)
  18. { }
  19. ScriptGUI::~ScriptGUI()
  20. { }
  21. void ScriptGUI::startUp()
  22. {
  23. CameraPtr mainCamera = gSceneManager().getMainCamera().camera;
  24. sGUIWidget = GUIWidget::create(mainCamera);
  25. sGUIWidget->setSkin(BuiltinResources::instance().getGUISkin());
  26. auto createPanel = [] ()
  27. {
  28. assert(sPanel == nullptr);
  29. MonoObject* guiPanel = ScriptGUIPanel::createFromExisting(sGUIWidget->getPanel());
  30. sPanel = ScriptGUILayout::toNative(guiPanel);
  31. void* params[1];
  32. params[0] = guiPanel;
  33. sGUIPanelMethod->invoke(nullptr, params);
  34. };
  35. auto clearPanel = [] ()
  36. {
  37. sPanel = nullptr;
  38. };
  39. createPanel();
  40. sDomainLoadConn = ScriptObjectManager::instance().onRefreshDomainLoaded.connect(createPanel);
  41. sDomainUnloadConn = MonoManager::instance().onDomainUnload.connect(clearPanel);
  42. }
  43. void ScriptGUI::update()
  44. {
  45. if (sGUIWidget == nullptr)
  46. return;
  47. CameraPtr mainCamera = gSceneManager().getMainCamera().camera;
  48. if (mainCamera != sGUIWidget->getCamera())
  49. sGUIWidget->setCamera(mainCamera);
  50. }
  51. void ScriptGUI::shutDown()
  52. {
  53. sDomainLoadConn.disconnect();
  54. sDomainUnloadConn.disconnect();
  55. if (sPanel != nullptr)
  56. {
  57. sPanel->destroy();
  58. sPanel = nullptr;
  59. }
  60. if (sGUIWidget != nullptr)
  61. {
  62. sGUIWidget->_destroy();
  63. sGUIWidget = nullptr;
  64. }
  65. }
  66. void ScriptGUI::initRuntimeData()
  67. {
  68. sGUIPanelMethod = metaData.scriptClass->getMethod("SetPanel", 1);
  69. metaData.scriptClass->addInternalCall("Internal_SetSkin", &ScriptGUI::internal_SetSkin);
  70. }
  71. void ScriptGUI::internal_SetSkin(ScriptGUISkin* skin)
  72. {
  73. HGUISkin guiSkin;
  74. if (skin != nullptr)
  75. guiSkin = skin->getHandle();
  76. if (!guiSkin.isLoaded())
  77. guiSkin = BuiltinResources::instance().getGUISkin();
  78. if(sGUIWidget != nullptr)
  79. sGUIWidget->setSkin(guiSkin);
  80. }
  81. }