BsScriptEditorUtility.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptEditorUtility.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoUtil.h"
  9. #include "Utility/BsEditorUtility.h"
  10. #include "Wrappers/BsScriptSceneObject.h"
  11. #include "Wrappers/BsScriptResource.h"
  12. #include "BsScriptResourceManager.h"
  13. #include "Utility/BsUtility.h"
  14. #include "Scene/BsSceneObject.h"
  15. namespace bs
  16. {
  17. ScriptEditorUtility::ScriptEditorUtility(MonoObject* instance)
  18. :ScriptObject(instance)
  19. { }
  20. void ScriptEditorUtility::initRuntimeData()
  21. {
  22. metaData.scriptClass->addInternalCall("Internal_CalculateBounds", (void*)&ScriptEditorUtility::internal_CalculateBounds);
  23. metaData.scriptClass->addInternalCall("Internal_CalculateBoundsArray", (void*)&ScriptEditorUtility::internal_CalculateBoundsArray);
  24. metaData.scriptClass->addInternalCall("Internal_CalculateArrayCenter", (void*)&ScriptEditorUtility::internal_CalculateArrayCenter);
  25. metaData.scriptClass->addInternalCall("Internal_FindDependencies", (void*)&ScriptEditorUtility::internal_FindDependencies);
  26. metaData.scriptClass->addInternalCall("Internal_IsInternal", (void*)&ScriptEditorUtility::internal_IsInternal);
  27. }
  28. void ScriptEditorUtility::internal_CalculateBounds(MonoObject* so, AABox* bounds)
  29. {
  30. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(so);
  31. if (scriptSO != nullptr)
  32. *bounds = EditorUtility::calculateBounds(static_object_cast<SceneObject>(scriptSO->getNativeHandle()));
  33. else
  34. *bounds = AABox();
  35. }
  36. void ScriptEditorUtility::internal_CalculateBoundsArray(MonoArray* objects, AABox* bounds)
  37. {
  38. Vector<HSceneObject> sceneObjects;
  39. ScriptArray scriptArray(objects);
  40. UINT32 arrayLen = scriptArray.size();
  41. for (UINT32 i = 0; i < arrayLen; i++)
  42. {
  43. MonoObject* curObject = scriptArray.get<MonoObject*>(i);
  44. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(curObject);
  45. if (scriptSO != nullptr)
  46. sceneObjects.push_back(static_object_cast<SceneObject>(scriptSO->getNativeHandle()));
  47. }
  48. *bounds = EditorUtility::calculateBounds(sceneObjects);
  49. }
  50. MonoArray* ScriptEditorUtility::internal_FindDependencies(MonoObject* resource, bool recursive)
  51. {
  52. ScriptResource* srcResource = ScriptResource::toNative(resource);
  53. if (srcResource == nullptr)
  54. {
  55. ScriptArray emptyArray = ScriptArray::create<ScriptResource>(0);
  56. return emptyArray.getInternal();
  57. }
  58. HResource srcHandle = srcResource->getGenericHandle();
  59. Vector<ResourceDependency> dependencies = Utility::findResourceDependencies(srcHandle, recursive);
  60. UINT32 numEntries = (UINT32)dependencies.size();
  61. ScriptArray output = ScriptArray::create<ScriptResource>(numEntries);
  62. for (UINT32 i = 0; i < numEntries; i++)
  63. {
  64. ScriptResourceBase* dependency = ScriptResourceManager::instance().getScriptResource(dependencies[i].resource, true);
  65. output.set(i, dependency->getManagedInstance());
  66. }
  67. return output.getInternal();
  68. }
  69. void ScriptEditorUtility::internal_CalculateArrayCenter(MonoArray* objects, Vector3* center)
  70. {
  71. Vector<HSceneObject> sceneObjects;
  72. ScriptArray scriptArray(objects);
  73. UINT32 arrayLen = scriptArray.size();
  74. for (UINT32 i = 0; i < arrayLen; i++)
  75. {
  76. MonoObject* curObject = scriptArray.get<MonoObject*>(i);
  77. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(curObject);
  78. if (scriptSO != nullptr)
  79. sceneObjects.push_back(static_object_cast<SceneObject>(scriptSO->getNativeHandle()));
  80. }
  81. *center = EditorUtility::calculateCenter(sceneObjects);
  82. }
  83. bool ScriptEditorUtility::internal_IsInternal(ScriptSceneObject* soPtr)
  84. {
  85. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  86. return false;
  87. HSceneObject so = soPtr->getHandle();
  88. return so->hasFlag(SOF_Internal);
  89. }
  90. }