BsCMeshCollider.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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()
  11. {
  12. setName("MeshCollider");
  13. }
  14. CMeshCollider::CMeshCollider(const HSceneObject& parent)
  15. : CCollider(parent)
  16. {
  17. setName("MeshCollider");
  18. }
  19. void CMeshCollider::setMesh(const HPhysicsMesh& mesh)
  20. {
  21. if (mMesh == mesh)
  22. return;
  23. if(getIsTrigger() && mesh->getType() == PhysicsMeshType::Triangle)
  24. {
  25. LOGWRN("Triangle meshes are not supported on Trigger colliders.");
  26. return;
  27. }
  28. mMesh = mesh;
  29. if (mInternal != nullptr)
  30. {
  31. _getInternal()->setMesh(mesh);
  32. if (mParent != nullptr)
  33. {
  34. // If triangle mesh its possible the parent can no longer use this collider (they're not supported for
  35. // non-kinematic rigidbodies)
  36. if (mMesh.isLoaded() && mMesh->getType() == PhysicsMeshType::Triangle)
  37. updateParentRigidbody();
  38. else
  39. mParent->_updateMassDistribution();
  40. }
  41. }
  42. }
  43. SPtr<Collider> CMeshCollider::createInternal()
  44. {
  45. const Transform& tfrm = SO()->getTransform();
  46. SPtr<MeshCollider> collider = MeshCollider::create(tfrm.getPosition(), tfrm.getRotation());
  47. collider->setMesh(mMesh);
  48. collider->_setOwner(PhysicsOwnerType::Component, this);
  49. return collider;
  50. }
  51. bool CMeshCollider::isValidParent(const HRigidbody& parent) const
  52. {
  53. // Triangle mesh colliders cannot be used for non-kinematic rigidbodies
  54. return !mMesh.isLoaded() || mMesh->getType() == PhysicsMeshType::Convex || parent->getIsKinematic();
  55. }
  56. RTTITypeBase* CMeshCollider::getRTTIStatic()
  57. {
  58. return CMeshColliderRTTI::instance();
  59. }
  60. RTTITypeBase* CMeshCollider::getRTTI() const
  61. {
  62. return CMeshCollider::getRTTIStatic();
  63. }
  64. }