diff options
Diffstat (limited to 'OpenSim/Region/Physics/UbitMeshing/Mesh.cs')
-rw-r--r-- | OpenSim/Region/Physics/UbitMeshing/Mesh.cs | 84 |
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; |