BsCMeshCollider.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Components/BsCMeshCollider.h"
  4. #include "Scene/BsSceneObject.h"
  5. #include "Components/BsCRigidbody.h"
  6. #include "Physics/BsPhysicsMesh.h"
  7. #include "RTTI/BsCMeshColliderRTTI.h"
  8. namespace bs
  9. {
  10. CMeshCollider::CMeshCollider(const HSceneObject& parent)
  11. : CCollider(parent)
  12. {
  13. setName("MeshCollider");
  14. }
  15. void CMeshCollider::setMesh(const HPhysicsMesh& mesh)
  16. {
  17. if (mMesh == mesh)
  18. return;
  19. if(getIsTrigger() && mesh->getType() == PhysicsMeshType::Triangle)
  20. {
  21. LOGWRN("Triangle meshes are not supported on Trigger colliders.");
  22. return;
  23. }
  24. mMesh = mesh;
  25. if (mInternal != nullptr)
  26. {
  27. _getInternal()->setMesh(mesh);
  28. if (mParent != nullptr)
  29. {
  30. // If triangle mesh its possible the parent can no longer use this collider (they're not supported for
  31. // non-kinematic rigidbodies)
  32. if (mMesh.isLoaded() && mMesh->getType() == PhysicsMeshType::Triangle)
  33. updateParentRigidbody();
  34. else
  35. mParent->_updateMassDistribution();
  36. }
  37. }
  38. }
  39. SPtr<Collider> CMeshCollider::createInternal()
  40. {
  41. const Transform& tfrm = SO()->getTransform();
  42. SPtr<MeshCollider> collider = MeshCollider::create(tfrm.getPosition(), tfrm.getRotation());
  43. collider->setMesh(mMesh);
  44. collider->_setOwner(PhysicsOwnerType::Component, this);
  45. return collider;
  46. }
  47. bool CMeshCollider::isValidParent(const HRigidbody& parent) const
  48. {
  49. // Triangle mesh colliders cannot be used for non-kinematic rigidbodies
  50. return !mMesh.isLoaded() || mMesh->getType() == PhysicsMeshType::Convex || parent->getIsKinematic();
  51. }
  52. RTTITypeBase* CMeshCollider::getRTTIStatic()
  53. {
  54. return CMeshColliderRTTI::instance();
  55. }
  56. RTTITypeBase* CMeshCollider::getRTTI() const
  57. {
  58. return CMeshCollider::getRTTIStatic();
  59. }
  60. }