aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/Meshing/PrimMesher.cs
diff options
context:
space:
mode:
authorDahlia Trimble2008-10-21 01:35:05 +0000
committerDahlia Trimble2008-10-21 01:35:05 +0000
commit931b04485d3856f111367b9f0d00c1bb7a62da99 (patch)
treed1ac99a24b67041152c4da7ba9fb045fbbe42378 /OpenSim/Region/Physics/Meshing/PrimMesher.cs
parentSet a default creation date on inventory and task inventory items (diff)
downloadopensim-SC-931b04485d3856f111367b9f0d00c1bb7a62da99.zip
opensim-SC-931b04485d3856f111367b9f0d00c1bb7a62da99.tar.gz
opensim-SC-931b04485d3856f111367b9f0d00c1bb7a62da99.tar.bz2
opensim-SC-931b04485d3856f111367b9f0d00c1bb7a62da99.tar.xz
More work in vertex normals and texture UVs. Syncing code with pyov.
Diffstat (limited to 'OpenSim/Region/Physics/Meshing/PrimMesher.cs')
-rw-r--r--OpenSim/Region/Physics/Meshing/PrimMesher.cs346
1 files changed, 328 insertions, 18 deletions
diff --git a/OpenSim/Region/Physics/Meshing/PrimMesher.cs b/OpenSim/Region/Physics/Meshing/PrimMesher.cs
index b36b5a8..527bf88 100644
--- a/OpenSim/Region/Physics/Meshing/PrimMesher.cs
+++ b/OpenSim/Region/Physics/Meshing/PrimMesher.cs
@@ -523,6 +523,9 @@ namespace PrimMesher
523 internal List<Coord> coords; 523 internal List<Coord> coords;
524 internal List<Face> faces; 524 internal List<Face> faces;
525 internal List<Coord> vertexNormals; 525 internal List<Coord> vertexNormals;
526 internal List<float> us;
527 internal List<UVCoord> faceUVs;
528
526 internal Coord faceNormal = new Coord(0.0f, 0.0f, 1.0f); 529 internal Coord faceNormal = new Coord(0.0f, 0.0f, 1.0f);
527 internal Coord cutNormal1 = new Coord(); 530 internal Coord cutNormal1 = new Coord();
528 internal Coord cutNormal2 = new Coord(); 531 internal Coord cutNormal2 = new Coord();
@@ -537,6 +540,8 @@ namespace PrimMesher
537 this.coords = new List<Coord>(); 540 this.coords = new List<Coord>();
538 this.faces = new List<Face>(); 541 this.faces = new List<Face>();
539 this.vertexNormals = new List<Coord>(); 542 this.vertexNormals = new List<Coord>();
543 this.us = new List<float>();
544 this.faceUVs = new List<UVCoord>();
540 } 545 }
541 546
542 public Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces, bool calcVertexNormals) 547 public Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces, bool calcVertexNormals)
@@ -545,10 +550,13 @@ namespace PrimMesher
545 this.coords = new List<Coord>(); 550 this.coords = new List<Coord>();
546 this.faces = new List<Face>(); 551 this.faces = new List<Face>();
547 this.vertexNormals = new List<Coord>(); 552 this.vertexNormals = new List<Coord>();
553 this.us = new List<float>();
554 this.faceUVs = new List<UVCoord>();
548 Coord center = new Coord(0.0f, 0.0f, 0.0f); 555 Coord center = new Coord(0.0f, 0.0f, 0.0f);
549 556
550 List<Coord> hollowCoords = new List<Coord>(); 557 List<Coord> hollowCoords = new List<Coord>();
551 List<Coord> hollowNormals = new List<Coord>(); 558 List<Coord> hollowNormals = new List<Coord>();
559 List<float> hollowUs = new List<float>();
552 560
553 //Quat rot180 = new Quat(new Coord(0.0f, 0.0f, 1.0f), (float)Math.PI); ; 561 //Quat rot180 = new Quat(new Coord(0.0f, 0.0f, 1.0f), (float)Math.PI); ;
554 bool hasHollow = (hollow > 0.0f); 562 bool hasHollow = (hollow > 0.0f);
@@ -627,6 +635,7 @@ namespace PrimMesher
627 //hollowNormal *= rot180; 635 //hollowNormal *= rot180;
628 //hollowNormals.Add(hollowNormal); 636 //hollowNormals.Add(hollowNormal);
629 hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f)); 637 hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
638 hollowUs.Add(angle.angle);
630 } 639 }
631 } 640 }
632 } 641 }
@@ -634,6 +643,8 @@ namespace PrimMesher
634 int index = 0; 643 int index = 0;
635 int numAngles = angles.angles.Count; 644 int numAngles = angles.angles.Count;
636 645
646 //float sideIncrement = 1.0f / (float)sides;
647
637 for (int i = 0; i < numAngles; i++) 648 for (int i = 0; i < numAngles; i++)
638 { 649 {
639 angle = angles.angles[i]; 650 angle = angles.angles[i];
@@ -642,7 +653,18 @@ namespace PrimMesher
642 newVert.Z = z; 653 newVert.Z = z;
643 this.coords.Add(newVert); 654 this.coords.Add(newVert);
644 if (this.calcVertexNormals) 655 if (this.calcVertexNormals)
656 {
645 this.vertexNormals.Add(new Coord(angle.X, angle.Y, 0.0f)); 657 this.vertexNormals.Add(new Coord(angle.X, angle.Y, 0.0f));
658 if (sides < 5)
659 {
660 float u = angle.angle;
661 //u %= sideIncrement;
662 //u *= sides;
663 this.us.Add(u);
664 }
665 else
666 this.us.Add(angle.angle);
667 }
646 668
647 if (hollow > 0.0f) 669 if (hollow > 0.0f)
648 { 670 {
@@ -658,6 +680,7 @@ namespace PrimMesher
658 //hollowNormal *= rot180; 680 //hollowNormal *= rot180;
659 //hollowNormals.Add(hollowNormal); 681 //hollowNormals.Add(hollowNormal);
660 hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f)); 682 hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
683 hollowUs.Add(angle.angle);
661 } 684 }
662 } 685 }
663 } 686 }
@@ -677,7 +700,10 @@ namespace PrimMesher
677 { 700 {
678 hollowCoords.Reverse(); 701 hollowCoords.Reverse();
679 if (this.calcVertexNormals) 702 if (this.calcVertexNormals)
703 {
680 hollowNormals.Reverse(); 704 hollowNormals.Reverse();
705 hollowUs.Reverse();
706 }
681 707
682 if (createFaces) 708 if (createFaces)
683 { 709 {
@@ -759,7 +785,11 @@ namespace PrimMesher
759 785
760 this.coords.AddRange(hollowCoords); 786 this.coords.AddRange(hollowCoords);
761 if (this.calcVertexNormals) 787 if (this.calcVertexNormals)
788 {
762 this.vertexNormals.AddRange(hollowNormals); 789 this.vertexNormals.AddRange(hollowNormals);
790 this.us.AddRange(hollowUs);
791
792 }
763 } 793 }
764 794
765 if (simpleFace && createFaces) 795 if (simpleFace && createFaces)
@@ -797,9 +827,19 @@ namespace PrimMesher
797 this.cutNormal2.Normalize(); 827 this.cutNormal2.Normalize();
798 } 828 }
799 829
830 this.MakeFaceUVs();
831
800 hollowCoords = null; 832 hollowCoords = null;
801 hollowNormals = null; 833 hollowNormals = null;
834 hollowUs = null;
835
836 }
802 837
838 public void MakeFaceUVs()
839 {
840 this.faceUVs = new List<UVCoord>();
841 foreach (Coord c in this.coords)
842 this.faceUVs.Add(new UVCoord(0.5f + c.X, 0.5f - c.Y));
803 } 843 }
804 844
805 public Profile Clone() 845 public Profile Clone()
@@ -812,6 +852,8 @@ namespace PrimMesher
812 Profile clone = new Profile(); 852 Profile clone = new Profile();
813 853
814 clone.coords.AddRange(this.coords); 854 clone.coords.AddRange(this.coords);
855 clone.faceUVs.AddRange(this.faceUVs);
856
815 if (needFaces) 857 if (needFaces)
816 clone.faces.AddRange(this.faces); 858 clone.faces.AddRange(this.faces);
817 if ((clone.calcVertexNormals = this.calcVertexNormals) == true) 859 if ((clone.calcVertexNormals = this.calcVertexNormals) == true)
@@ -820,6 +862,7 @@ namespace PrimMesher
820 clone.faceNormal = this.faceNormal; 862 clone.faceNormal = this.faceNormal;
821 clone.cutNormal1 = this.cutNormal1; 863 clone.cutNormal1 = this.cutNormal1;
822 clone.cutNormal2 = this.cutNormal2; 864 clone.cutNormal2 = this.cutNormal2;
865 clone.us.AddRange(this.us);
823 } 866 }
824 clone.numOuterVerts = this.numOuterVerts; 867 clone.numOuterVerts = this.numOuterVerts;
825 clone.numHollowVerts = this.numHollowVerts; 868 clone.numHollowVerts = this.numHollowVerts;
@@ -933,6 +976,19 @@ namespace PrimMesher
933 this.faceNormal.X = -this.faceNormal.X; 976 this.faceNormal.X = -this.faceNormal.X;
934 this.faceNormal.Y = -this.faceNormal.Y; 977 this.faceNormal.Y = -this.faceNormal.Y;
935 this.faceNormal.Z = -this.faceNormal.Z; 978 this.faceNormal.Z = -this.faceNormal.Z;
979
980 int numUs = this.us.Count;
981 //for (int i = 0; i < numUs; i++)
982 // this.us[i]
983
984 int numfaceUVs = this.faceUVs.Count;
985 for (i = 0; i < numfaceUVs; i++)
986 {
987 UVCoord uv = this.faceUVs[i];
988 uv.U = 1.0f - uv.U;
989 //uv.V = 1.0f - uv.V;
990 this.faceUVs[i] = uv;
991 }
936 } 992 }
937 993
938 public void AddValue2FaceVertexIndices(int num) 994 public void AddValue2FaceVertexIndices(int num)
@@ -1162,10 +1218,16 @@ namespace PrimMesher
1162 Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, true, calcVertexNormals); 1218 Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, true, calcVertexNormals);
1163 1219
1164 if (initialProfileRot != 0.0f) 1220 if (initialProfileRot != 0.0f)
1221 {
1165 profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot)); 1222 profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot));
1223 if (viewerMode)
1224 profile.MakeFaceUVs();
1225 }
1226
1166 1227
1167 Coord lastCutNormal1 = new Coord(); 1228 Coord lastCutNormal1 = new Coord();
1168 Coord lastCutNormal2 = new Coord(); 1229 Coord lastCutNormal2 = new Coord();
1230 float lastV = 1.0f;
1169 1231
1170 bool done = false; 1232 bool done = false;
1171 while (!done) 1233 while (!done)
@@ -1213,6 +1275,10 @@ namespace PrimMesher
1213 newViewerFace.n2 = faceNormal; 1275 newViewerFace.n2 = faceNormal;
1214 newViewerFace.n3 = faceNormal; 1276 newViewerFace.n3 = faceNormal;
1215 1277
1278 newViewerFace.uv1 = newLayer.faceUVs[face.v1];
1279 newViewerFace.uv2 = newLayer.faceUVs[face.v2];
1280 newViewerFace.uv3 = newLayer.faceUVs[face.v3];
1281
1216 this.viewerFaces.Add(newViewerFace); 1282 this.viewerFaces.Add(newViewerFace);
1217 } 1283 }
1218 1284
@@ -1264,8 +1330,44 @@ namespace PrimMesher
1264 if (this.viewerMode) 1330 if (this.viewerMode)
1265 { 1331 {
1266 // add the side faces to the list of viewerFaces here 1332 // add the side faces to the list of viewerFaces here
1267 ViewerFace newViewerFace1 = new ViewerFace(); 1333 int primFaceNum = 1;
1268 ViewerFace newViewerFace2 = new ViewerFace(); 1334 if (whichVert >= sides)
1335 primFaceNum = 2;
1336 ViewerFace newViewerFace1 = new ViewerFace(primFaceNum);
1337 ViewerFace newViewerFace2 = new ViewerFace(primFaceNum);
1338 float u1 = newLayer.us[whichVert];
1339 float u2 = 1.0f;
1340 if (whichVert < newLayer.us.Count - 1)
1341 u2 = newLayer.us[whichVert + 1];
1342 if (sides < 5 && whichVert < sides)
1343 {
1344 u1 *= sides;
1345 u2 *= sides;
1346 u1 -= whichVert;
1347 u2 -= whichVert;
1348 if (u2 < 0.1f)
1349 u2 = 1.0f;
1350 //u1 = 0.0f;
1351 //u2 = 1.0f;
1352
1353 newViewerFace2.primFaceNumber = newViewerFace1.primFaceNumber = whichVert + 1;
1354 }
1355
1356 newViewerFace1.uv1.U = u1;
1357 newViewerFace1.uv2.U = u1;
1358 newViewerFace1.uv3.U = u2;
1359
1360 newViewerFace1.uv1.V = 1.0f - percentOfPath;
1361 newViewerFace1.uv2.V = lastV;
1362 newViewerFace1.uv3.V = lastV;
1363
1364 newViewerFace2.uv1.U = u1;
1365 newViewerFace2.uv2.U = u2;
1366 newViewerFace2.uv3.U = u2;
1367
1368 newViewerFace2.uv1.V = 1.0f - percentOfPath;
1369 newViewerFace2.uv2.V = lastV;
1370 newViewerFace2.uv3.V = 1.0f - percentOfPath;
1269 1371
1270 newViewerFace1.v1 = this.coords[i]; 1372 newViewerFace1.v1 = this.coords[i];
1271 newViewerFace1.v2 = this.coords[i - numVerts]; 1373 newViewerFace1.v2 = this.coords[i - numVerts];
@@ -1330,9 +1432,18 @@ namespace PrimMesher
1330 newViewerFace.v2 = this.coords[coordsLen - numVerts]; // first vert in prior layer 1432 newViewerFace.v2 = this.coords[coordsLen - numVerts]; // first vert in prior layer
1331 newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer 1433 newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
1332 1434
1435 float u1 = newLayer.us[0];
1436 float u2 = newLayer.us[newLayer.us.Count - 1];
1437
1333 newViewerFace.n2 = newViewerFace.n1 = lastCutNormal2; 1438 newViewerFace.n2 = newViewerFace.n1 = lastCutNormal2;
1334 newViewerFace.n3 = newLayer.cutNormal2; 1439 newViewerFace.n3 = newLayer.cutNormal2;
1335 1440
1441 newViewerFace.uv3.U = newViewerFace.uv1.U = u2;
1442 newViewerFace.uv2.U = u1;
1443
1444 newViewerFace.uv1.V = newViewerFace.uv2.V = lastV;
1445 newViewerFace.uv3.V = 1.0f - percentOfPath;
1446
1336 this.viewerFaces.Add(newViewerFace); 1447 this.viewerFaces.Add(newViewerFace);
1337 1448
1338 newViewerFace.v1 = this.coords[coordsLen + numVerts - 1]; // last vert in new layer 1449 newViewerFace.v1 = this.coords[coordsLen + numVerts - 1]; // last vert in new layer
@@ -1342,6 +1453,12 @@ namespace PrimMesher
1342 newViewerFace.n3 = newViewerFace.n1 = newLayer.cutNormal2; 1453 newViewerFace.n3 = newViewerFace.n1 = newLayer.cutNormal2;
1343 newViewerFace.n2 = lastCutNormal2; 1454 newViewerFace.n2 = lastCutNormal2;
1344 1455
1456 newViewerFace.uv2.U = newViewerFace.uv1.U = u1;
1457 newViewerFace.uv3.U = u2;
1458
1459 newViewerFace.uv3.V = newViewerFace.uv1.V = 1.0f - percentOfPath;
1460 newViewerFace.uv2.V = lastV;
1461
1345 this.viewerFaces.Add(newViewerFace); 1462 this.viewerFaces.Add(newViewerFace);
1346 } 1463 }
1347 } 1464 }
@@ -1350,6 +1467,7 @@ namespace PrimMesher
1350 1467
1351 lastCutNormal1 = newLayer.cutNormal1; 1468 lastCutNormal1 = newLayer.cutNormal1;
1352 lastCutNormal2 = newLayer.cutNormal2; 1469 lastCutNormal2 = newLayer.cutNormal2;
1470 lastV = 1.0f - percentOfPath;
1353 1471
1354 // calc the step for the next iteration of the loop 1472 // calc the step for the next iteration of the loop
1355 1473
@@ -1381,6 +1499,10 @@ namespace PrimMesher
1381 newViewerFace.n2 = faceNormal; 1499 newViewerFace.n2 = faceNormal;
1382 newViewerFace.n3 = faceNormal; 1500 newViewerFace.n3 = faceNormal;
1383 1501
1502 newViewerFace.uv1 = newLayer.faceUVs[face.v1 - coordsLen];
1503 newViewerFace.uv2 = newLayer.faceUVs[face.v2 - coordsLen];
1504 newViewerFace.uv3 = newLayer.faceUVs[face.v3 - coordsLen];
1505
1384 this.viewerFaces.Add(newViewerFace); 1506 this.viewerFaces.Add(newViewerFace);
1385 } 1507 }
1386 } 1508 }
@@ -1489,7 +1611,15 @@ namespace PrimMesher
1489 Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces, calcVertexNormals); 1611 Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces, calcVertexNormals);
1490 1612
1491 if (initialProfileRot != 0.0f) 1613 if (initialProfileRot != 0.0f)
1614 {
1492 profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot)); 1615 profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot));
1616 if (viewerMode)
1617 profile.MakeFaceUVs();
1618 }
1619
1620 Coord lastCutNormal1 = new Coord();
1621 Coord lastCutNormal2 = new Coord();
1622 float lastV = 1.0f;
1493 1623
1494 bool done = false; 1624 bool done = false;
1495 while (!done) // loop through the length of the path and add the layers 1625 while (!done) // loop through the length of the path and add the layers
@@ -1498,7 +1628,8 @@ namespace PrimMesher
1498 if (angle == startAngle || angle >= endAngle) 1628 if (angle == startAngle || angle >= endAngle)
1499 isEndLayer = true; 1629 isEndLayer = true;
1500 1630
1501 Profile newLayer = profile.Clone(isEndLayer && needEndFaces); 1631 //Profile newLayer = profile.Clone(isEndLayer && needEndFaces);
1632 Profile newLayer = profile.Clone();
1502 1633
1503 float xProfileScale = (1.0f - Math.Abs(this.skew)) * this.holeSizeX; 1634 float xProfileScale = (1.0f - Math.Abs(this.skew)) * this.holeSizeX;
1504 float yProfileScale = this.holeSizeY; 1635 float yProfileScale = this.holeSizeY;
@@ -1547,6 +1678,36 @@ namespace PrimMesher
1547 if (angle == startAngle) 1678 if (angle == startAngle)
1548 newLayer.FlipNormals(); 1679 newLayer.FlipNormals();
1549 1680
1681 if (angle == startAngle)
1682 {
1683 newLayer.FlipNormals();
1684
1685 // add the top faces to the viewerFaces list here
1686 if (this.viewerMode && needEndFaces)
1687 {
1688 Coord faceNormal = newLayer.faceNormal;
1689 ViewerFace newViewerFace = new ViewerFace();
1690 newViewerFace.primFaceNumber = 0;
1691 foreach (Face face in newLayer.faces)
1692 {
1693 newViewerFace.v1 = newLayer.coords[face.v1];
1694 newViewerFace.v2 = newLayer.coords[face.v2];
1695 newViewerFace.v3 = newLayer.coords[face.v3];
1696
1697 newViewerFace.n1 = faceNormal;
1698 newViewerFace.n2 = faceNormal;
1699 newViewerFace.n3 = faceNormal;
1700
1701 newViewerFace.uv1 = newLayer.faceUVs[face.v1];
1702 newViewerFace.uv2 = newLayer.faceUVs[face.v2];
1703 newViewerFace.uv3 = newLayer.faceUVs[face.v3];
1704
1705 this.viewerFaces.Add(newViewerFace);
1706 }
1707
1708 }
1709 }
1710
1550 // append the layer and fill in the sides 1711 // append the layer and fill in the sides
1551 1712
1552 int coordsLen = this.coords.Count; 1713 int coordsLen = this.coords.Count;
@@ -1578,6 +1739,8 @@ namespace PrimMesher
1578 for (int i = startVert; i < endVert; i++) 1739 for (int i = startVert; i < endVert; i++)
1579 //for (int i = coordsLen; i < this.coords.Count - 1; i++) 1740 //for (int i = coordsLen; i < this.coords.Count - 1; i++)
1580 { 1741 {
1742 int whichVert = i - startVert;
1743
1581 newFace.v1 = i; 1744 newFace.v1 = i;
1582 newFace.v2 = i - numVerts; 1745 newFace.v2 = i - numVerts;
1583 newFace.v3 = i - numVerts + 1; 1746 newFace.v3 = i - numVerts + 1;
@@ -1587,33 +1750,115 @@ namespace PrimMesher
1587 newFace.v3 = i + 1; 1750 newFace.v3 = i + 1;
1588 this.faces.Add(newFace); 1751 this.faces.Add(newFace);
1589 1752
1753 //if (this.viewerMode)
1754 //{
1755 // // add the side faces to the list of viewerFaces here
1756 // ViewerFace newViewerFace = new ViewerFace();
1757 // newViewerFace.v1 = this.coords[i];
1758 // newViewerFace.v2 = this.coords[i - numVerts];
1759 // newViewerFace.v3 = this.coords[i - numVerts + 1];
1760
1761 // newViewerFace.n1 = this.normals[i];
1762 // newViewerFace.n2 = this.normals[i - numVerts];
1763 // newViewerFace.n3 = this.normals[i - numVerts + 1];
1764
1765 // this.viewerFaces.Add(newViewerFace);
1766
1767 // newViewerFace.v2 = this.coords[i - numVerts + 1];
1768 // newViewerFace.v3 = this.coords[i + 1];
1769
1770 // newViewerFace.n2 = this.normals[i - numVerts + 1];
1771 // newViewerFace.n3 = this.normals[i + 1];
1772
1773 // this.viewerFaces.Add(newViewerFace);
1774
1775 //}
1776
1590 if (this.viewerMode) 1777 if (this.viewerMode)
1591 { 1778 {
1592 // add the side faces to the list of viewerFaces here 1779 // add the side faces to the list of viewerFaces here
1593 ViewerFace newViewerFace = new ViewerFace(); 1780 ViewerFace newViewerFace1 = new ViewerFace();
1594 newViewerFace.v1 = this.coords[i]; 1781 ViewerFace newViewerFace2 = new ViewerFace();
1595 newViewerFace.v2 = this.coords[i - numVerts]; 1782 float u1 = newLayer.us[whichVert];
1596 newViewerFace.v3 = this.coords[i - numVerts + 1]; 1783 float u2 = 1.0f;
1784 if (whichVert < newLayer.us.Count - 1)
1785 u2 = newLayer.us[whichVert + 1];
1597 1786
1598 newViewerFace.n1 = this.normals[i]; 1787 newViewerFace1.uv1.U = u1;
1599 newViewerFace.n2 = this.normals[i - numVerts]; 1788 newViewerFace1.uv2.U = u1;
1600 newViewerFace.n3 = this.normals[i - numVerts + 1]; 1789 newViewerFace1.uv3.U = u2;
1601 1790
1602 this.viewerFaces.Add(newViewerFace); 1791 newViewerFace1.uv1.V = 1.0f - percentOfPath;
1792 newViewerFace1.uv2.V = lastV;
1793 newViewerFace1.uv3.V = lastV;
1603 1794
1604 newViewerFace.v2 = this.coords[i - numVerts + 1]; 1795 newViewerFace2.uv1.U = u1;
1605 newViewerFace.v3 = this.coords[i + 1]; 1796 newViewerFace2.uv2.U = u2;
1797 newViewerFace2.uv3.U = u2;
1606 1798
1607 newViewerFace.n2 = this.normals[i - numVerts + 1]; 1799 newViewerFace2.uv1.V = 1.0f - percentOfPath;
1608 newViewerFace.n3 = this.normals[i + 1]; 1800 newViewerFace2.uv2.V = lastV;
1801 newViewerFace2.uv3.V = 1.0f - percentOfPath;
1609 1802
1610 this.viewerFaces.Add(newViewerFace); 1803 newViewerFace1.v1 = this.coords[i];
1804 newViewerFace1.v2 = this.coords[i - numVerts];
1805 newViewerFace1.v3 = this.coords[i - numVerts + 1];
1806
1807 newViewerFace2.v1 = this.coords[i];
1808 newViewerFace2.v2 = this.coords[i - numVerts + 1];
1809 newViewerFace2.v3 = this.coords[i + 1];
1810
1811 if (whichVert == newLayer.numOuterVerts - 1 && hasProfileCut)
1812 { // start profile cut faces
1813
1814 newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal1;
1815 newViewerFace1.n3 = newLayer.cutNormal1;
1816
1817 newViewerFace2.n3 = newViewerFace2.n1 = newLayer.cutNormal1;
1818 newViewerFace2.n2 = lastCutNormal1;
1819 }
1820
1821 else // periphery faces
1822 {
1823 if ((sides < 5 && whichVert < newLayer.numOuterVerts) || (hollowSides < 5 && whichVert >= newLayer.numOuterVerts))
1824 {
1825 newViewerFace1.CalcSurfaceNormal();
1826 newViewerFace2.CalcSurfaceNormal();
1827 }
1828 else
1829 {
1830 newViewerFace1.n1 = this.normals[i];
1831 newViewerFace1.n2 = this.normals[i - numVerts];
1832 newViewerFace1.n3 = this.normals[i - numVerts + 1];
1833
1834 newViewerFace2.n1 = this.normals[i];
1835 newViewerFace2.n2 = this.normals[i - numVerts + 1];
1836 newViewerFace2.n3 = this.normals[i + 1];
1837 }
1838 }
1839
1840 this.viewerFaces.Add(newViewerFace1);
1841 this.viewerFaces.Add(newViewerFace2);
1611 1842
1612 } 1843 }
1613 } 1844 }
1614 1845
1846 //if (this.hasProfileCut)
1847 //{
1848 // newFace.v1 = coordsLen - 1;
1849 // newFace.v2 = coordsLen - numVerts;
1850 // newFace.v3 = coordsLen;
1851 // this.faces.Add(newFace);
1852
1853 // newFace.v1 = coordsLen + numVerts - 1;
1854 // newFace.v2 = coordsLen - 1;
1855 // newFace.v3 = coordsLen;
1856 // this.faces.Add(newFace);
1857 //}
1858
1615 if (this.hasProfileCut) 1859 if (this.hasProfileCut)
1616 { 1860 { // add the end cut face to the list of viewerFaces here
1861 // the first cut face was filled in the above loop
1617 newFace.v1 = coordsLen - 1; 1862 newFace.v1 = coordsLen - 1;
1618 newFace.v2 = coordsLen - numVerts; 1863 newFace.v2 = coordsLen - numVerts;
1619 newFace.v3 = coordsLen; 1864 newFace.v3 = coordsLen;
@@ -1623,9 +1868,50 @@ namespace PrimMesher
1623 newFace.v2 = coordsLen - 1; 1868 newFace.v2 = coordsLen - 1;
1624 newFace.v3 = coordsLen; 1869 newFace.v3 = coordsLen;
1625 this.faces.Add(newFace); 1870 this.faces.Add(newFace);
1871
1872 if (this.viewerMode)
1873 {
1874 ViewerFace newViewerFace = new ViewerFace();
1875 newViewerFace.v1 = this.coords[coordsLen - 1]; // last vert in prior layer
1876 newViewerFace.v2 = this.coords[coordsLen - numVerts]; // first vert in prior layer
1877 newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
1878
1879 float u1 = newLayer.us[0];
1880 float u2 = newLayer.us[newLayer.us.Count - 1];
1881
1882 newViewerFace.n2 = newViewerFace.n1 = lastCutNormal2;
1883 newViewerFace.n3 = newLayer.cutNormal2;
1884
1885 newViewerFace.uv3.U = newViewerFace.uv1.U = u2;
1886 newViewerFace.uv2.U = u1;
1887
1888 newViewerFace.uv1.V = newViewerFace.uv2.V = lastV;
1889 newViewerFace.uv3.V = 1.0f - percentOfPath;
1890
1891 this.viewerFaces.Add(newViewerFace);
1892
1893 newViewerFace.v1 = this.coords[coordsLen + numVerts - 1]; // last vert in new layer
1894 newViewerFace.v2 = this.coords[coordsLen - 1]; // last vert in prior layer
1895 newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
1896
1897 newViewerFace.n3 = newViewerFace.n1 = newLayer.cutNormal2;
1898 newViewerFace.n2 = lastCutNormal2;
1899
1900 newViewerFace.uv2.U = newViewerFace.uv1.U = u1;
1901 newViewerFace.uv3.U = u2;
1902
1903 newViewerFace.uv3.V = newViewerFace.uv1.V = 1.0f - percentOfPath;
1904 newViewerFace.uv2.V = lastV;
1905
1906 this.viewerFaces.Add(newViewerFace);
1907 }
1626 } 1908 }
1627 } 1909 }
1628 1910
1911 lastCutNormal1 = newLayer.cutNormal1;
1912 lastCutNormal2 = newLayer.cutNormal2;
1913 lastV = 1.0f - percentOfPath;
1914
1629 // calculate terms for next iteration 1915 // calculate terms for next iteration
1630 // calculate the angle for the next iteration of the loop 1916 // calculate the angle for the next iteration of the loop
1631 1917
@@ -1638,6 +1924,30 @@ namespace PrimMesher
1638 if (angle > endAngle) 1924 if (angle > endAngle)
1639 angle = endAngle; 1925 angle = endAngle;
1640 } 1926 }
1927
1928 if (done && viewerMode && needEndFaces)
1929 {
1930 // add the bottom faces to the viewerFaces list here
1931 Coord faceNormal = newLayer.faceNormal;
1932 ViewerFace newViewerFace = new ViewerFace();
1933 newViewerFace.primFaceNumber = 0;
1934 foreach (Face face in newLayer.faces)
1935 {
1936 newViewerFace.v1 = newLayer.coords[face.v1 - coordsLen];
1937 newViewerFace.v2 = newLayer.coords[face.v2 - coordsLen];
1938 newViewerFace.v3 = newLayer.coords[face.v3 - coordsLen];
1939
1940 newViewerFace.n1 = faceNormal;
1941 newViewerFace.n2 = faceNormal;
1942 newViewerFace.n3 = faceNormal;
1943
1944 newViewerFace.uv1 = newLayer.faceUVs[face.v1 - coordsLen];
1945 newViewerFace.uv2 = newLayer.faceUVs[face.v2 - coordsLen];
1946 newViewerFace.uv3 = newLayer.faceUVs[face.v3 - coordsLen];
1947
1948 this.viewerFaces.Add(newViewerFace);
1949 }
1950 }
1641 } 1951 }
1642 } 1952 }
1643 1953
@@ -1659,7 +1969,7 @@ namespace PrimMesher
1659 1969
1660 public Coord SurfaceNormal(int faceIndex) 1970 public Coord SurfaceNormal(int faceIndex)
1661 { 1971 {
1662 //int numFaces = faces.Count; 1972 int numFaces = faces.Count;
1663 if (faceIndex < 0 || faceIndex >= faces.Count) 1973 if (faceIndex < 0 || faceIndex >= faces.Count)
1664 throw new Exception("faceIndex out of range"); 1974 throw new Exception("faceIndex out of range");
1665 1975