aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs111
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs4
2 files changed, 113 insertions, 2 deletions
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index 6fb4606..d668aa3 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -57,7 +57,7 @@ namespace OpenSim.Region.Physics.Meshing
57 // Setting baseDir to a path will enable the dumping of raw files 57 // Setting baseDir to a path will enable the dumping of raw files
58 // raw files can be imported by blender so a visual inspection of the results can be done 58 // raw files can be imported by blender so a visual inspection of the results can be done
59 // const string baseDir = "rawFiles"; 59 // const string baseDir = "rawFiles";
60 private const string baseDir = null; // "rawFiles"; 60 private const string baseDir = null; //"rawFiles";
61 61
62// TODO: unused 62// TODO: unused
63// private static void IntersectionParameterPD(PhysicsVector p1, PhysicsVector r1, PhysicsVector p2, 63// private static void IntersectionParameterPD(PhysicsVector p1, PhysicsVector r1, PhysicsVector p2,
@@ -204,6 +204,8 @@ namespace OpenSim.Region.Physics.Meshing
204 } 204 }
205 } 205 }
206 break; 206 break;
207
208
207 default: 209 default:
208 if (hshape == HollowShape.Same) 210 if (hshape == HollowShape.Same)
209 hshape= HollowShape.Square; 211 hshape= HollowShape.Square;
@@ -986,6 +988,105 @@ namespace OpenSim.Region.Physics.Meshing
986 result.DumpRaw(baseDir, primName, "Z extruded"); 988 result.DumpRaw(baseDir, primName, "Z extruded");
987 return result; 989 return result;
988 } 990 }
991 private static Mesh CreateSphereMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size)
992 // Builds the z (+ and -) surfaces of a box shaped prim
993 {
994 UInt16 hollowFactor = primShape.ProfileHollow;
995 UInt16 profileBegin = primShape.ProfileBegin;
996 UInt16 profileEnd = primShape.ProfileEnd;
997 UInt16 taperX = primShape.PathScaleX;
998 UInt16 taperY = primShape.PathScaleY;
999 UInt16 pathShearX = primShape.PathShearX;
1000 UInt16 pathShearY = primShape.PathShearY;
1001 Mesh m = new Mesh();
1002 float radius = 0.6f;
1003 float sq5 = (float) Math.Sqrt(5.0);
1004 float phi = (1 + sq5) * 0.5f;
1005 float rat = (float) Math.Sqrt(10f + (2f * sq5)) / (4f * phi);
1006 float a = (radius / rat) * 0.5f;
1007 float b = (radius / rat) / (2.0f * phi);
1008
1009 Vertex v1 = new Vertex(0f, b, -a);
1010 Vertex v2 = new Vertex(b, a, 0f);
1011 Vertex v3 = new Vertex(-b, a, 0f);
1012 Vertex v4 = new Vertex(0f, b, a);
1013 Vertex v5 = new Vertex(0f, -b, a);
1014 Vertex v6 = new Vertex(-a, 0f, b);
1015 Vertex v7 = new Vertex(0f, -b, -a);
1016 Vertex v8 = new Vertex(a, 0f, -b);
1017 Vertex v9 = new Vertex(a, 0f, b);
1018 Vertex v10 = new Vertex(-a, 0f, -b);
1019 Vertex v11 = new Vertex(b, -a, 0);
1020 Vertex v12 = new Vertex(-b, -a, 0);
1021 m.Add(v1);
1022 m.Add(v2);
1023 m.Add(v3);
1024 m.Add(v4);
1025 m.Add(v5);
1026 m.Add(v6);
1027 m.Add(v7);
1028 m.Add(v8);
1029 m.Add(v9);
1030 m.Add(v10);
1031 m.Add(v11);
1032 m.Add(v12);
1033
1034 Triangle t1 = new Triangle(v1, v2, v3);
1035 Triangle t2 = new Triangle(v4, v3, v2);
1036 Triangle t3 = new Triangle(v4, v5, v6);
1037 Triangle t4 = new Triangle(v4, v9, v5);
1038 Triangle t5 = new Triangle(v1, v7, v8);
1039 Triangle t6 = new Triangle(v1, v10, v7);
1040 Triangle t7 = new Triangle(v5, v11, v12);
1041 Triangle t8 = new Triangle(v7, v12, v11);
1042 Triangle t9 = new Triangle(v3, v6, v10);
1043 Triangle t10 = new Triangle(v12, v10, v6);
1044 Triangle t11 = new Triangle(v2, v8, v9);
1045 Triangle t12 = new Triangle(v11, v9, v8);
1046 Triangle t13 = new Triangle(v4, v6, v3);
1047 Triangle t14 = new Triangle(v4, v2, v9);
1048 Triangle t15 = new Triangle(v1, v3, v10);
1049 Triangle t16 = new Triangle(v1, v8, v2);
1050 Triangle t17 = new Triangle(v7, v10, v12);
1051 Triangle t18 = new Triangle(v7, v11, v8);
1052 Triangle t19 = new Triangle(v5, v12, v6);
1053 Triangle t20 = new Triangle(v5, v9, v11);
1054 m.Add(t1);
1055 m.Add(t2);
1056 m.Add(t3);
1057 m.Add(t4);
1058 m.Add(t5);
1059 m.Add(t6);
1060 m.Add(t7);
1061 m.Add(t8);
1062 m.Add(t9);
1063 m.Add(t10);
1064 m.Add(t11);
1065 m.Add(t12);
1066 m.Add(t13);
1067 m.Add(t14);
1068 m.Add(t15);
1069 m.Add(t16);
1070 m.Add(t17);
1071 m.Add(t18);
1072 m.Add(t19);
1073 m.Add(t20);
1074
1075 // strechy!
1076 foreach (Vertex v in m.vertices)
1077 {
1078 v.X *= size.X;
1079 v.Y *= size.Y;
1080 v.Z *= size.Z;
1081 }
1082 foreach (Triangle t in m.triangles)
1083 {
1084 t.invertNormal();
1085 }
1086 m.DumpRaw(baseDir, primName, "Z extruded");
1087
1088 return m;
1089 }
989 1090
990 public static void CalcNormals(Mesh mesh) 1091 public static void CalcNormals(Mesh mesh)
991 { 1092 {
@@ -1065,6 +1166,14 @@ namespace OpenSim.Region.Physics.Meshing
1065 CalcNormals(mesh); 1166 CalcNormals(mesh);
1066 } 1167 }
1067 break; 1168 break;
1169 case ProfileShape.HalfCircle:
1170 if (primShape.PathCurve == (byte)Extrusion.Curve1)
1171 {
1172 mesh = CreateSphereMesh(primName, primShape, size);
1173 CalcNormals(mesh);
1174 }
1175 break;
1176
1068 case ProfileShape.EquilateralTriangle: 1177 case ProfileShape.EquilateralTriangle:
1069 mesh = CreatePrismMesh(primName, primShape, size); 1178 mesh = CreatePrismMesh(primName, primShape, size);
1070 CalcNormals(mesh); 1179 CalcNormals(mesh);
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 33b9ce3..9b8f4af 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -1449,9 +1449,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1449 1449
1450 if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight) 1450 if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight)
1451 return true; 1451 return true;
1452 if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 && (pbs.Scale.X != pbs.Scale.Y || pbs.Scale.Y != pbs.Scale.Z || pbs.Scale.Z != pbs.Scale.X))
1453 return true;
1452 1454
1453 if (pbs.ProfileShape == ProfileShape.EquilateralTriangle) 1455 if (pbs.ProfileShape == ProfileShape.EquilateralTriangle)
1454 return true; 1456 return true;
1455 1457
1456 return false; 1458 return false;
1457 } 1459 }