aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r--OpenSim/Region/Physics/Meshing/Mesh.cs65
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs1
-rw-r--r--OpenSim/Region/Physics/Meshing/PrimMesher.cs308
3 files changed, 283 insertions, 91 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>();
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index 4e43a1b..b11efd8 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -31,6 +31,7 @@ using System.Collections.Generic;
31using OpenSim.Framework; 31using OpenSim.Framework;
32using OpenSim.Region.Physics.Manager; 32using OpenSim.Region.Physics.Manager;
33using OpenMetaverse; 33using OpenMetaverse;
34using PrimMesher;
34 35
35namespace OpenSim.Region.Physics.Meshing 36namespace OpenSim.Region.Physics.Meshing
36{ 37{
diff --git a/OpenSim/Region/Physics/Meshing/PrimMesher.cs b/OpenSim/Region/Physics/Meshing/PrimMesher.cs
index 5e08fdf..caf5966 100644
--- a/OpenSim/Region/Physics/Meshing/PrimMesher.cs
+++ b/OpenSim/Region/Physics/Meshing/PrimMesher.cs
@@ -27,12 +27,77 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Text;
30using System.IO; 31using System.IO;
31using OpenSim.Region.Physics.Manager;
32using OpenMetaverse;
33 32
34namespace OpenSim.Region.Physics.Meshing 33namespace PrimMesher
35{ 34{
35 public struct Quat
36 {
37 /// <summary>X value</summary>
38 public float X;
39 /// <summary>Y value</summary>
40 public float Y;
41 /// <summary>Z value</summary>
42 public float Z;
43 /// <summary>W value</summary>
44 public float W;
45
46 public Quat(float x, float y, float z, float w)
47 {
48 X = x;
49 Y = y;
50 Z = z;
51 W = w;
52 }
53
54 public Quat(Coord axis, float angle)
55 {
56 axis = axis.Normalize();
57
58 angle *= 0.5f;
59 float c = (float)Math.Cos(angle);
60 float s = (float)Math.Sin(angle);
61
62 X = axis.X * s;
63 Y = axis.Y * s;
64 Z = axis.Z * s;
65 W = c;
66
67 Normalize();
68 }
69
70 public float Length()
71 {
72 return (float)Math.Sqrt(X * X + Y * Y + Z * Z + W * W);
73 }
74
75 public Quat Normalize()
76 {
77 const float MAG_THRESHOLD = 0.0000001f;
78 float mag = Length();
79
80 // Catch very small rounding errors when normalizing
81 if (mag > MAG_THRESHOLD)
82 {
83 float oomag = 1f / mag;
84 X *= oomag;
85 Y *= oomag;
86 Z *= oomag;
87 W *= oomag;
88 }
89 else
90 {
91 X = 0f;
92 Y = 0f;
93 Z = 0f;
94 W = 1f;
95 }
96
97 return this;
98 }
99 }
100
36 public struct Coord 101 public struct Coord
37 { 102 {
38 public float X; 103 public float X;
@@ -46,23 +111,119 @@ namespace OpenSim.Region.Physics.Meshing
46 this.Z = z; 111 this.Z = z;
47 } 112 }
48 113
114 public float Length()
115 {
116 return (float)Math.Sqrt(this.X * this.X + this.Y * this.Y + this.Z * this.Z);
117 }
118
119 public Coord Normalize()
120 {
121 const float MAG_THRESHOLD = 0.0000001f;
122 float mag = Length();
123
124 // Catch very small rounding errors when normalizing
125 if (mag > MAG_THRESHOLD)
126 {
127 float oomag = 1.0f / mag;
128 this.X *= oomag;
129 this.Y *= oomag;
130 this.Z *= oomag;
131 }
132 else
133 {
134 this.X = 0.0f;
135 this.Y = 0.0f;
136 this.Z = 0.0f;
137 }
138
139 return this;
140 }
141
49 public override string ToString() 142 public override string ToString()
50 { 143 {
51 return this.X.ToString() + " " + this.Y.ToString() + " " + this.Z.ToString(); 144 return this.X.ToString() + " " + this.Y.ToString() + " " + this.Z.ToString();
52 } 145 }
146
147 public static Coord Cross(Coord c1, Coord c2)
148 {
149 return new Coord(
150 c1.Y * c2.Z - c2.Y * c1.Z,
151 c1.Z * c2.X - c2.Z * c1.X,
152 c1.X * c2.Y - c2.X * c1.Y
153 );
154 }
155
156 public static Coord operator *(Coord v, Quat q)
157 {
158 // From http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/transforms/
159
160 Coord c2 = new Coord(0.0f, 0.0f, 0.0f);
161
162 c2.X = q.W * q.W * v.X +
163 2f * q.Y * q.W * v.Z -
164 2f * q.Z * q.W * v.Y +
165 q.X * q.X * v.X +
166 2f * q.Y * q.X * v.Y +
167 2f * q.Z * q.X * v.Z -
168 q.Z * q.Z * v.X -
169 q.Y * q.Y * v.X;
170
171 c2.Y =
172 2f * q.X * q.Y * v.X +
173 q.Y * q.Y * v.Y +
174 2f * q.Z * q.Y * v.Z +
175 2f * q.W * q.Z * v.X -
176 q.Z * q.Z * v.Y +
177 q.W * q.W * v.Y -
178 2f * q.X * q.W * v.Z -
179 q.X * q.X * v.Y;
180
181 c2.Z =
182 2f * q.X * q.Z * v.X +
183 2f * q.Y * q.Z * v.Y +
184 q.Z * q.Z * v.Z -
185 2f * q.W * q.Y * v.X -
186 q.Y * q.Y * v.Z +
187 2f * q.W * q.X * v.Y -
188 q.X * q.X * v.Z +
189 q.W * q.W * v.Z;
190
191 return c2;
192 }
53 } 193 }
54 194
55 public struct Face 195 public struct Face
56 { 196 {
197 // vertices
57 public int v1; 198 public int v1;
58 public int v2; 199 public int v2;
59 public int v3; 200 public int v3;
60 201
202 //normals
203 public int n1;
204 public int n2;
205 public int n3;
206
61 public Face(int v1, int v2, int v3) 207 public Face(int v1, int v2, int v3)
62 { 208 {
63 this.v1 = v1; 209 this.v1 = v1;
64 this.v2 = v2; 210 this.v2 = v2;
65 this.v3 = v3; 211 this.v3 = v3;
212
213 this.n1 = 0;
214 this.n2 = 0;
215 this.n3 = 0;
216 }
217
218 public Face(int v1, int v2, int v3, int n1, int n2, int n3)
219 {
220 this.v1 = v1;
221 this.v2 = v2;
222 this.v3 = v3;
223
224 this.n1 = n1;
225 this.n2 = n2;
226 this.n3 = n3;
66 } 227 }
67 } 228 }
68 229
@@ -80,81 +241,6 @@ namespace OpenSim.Region.Physics.Meshing
80 } 241 }
81 } 242 }
82 243
83 //internal float angles3[][] = [
84 //[0.0f, 1.0f, 0.0f],
85 //[0.33333333333333331f, -0.49999999999999978f, 0.86602540378443871f],
86 //[0.66666666666666663f, -0.50000000000000044f, -0.86602540378443837f],
87 //[1.0f, 1.0f, -2.4492127076447545e-016f]];
88 /*
89angles3 = [
90 [0.0, 1.0, 0.0],
91 [0.33333333333333331, -0.49999999999999978, 0.86602540378443871],
92 [0.66666666666666663, -0.50000000000000044, -0.86602540378443837],
93 [1.0, 1.0, -2.4492127076447545e-016]]
94
95angles4 = [
96 [0.0, 1.0, 0.0],
97 [0.25, 0.0, 1.0],
98 [0.5, -1.0, 0.0],
99 [0.75, 0.0, -1.0],
100 [1.0, 1.0, 0.0]]
101
102angles24 = [
103 [0.0, 0.5, 0.0],
104 [0.041666666666666664, 0.48296291314453416, 0.12940952255126037],
105 [0.083333333333333329, 0.43301270189221935, 0.25],
106 [0.125, 0.35355339059327379, 0.35355339059327373],
107 [0.16666666666666666, 0.25, 0.4330127018922193],
108 [0.20833333333333331, 0.12940952255126048, 0.4829629131445341],
109 [0.25, 0.0, 0.5],
110 [0.29166666666666663, -0.12940952255126031, 0.48296291314453416],
111 [0.33333333333333331, -0.25, 0.43301270189221935],
112 [0.375, -0.35355339059327373, 0.35355339059327379],
113 [0.41666666666666663, -0.43301270189221924, 0.25],
114 [0.45833333333333331, -0.4829629131445341, 0.12940952255126051],
115 [0.5, -0.5, 0.0],
116 [0.54166666666666663, -0.48296291314453421, -0.12940952255126018],
117 [0.58333333333333326, -0.43301270189221941, -0.25],
118 [0.62499999999999989, -0.35355339059327395, -0.35355339059327356],
119 [0.66666666666666663, -0.25, -0.43301270189221919],
120 [0.70833333333333326, -0.12940952255126076, -0.48296291314453405],
121 [0.75, 0.0, -0.5],
122 [0.79166666666666663, 0.12940952255126015, -0.48296291314453421],
123 [0.83333333333333326, 0.25, -0.43301270189221952],
124 [0.875, 0.35355339059327368, -0.35355339059327384],
125 [0.91666666666666663, 0.43301270189221919, -0.25],
126 [0.95833333333333326, 0.48296291314453405, -0.12940952255126079],
127 [1.0, 0.5, 0.0]]
128
129angles24 = [
130 [0.0, 1.0, 0.0],
131 [0.041666666666666664, 0.96592582628906831, 0.25881904510252074],
132 [0.083333333333333329, 0.86602540378443871, 0.5],
133 [0.125, 0.70710678118654757, 0.70710678118654746],
134 [0.16666666666666667, 0.5, 0.8660254037844386],
135 [0.20833333333333331, 0.25881904510252096, 0.9659258262890682],
136 [0.25, 6.1230317691118863e-017, 1.0],
137 [0.29166666666666663, -0.25881904510252063, 0.96592582628906831],
138 [0.33333333333333333, -0.5, 0.86602540378443871],
139 [0.375, -0.70710678118654746, 0.70710678118654757],
140 [0.41666666666666663, -0.86602540378443849, 0.5],
141 [0.45833333333333331, -0.9659258262890682, 0.25881904510252102],
142 [0.5, -1.0, 1.2246063538223773e-016],
143 [0.54166666666666663, -0.96592582628906842, -0.25881904510252035],
144 [0.58333333333333326, -0.86602540378443882, -0.5],
145 [0.62499999999999989, -0.70710678118654791, -0.70710678118654713],
146 [0.66666666666666667, -0.5, -0.86602540378443837],
147 [0.70833333333333326, -0.25881904510252152, -0.96592582628906809],
148 [0.75, -1.8369095307335659e-016, -1.0],
149 [0.79166666666666663, 0.2588190451025203, -0.96592582628906842],
150 [0.83333333333333326, 0.5, -0.86602540378443904],
151 [0.875, 0.70710678118654735, -0.70710678118654768],
152 [0.91666666666666663, 0.86602540378443837, -0.5],
153 [0.95833333333333326, 0.96592582628906809, -0.25881904510252157],
154 [1.0, 1.0, -2.4492127076447545e-016]]
155
156 */
157
158 internal class AngleList 244 internal class AngleList
159 { 245 {
160 private float iX, iY; // intersection point 246 private float iX, iY; // intersection point
@@ -226,7 +312,7 @@ angles24 = [
226 312
227 internal List<Angle> angles; 313 internal List<Angle> angles;
228 314
229 internal void makeAngles( int sides, float startAngle, float stopAngle ) 315 internal void makeAngles(int sides, float startAngle, float stopAngle)
230 { 316 {
231 angles = new List<Angle>(); 317 angles = new List<Angle>();
232 double twoPi = System.Math.PI * 2.0; 318 double twoPi = System.Math.PI * 2.0;
@@ -556,7 +642,7 @@ angles24 = [
556 } 642 }
557 } 643 }
558 644
559 public void AddRot(Quaternion q) 645 public void AddRot(Quat q)
560 { 646 {
561 int i; 647 int i;
562 int numVerts = this.coords.Count; 648 int numVerts = this.coords.Count;
@@ -565,7 +651,7 @@ angles24 = [
565 for (i = 0; i < numVerts; i++) 651 for (i = 0; i < numVerts; i++)
566 { 652 {
567 vert = this.coords[i]; 653 vert = this.coords[i];
568 Vertex v = new Vertex(vert.X, vert.Y, vert.Z) * q; 654 Coord v = new Coord(vert.X, vert.Y, vert.Z) * q;
569 655
570 vert.X = v.X; 656 vert.X = v.X;
571 vert.Y = v.Y; 657 vert.Y = v.Y;
@@ -646,6 +732,7 @@ angles24 = [
646 private const float twoPi = 2.0f * (float)Math.PI; 732 private const float twoPi = 2.0f * (float)Math.PI;
647 733
648 public List<Coord> coords; 734 public List<Coord> coords;
735 public List<Coord> normals;
649 public List<Face> faces; 736 public List<Face> faces;
650 737
651 public int sides = 4; 738 public int sides = 4;
@@ -712,7 +799,7 @@ angles24 = [
712 799
713 if (sides < 3) 800 if (sides < 3)
714 this.sides = 3; 801 this.sides = 3;
715 if ( hollowSides < 3) 802 if (hollowSides < 3)
716 this.hollowSides = 3; 803 this.hollowSides = 3;
717 if (profileStart < 0.0f) 804 if (profileStart < 0.0f)
718 this.profileStart = 0.0f; 805 this.profileStart = 0.0f;
@@ -795,7 +882,7 @@ angles24 = [
795 Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, true); 882 Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, true);
796 883
797 if (initialProfileRot != 0.0f) 884 if (initialProfileRot != 0.0f)
798 profile.AddRot(Quaternion.CreateFromAxisAngle(new Vector3(0.0f, 0.0f, 1.0f), initialProfileRot)); 885 profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot));
799 886
800 bool done = false; 887 bool done = false;
801 while (!done) 888 while (!done)
@@ -819,7 +906,7 @@ angles24 = [
819 906
820 float twist = twistBegin + twistTotal * percentOfPath; 907 float twist = twistBegin + twistTotal * percentOfPath;
821 if (twist != 0.0f) 908 if (twist != 0.0f)
822 newLayer.AddRot(Quaternion.CreateFromAxisAngle(new Vector3(0.0f, 0.0f, 1.0f), twist)); 909 newLayer.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), twist));
823 910
824 newLayer.AddPos(xOffset, yOffset, zOffset); 911 newLayer.AddPos(xOffset, yOffset, zOffset);
825 912
@@ -972,7 +1059,7 @@ angles24 = [
972 Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces); 1059 Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces);
973 1060
974 if (initialProfileRot != 0.0f) 1061 if (initialProfileRot != 0.0f)
975 profile.AddRot(Quaternion.CreateFromAxisAngle(new Vector3(0.0f, 0.0f, 1.0f), initialProfileRot)); 1062 profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot));
976 1063
977 bool done = false; 1064 bool done = false;
978 while (!done) // loop through the length of the path and add the layers 1065 while (!done) // loop through the length of the path and add the layers
@@ -980,7 +1067,7 @@ angles24 = [
980 bool isEndLayer = false; 1067 bool isEndLayer = false;
981 if (angle == startAngle || angle >= endAngle) 1068 if (angle == startAngle || angle >= endAngle)
982 isEndLayer = true; 1069 isEndLayer = true;
983 1070
984 Profile newLayer = profile.Clone(isEndLayer && needEndFaces); 1071 Profile newLayer = profile.Clone(isEndLayer && needEndFaces);
985 1072
986 float xProfileScale = (1.0f - Math.Abs(this.skew)) * this.holeSizeX; 1073 float xProfileScale = (1.0f - Math.Abs(this.skew)) * this.holeSizeX;
@@ -1019,12 +1106,12 @@ angles24 = [
1019 1106
1020 // next apply twist rotation to the profile layer 1107 // next apply twist rotation to the profile layer
1021 if (twistTotal != 0.0f || twistBegin != 0.0f) 1108 if (twistTotal != 0.0f || twistBegin != 0.0f)
1022 newLayer.AddRot(Quaternion.CreateFromAxisAngle(new Vector3(0.0f, 0.0f, 1.0f), twist)); 1109 newLayer.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), twist));
1023 1110
1024 // now orient the rotation of the profile layer relative to it's position on the path 1111 // now orient the rotation of the profile layer relative to it's position on the path
1025 // adding taperY to the angle used to generate the quat appears to approximate the viewer 1112 // adding taperY to the angle used to generate the quat appears to approximate the viewer
1026 //newLayer.AddRot(new Quaternion(new Vertex(1.0f, 0.0f, 0.0f), angle + this.topShearY * 0.9f)); 1113 //newLayer.AddRot(new Quaternion(new Vertex(1.0f, 0.0f, 0.0f), angle + this.topShearY * 0.9f));
1027 newLayer.AddRot(Quaternion.CreateFromAxisAngle(new Vector3(1.0f, 0.0f, 0.0f), angle + this.topShearY)); 1114 newLayer.AddRot(new Quat(new Coord(1.0f, 0.0f, 0.0f), angle + this.topShearY));
1028 newLayer.AddPos(xOffset, yOffset, zOffset); 1115 newLayer.AddPos(xOffset, yOffset, zOffset);
1029 1116
1030 if (angle == startAngle) 1117 if (angle == startAngle)
@@ -1084,6 +1171,47 @@ angles24 = [
1084 } 1171 }
1085 } 1172 }
1086 1173
1174 public Coord SurfaceNormal(int faceIndex)
1175 {
1176 int numFaces = faces.Count;
1177 if (faceIndex < 0 || faceIndex >= faces.Count)
1178 return new Coord(0.0f, 0.0f, 0.0f);
1179
1180 Face face = faces[faceIndex];
1181 Coord c1 = coords[face.v1];
1182 Coord c2 = coords[face.v2];
1183 Coord c3 = coords[face.v3];
1184
1185 Coord edge1 = new Coord(c2.X - c1.X, c2.Y - c1.Y, c2.Z - c1.Z);
1186 Coord edge2 = new Coord(c3.X - c1.X, c3.Y - c1.Y, c3.Z - c1.Z);
1187
1188 Coord normal = Coord.Cross(edge1, edge2);
1189
1190 normal.Normalize();
1191
1192 return normal;
1193 }
1194
1195 public void CalcNormals()
1196 {
1197 int numFaces = faces.Count;
1198 this.normals = new List<Coord>();
1199
1200 for (int i = 0; i < numFaces; i++)
1201 {
1202 Face face = faces[i];
1203
1204 this.normals.Add(SurfaceNormal(i).Normalize());
1205
1206 int normIndex = normals.Count - 1;
1207 face.n1 = normIndex;
1208 face.n2 = normIndex;
1209 face.n3 = normIndex;
1210
1211 this.faces[i] = face;
1212 }
1213 }
1214
1087 public void AddPos(float x, float y, float z) 1215 public void AddPos(float x, float y, float z)
1088 { 1216 {
1089 int i; 1217 int i;
@@ -1100,7 +1228,7 @@ angles24 = [
1100 } 1228 }
1101 } 1229 }
1102 1230
1103 public void AddRot(Quaternion q) 1231 public void AddRot(Quat q)
1104 { 1232 {
1105 int i; 1233 int i;
1106 int numVerts = this.coords.Count; 1234 int numVerts = this.coords.Count;
@@ -1109,7 +1237,7 @@ angles24 = [
1109 for (i = 0; i < numVerts; i++) 1237 for (i = 0; i < numVerts; i++)
1110 { 1238 {
1111 vert = this.coords[i]; 1239 vert = this.coords[i];
1112 Vertex v = new Vertex(vert.X, vert.Y, vert.Z) * q; 1240 Coord v = new Coord(vert.X, vert.Y, vert.Z) * q;
1113 1241
1114 vert.X = v.X; 1242 vert.X = v.X;
1115 vert.Y = v.Y; 1243 vert.Y = v.Y;