BsScriptEditorUtility.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptEditorUtility.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoUtil.h"
  9. #include "BsEditorUtility.h"
  10. #include "BsScriptSceneObject.h"
  11. #include "BsScriptResource.h"
  12. #include "BsScriptResourceManager.h"
  13. #include "BsUtility.h"
  14. #include "BsSceneObject.h"
  15. namespace BansheeEngine
  16. {
  17. ScriptEditorUtility::ScriptEditorUtility(MonoObject* instance)
  18. :ScriptObject(instance)
  19. { }
  20. void ScriptEditorUtility::initRuntimeData()
  21. {
  22. metaData.scriptClass->addInternalCall("Internal_CalculateBounds", &ScriptEditorUtility::internal_CalculateBounds);
  23. metaData.scriptClass->addInternalCall("Internal_CalculateBoundsArray", &ScriptEditorUtility::internal_CalculateBoundsArray);
  24. metaData.scriptClass->addInternalCall("Internal_CalculateArrayCenter", &ScriptEditorUtility::internal_CalculateArrayCenter);
  25. metaData.scriptClass->addInternalCall("Internal_FindDependencies", &ScriptEditorUtility::internal_FindDependencies);
  26. metaData.scriptClass->addInternalCall("Internal_IsInternal", &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;
  65. ScriptResourceManager::instance().getScriptResource(dependencies[i].resource, &dependency, true);
  66. output.set(i, dependency->getManagedInstance());
  67. }
  68. return output.getInternal();
  69. }
  70. void ScriptEditorUtility::internal_CalculateArrayCenter(MonoArray* objects, Vector3* center)
  71. {
  72. Vector<HSceneObject> sceneObjects;
  73. ScriptArray scriptArray(objects);
  74. UINT32 arrayLen = scriptArray.size();
  75. for (UINT32 i = 0; i < arrayLen; i++)
  76. {
  77. MonoObject* curObject = scriptArray.get<MonoObject*>(i);
  78. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(curObject);
  79. if (scriptSO != nullptr)
  80. sceneObjects.push_back(static_object_cast<SceneObject>(scriptSO->getNativeHandle()));
  81. }
  82. *center = EditorUtility::calculateCenter(sceneObjects);
  83. }
  84. bool ScriptEditorUtility::internal_IsInternal(ScriptSceneObject* soPtr)
  85. {
  86. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  87. return false;
  88. HSceneObject so = soPtr->getNativeSceneObject();
  89. return so->hasFlag(SOF_Internal);
  90. }
  91. }