From d0f77841016291956ff3668b0d67d0a8a56d8f1e Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Tue, 8 Apr 2008 01:29:45 +0000 Subject: [PATCH] * Adds poor support for ellipsis in the Meshmerizer. This will get better.. notice the huge nasty facets! Regular spheres still work as they did. --- OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 111 +++++++++++++++++- OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 4 +- 2 files changed, 113 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs index 6fb4606993..d668aa3f6b 100644 --- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs @@ -57,7 +57,7 @@ namespace OpenSim.Region.Physics.Meshing // Setting baseDir to a path will enable the dumping of raw files // raw files can be imported by blender so a visual inspection of the results can be done // const string baseDir = "rawFiles"; - private const string baseDir = null; // "rawFiles"; + private const string baseDir = null; //"rawFiles"; // TODO: unused // private static void IntersectionParameterPD(PhysicsVector p1, PhysicsVector r1, PhysicsVector p2, @@ -204,6 +204,8 @@ namespace OpenSim.Region.Physics.Meshing } } break; + + default: if (hshape == HollowShape.Same) hshape= HollowShape.Square; @@ -986,6 +988,105 @@ namespace OpenSim.Region.Physics.Meshing result.DumpRaw(baseDir, primName, "Z extruded"); return result; } + private static Mesh CreateSphereMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size) + // Builds the z (+ and -) surfaces of a box shaped prim + { + UInt16 hollowFactor = primShape.ProfileHollow; + UInt16 profileBegin = primShape.ProfileBegin; + UInt16 profileEnd = primShape.ProfileEnd; + UInt16 taperX = primShape.PathScaleX; + UInt16 taperY = primShape.PathScaleY; + UInt16 pathShearX = primShape.PathShearX; + UInt16 pathShearY = primShape.PathShearY; + Mesh m = new Mesh(); + float radius = 0.6f; + float sq5 = (float) Math.Sqrt(5.0); + float phi = (1 + sq5) * 0.5f; + float rat = (float) Math.Sqrt(10f + (2f * sq5)) / (4f * phi); + float a = (radius / rat) * 0.5f; + float b = (radius / rat) / (2.0f * phi); + + Vertex v1 = new Vertex(0f, b, -a); + Vertex v2 = new Vertex(b, a, 0f); + Vertex v3 = new Vertex(-b, a, 0f); + Vertex v4 = new Vertex(0f, b, a); + Vertex v5 = new Vertex(0f, -b, a); + Vertex v6 = new Vertex(-a, 0f, b); + Vertex v7 = new Vertex(0f, -b, -a); + Vertex v8 = new Vertex(a, 0f, -b); + Vertex v9 = new Vertex(a, 0f, b); + Vertex v10 = new Vertex(-a, 0f, -b); + Vertex v11 = new Vertex(b, -a, 0); + Vertex v12 = new Vertex(-b, -a, 0); + m.Add(v1); + m.Add(v2); + m.Add(v3); + m.Add(v4); + m.Add(v5); + m.Add(v6); + m.Add(v7); + m.Add(v8); + m.Add(v9); + m.Add(v10); + m.Add(v11); + m.Add(v12); + + Triangle t1 = new Triangle(v1, v2, v3); + Triangle t2 = new Triangle(v4, v3, v2); + Triangle t3 = new Triangle(v4, v5, v6); + Triangle t4 = new Triangle(v4, v9, v5); + Triangle t5 = new Triangle(v1, v7, v8); + Triangle t6 = new Triangle(v1, v10, v7); + Triangle t7 = new Triangle(v5, v11, v12); + Triangle t8 = new Triangle(v7, v12, v11); + Triangle t9 = new Triangle(v3, v6, v10); + Triangle t10 = new Triangle(v12, v10, v6); + Triangle t11 = new Triangle(v2, v8, v9); + Triangle t12 = new Triangle(v11, v9, v8); + Triangle t13 = new Triangle(v4, v6, v3); + Triangle t14 = new Triangle(v4, v2, v9); + Triangle t15 = new Triangle(v1, v3, v10); + Triangle t16 = new Triangle(v1, v8, v2); + Triangle t17 = new Triangle(v7, v10, v12); + Triangle t18 = new Triangle(v7, v11, v8); + Triangle t19 = new Triangle(v5, v12, v6); + Triangle t20 = new Triangle(v5, v9, v11); + m.Add(t1); + m.Add(t2); + m.Add(t3); + m.Add(t4); + m.Add(t5); + m.Add(t6); + m.Add(t7); + m.Add(t8); + m.Add(t9); + m.Add(t10); + m.Add(t11); + m.Add(t12); + m.Add(t13); + m.Add(t14); + m.Add(t15); + m.Add(t16); + m.Add(t17); + m.Add(t18); + m.Add(t19); + m.Add(t20); + + // strechy! + foreach (Vertex v in m.vertices) + { + v.X *= size.X; + v.Y *= size.Y; + v.Z *= size.Z; + } + foreach (Triangle t in m.triangles) + { + t.invertNormal(); + } + m.DumpRaw(baseDir, primName, "Z extruded"); + + return m; + } public static void CalcNormals(Mesh mesh) { @@ -1065,6 +1166,14 @@ namespace OpenSim.Region.Physics.Meshing CalcNormals(mesh); } break; + case ProfileShape.HalfCircle: + if (primShape.PathCurve == (byte)Extrusion.Curve1) + { + mesh = CreateSphereMesh(primName, primShape, size); + CalcNormals(mesh); + } + break; + case ProfileShape.EquilateralTriangle: mesh = CreatePrismMesh(primName, primShape, size); CalcNormals(mesh); diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 33b9ce3017..9b8f4af0ee 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs @@ -1449,9 +1449,11 @@ namespace OpenSim.Region.Physics.OdePlugin if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight) return true; + 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)) + return true; if (pbs.ProfileShape == ProfileShape.EquilateralTriangle) - return true; + return true; return false; }