TrueSync: TSMeshCollider.cs Source File

TrueSync

TSMeshCollider.cs
1 using System.Collections.Generic;
2 using System.Linq;
3 using UnityEngine;
4 using TrueSync.Physics3D;
5 
6 namespace TrueSync {
7 
11  [AddComponentMenu("TrueSync/Physics/MeshCollider", 0)]
12  public class TSMeshCollider : TSCollider {
13 
14  [SerializeField]
15  private Mesh mesh;
16 
20  public Mesh Mesh {
21  get { return mesh; }
22  set {
23  mesh = value;
24  vertices = GetVertices();
25  indices = GetIndices();
26 
27  if (_body != null) {
28  _body.Shape = CreateShape();
29  }
30  }
31  }
32 
33  private List<TSVector> vertices;
34 
38  public List<TSVector> Vertices {
39  get {
40  if (vertices == null)
41  vertices = GetVertices();
42  return vertices;
43  }
44  }
45 
46  private List<TriangleVertexIndices> indices;
47 
51  public List<TriangleVertexIndices> Indices {
52  get {
53  if (indices == null)
54  indices = GetIndices();
55  return indices;
56  }
57  }
58 
62  public void Reset() {
63  if (mesh == null) {
64  var meshFilter = GetComponent<MeshFilter>();
65  mesh = meshFilter.sharedMesh;
66  }
67  }
68 
72  public override Shape CreateShape() {
73  var octree = new Octree(Vertices, Indices);
74  return new TriangleMeshShape(octree);
75  }
76 
77  private List<TriangleVertexIndices> GetIndices() {
78  var triangles = mesh.triangles;
79  var result = new List<TriangleVertexIndices>();
80  for (int i = 0; i < triangles.Length; i += 3)
81  result.Add(new TriangleVertexIndices(triangles[i + 2], triangles[i + 1], triangles[i + 0]));
82  return result;
83  }
84 
85  private List<TSVector> GetVertices() {
86  var result = mesh.vertices.Select(p => new TSVector(p.x * lossyScale.x, p.y * lossyScale.y, p.z * lossyScale.z)).ToList();
87  return result;
88  }
89 
90  protected override Vector3 GetGizmosSize() {
91  return lossyScale.ToVector();
92  }
93 
94  protected override void DrawGizmos() {
95  Gizmos.DrawWireMesh(mesh);
96  }
97 
98  }
99 
100 }
override Shape CreateShape()
Creates a shape based on attached mesh.
Shape Shape
Shape used by a collider.
Definition: TSCollider.cs:20
Collider with a mesh shape.
List< TriangleVertexIndices > Indices
A list of mess related structs.
void Reset()
Gets (if any) the mesh attached to this game object.
Abstract collider for 3D shapes.
Definition: TSCollider.cs:13
TSVector lossyScale
Holds an first value of the GameObject&#39;s lossy scale.
Definition: TSCollider.cs:129
Mesh Mesh
Mesh attached to the same game object.
override void DrawGizmos()
Draws the specific gizmos of concrete collider (for example "Gizmos.DrawWireCube" for a TSBoxCollider...
List< TSVector > Vertices
A list of all mesh&#39;s vertices.
override Vector3 GetGizmosSize()
Returns the gizmos size.
Generated by   doxygen 1.8.11