aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/UbitMeshing/Mesh.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/UbitMeshing/Mesh.cs')
-rw-r--r--OpenSim/Region/Physics/UbitMeshing/Mesh.cs84
1 files changed, 69 insertions, 15 deletions
diff --git a/OpenSim/Region/Physics/UbitMeshing/Mesh.cs b/OpenSim/Region/Physics/UbitMeshing/Mesh.cs
index 98c0f0b..c31ec08 100644
--- a/OpenSim/Region/Physics/UbitMeshing/Mesh.cs
+++ b/OpenSim/Region/Physics/UbitMeshing/Mesh.cs
@@ -48,8 +48,14 @@ namespace OpenSim.Region.Physics.Meshing
48 int m_indexCount = 0; 48 int m_indexCount = 0;
49 public float[] m_normals; 49 public float[] m_normals;
50 Vector3 m_centroid; 50 Vector3 m_centroid;
51 int m_centroidDiv; 51 float m_obbXmin;
52 float m_obbXmax;
53 float m_obbYmin;
54 float m_obbYmax;
55 float m_obbZmin;
56 float m_obbZmax;
52 57
58 int m_centroidDiv;
53 59
54 private class vertexcomp : IEqualityComparer<Vertex> 60 private class vertexcomp : IEqualityComparer<Vertex>
55 { 61 {
@@ -77,6 +83,12 @@ namespace OpenSim.Region.Physics.Meshing
77 m_triangles = new List<Triangle>(); 83 m_triangles = new List<Triangle>();
78 m_centroid = Vector3.Zero; 84 m_centroid = Vector3.Zero;
79 m_centroidDiv = 0; 85 m_centroidDiv = 0;
86 m_obbXmin = float.MaxValue;
87 m_obbXmax = float.MinValue;
88 m_obbYmin = float.MaxValue;
89 m_obbYmax = float.MinValue;
90 m_obbZmin = float.MaxValue;
91 m_obbZmax = float.MinValue;
80 } 92 }
81 93
82 public int RefCount { get; set; } 94 public int RefCount { get; set; }
@@ -85,8 +97,6 @@ namespace OpenSim.Region.Physics.Meshing
85 97
86 public void Scale(Vector3 scale) 98 public void Scale(Vector3 scale)
87 { 99 {
88
89
90 } 100 }
91 101
92 public Mesh Clone() 102 public Mesh Clone()
@@ -99,9 +109,44 @@ namespace OpenSim.Region.Physics.Meshing
99 } 109 }
100 result.m_centroid = m_centroid; 110 result.m_centroid = m_centroid;
101 result.m_centroidDiv = m_centroidDiv; 111 result.m_centroidDiv = m_centroidDiv;
112 result.m_obbXmin = m_obbXmin;
113 result.m_obbXmax = m_obbXmax;
114 result.m_obbYmin = m_obbYmin;
115 result.m_obbYmax = m_obbYmax;
116 result.m_obbZmin = m_obbZmin;
117 result.m_obbZmax = m_obbZmax;
102 return result; 118 return result;
103 } 119 }
104 120
121 public void addVertexLStats(Vertex v)
122 {
123 float x = v.X;
124 float y = v.Y;
125 float z = v.Z;
126
127 m_centroid.X += x;
128 m_centroid.Y += y;
129 m_centroid.Z += z;
130 m_centroidDiv++;
131
132 if (x > m_obbXmax)
133 m_obbXmax = x;
134 else if (x < m_obbXmin)
135 m_obbXmin = x;
136
137 if (y > m_obbYmax)
138 m_obbYmax = y;
139 else if (y < m_obbYmin)
140 m_obbYmin = y;
141
142 if (z > m_obbZmax)
143 m_obbZmax = z;
144 else if (z < m_obbZmin)
145 m_obbZmin = z;
146
147 }
148
149
105 public void Add(Triangle triangle) 150 public void Add(Triangle triangle)
106 { 151 {
107 if (m_pinnedIndex.IsAllocated || m_pinnedVertexes.IsAllocated || m_indicesPtr != IntPtr.Zero || m_verticesPtr != IntPtr.Zero) 152 if (m_pinnedIndex.IsAllocated || m_pinnedVertexes.IsAllocated || m_indicesPtr != IntPtr.Zero || m_verticesPtr != IntPtr.Zero)
@@ -127,26 +172,17 @@ namespace OpenSim.Region.Physics.Meshing
127 if (!m_vertices.ContainsKey(triangle.v1)) 172 if (!m_vertices.ContainsKey(triangle.v1))
128 { 173 {
129 m_vertices[triangle.v1] = m_vertices.Count; 174 m_vertices[triangle.v1] = m_vertices.Count;
130 m_centroid.X += triangle.v1.X; 175 addVertexLStats(triangle.v1);
131 m_centroid.Y += triangle.v1.Y;
132 m_centroid.Z += triangle.v1.Z;
133 m_centroidDiv++;
134 } 176 }
135 if (!m_vertices.ContainsKey(triangle.v2)) 177 if (!m_vertices.ContainsKey(triangle.v2))
136 { 178 {
137 m_vertices[triangle.v2] = m_vertices.Count; 179 m_vertices[triangle.v2] = m_vertices.Count;
138 m_centroid.X += triangle.v2.X; 180 addVertexLStats(triangle.v2);
139 m_centroid.Y += triangle.v2.Y;
140 m_centroid.Z += triangle.v2.Z;
141 m_centroidDiv++;
142 } 181 }
143 if (!m_vertices.ContainsKey(triangle.v3)) 182 if (!m_vertices.ContainsKey(triangle.v3))
144 { 183 {
145 m_vertices[triangle.v3] = m_vertices.Count; 184 m_vertices[triangle.v3] = m_vertices.Count;
146 m_centroid.X += triangle.v3.X; 185 addVertexLStats(triangle.v3);
147 m_centroid.Y += triangle.v3.Y;
148 m_centroid.Z += triangle.v3.Z;
149 m_centroidDiv++;
150 } 186 }
151 m_triangles.Add(triangle); 187 m_triangles.Add(triangle);
152 } 188 }
@@ -159,6 +195,24 @@ namespace OpenSim.Region.Physics.Meshing
159 return Vector3.Zero; 195 return Vector3.Zero;
160 } 196 }
161 197
198 public Vector3 GetOBB()
199 {
200 float x, y, z;
201 if (m_centroidDiv > 0)
202 {
203 x = (m_obbXmax - m_obbXmin) * 0.5f;
204 y = (m_obbYmax - m_obbYmin) * 0.5f;
205 z = (m_obbZmax - m_obbZmin) * 0.5f;
206 }
207 else // ??
208 {
209 x = 0.5f;
210 y = 0.5f;
211 z = 0.5f;
212 }
213 return new Vector3(x, y, z);
214 }
215
162 public void CalcNormals() 216 public void CalcNormals()
163 { 217 {
164 int iTriangles = m_triangles.Count; 218 int iTriangles = m_triangles.Count;