From a11fa9055ac58445114cec051c95db2a576c9631 Mon Sep 17 00:00:00 2001 From: Dahlia Trimble Date: Fri, 24 Oct 2008 05:31:43 +0000 Subject: Fixed a floating point error accumulation that was causing missing end faces on some twisted prims --- OpenSim/Region/Physics/Meshing/PrimMesher.cs | 102 ++++++++++++++++++--------- 1 file changed, 68 insertions(+), 34 deletions(-) diff --git a/OpenSim/Region/Physics/Meshing/PrimMesher.cs b/OpenSim/Region/Physics/Meshing/PrimMesher.cs index 527bf88..df1d932 100644 --- a/OpenSim/Region/Physics/Meshing/PrimMesher.cs +++ b/OpenSim/Region/Physics/Meshing/PrimMesher.cs @@ -96,6 +96,11 @@ namespace PrimMesher return this; } + + public override string ToString() + { + return "< X: " + this.X.ToString() + ", Y: " + this.Y.ToString() + ", Z: " + this.Z.ToString() + ", W: " + this.W.ToString() + ">"; + } } public struct Coord @@ -153,6 +158,16 @@ namespace PrimMesher ); } + public static Coord operator +(Coord v, Coord a) + { + return new Coord(v.X + a.X, v.Y + a.Y, v.Z + a.Z); + } + + public static Coord operator *(Coord v, Coord m) + { + return new Coord(v.X * m.X, v.Y * m.Y, v.Z * m.Z); + } + public static Coord operator *(Coord v, Quat q) { // From http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/transforms/ @@ -895,36 +910,20 @@ namespace PrimMesher { int i; int numVerts = this.coords.Count; - Coord c; for (i = 0; i < numVerts; i++) - { - c = this.coords[i]; - Coord v = new Coord(c.X, c.Y, c.Z) * q; - - c.X = v.X; - c.Y = v.Y; - c.Z = v.Z; - this.coords[i] = c; - } + this.coords[i] *= q; if (this.calcVertexNormals) { int numNormals = this.vertexNormals.Count; for (i = 0; i < numNormals; i++) - { - c = this.vertexNormals[i]; - Coord n = new Coord(c.X, c.Y, c.Z) * q; - - c.X = n.X; - c.Y = n.Y; - c.Z = n.Z; - this.vertexNormals[i] = c; - } + this.vertexNormals[i] *= q; this.faceNormal *= q; this.cutNormal1 *= q; this.cutNormal2 *= q; + } } @@ -1298,7 +1297,7 @@ namespace PrimMesher this.normals.AddRange(newLayer.vertexNormals); } - if (percentOfPath <= this.pathCutBegin || percentOfPath >= this.pathCutEnd) + if (percentOfPath < this.pathCutBegin + 0.01f || percentOfPath > this.pathCutEnd - 0.01f) this.faces.AddRange(newLayer.faces); // fill faces between layers @@ -1485,7 +1484,7 @@ namespace PrimMesher if (done && viewerMode) { - // add the bottom faces to the viewerFaces list here + // add the top faces to the viewerFaces list here Coord faceNormal = newLayer.faceNormal; ViewerFace newViewerFace = new ViewerFace(); newViewerFace.primFaceNumber = 0; @@ -2023,36 +2022,71 @@ namespace PrimMesher public void AddRot(Quat q) { + Console.WriteLine("AddRot(" + q.ToString() + ")"); int i; int numVerts = this.coords.Count; - Coord vert; for (i = 0; i < numVerts; i++) + this.coords[i] *= q; + + if (this.normals != null) { - vert = this.coords[i]; - Coord v = new Coord(vert.X, vert.Y, vert.Z) * q; + int numNormals = this.normals.Count; + for (i = 0; i < numNormals; i++) + this.normals[i] *= q; + } - vert.X = v.X; - vert.Y = v.Y; - vert.Z = v.Z; - this.coords[i] = vert; + if (this.viewerFaces != null) + { + int numViewerFaces = this.viewerFaces.Count; + + for (i = 0; i < numViewerFaces; i++) + { + ViewerFace v = this.viewerFaces[i]; + v.v1 *= q; + v.v2 *= q; + v.v3 *= q; + + v.n1 *= q; + v.n2 *= q; + v.n3 *= q; + this.viewerFaces[i] = v; + } } + } public void Scale(float x, float y, float z) { int i; int numVerts = this.coords.Count; - Coord vert; + //Coord vert; + Coord m = new Coord(x, y, z); for (i = 0; i < numVerts; i++) + this.coords[i] *= m; + //{ + // vert = this.coords[i]; + // vert.X *= x; + // vert.Y *= y; + // vert.Z *= z; + // this.coords[i] = vert; + //} + + if (this.viewerFaces != null) { - vert = this.coords[i]; - vert.X *= x; - vert.Y *= y; - vert.Z *= z; - this.coords[i] = vert; + int numViewerFaces = this.viewerFaces.Count; + for (i = 0; i < numViewerFaces; i++) + { + ViewerFace v = this.viewerFaces[i]; + v.v1 *= m; + v.v2 *= m; + v.v3 *= m; + this.viewerFaces[i] = v; + } + } + } public void DumpRaw(String path, String name, String title) -- cgit v1.1