diff options
Diffstat (limited to 'OpenSim/Region/Physics/Meshing')
-rw-r--r-- | OpenSim/Region/Physics/Meshing/PrimMesher.cs | 108 |
1 files changed, 59 insertions, 49 deletions
diff --git a/OpenSim/Region/Physics/Meshing/PrimMesher.cs b/OpenSim/Region/Physics/Meshing/PrimMesher.cs index 7245eea..741010d 100644 --- a/OpenSim/Region/Physics/Meshing/PrimMesher.cs +++ b/OpenSim/Region/Physics/Meshing/PrimMesher.cs | |||
@@ -336,8 +336,8 @@ namespace PrimMesher | |||
336 | public void CalcSurfaceNormal() | 336 | public void CalcSurfaceNormal() |
337 | { | 337 | { |
338 | 338 | ||
339 | Coord edge1 = new Coord(this.n2.X - this.n1.X, this.n2.Y - this.n1.Y, this.n2.Z - this.n1.Z); | 339 | Coord edge1 = new Coord(this.v2.X - this.v1.X, this.v2.Y - this.v1.Y, this.v2.Z - this.v1.Z); |
340 | Coord edge2 = new Coord(this.n3.X - this.n1.X, this.n3.Y - this.n1.Y, this.n3.Z - this.n1.Z); | 340 | Coord edge2 = new Coord(this.v3.X - this.v1.X, this.v3.Y - this.v1.Y, this.v3.Z - this.v1.Z); |
341 | 341 | ||
342 | this.n1 = this.n2 = this.n3 = Coord.Cross(edge1, edge2).Normalize(); | 342 | this.n1 = this.n2 = this.n3 = Coord.Cross(edge1, edge2).Normalize(); |
343 | } | 343 | } |
@@ -1213,7 +1213,7 @@ namespace PrimMesher | |||
1213 | 1213 | ||
1214 | 1214 | ||
1215 | Coord lastCutNormal1 = new Coord(); | 1215 | Coord lastCutNormal1 = new Coord(); |
1216 | //Coord lastCutNormal2 = new Coord(); | 1216 | Coord lastCutNormal2 = new Coord(); |
1217 | float lastV = 1.0f; | 1217 | float lastV = 1.0f; |
1218 | 1218 | ||
1219 | bool done = false; | 1219 | bool done = false; |
@@ -1268,7 +1268,6 @@ namespace PrimMesher | |||
1268 | 1268 | ||
1269 | this.viewerFaces.Add(newViewerFace); | 1269 | this.viewerFaces.Add(newViewerFace); |
1270 | } | 1270 | } |
1271 | |||
1272 | } | 1271 | } |
1273 | } | 1272 | } |
1274 | 1273 | ||
@@ -1330,12 +1329,13 @@ namespace PrimMesher | |||
1330 | float u2 = 1.0f; | 1329 | float u2 = 1.0f; |
1331 | if (whichVert < newLayer.us.Count - 1) | 1330 | if (whichVert < newLayer.us.Count - 1) |
1332 | u2 = newLayer.us[whichVert + 1]; | 1331 | u2 = newLayer.us[whichVert + 1]; |
1333 | if (sides < 5 && whichVert < sides) | 1332 | int whichOuterVert = (hasProfileCut && hasHollow) ? whichVert - 1 : whichVert; |
1333 | if (sides < 5 && whichOuterVert < sides) | ||
1334 | { | 1334 | { |
1335 | u1 *= sides; | 1335 | u1 *= sides; |
1336 | u2 *= sides; | 1336 | u2 *= sides; |
1337 | u1 -= whichVert; | 1337 | u1 -= whichOuterVert; |
1338 | u2 -= whichVert; | 1338 | u2 -= whichOuterVert; |
1339 | if (u2 < 0.1f) | 1339 | if (u2 < 0.1f) |
1340 | u2 = 1.0f; | 1340 | u2 = 1.0f; |
1341 | 1341 | ||
@@ -1372,8 +1372,9 @@ namespace PrimMesher | |||
1372 | newViewerFace2.v2 = this.coords[iNext - numVerts]; | 1372 | newViewerFace2.v2 = this.coords[iNext - numVerts]; |
1373 | newViewerFace2.v3 = this.coords[iNext]; | 1373 | newViewerFace2.v3 = this.coords[iNext]; |
1374 | 1374 | ||
1375 | // profile cut faces | ||
1375 | if (whichVert == cut1Vert) | 1376 | if (whichVert == cut1Vert) |
1376 | { // start profile cut faces | 1377 | { |
1377 | 1378 | ||
1378 | newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal1; | 1379 | newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal1; |
1379 | newViewerFace1.n3 = newLayer.cutNormal1; | 1380 | newViewerFace1.n3 = newLayer.cutNormal1; |
@@ -1381,10 +1382,20 @@ namespace PrimMesher | |||
1381 | newViewerFace2.n3 = newViewerFace2.n1 = newLayer.cutNormal1; | 1382 | newViewerFace2.n3 = newViewerFace2.n1 = newLayer.cutNormal1; |
1382 | newViewerFace2.n2 = lastCutNormal1; | 1383 | newViewerFace2.n2 = lastCutNormal1; |
1383 | } | 1384 | } |
1385 | else if (whichVert == cut2Vert) | ||
1386 | { | ||
1384 | 1387 | ||
1385 | else // periphery faces | 1388 | newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal2; |
1389 | newViewerFace1.n3 = newLayer.cutNormal2; | ||
1390 | |||
1391 | newViewerFace2.n3 = newViewerFace2.n1 = newLayer.cutNormal2; | ||
1392 | newViewerFace2.n2 = lastCutNormal2; | ||
1393 | } | ||
1394 | |||
1395 | else // outer and hollow faces | ||
1386 | { | 1396 | { |
1387 | if ((sides < 5 && whichVert < newLayer.numOuterVerts) || (hollowSides < 5 && whichVert >= newLayer.numOuterVerts)) | 1397 | //if ((sides < 5 && whichVert < newLayer.numOuterVerts) || (hollowSides < 5 && whichVert >= newLayer.numOuterVerts)) |
1398 | if (sides < 5) | ||
1388 | { | 1399 | { |
1389 | newViewerFace1.CalcSurfaceNormal(); | 1400 | newViewerFace1.CalcSurfaceNormal(); |
1390 | newViewerFace2.CalcSurfaceNormal(); | 1401 | newViewerFace2.CalcSurfaceNormal(); |
@@ -1406,25 +1417,10 @@ namespace PrimMesher | |||
1406 | 1417 | ||
1407 | } | 1418 | } |
1408 | } | 1419 | } |
1409 | |||
1410 | if (this.hasProfileCut) | ||
1411 | { // add the end cut face to the list of viewerFaces here | ||
1412 | // the prior cut face was filled in the above loop | ||
1413 | newFace.v1 = coordsLen - 1; | ||
1414 | newFace.v2 = coordsLen - numVerts; | ||
1415 | newFace.v3 = coordsLen; | ||
1416 | this.faces.Add(newFace); | ||
1417 | |||
1418 | newFace.v1 = coordsLen + numVerts - 1; | ||
1419 | newFace.v2 = coordsLen - 1; | ||
1420 | newFace.v3 = coordsLen; | ||
1421 | this.faces.Add(newFace); | ||
1422 | } | ||
1423 | |||
1424 | } | 1420 | } |
1425 | 1421 | ||
1426 | lastCutNormal1 = newLayer.cutNormal1; | 1422 | lastCutNormal1 = newLayer.cutNormal1; |
1427 | //lastCutNormal2 = newLayer.cutNormal2; | 1423 | lastCutNormal2 = newLayer.cutNormal2; |
1428 | lastV = 1.0f - percentOfPath; | 1424 | lastV = 1.0f - percentOfPath; |
1429 | 1425 | ||
1430 | // calc the step for the next iteration of the loop | 1426 | // calc the step for the next iteration of the loop |
@@ -1570,6 +1566,14 @@ namespace PrimMesher | |||
1570 | 1566 | ||
1571 | Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces, calcVertexNormals); | 1567 | Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces, calcVertexNormals); |
1572 | 1568 | ||
1569 | int cut1Vert = -1; | ||
1570 | int cut2Vert = -1; | ||
1571 | if (hasProfileCut) | ||
1572 | { | ||
1573 | cut1Vert = hasHollow ? profile.coords.Count - 1 : 0; | ||
1574 | cut2Vert = hasHollow ? profile.numOuterVerts - 1 : profile.numOuterVerts; | ||
1575 | } | ||
1576 | |||
1573 | if (initialProfileRot != 0.0f) | 1577 | if (initialProfileRot != 0.0f) |
1574 | { | 1578 | { |
1575 | profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot)); | 1579 | profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot)); |
@@ -1578,7 +1582,7 @@ namespace PrimMesher | |||
1578 | } | 1582 | } |
1579 | 1583 | ||
1580 | Coord lastCutNormal1 = new Coord(); | 1584 | Coord lastCutNormal1 = new Coord(); |
1581 | //Coord lastCutNormal2 = new Coord(); | 1585 | Coord lastCutNormal2 = new Coord(); |
1582 | float lastV = 1.0f; | 1586 | float lastV = 1.0f; |
1583 | 1587 | ||
1584 | bool done = false; | 1588 | bool done = false; |
@@ -1631,7 +1635,6 @@ namespace PrimMesher | |||
1631 | 1635 | ||
1632 | // now orient the rotation of the profile layer relative to it's position on the path | 1636 | // now orient the rotation of the profile layer relative to it's position on the path |
1633 | // adding taperY to the angle used to generate the quat appears to approximate the viewer | 1637 | // adding taperY to the angle used to generate the quat appears to approximate the viewer |
1634 | //newLayer.AddRot(new Quaternion(new Vertex(1.0f, 0.0f, 0.0f), angle + this.topShearY * 0.9f)); | ||
1635 | newLayer.AddRot(new Quat(new Coord(1.0f, 0.0f, 0.0f), angle + this.topShearY)); | 1638 | newLayer.AddRot(new Quat(new Coord(1.0f, 0.0f, 0.0f), angle + this.topShearY)); |
1636 | newLayer.AddPos(xOffset, yOffset, zOffset); | 1639 | newLayer.AddPos(xOffset, yOffset, zOffset); |
1637 | 1640 | ||
@@ -1661,7 +1664,6 @@ namespace PrimMesher | |||
1661 | 1664 | ||
1662 | this.viewerFaces.Add(newViewerFace); | 1665 | this.viewerFaces.Add(newViewerFace); |
1663 | } | 1666 | } |
1664 | |||
1665 | } | 1667 | } |
1666 | } | 1668 | } |
1667 | 1669 | ||
@@ -1720,6 +1722,12 @@ namespace PrimMesher | |||
1720 | if (whichVert < newLayer.us.Count - 1) | 1722 | if (whichVert < newLayer.us.Count - 1) |
1721 | u2 = newLayer.us[whichVert + 1]; | 1723 | u2 = newLayer.us[whichVert + 1]; |
1722 | 1724 | ||
1725 | if (whichVert == cut1Vert || whichVert == cut2Vert) | ||
1726 | { | ||
1727 | u1 = 0.0f; | ||
1728 | u2 = 1.0f; | ||
1729 | } | ||
1730 | |||
1723 | newViewerFace1.uv1.U = u1; | 1731 | newViewerFace1.uv1.U = u1; |
1724 | newViewerFace1.uv2.U = u1; | 1732 | newViewerFace1.uv2.U = u1; |
1725 | newViewerFace1.uv3.U = u2; | 1733 | newViewerFace1.uv3.U = u2; |
@@ -1744,8 +1752,8 @@ namespace PrimMesher | |||
1744 | newViewerFace2.v2 = this.coords[iNext - numVerts]; | 1752 | newViewerFace2.v2 = this.coords[iNext - numVerts]; |
1745 | newViewerFace2.v3 = this.coords[iNext]; | 1753 | newViewerFace2.v3 = this.coords[iNext]; |
1746 | 1754 | ||
1747 | if (whichVert == newLayer.numOuterVerts - 1 && hasProfileCut) | 1755 | if (whichVert == cut1Vert) |
1748 | { // start profile cut faces | 1756 | { |
1749 | 1757 | ||
1750 | newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal1; | 1758 | newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal1; |
1751 | newViewerFace1.n3 = newLayer.cutNormal1; | 1759 | newViewerFace1.n3 = newLayer.cutNormal1; |
@@ -1753,10 +1761,20 @@ namespace PrimMesher | |||
1753 | newViewerFace2.n3 = newViewerFace2.n1 = newLayer.cutNormal1; | 1761 | newViewerFace2.n3 = newViewerFace2.n1 = newLayer.cutNormal1; |
1754 | newViewerFace2.n2 = lastCutNormal1; | 1762 | newViewerFace2.n2 = lastCutNormal1; |
1755 | } | 1763 | } |
1764 | else if (whichVert == cut2Vert) | ||
1765 | { | ||
1766 | |||
1767 | newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal2; | ||
1768 | newViewerFace1.n3 = newLayer.cutNormal2; | ||
1769 | |||
1770 | newViewerFace2.n3 = newViewerFace2.n1 = newLayer.cutNormal2; | ||
1771 | newViewerFace2.n2 = lastCutNormal2; | ||
1772 | } | ||
1756 | 1773 | ||
1757 | else // periphery faces | 1774 | else // periphery faces |
1758 | { | 1775 | { |
1759 | if ((sides < 5 && whichVert < newLayer.numOuterVerts) || (hollowSides < 5 && whichVert >= newLayer.numOuterVerts)) | 1776 | //if ((sides < 5 && whichVert < newLayer.numOuterVerts) || (hollowSides < 5 && whichVert >= newLayer.numOuterVerts)) |
1777 | if (sides < 5) | ||
1760 | { | 1778 | { |
1761 | newViewerFace1.CalcSurfaceNormal(); | 1779 | newViewerFace1.CalcSurfaceNormal(); |
1762 | newViewerFace2.CalcSurfaceNormal(); | 1780 | newViewerFace2.CalcSurfaceNormal(); |
@@ -1781,7 +1799,7 @@ namespace PrimMesher | |||
1781 | } | 1799 | } |
1782 | 1800 | ||
1783 | lastCutNormal1 = newLayer.cutNormal1; | 1801 | lastCutNormal1 = newLayer.cutNormal1; |
1784 | //lastCutNormal2 = newLayer.cutNormal2; | 1802 | lastCutNormal2 = newLayer.cutNormal2; |
1785 | lastV = 1.0f - percentOfPath; | 1803 | lastV = 1.0f - percentOfPath; |
1786 | 1804 | ||
1787 | // calculate terms for next iteration | 1805 | // calculate terms for next iteration |
@@ -1823,12 +1841,8 @@ namespace PrimMesher | |||
1823 | } | 1841 | } |
1824 | } | 1842 | } |
1825 | 1843 | ||
1826 | private Coord SurfaceNormal(Face face) | 1844 | private Coord SurfaceNormal(Coord c1, Coord c2, Coord c3) |
1827 | { | 1845 | { |
1828 | Coord c1 = coords[face.v1]; | ||
1829 | Coord c2 = coords[face.v2]; | ||
1830 | Coord c3 = coords[face.v3]; | ||
1831 | |||
1832 | Coord edge1 = new Coord(c2.X - c1.X, c2.Y - c1.Y, c2.Z - c1.Z); | 1846 | Coord edge1 = new Coord(c2.X - c1.X, c2.Y - c1.Y, c2.Z - c1.Z); |
1833 | Coord edge2 = new Coord(c3.X - c1.X, c3.Y - c1.Y, c3.Z - c1.Z); | 1847 | Coord edge2 = new Coord(c3.X - c1.X, c3.Y - c1.Y, c3.Z - c1.Z); |
1834 | 1848 | ||
@@ -1839,15 +1853,18 @@ namespace PrimMesher | |||
1839 | return normal; | 1853 | return normal; |
1840 | } | 1854 | } |
1841 | 1855 | ||
1856 | private Coord SurfaceNormal(Face face) | ||
1857 | { | ||
1858 | return SurfaceNormal(this.coords[face.v1], this.coords[face.v2], this.coords[face.v3]); | ||
1859 | } | ||
1860 | |||
1842 | public Coord SurfaceNormal(int faceIndex) | 1861 | public Coord SurfaceNormal(int faceIndex) |
1843 | { | 1862 | { |
1844 | int numFaces = faces.Count; | 1863 | int numFaces = this.faces.Count; |
1845 | if (faceIndex < 0 || faceIndex >= numFaces) | 1864 | if (faceIndex < 0 || faceIndex >= numFaces) |
1846 | throw new Exception("faceIndex out of range"); | 1865 | throw new Exception("faceIndex out of range"); |
1847 | 1866 | ||
1848 | //return new Coord(0.0f, 0.0f, 0.0f); | 1867 | return SurfaceNormal(this.faces[faceIndex]); |
1849 | |||
1850 | return SurfaceNormal(faces[faceIndex]); | ||
1851 | } | 1868 | } |
1852 | 1869 | ||
1853 | public void CalcNormals() | 1870 | public void CalcNormals() |
@@ -1938,13 +1955,6 @@ namespace PrimMesher | |||
1938 | Coord m = new Coord(x, y, z); | 1955 | Coord m = new Coord(x, y, z); |
1939 | for (i = 0; i < numVerts; i++) | 1956 | for (i = 0; i < numVerts; i++) |
1940 | this.coords[i] *= m; | 1957 | this.coords[i] *= m; |
1941 | //{ | ||
1942 | // vert = this.coords[i]; | ||
1943 | // vert.X *= x; | ||
1944 | // vert.Y *= y; | ||
1945 | // vert.Z *= z; | ||
1946 | // this.coords[i] = vert; | ||
1947 | //} | ||
1948 | 1958 | ||
1949 | if (this.viewerFaces != null) | 1959 | if (this.viewerFaces != null) |
1950 | { | 1960 | { |