Committing more work towards implementing vertex normals. Also added some (hopefully) helpful messages for identifying corrupt prims and some fixup code for corrupt profile cut data.
parent
a351d3a22f
commit
138a3924e0
|
@ -1626,6 +1626,14 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
}
|
||||
}
|
||||
|
||||
private void ReportPrimError(string message, string primName, PrimMesh primMesh)
|
||||
{
|
||||
Console.WriteLine(message);
|
||||
Console.WriteLine("\nPrim Name: " + primName);
|
||||
Console.WriteLine("****** PrimMesh Parameters (Linear) ******\n" + primMesh.ParamsToDisplayString());
|
||||
|
||||
}
|
||||
|
||||
public Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod)
|
||||
{
|
||||
Mesh mesh = new Mesh();
|
||||
|
@ -1676,6 +1684,13 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
primMesh.twistEnd = primShape.PathTwist * 18 / 10;
|
||||
primMesh.taperX = pathScaleX;
|
||||
primMesh.taperY = pathScaleY;
|
||||
|
||||
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
|
||||
{
|
||||
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
|
||||
if (profileBegin < 0.0f) profileBegin = 0.0f;
|
||||
if (profileEnd > 1.0f) profileEnd = 1.0f;
|
||||
}
|
||||
#if SPAM
|
||||
Console.WriteLine("****** PrimMesh Parameters (Linear) ******\n" + primMesh.ParamsToDisplayString());
|
||||
#endif
|
||||
|
@ -1685,9 +1700,7 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Extrusion failure: exception: " + ex.ToString());
|
||||
Console.WriteLine("\n Prim Name: " + primName);
|
||||
Console.WriteLine("****** PrimMesh Parameters (Linear) ******\n" + primMesh.ParamsToDisplayString());
|
||||
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -1702,6 +1715,13 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
primMesh.twistEnd = primShape.PathTwist * 36 / 10;
|
||||
primMesh.taperX = primShape.PathTaperX * 0.01f;
|
||||
primMesh.taperY = primShape.PathTaperY * 0.01f;
|
||||
|
||||
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
|
||||
{
|
||||
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
|
||||
if (profileBegin < 0.0f) profileBegin = 0.0f;
|
||||
if (profileEnd > 1.0f) profileEnd = 1.0f;
|
||||
}
|
||||
#if SPAM
|
||||
Console.WriteLine("****** PrimMesh Parameters (Circular) ******\n" + primMesh.ParamsToDisplayString());
|
||||
#endif
|
||||
|
@ -1711,9 +1731,7 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Extrusion failure: exception: " + ex.ToString());
|
||||
Console.WriteLine("\n Prim Name: " + primName);
|
||||
Console.WriteLine("****** PrimMesh Parameters (Circular) ******\n" + primMesh.ParamsToDisplayString());
|
||||
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -415,7 +415,7 @@ namespace PrimMesher
|
|||
|
||||
internal List<Coord> coords;
|
||||
internal List<Face> faces;
|
||||
internal List<Coord> normals;
|
||||
internal List<Coord> edgeNormals;
|
||||
|
||||
internal bool calcVertexNormals = false;
|
||||
|
||||
|
@ -423,7 +423,7 @@ namespace PrimMesher
|
|||
{
|
||||
this.coords = new List<Coord>();
|
||||
this.faces = new List<Face>();
|
||||
this.normals = new List<Coord>();
|
||||
this.edgeNormals = new List<Coord>();
|
||||
}
|
||||
|
||||
public Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces, bool calcVertexNormals)
|
||||
|
@ -431,9 +431,14 @@ namespace PrimMesher
|
|||
this.calcVertexNormals = calcVertexNormals;
|
||||
this.coords = new List<Coord>();
|
||||
this.faces = new List<Face>();
|
||||
this.normals = new List<Coord>();
|
||||
this.edgeNormals = new List<Coord>();
|
||||
Coord center = new Coord(0.0f, 0.0f, 0.0f);
|
||||
|
||||
List<Coord> hollowCoords = new List<Coord>();
|
||||
List<Coord> hollowNormals = new List<Coord>();
|
||||
|
||||
bool hasHollow = (hollow > 0.0f);
|
||||
bool hasProfileCut = (profileStart > 0.0f || profileEnd < 1.0f);
|
||||
|
||||
AngleList angles = new AngleList();
|
||||
AngleList hollowAngles = new AngleList();
|
||||
|
@ -458,25 +463,10 @@ namespace PrimMesher
|
|||
return;
|
||||
}
|
||||
|
||||
bool simpleFace = false; // flag to create as few triangles as possible for 3 or 4 side profile
|
||||
if (sides < 5 && hollow == 0.0f && profileStart == 0.0f && profileEnd == 1.0f)
|
||||
simpleFace = true;
|
||||
// flag to create as few triangles as possible for 3 or 4 side profile
|
||||
bool simpleFace = (sides < 5 && !(hasHollow || hasProfileCut));
|
||||
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
if (sides > 4)
|
||||
foreach (Angle a in angles.angles)
|
||||
normals.Add(new Coord(a.X, a.Y, 0.0f));
|
||||
else
|
||||
for (int i = 0; i < angles.angles.Count - 1; i++)
|
||||
{
|
||||
Angle a1 = angles.angles[i];
|
||||
Angle a2 = angles.angles[i + 1];
|
||||
normals.Add(new Coord(0.5f * (a1.X + a2.X), 0.5f * (a1.Y + a2.Y), 0.0f).Normalize());
|
||||
}
|
||||
}
|
||||
|
||||
if (hollow > 0.001f)
|
||||
if (hasHollow)
|
||||
{
|
||||
if (sides == hollowSides)
|
||||
hollowAngles = angles;
|
||||
|
@ -490,33 +480,19 @@ namespace PrimMesher
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
if (hollowSides > 4)
|
||||
foreach (Angle a in hollowAngles.angles)
|
||||
normals.Add(new Coord(-a.X, -a.Y, 0.0f));
|
||||
else
|
||||
for (int i = 0; i < hollowAngles.angles.Count - 1; i++)
|
||||
{
|
||||
Angle a1 = hollowAngles.angles[i];
|
||||
Angle a2 = hollowAngles.angles[i + 1];
|
||||
normals.Add(new Coord(-0.5f * (a1.X + a2.X), -0.5f * (a1.Y + a2.Y), 0.0f).Normalize());
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!simpleFace)
|
||||
{
|
||||
this.coords.Add(center);
|
||||
if (this.calcVertexNormals && sides > 4)
|
||||
this.normals.Add(new Coord(0.0f, 0.0f, 1.0f));
|
||||
this.edgeNormals.Add(new Coord(0.0f, 0.0f, 1.0f));
|
||||
}
|
||||
|
||||
float z = 0.0f;
|
||||
|
||||
Angle angle;
|
||||
Coord newVert = new Coord();
|
||||
if (hollow > 0.001f && hollowSides != sides)
|
||||
if (hasHollow && hollowSides != sides)
|
||||
{
|
||||
int numHollowAngles = hollowAngles.angles.Count;
|
||||
for (int i = 0; i < numHollowAngles; i++)
|
||||
|
@ -527,6 +503,8 @@ namespace PrimMesher
|
|||
newVert.Z = z;
|
||||
|
||||
hollowCoords.Add(newVert);
|
||||
if (this.calcVertexNormals)
|
||||
hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -539,6 +517,8 @@ namespace PrimMesher
|
|||
newVert.Y = angle.Y * yScale;
|
||||
newVert.Z = z;
|
||||
this.coords.Add(newVert);
|
||||
if (this.calcVertexNormals)
|
||||
this.edgeNormals.Add(new Coord(angle.X, angle.Y, 0.0f));
|
||||
|
||||
if (hollow > 0.0f)
|
||||
{
|
||||
|
@ -548,6 +528,8 @@ namespace PrimMesher
|
|||
newVert.Y *= hollow;
|
||||
newVert.Z = z;
|
||||
hollowCoords.Add(newVert);
|
||||
if (this.calcVertexNormals)
|
||||
hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
|
||||
}
|
||||
}
|
||||
else if (!simpleFace && createFaces && angle.angle > 0.0001f)
|
||||
|
@ -556,14 +538,22 @@ namespace PrimMesher
|
|||
newFace.v1 = 0;
|
||||
newFace.v2 = index;
|
||||
newFace.v3 = index + 1;
|
||||
//if (this.calcVertexNormals)
|
||||
//{
|
||||
// newFace.n1 = newFace.v1;
|
||||
// newFace.n2 = newFace.v2;
|
||||
// newFace.n3 = newFace.v3;
|
||||
//}
|
||||
this.faces.Add(newFace);
|
||||
}
|
||||
index += 1;
|
||||
}
|
||||
|
||||
if (hollow > 0.0f)
|
||||
if (hasHollow)
|
||||
{
|
||||
hollowCoords.Reverse();
|
||||
if (this.calcVertexNormals)
|
||||
hollowNormals.Reverse();
|
||||
|
||||
if (createFaces)
|
||||
{
|
||||
|
@ -580,11 +570,23 @@ namespace PrimMesher
|
|||
newFace.v1 = coordIndex;
|
||||
newFace.v2 = coordIndex + 1;
|
||||
newFace.v3 = numTotalVerts - coordIndex - 1;
|
||||
//if (this.calcVertexNormals)
|
||||
//{
|
||||
// newFace.n1 = newFace.v1;
|
||||
// newFace.n2 = newFace.v2;
|
||||
// newFace.n3 = newFace.v3;
|
||||
//}
|
||||
this.faces.Add(newFace);
|
||||
|
||||
newFace.v1 = coordIndex + 1;
|
||||
newFace.v2 = numTotalVerts - coordIndex - 2;
|
||||
newFace.v3 = numTotalVerts - coordIndex - 1;
|
||||
//if (this.calcVertexNormals)
|
||||
//{
|
||||
// newFace.n1 = newFace.v1;
|
||||
// newFace.n2 = newFace.v2;
|
||||
// newFace.n3 = newFace.v3;
|
||||
//}
|
||||
this.faces.Add(newFace);
|
||||
}
|
||||
}
|
||||
|
@ -603,6 +605,12 @@ namespace PrimMesher
|
|||
newFace.v1 = numTotalVerts - i - 1;
|
||||
newFace.v2 = j;
|
||||
newFace.v3 = j + 1;
|
||||
//if (this.calcVertexNormals)
|
||||
//{
|
||||
// newFace.n1 = newFace.v1;
|
||||
// newFace.n2 = newFace.v2;
|
||||
// newFace.n3 = newFace.v3;
|
||||
//}
|
||||
|
||||
this.faces.Add(newFace);
|
||||
j += 1;
|
||||
|
@ -611,6 +619,12 @@ namespace PrimMesher
|
|||
newFace.v1 = j;
|
||||
newFace.v2 = numTotalVerts - i - 2;
|
||||
newFace.v3 = numTotalVerts - i - 1;
|
||||
//if (this.calcVertexNormals)
|
||||
//{
|
||||
// newFace.n1 = newFace.v1;
|
||||
// newFace.n2 = newFace.v2;
|
||||
// newFace.n3 = newFace.v3;
|
||||
//}
|
||||
|
||||
this.faces.Add(newFace);
|
||||
}
|
||||
|
@ -628,6 +642,12 @@ namespace PrimMesher
|
|||
newFace.v1 = i;
|
||||
newFace.v2 = numTotalVerts - j - 2;
|
||||
newFace.v3 = numTotalVerts - j - 1;
|
||||
//if (this.calcVertexNormals)
|
||||
//{
|
||||
// newFace.n1 = newFace.v1;
|
||||
// newFace.n2 = newFace.v2;
|
||||
// newFace.n3 = newFace.v3;
|
||||
//}
|
||||
|
||||
this.faces.Add(newFace);
|
||||
j += 1;
|
||||
|
@ -636,6 +656,12 @@ namespace PrimMesher
|
|||
newFace.v1 = numTotalVerts - j - 1;
|
||||
newFace.v2 = i;
|
||||
newFace.v3 = i + 1;
|
||||
//if (this.calcVertexNormals)
|
||||
//{
|
||||
// newFace.n1 = newFace.v1;
|
||||
// newFace.n2 = newFace.v2;
|
||||
// newFace.n3 = newFace.v3;
|
||||
//}
|
||||
|
||||
this.faces.Add(newFace);
|
||||
}
|
||||
|
@ -644,6 +670,11 @@ namespace PrimMesher
|
|||
}
|
||||
|
||||
this.coords.AddRange(hollowCoords);
|
||||
if (this.calcVertexNormals)
|
||||
this.edgeNormals.AddRange(hollowNormals);
|
||||
|
||||
hollowCoords = null;
|
||||
hollowNormals = null;
|
||||
}
|
||||
|
||||
if (simpleFace && createFaces)
|
||||
|
@ -671,7 +702,7 @@ namespace PrimMesher
|
|||
clone.coords.AddRange(this.coords);
|
||||
if (needFaces)
|
||||
clone.faces.AddRange(this.faces);
|
||||
clone.normals.AddRange(this.normals);
|
||||
clone.edgeNormals.AddRange(this.edgeNormals);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
@ -714,16 +745,16 @@ namespace PrimMesher
|
|||
this.coords[i] = c;
|
||||
}
|
||||
|
||||
int numNormals = this.normals.Count;
|
||||
int numNormals = this.edgeNormals.Count;
|
||||
for (i = 0; i < numNormals; i++)
|
||||
{
|
||||
c = this.normals[i];
|
||||
c = this.edgeNormals[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.normals[i] = c;
|
||||
this.edgeNormals[i] = c;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -763,12 +794,12 @@ namespace PrimMesher
|
|||
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
int normalCount = this.normals.Count;
|
||||
int normalCount = this.edgeNormals.Count;
|
||||
if (normalCount > 0)
|
||||
{
|
||||
Coord n = this.normals[normalCount - 1];
|
||||
n.Z *= 1.0f;
|
||||
this.normals[normalCount - 1] = n;
|
||||
Coord n = this.edgeNormals[normalCount - 1];
|
||||
n.Z = -n.Z;
|
||||
this.edgeNormals[normalCount - 1] = n;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -858,6 +889,9 @@ namespace PrimMesher
|
|||
public int stepsPerRevolution = 24;
|
||||
|
||||
public bool calcVertexNormals = false;
|
||||
private bool normalsProcessed = false;
|
||||
|
||||
private List<Coord> edgeNormals;
|
||||
|
||||
public string ParamsToDisplayString()
|
||||
{
|
||||
|
@ -922,10 +956,16 @@ namespace PrimMesher
|
|||
this.coords = new List<Coord>();
|
||||
this.faces = new List<Face>();
|
||||
|
||||
if (this.calcVertexNormals)
|
||||
this.normals = new List<Coord>();
|
||||
|
||||
int step = 0;
|
||||
int steps = 1;
|
||||
|
||||
float length = this.pathCutEnd - this.pathCutBegin;
|
||||
normalsProcessed = false;
|
||||
if (this.calcVertexNormals)
|
||||
this.edgeNormals = new List<Coord>();
|
||||
|
||||
#if VIEWER
|
||||
if (this.sides == 3)
|
||||
|
@ -1026,6 +1066,12 @@ namespace PrimMesher
|
|||
|
||||
this.coords.AddRange(newLayer.coords);
|
||||
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
newLayer.AddValue2FaceNormalIndices(this.normals.Count);
|
||||
this.normals.AddRange(newLayer.edgeNormals);
|
||||
}
|
||||
|
||||
if (percentOfPath <= this.pathCutBegin || percentOfPath >= this.pathCutEnd)
|
||||
this.faces.AddRange(newLayer.faces);
|
||||
|
||||
|
@ -1047,10 +1093,21 @@ namespace PrimMesher
|
|||
newFace.v1 = i;
|
||||
newFace.v2 = i - numVerts;
|
||||
newFace.v3 = i - numVerts + 1;
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
newFace.n1 = newFace.v1;
|
||||
newFace.n2 = newFace.v2;
|
||||
newFace.n3 = newFace.v3;
|
||||
}
|
||||
this.faces.Add(newFace);
|
||||
|
||||
newFace.v2 = i - numVerts + 1;
|
||||
newFace.v3 = i + 1;
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
newFace.n2 = newFace.v2;
|
||||
newFace.n3 = newFace.v3;
|
||||
}
|
||||
this.faces.Add(newFace);
|
||||
}
|
||||
|
||||
|
@ -1059,11 +1116,25 @@ namespace PrimMesher
|
|||
newFace.v1 = coordsLen - 1;
|
||||
newFace.v2 = coordsLen - numVerts;
|
||||
newFace.v3 = coordsLen;
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
Coord n1 = SurfaceNormal(newFace);
|
||||
this.normals.Add(n1);
|
||||
|
||||
newFace.n1 = newFace.n2 = newFace.n3 = this.normals.Count - 1;
|
||||
}
|
||||
this.faces.Add(newFace);
|
||||
|
||||
newFace.v1 = coordsLen + numVerts - 1;
|
||||
newFace.v2 = coordsLen - 1;
|
||||
newFace.v3 = coordsLen;
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
Coord n1 = SurfaceNormal(newFace);
|
||||
this.normals.Add(n1);
|
||||
|
||||
newFace.n1 = newFace.n2 = newFace.n3 = this.normals.Count - 1;
|
||||
}
|
||||
this.faces.Add(newFace);
|
||||
}
|
||||
|
||||
|
@ -1084,8 +1155,8 @@ namespace PrimMesher
|
|||
else done = true;
|
||||
}
|
||||
|
||||
if (calcVertexNormals && sides < 5 && twistBegin == 0.0f && twistEnd == 0.0f)
|
||||
this.CalcNormals();
|
||||
//if (calcVertexNormals && sides < 5 && twistBegin == 0.0f && twistEnd == 0.0f)
|
||||
// this.CalcNormals();
|
||||
}
|
||||
|
||||
public void ExtrudeCircular()
|
||||
|
@ -1093,9 +1164,14 @@ namespace PrimMesher
|
|||
this.coords = new List<Coord>();
|
||||
this.faces = new List<Face>();
|
||||
|
||||
if (this.calcVertexNormals)
|
||||
this.normals = new List<Coord>();
|
||||
|
||||
int step = 0;
|
||||
int steps = 24;
|
||||
|
||||
normalsProcessed = false;
|
||||
|
||||
float twistBegin = this.twistBegin / 360.0f * twoPi;
|
||||
float twistEnd = this.twistEnd / 360.0f * twoPi;
|
||||
float twistTotal = twistEnd - twistBegin;
|
||||
|
@ -1248,6 +1324,12 @@ namespace PrimMesher
|
|||
|
||||
this.coords.AddRange(newLayer.coords);
|
||||
|
||||
if (this.calcVertexNormals)
|
||||
{
|
||||
newLayer.AddValue2FaceNormalIndices(this.normals.Count);
|
||||
this.normals.AddRange(newLayer.edgeNormals);
|
||||
}
|
||||
|
||||
if (isEndLayer)
|
||||
this.faces.AddRange(newLayer.faces);
|
||||
|
||||
|
@ -1305,15 +1387,8 @@ namespace PrimMesher
|
|||
}
|
||||
}
|
||||
|
||||
public Coord SurfaceNormal(int faceIndex)
|
||||
private Coord SurfaceNormal(Face face)
|
||||
{
|
||||
int numFaces = faces.Count;
|
||||
if (faceIndex < 0 || faceIndex >= faces.Count)
|
||||
throw new Exception("faceIndex out of range");
|
||||
|
||||
//return new Coord(0.0f, 0.0f, 0.0f);
|
||||
|
||||
Face face = faces[faceIndex];
|
||||
Coord c1 = coords[face.v1];
|
||||
Coord c2 = coords[face.v2];
|
||||
Coord c3 = coords[face.v3];
|
||||
|
@ -1328,10 +1403,28 @@ namespace PrimMesher
|
|||
return normal;
|
||||
}
|
||||
|
||||
public void CalcNormals()
|
||||
public Coord SurfaceNormal(int faceIndex)
|
||||
{
|
||||
int numFaces = faces.Count;
|
||||
this.normals = new List<Coord>();
|
||||
if (faceIndex < 0 || faceIndex >= faces.Count)
|
||||
throw new Exception("faceIndex out of range");
|
||||
|
||||
//return new Coord(0.0f, 0.0f, 0.0f);
|
||||
|
||||
return SurfaceNormal(faces[faceIndex]);
|
||||
}
|
||||
|
||||
public void CalcNormals()
|
||||
{
|
||||
if (normalsProcessed)
|
||||
return;
|
||||
|
||||
normalsProcessed = true;
|
||||
|
||||
int numFaces = faces.Count;
|
||||
|
||||
if (!this.calcVertexNormals)
|
||||
this.normals = new List<Coord>();
|
||||
|
||||
for (int i = 0; i < numFaces; i++)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue