BsScriptSkeleton.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptSkeleton.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsMonoClass.h"
  8. #include "BsMonoManager.h"
  9. #include "BsMonoUtil.h"
  10. using namespace std::placeholders;
  11. namespace BansheeEngine
  12. {
  13. ScriptSkeleton::ScriptSkeleton(MonoObject* managedInstance, const SPtr<Skeleton>& skeleton)
  14. :ScriptObject(managedInstance), mSkeleton(skeleton)
  15. {
  16. }
  17. void ScriptSkeleton::initRuntimeData()
  18. {
  19. metaData.scriptClass->addInternalCall("Internal_GetNumBones", &ScriptSkeleton::internal_GetNumBones);
  20. metaData.scriptClass->addInternalCall("Internal_GetBoneInfo", &ScriptSkeleton::internal_GetBoneInfo);
  21. }
  22. MonoObject* ScriptSkeleton::create(const SPtr<Skeleton>& skeleton)
  23. {
  24. MonoObject* instance = metaData.scriptClass->createInstance();
  25. new (bs_alloc<ScriptSkeleton>()) ScriptSkeleton(instance, skeleton);
  26. return instance;
  27. }
  28. int ScriptSkeleton::internal_GetNumBones(ScriptSkeleton* thisPtr)
  29. {
  30. return thisPtr->getInternal()->getNumBones();
  31. }
  32. MonoObject* ScriptSkeleton::internal_GetBoneInfo(ScriptSkeleton* thisPtr, UINT32 boneIdx)
  33. {
  34. SPtr<Skeleton> skeleton = thisPtr->getInternal();
  35. UINT32 numBones = skeleton->getNumBones();
  36. if (boneIdx >= numBones)
  37. return nullptr;
  38. const SkeletonBoneInfo& boneInfo = skeleton->getBoneInfo(boneIdx);
  39. const Matrix4& invBindPose = skeleton->getInvBindPose(boneIdx);
  40. return ScriptBoneInfo::toManaged(boneInfo, invBindPose);
  41. }
  42. MonoField* ScriptBoneInfo::sNameField = nullptr;
  43. MonoField* ScriptBoneInfo::sParentField = nullptr;
  44. MonoField* ScriptBoneInfo::sInvBindPoseField = nullptr;
  45. ScriptBoneInfo::ScriptBoneInfo(MonoObject* instance)
  46. :ScriptObject(instance)
  47. { }
  48. void ScriptBoneInfo::initRuntimeData()
  49. {
  50. sNameField = metaData.scriptClass->getField("Name");
  51. sParentField = metaData.scriptClass->getField("Parent");
  52. sInvBindPoseField = metaData.scriptClass->getField("InvBindPose");
  53. }
  54. MonoObject* ScriptBoneInfo::toManaged(const SkeletonBoneInfo& boneInfo, const Matrix4& invBindPose)
  55. {
  56. MonoString* monoName = MonoUtil::stringToMono(boneInfo.name);
  57. int parentIdx = boneInfo.parent;
  58. Matrix4 monoInvBindPose = invBindPose;
  59. MonoObject* instance = metaData.scriptClass->createInstance();
  60. sNameField->setValue(instance, monoName);
  61. sParentField->setValue(instance, &parentIdx);
  62. sInvBindPoseField->setValue(instance, &monoInvBindPose);
  63. return instance;
  64. }
  65. }