BsScriptEditorUtility.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. namespace BansheeEngine
  15. {
  16. ScriptEditorUtility::ScriptEditorUtility(MonoObject* instance)
  17. :ScriptObject(instance)
  18. { }
  19. void ScriptEditorUtility::initRuntimeData()
  20. {
  21. metaData.scriptClass->addInternalCall("Internal_CalculateBounds", &ScriptEditorUtility::internal_CalculateBounds);
  22. metaData.scriptClass->addInternalCall("Internal_CalculateBoundsArray", &ScriptEditorUtility::internal_CalculateBoundsArray);
  23. metaData.scriptClass->addInternalCall("Internal_FindDependencies", &ScriptEditorUtility::internal_FindDependencies);
  24. }
  25. void ScriptEditorUtility::internal_CalculateBounds(MonoObject* so, AABox* bounds)
  26. {
  27. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(so);
  28. if (scriptSO != nullptr)
  29. *bounds = EditorUtility::calculateBounds(static_object_cast<SceneObject>(scriptSO->getNativeHandle()));
  30. else
  31. *bounds = AABox();
  32. }
  33. void ScriptEditorUtility::internal_CalculateBoundsArray(MonoArray* objects, AABox* bounds)
  34. {
  35. Vector<HSceneObject> sceneObjects;
  36. UINT32 arrayLen = (UINT32)mono_array_length(objects);
  37. for (UINT32 i = 0; i < arrayLen; i++)
  38. {
  39. MonoObject* curObject = mono_array_get(objects, MonoObject*, i);
  40. ScriptSceneObject* scriptSO = ScriptSceneObject::toNative(curObject);
  41. if (scriptSO != nullptr)
  42. sceneObjects.push_back(static_object_cast<SceneObject>(scriptSO->getNativeHandle()));
  43. }
  44. *bounds = EditorUtility::calculateBounds(sceneObjects);
  45. }
  46. MonoArray* ScriptEditorUtility::internal_FindDependencies(MonoObject* resource, bool recursive)
  47. {
  48. ScriptResource* srcResource = ScriptResource::toNative(resource);
  49. if (srcResource == nullptr)
  50. {
  51. ScriptArray emptyArray = ScriptArray::create<ScriptResource>(0);
  52. return emptyArray.getInternal();
  53. }
  54. Vector<ResourceDependency> dependencies = Utility::findResourceDependencies(srcResource->getGenericHandle(), recursive);
  55. UINT32 numEntries = (UINT32)dependencies.size();
  56. ScriptArray output = ScriptArray::create<ScriptResource>(numEntries);
  57. for (UINT32 i = 0; i < numEntries; i++)
  58. {
  59. ScriptResourceBase* dependency;
  60. ScriptResourceManager::instance().getScriptResource(dependencies[i].resource, &dependency, true);
  61. output.set(i, dependency->getManagedInstance());
  62. }
  63. return output.getInternal();
  64. }
  65. }