BsCMeshCollider.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsCMeshCollider.h"
  4. #include "BsSceneObject.h"
  5. #include "BsCRigidbody.h"
  6. #include "BsPhysicsMesh.h"
  7. #include "BsCMeshColliderRTTI.h"
  8. namespace BansheeEngine
  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. return collider;
  44. }
  45. bool CMeshCollider::isValidParent(const HRigidbody& parent) const
  46. {
  47. // Triangle mesh colliders cannot be used for non-kinematic rigidbodies
  48. return !mMesh.isLoaded() || mMesh->getType() == PhysicsMeshType::Convex || parent->getIsKinematic();
  49. }
  50. RTTITypeBase* CMeshCollider::getRTTIStatic()
  51. {
  52. return CMeshColliderRTTI::instance();
  53. }
  54. RTTITypeBase* CMeshCollider::getRTTI() const
  55. {
  56. return CMeshCollider::getRTTIStatic();
  57. }
  58. }