aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/Meshing/Mesh.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/Meshing/Mesh.cs')
-rw-r--r--OpenSim/Region/Physics/Meshing/Mesh.cs65
1 files changed, 64 insertions, 1 deletions
diff --git a/OpenSim/Region/Physics/Meshing/Mesh.cs b/OpenSim/Region/Physics/Meshing/Mesh.cs
index 06131a7..583b485 100644
--- a/OpenSim/Region/Physics/Meshing/Mesh.cs
+++ b/OpenSim/Region/Physics/Meshing/Mesh.cs
@@ -30,6 +30,7 @@ using System.Collections.Generic;
30using System.IO; 30using System.IO;
31using System.Runtime.InteropServices; 31using System.Runtime.InteropServices;
32using OpenSim.Region.Physics.Manager; 32using OpenSim.Region.Physics.Manager;
33using PrimMesher;
33 34
34namespace OpenSim.Region.Physics.Meshing 35namespace OpenSim.Region.Physics.Meshing
35{ 36{
@@ -40,7 +41,7 @@ namespace OpenSim.Region.Physics.Meshing
40 GCHandle pinnedVirtexes; 41 GCHandle pinnedVirtexes;
41 GCHandle pinnedIndex; 42 GCHandle pinnedIndex;
42 public PrimMesh primMesh = null; 43 public PrimMesh primMesh = null;
43 //public float[] normals; 44 public float[] normals;
44 45
45 public Mesh() 46 public Mesh()
46 { 47 {
@@ -142,6 +143,68 @@ namespace OpenSim.Region.Physics.Meshing
142 } 143 }
143 } 144 }
144 145
146 public void CalcNormals()
147 {
148 int iTriangles = triangles.Count;
149
150 this.normals = new float[iTriangles * 3];
151
152 int i = 0;
153 foreach (Triangle t in triangles)
154 {
155 float ux, uy, uz;
156 float vx, vy, vz;
157 float wx, wy, wz;
158
159 ux = t.v1.X;
160 uy = t.v1.Y;
161 uz = t.v1.Z;
162
163 vx = t.v2.X;
164 vy = t.v2.Y;
165 vz = t.v2.Z;
166
167 wx = t.v3.X;
168 wy = t.v3.Y;
169 wz = t.v3.Z;
170
171
172 // Vectors for edges
173 float e1x, e1y, e1z;
174 float e2x, e2y, e2z;
175
176 e1x = ux - vx;
177 e1y = uy - vy;
178 e1z = uz - vz;
179
180 e2x = ux - wx;
181 e2y = uy - wy;
182 e2z = uz - wz;
183
184
185 // Cross product for normal
186 float nx, ny, nz;
187 nx = e1y * e2z - e1z * e2y;
188 ny = e1z * e2x - e1x * e2z;
189 nz = e1x * e2y - e1y * e2x;
190
191 // Length
192 float l = (float)Math.Sqrt(nx * nx + ny * ny + nz * nz);
193 float lReciprocal = 1.0f / l;
194
195 // Normalized "normal"
196 //nx /= l;
197 //ny /= l;
198 //nz /= l;
199
200 normals[i] = nx * lReciprocal;
201 normals[i + 1] = ny * lReciprocal;
202 normals[i + 2] = nz * lReciprocal;
203
204 i += 3;
205 }
206 }
207
145 public List<PhysicsVector> getVertexList() 208 public List<PhysicsVector> getVertexList()
146 { 209 {
147 List<PhysicsVector> result = new List<PhysicsVector>(); 210 List<PhysicsVector> result = new List<PhysicsVector>();