some sorely needed extruder code simplification and refactoring, also some fixes to cut face UV coordinates

0.6.0-stable
Dahlia Trimble 2008-10-28 08:57:15 +00:00
parent 1342e89a8f
commit ae5d92a167
1 changed files with 50 additions and 138 deletions

View File

@ -339,12 +339,6 @@ namespace PrimMesher
Coord edge1 = new Coord(this.n2.X - this.n1.X, this.n2.Y - this.n1.Y, this.n2.Z - this.n1.Z);
Coord edge2 = new Coord(this.n3.X - this.n1.X, this.n3.Y - this.n1.Y, this.n3.Z - this.n1.Z);
//Coord normal = Coord.Cross(edge1, edge2).Normalize();
//this.n1 = normal;
//this.n2 = normal;
//this.n3 = normal;
this.n1 = this.n2 = this.n3 = Coord.Cross(edge1, edge2).Normalize();
}
}
@ -573,7 +567,6 @@ namespace PrimMesher
List<Coord> hollowNormals = new List<Coord>();
List<float> hollowUs = new List<float>();
//Quat rot180 = new Quat(new Coord(0.0f, 0.0f, 1.0f), (float)Math.PI); ;
bool hasHollow = (hollow > 0.0f);
bool hasProfileCut = (profileStart > 0.0f || profileEnd < 1.0f);
@ -591,7 +584,6 @@ namespace PrimMesher
float startAngle = profileStart * twoPi;
float stopAngle = profileEnd * twoPi;
// float stepSize = twoPi / sides;
try { angles.makeAngles(sides, startAngle, stopAngle); }
catch (Exception ex)
@ -625,8 +617,9 @@ namespace PrimMesher
else if (!simpleFace)
{
this.coords.Add(center);
if (this.calcVertexNormals)// && sides > 4)
if (this.calcVertexNormals)
this.vertexNormals.Add(new Coord(0.0f, 0.0f, 1.0f));
this.us.Add(0.0f);
}
float z = 0.0f;
@ -646,9 +639,6 @@ namespace PrimMesher
hollowCoords.Add(newVert);
if (this.calcVertexNormals)
{
//Coord hollowNormal = new Coord(angle.X, angle.Y, 0.0f);
//hollowNormal *= rot180;
//hollowNormals.Add(hollowNormal);
hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
hollowUs.Add(angle.angle);
}
@ -658,8 +648,6 @@ namespace PrimMesher
int index = 0;
int numAngles = angles.angles.Count;
//float sideIncrement = 1.0f / (float)sides;
for (int i = 0; i < numAngles; i++)
{
angle = angles.angles[i];
@ -673,8 +661,6 @@ namespace PrimMesher
if (sides < 5)
{
float u = angle.angle;
//u %= sideIncrement;
//u *= sides;
this.us.Add(u);
}
else
@ -691,9 +677,6 @@ namespace PrimMesher
hollowCoords.Add(newVert);
if (this.calcVertexNormals)
{
//Coord hollowNormal = new Coord(angle.X, angle.Y, 0.0f);
//hollowNormal *= rot180;
//hollowNormals.Add(hollowNormal);
hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
hollowUs.Add(angle.angle);
}
@ -976,16 +959,11 @@ namespace PrimMesher
this.faceNormal.Y = -this.faceNormal.Y;
this.faceNormal.Z = -this.faceNormal.Z;
//int numUs = this.us.Count;
//for (int i = 0; i < numUs; i++)
// this.us[i]
int numfaceUVs = this.faceUVs.Count;
for (i = 0; i < numfaceUVs; i++)
{
UVCoord uv = this.faceUVs[i];
uv.U = 1.0f - uv.U;
//uv.V = 1.0f - uv.V;
this.faceUVs[i] = uv;
}
}
@ -1077,6 +1055,7 @@ namespace PrimMesher
public int stepsPerRevolution = 24;
private bool hasProfileCut = false;
private bool hasHollow = false;
public bool calcVertexNormals = false;
private bool normalsProcessed = false;
public bool viewerMode = false;
@ -1139,6 +1118,7 @@ namespace PrimMesher
this.hollow = 0.0f;
this.hasProfileCut = (this.profileStart > 0.0f || this.profileEnd < 1.0f);
this.hasHollow = (this.hollow > 0.001f);
}
public void ExtrudeLinear()
@ -1216,6 +1196,14 @@ namespace PrimMesher
Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, true, calcVertexNormals);
int cut1Vert = -1;
int cut2Vert = -1;
if (hasProfileCut)
{
cut1Vert = hasHollow ? profile.coords.Count - 1 : 0;
cut2Vert = hasHollow ? profile.numOuterVerts - 1 : profile.numOuterVerts;
}
if (initialProfileRot != 0.0f)
{
profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot));
@ -1308,22 +1296,26 @@ namespace PrimMesher
if (step > 0)
{
int startVert = coordsLen + 1;
int endVert = this.coords.Count - 1;
int endVert = this.coords.Count;
if (sides < 5 || this.hasProfileCut || hollow > 0.0f)
startVert--;
for (int i = startVert; i < endVert; i++)
{
int iNext = i + 1;
if (i == endVert - 1)
iNext = startVert;
int whichVert = i - startVert;
newFace.v1 = i;
newFace.v2 = i - numVerts;
newFace.v3 = i - numVerts + 1;
newFace.v3 = iNext - numVerts;
this.faces.Add(newFace);
newFace.v2 = i - numVerts + 1;
newFace.v3 = i + 1;
newFace.v2 = iNext - numVerts;
newFace.v3 = iNext;
this.faces.Add(newFace);
if (this.viewerMode)
@ -1346,12 +1338,16 @@ namespace PrimMesher
u2 -= whichVert;
if (u2 < 0.1f)
u2 = 1.0f;
//u1 = 0.0f;
//u2 = 1.0f;
newViewerFace2.primFaceNumber = newViewerFace1.primFaceNumber = whichVert + 1;
}
if (whichVert == cut1Vert || whichVert == cut2Vert)
{
u1 = 0.0f;
u2 = 1.0f;
}
newViewerFace1.uv1.U = u1;
newViewerFace1.uv2.U = u1;
newViewerFace1.uv3.U = u2;
@ -1370,13 +1366,13 @@ namespace PrimMesher
newViewerFace1.v1 = this.coords[i];
newViewerFace1.v2 = this.coords[i - numVerts];
newViewerFace1.v3 = this.coords[i - numVerts + 1];
newViewerFace1.v3 = this.coords[iNext - numVerts];
newViewerFace2.v1 = this.coords[i];
newViewerFace2.v2 = this.coords[i - numVerts + 1];
newViewerFace2.v3 = this.coords[i + 1];
newViewerFace2.v2 = this.coords[iNext - numVerts];
newViewerFace2.v3 = this.coords[iNext];
if (whichVert == newLayer.numOuterVerts - 1 && hasProfileCut)
if (whichVert == cut1Vert)
{ // start profile cut faces
newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal1;
@ -1397,11 +1393,11 @@ namespace PrimMesher
{
newViewerFace1.n1 = this.normals[i];
newViewerFace1.n2 = this.normals[i - numVerts];
newViewerFace1.n3 = this.normals[i - numVerts + 1];
newViewerFace1.n3 = this.normals[iNext - numVerts];
newViewerFace2.n1 = this.normals[i];
newViewerFace2.n2 = this.normals[i - numVerts + 1];
newViewerFace2.n3 = this.normals[i + 1];
newViewerFace2.n2 = this.normals[iNext - numVerts];
newViewerFace2.n3 = this.normals[iNext];
}
}
@ -1413,7 +1409,7 @@ namespace PrimMesher
if (this.hasProfileCut)
{ // add the end cut face to the list of viewerFaces here
// the first cut face was filled in the above loop
// the prior cut face was filled in the above loop
newFace.v1 = coordsLen - 1;
newFace.v2 = coordsLen - numVerts;
newFace.v3 = coordsLen;
@ -1423,43 +1419,6 @@ namespace PrimMesher
newFace.v2 = coordsLen - 1;
newFace.v3 = coordsLen;
this.faces.Add(newFace);
if (this.viewerMode)
{
ViewerFace newViewerFace = new ViewerFace();
newViewerFace.v1 = this.coords[coordsLen - 1]; // last vert in prior layer
newViewerFace.v2 = this.coords[coordsLen - numVerts]; // first vert in prior layer
newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
float u1 = newLayer.us[0];
float u2 = newLayer.us[newLayer.us.Count - 1];
newViewerFace.n2 = newViewerFace.n1 = lastCutNormal2;
newViewerFace.n3 = newLayer.cutNormal2;
newViewerFace.uv3.U = newViewerFace.uv1.U = u2;
newViewerFace.uv2.U = u1;
newViewerFace.uv1.V = newViewerFace.uv2.V = lastV;
newViewerFace.uv3.V = 1.0f - percentOfPath;
this.viewerFaces.Add(newViewerFace);
newViewerFace.v1 = this.coords[coordsLen + numVerts - 1]; // last vert in new layer
newViewerFace.v2 = this.coords[coordsLen - 1]; // last vert in prior layer
newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
newViewerFace.n3 = newViewerFace.n1 = newLayer.cutNormal2;
newViewerFace.n2 = lastCutNormal2;
newViewerFace.uv2.U = newViewerFace.uv1.U = u1;
newViewerFace.uv3.U = u2;
newViewerFace.uv3.V = newViewerFace.uv1.V = 1.0f - percentOfPath;
newViewerFace.uv2.V = lastV;
this.viewerFaces.Add(newViewerFace);
}
}
}
@ -1729,23 +1688,26 @@ namespace PrimMesher
if (step > firstStep)
{
int startVert = coordsLen + 1;
int endVert = this.coords.Count - 1;
int endVert = this.coords.Count;
if (sides < 5 || this.hasProfileCut || hollow > 0.0f)
startVert--;
for (int i = startVert; i < endVert; i++)
//for (int i = coordsLen; i < this.coords.Count - 1; i++)
{
int iNext = i + 1;
if (i == endVert - 1)
iNext = startVert;
int whichVert = i - startVert;
newFace.v1 = i;
newFace.v2 = i - numVerts;
newFace.v3 = i - numVerts + 1;
newFace.v3 = iNext - numVerts;
this.faces.Add(newFace);
newFace.v2 = i - numVerts + 1;
newFace.v3 = i + 1;
newFace.v2 = iNext - numVerts;
newFace.v3 = iNext;
this.faces.Add(newFace);
if (this.viewerMode)
@ -1776,11 +1738,11 @@ namespace PrimMesher
newViewerFace1.v1 = this.coords[i];
newViewerFace1.v2 = this.coords[i - numVerts];
newViewerFace1.v3 = this.coords[i - numVerts + 1];
newViewerFace1.v3 = this.coords[iNext - numVerts];
newViewerFace2.v1 = this.coords[i];
newViewerFace2.v2 = this.coords[i - numVerts + 1];
newViewerFace2.v3 = this.coords[i + 1];
newViewerFace2.v2 = this.coords[iNext - numVerts];
newViewerFace2.v3 = this.coords[iNext];
if (whichVert == newLayer.numOuterVerts - 1 && hasProfileCut)
{ // start profile cut faces
@ -1803,11 +1765,11 @@ namespace PrimMesher
{
newViewerFace1.n1 = this.normals[i];
newViewerFace1.n2 = this.normals[i - numVerts];
newViewerFace1.n3 = this.normals[i - numVerts + 1];
newViewerFace1.n3 = this.normals[iNext - numVerts];
newViewerFace2.n1 = this.normals[i];
newViewerFace2.n2 = this.normals[i - numVerts + 1];
newViewerFace2.n3 = this.normals[i + 1];
newViewerFace2.n2 = this.normals[iNext - numVerts];
newViewerFace2.n3 = this.normals[iNext];
}
}
@ -1816,57 +1778,6 @@ namespace PrimMesher
}
}
if (this.hasProfileCut)
{ // add the end cut face to the list of viewerFaces here
// the first cut face was filled in the above loop
newFace.v1 = coordsLen - 1;
newFace.v2 = coordsLen - numVerts;
newFace.v3 = coordsLen;
this.faces.Add(newFace);
newFace.v1 = coordsLen + numVerts - 1;
newFace.v2 = coordsLen - 1;
newFace.v3 = coordsLen;
this.faces.Add(newFace);
if (this.viewerMode)
{
ViewerFace newViewerFace = new ViewerFace();
newViewerFace.v1 = this.coords[coordsLen - 1]; // last vert in prior layer
newViewerFace.v2 = this.coords[coordsLen - numVerts]; // first vert in prior layer
newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
float u1 = newLayer.us[0];
float u2 = newLayer.us[newLayer.us.Count - 1];
newViewerFace.n2 = newViewerFace.n1 = lastCutNormal2;
newViewerFace.n3 = newLayer.cutNormal2;
newViewerFace.uv3.U = newViewerFace.uv1.U = u2;
newViewerFace.uv2.U = u1;
newViewerFace.uv1.V = newViewerFace.uv2.V = lastV;
newViewerFace.uv3.V = 1.0f - percentOfPath;
this.viewerFaces.Add(newViewerFace);
newViewerFace.v1 = this.coords[coordsLen + numVerts - 1]; // last vert in new layer
newViewerFace.v2 = this.coords[coordsLen - 1]; // last vert in prior layer
newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
newViewerFace.n3 = newViewerFace.n1 = newLayer.cutNormal2;
newViewerFace.n2 = lastCutNormal2;
newViewerFace.uv2.U = newViewerFace.uv1.U = u1;
newViewerFace.uv3.U = u2;
newViewerFace.uv3.V = newViewerFace.uv1.V = 1.0f - percentOfPath;
newViewerFace.uv2.V = lastV;
this.viewerFaces.Add(newViewerFace);
}
}
}
lastCutNormal1 = newLayer.cutNormal1;
@ -1930,7 +1841,8 @@ namespace PrimMesher
public Coord SurfaceNormal(int faceIndex)
{
if (faceIndex < 0 || faceIndex >= faces.Count)
int numFaces = faces.Count;
if (faceIndex < 0 || faceIndex >= numFaces)
throw new Exception("faceIndex out of range");
//return new Coord(0.0f, 0.0f, 0.0f);