some sorely needed extruder code simplification and refactoring, also some fixes to cut face UV coordinates
parent
1342e89a8f
commit
ae5d92a167
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue