BsCMeshCollider.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. SPtr<MeshCollider> collider = MeshCollider::create(SO()->getWorldPosition(), SO()->getWorldRotation());
  42. collider->setMesh(mMesh);
  43. collider->_setOwner(PhysicsOwnerType::Component, this);
  44. return collider;
  45. }
  46. bool CMeshCollider::isValidParent(const HRigidbody& parent) const
  47. {
  48. // Triangle mesh colliders cannot be used for non-kinematic rigidbodies
  49. return !mMesh.isLoaded() || mMesh->getType() == PhysicsMeshType::Convex || parent->getIsKinematic();
  50. }
  51. RTTITypeBase* CMeshCollider::getRTTIStatic()
  52. {
  53. return CMeshColliderRTTI::instance();
  54. }
  55. RTTITypeBase* CMeshCollider::getRTTI() const
  56. {
  57. return CMeshCollider::getRTTIStatic();
  58. }
  59. }