MeshCollider.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. namespace BansheeEngine
  4. {
  5. /** @addtogroup Physics
  6. * @{
  7. */
  8. /// <summary>
  9. /// A collider represented by an arbitrary mesh.
  10. /// </summary>
  11. public sealed class MeshCollider : Collider
  12. {
  13. [SerializeField]
  14. private PhysicsMesh mesh;
  15. /// <summary>
  16. /// Mesh that represents the collider geometry. This can be a generic triangle mesh, or and convex mesh. Triangle
  17. /// meshes are not supported as triggers, nor are they supported for colliders that are parts of a non-kinematic
  18. /// rigidbody.
  19. /// </summary>
  20. public PhysicsMesh Mesh
  21. {
  22. get { return mesh; }
  23. set
  24. {
  25. if (mesh == value)
  26. return;
  27. if (IsTrigger && mesh.MeshType == PhysicsMeshType.Triangle)
  28. {
  29. Debug.LogWarning("Triangle meshes are not supported on Trigger colliders.");
  30. return;
  31. }
  32. mesh = value;
  33. if (Native != null)
  34. {
  35. Native.Mesh = value;
  36. if (parent != null)
  37. {
  38. // If triangle mesh its possible the parent can no longer use this collider (they're not supported for
  39. // non-kinematic rigidbodies)
  40. if (mesh != null && mesh.MeshType == PhysicsMeshType.Triangle)
  41. UpdateParentRigidbody();
  42. else
  43. parent.UpdateMassDistribution();
  44. }
  45. }
  46. }
  47. }
  48. /// <inheritdoc/>
  49. protected internal override bool IsValidParent(Rigidbody parent)
  50. {
  51. // Triangle mesh colliders cannot be used for non-kinematic rigidbodies
  52. return mesh == null|| mesh.MeshType == PhysicsMeshType.Convex || parent.Kinematic;
  53. }
  54. /// <summary>
  55. /// Returns the native mesh collider wrapped by this component.
  56. /// </summary>
  57. private NativeMeshCollider Native
  58. {
  59. get { return (NativeMeshCollider)native; }
  60. }
  61. /// <inheritdoc/>
  62. internal override NativeCollider CreateCollider()
  63. {
  64. NativeMeshCollider meshCollider = new NativeMeshCollider();
  65. meshCollider.Mesh = mesh;
  66. return meshCollider;
  67. }
  68. }
  69. /** @} */
  70. }