diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 128 |
1 files changed, 111 insertions, 17 deletions
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs index 9afc7ae..dfcf99a 100644 --- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs | |||
@@ -657,6 +657,14 @@ namespace OpenSim.Region.Physics.Meshing | |||
657 | //Mesh result = extr.Extrude(m); | 657 | //Mesh result = extr.Extrude(m); |
658 | Mesh result = extr.ExtrudeLinearPath(m); | 658 | Mesh result = extr.ExtrudeLinearPath(m); |
659 | result.DumpRaw(baseDir, primName, "Z extruded"); | 659 | result.DumpRaw(baseDir, primName, "Z extruded"); |
660 | #if SPAM | ||
661 | int vCount = 0; | ||
662 | |||
663 | foreach (Vertex v in result.vertices) | ||
664 | if (v != null) | ||
665 | vCount++; | ||
666 | System.Console.WriteLine("Mesh vertex count: " + vCount.ToString()); | ||
667 | #endif | ||
660 | return result; | 668 | return result; |
661 | } | 669 | } |
662 | 670 | ||
@@ -1002,6 +1010,14 @@ namespace OpenSim.Region.Physics.Meshing | |||
1002 | //Mesh result = extr.Extrude(m); | 1010 | //Mesh result = extr.Extrude(m); |
1003 | Mesh result = extr.ExtrudeLinearPath(m); | 1011 | Mesh result = extr.ExtrudeLinearPath(m); |
1004 | result.DumpRaw(baseDir, primName, "Z extruded"); | 1012 | result.DumpRaw(baseDir, primName, "Z extruded"); |
1013 | #if SPAM | ||
1014 | int vCount = 0; | ||
1015 | |||
1016 | foreach (Vertex v in result.vertices) | ||
1017 | if (v != null) | ||
1018 | vCount++; | ||
1019 | System.Console.WriteLine("Mesh vertex count: " + vCount.ToString()); | ||
1020 | #endif | ||
1005 | return result; | 1021 | return result; |
1006 | } | 1022 | } |
1007 | 1023 | ||
@@ -1238,6 +1254,14 @@ namespace OpenSim.Region.Physics.Meshing | |||
1238 | //Mesh result = extr.Extrude(m); | 1254 | //Mesh result = extr.Extrude(m); |
1239 | Mesh result = extr.ExtrudeLinearPath(m); | 1255 | Mesh result = extr.ExtrudeLinearPath(m); |
1240 | result.DumpRaw(baseDir, primName, "Z extruded"); | 1256 | result.DumpRaw(baseDir, primName, "Z extruded"); |
1257 | #if SPAM | ||
1258 | int vCount = 0; | ||
1259 | |||
1260 | foreach (Vertex v in result.vertices) | ||
1261 | if (v != null) | ||
1262 | vCount++; | ||
1263 | System.Console.WriteLine("Mesh vertex count: " + vCount.ToString()); | ||
1264 | #endif | ||
1241 | return result; | 1265 | return result; |
1242 | } | 1266 | } |
1243 | 1267 | ||
@@ -1330,6 +1354,14 @@ namespace OpenSim.Region.Physics.Meshing | |||
1330 | } | 1354 | } |
1331 | // Dump the faces for visualization in blender. | 1355 | // Dump the faces for visualization in blender. |
1332 | m.DumpRaw(baseDir, primName, "Icosahedron"); | 1356 | m.DumpRaw(baseDir, primName, "Icosahedron"); |
1357 | #if SPAM | ||
1358 | int vCount = 0; | ||
1359 | |||
1360 | foreach (Vertex v in m.vertices) | ||
1361 | if (v != null) | ||
1362 | vCount++; | ||
1363 | System.Console.WriteLine("Mesh vertex count: " + vCount.ToString()); | ||
1364 | #endif | ||
1333 | 1365 | ||
1334 | return m; | 1366 | return m; |
1335 | } | 1367 | } |
@@ -1386,9 +1418,6 @@ namespace OpenSim.Region.Physics.Meshing | |||
1386 | SimpleHull outerHull = new SimpleHull(); | 1418 | SimpleHull outerHull = new SimpleHull(); |
1387 | 1419 | ||
1388 | if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle) | 1420 | if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle) |
1389 | |||
1390 | //if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle | ||
1391 | // || (primShape.ProfileCurve & 0x07) == (byte) ProfileShape.Square) | ||
1392 | { | 1421 | { |
1393 | #if SPAM | 1422 | #if SPAM |
1394 | Console.WriteLine("Meshmerizer thinks " + primName + " is a TORUS"); | 1423 | Console.WriteLine("Meshmerizer thinks " + primName + " is a TORUS"); |
@@ -1458,11 +1487,46 @@ namespace OpenSim.Region.Physics.Meshing | |||
1458 | #if SPAM | 1487 | #if SPAM |
1459 | Console.WriteLine("Meshmerizer thinks " + primName + " is a SPHERE"); | 1488 | Console.WriteLine("Meshmerizer thinks " + primName + " is a SPHERE"); |
1460 | #endif | 1489 | #endif |
1490 | |||
1491 | // sanity check here... some spheres have inverted normals which can trap avatars | ||
1492 | // so for now if the shape parameters are such that this may happen, revert to the | ||
1493 | // geodesic sphere mesh.. the threshold is arbitrary as it seems any twist on a sphere | ||
1494 | // will create some inverted normals | ||
1495 | if ( | ||
1496 | (System.Math.Abs(primShape.PathTwist - primShape.PathTwistBegin) > 65) | ||
1497 | || (primShape.PathBegin == 0 | ||
1498 | && primShape.PathEnd == 0 | ||
1499 | && primShape.PathTwist == 0 | ||
1500 | && primShape.PathTwistBegin == 0 | ||
1501 | && primShape.ProfileBegin == 0 | ||
1502 | && primShape.ProfileEnd == 0 | ||
1503 | ) // simple sphere, revert to geodesic shape | ||
1504 | |||
1505 | ) | ||
1506 | { | ||
1507 | #if SPAM | ||
1508 | System.Console.WriteLine( "reverting to geodesic sphere for prim: " + primName ); | ||
1509 | #endif | ||
1510 | return CreateSphereMesh(primName, primShape, size); | ||
1511 | } | ||
1512 | |||
1461 | if (hollowShape == HollowShape.Same) | 1513 | if (hollowShape == HollowShape.Same) |
1462 | hollowShape = HollowShape.Circle; | 1514 | hollowShape = HollowShape.Circle; |
1463 | 1515 | ||
1464 | // not implemented here, use old routine | 1516 | outerHull.AddVertex(new Vertex(0.250000f, 0.433013f, 0.0f)); // 60 degrees |
1465 | return CreateSphereMesh(primName, primShape, size); | 1517 | outerHull.AddVertex(new Vertex(0.129410f, 0.482963f, 0.0f)); // 75 degrees |
1518 | outerHull.AddVertex(new Vertex(0.000000f, 0.500000f, 0.0f)); // 90 degrees | ||
1519 | outerHull.AddVertex(new Vertex(-0.129410f, 0.482963f, 0.0f)); // 105 degrees | ||
1520 | outerHull.AddVertex(new Vertex(-0.250000f, 0.433013f, 0.0f)); // 120 degrees | ||
1521 | outerHull.AddVertex(new Vertex(-0.353553f, 0.353553f, 0.0f)); // 135 degrees | ||
1522 | outerHull.AddVertex(new Vertex(-0.433013f, 0.250000f, 0.0f)); // 150 degrees | ||
1523 | outerHull.AddVertex(new Vertex(-0.482963f, 0.129410f, 0.0f)); // 165 degrees | ||
1524 | outerHull.AddVertex(new Vertex(-0.500000f, 0.000000f, 0.0f)); // 180 degrees | ||
1525 | |||
1526 | outerHull.AddVertex(new Vertex(0.500000f, 0.000000f, 0.0f)); // 0 degrees | ||
1527 | outerHull.AddVertex(new Vertex(0.482963f, 0.129410f, 0.0f)); // 15 degrees | ||
1528 | outerHull.AddVertex(new Vertex(0.433013f, 0.250000f, 0.0f)); // 30 degrees | ||
1529 | outerHull.AddVertex(new Vertex(0.353553f, 0.353553f, 0.0f)); // 45 degrees | ||
1466 | } | 1530 | } |
1467 | 1531 | ||
1468 | // Deal with cuts now | 1532 | // Deal with cuts now |
@@ -1476,6 +1540,19 @@ namespace OpenSim.Region.Physics.Meshing | |||
1476 | if (fProfileBeginAngle < fProfileEndAngle) | 1540 | if (fProfileBeginAngle < fProfileEndAngle) |
1477 | fProfileEndAngle -= 360.0; | 1541 | fProfileEndAngle -= 360.0; |
1478 | 1542 | ||
1543 | if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle) | ||
1544 | { // dimpled sphere uses profile cut but since it's a half circle the angles are smaller | ||
1545 | |||
1546 | fProfileBeginAngle = 0.0036f * (float)primShape.ProfileBegin; | ||
1547 | fProfileEndAngle = 180.0f - 0.0036f * (float)primShape.ProfileEnd; | ||
1548 | if (fProfileBeginAngle < fProfileEndAngle) | ||
1549 | fProfileEndAngle -= 360.0f; | ||
1550 | |||
1551 | #if SPAM | ||
1552 | Console.WriteLine("Sphere dimple: fProfileBeginAngle: " + fProfileBeginAngle.ToString() + " fProfileEndAngle: " + fProfileEndAngle.ToString()); | ||
1553 | #endif | ||
1554 | } | ||
1555 | |||
1479 | // Note, that we don't want to cut out a triangle, even if this is a | 1556 | // Note, that we don't want to cut out a triangle, even if this is a |
1480 | // good approximation for small cuts. Indeed we want to cut out an arc | 1557 | // good approximation for small cuts. Indeed we want to cut out an arc |
1481 | // and we approximate this arc by a polygon chain | 1558 | // and we approximate this arc by a polygon chain |
@@ -1529,7 +1606,7 @@ namespace OpenSim.Region.Physics.Meshing | |||
1529 | { | 1606 | { |
1530 | holeHull = new SimpleHull(); | 1607 | holeHull = new SimpleHull(); |
1531 | 1608 | ||
1532 | float hollowFactorF = (float) hollowFactor / 50000.0f; | 1609 | float hollowFactorF = (float)hollowFactor * 2.0e-5f; |
1533 | 1610 | ||
1534 | if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle) | 1611 | if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle) |
1535 | { | 1612 | { |
@@ -1537,23 +1614,29 @@ namespace OpenSim.Region.Physics.Meshing | |||
1537 | holeHull.AddVertex(new Vertex(-0.25f * hollowFactorF, -0f * hollowFactorF, 0.0f)); | 1614 | holeHull.AddVertex(new Vertex(-0.25f * hollowFactorF, -0f * hollowFactorF, 0.0f)); |
1538 | holeHull.AddVertex(new Vertex(+0.125f * hollowFactorF, +0.1875f * hollowFactorF, 0.0f)); | 1615 | holeHull.AddVertex(new Vertex(+0.125f * hollowFactorF, +0.1875f * hollowFactorF, 0.0f)); |
1539 | } | 1616 | } |
1617 | else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle) | ||
1618 | { | ||
1619 | holeHull.AddVertex(new Vertex(-0.500000f * hollowFactorF, 0.000000f * hollowFactorF, 0.0f)); // 180 degrees | ||
1620 | holeHull.AddVertex(new Vertex(-0.250000f * hollowFactorF, 0.433013f * hollowFactorF, 0.0f)); // 120 degrees | ||
1621 | holeHull.AddVertex(new Vertex(0.250000f * hollowFactorF, 0.433013f * hollowFactorF, 0.0f)); // 60 degrees | ||
1622 | holeHull.AddVertex(new Vertex(0.500000f * hollowFactorF, 0.000000f * hollowFactorF, 0.0f)); // 0 degrees | ||
1623 | } | ||
1540 | else | 1624 | else |
1541 | { | 1625 | { |
1542 | holeHull.AddVertex(new Vertex(+0.25f * hollowFactorF, -0.45f * hollowFactorF, 0.0f)); | 1626 | holeHull.AddVertex(new Vertex(+0.25f * hollowFactorF, -0.45f * hollowFactorF, 0.0f)); |
1543 | holeHull.AddVertex(new Vertex(-0.5f * hollowFactorF, -0f * hollowFactorF, 0.0f)); | 1627 | holeHull.AddVertex(new Vertex(-0.5f * hollowFactorF, -0f * hollowFactorF, 0.0f)); |
1544 | holeHull.AddVertex(new Vertex(+0.25f * hollowFactorF, +0.45f * hollowFactorF, 0.0f)); | 1628 | holeHull.AddVertex(new Vertex(+0.25f * hollowFactorF, +0.45f * hollowFactorF, 0.0f)); |
1629 | } | ||
1630 | } | ||
1631 | else if (hollowShape == HollowShape.Square && (primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle) | ||
1632 | { | ||
1633 | holeHull = new SimpleHull(); | ||
1545 | 1634 | ||
1546 | ////holeHull.AddVertex(new Vertex(-0.5f * hollowFactorF, -0f * hollowFactorF, 0.0f)); | 1635 | float hollowFactorF = (float)hollowFactor * 2.0e-5f; |
1547 | |||
1548 | ////holeHull.AddVertex(new Vertex(+0.25f * hollowFactorF, +0.45f * hollowFactorF, 0.0f)); | ||
1549 | |||
1550 | ////holeHull.AddVertex(new Vertex(+0.25f * hollowFactorF, -0.45f * hollowFactorF, 0.0f)); | ||
1551 | 1636 | ||
1552 | //holeHull.AddVertex(new Vertex(-0.5f * hollowFactorF, +0f * hollowFactorF, 0.0f)); | 1637 | holeHull.AddVertex(new Vertex(-0.707f * hollowFactorF, 0.0f, 0.0f)); // 180 degrees |
1553 | //holeHull.AddVertex(new Vertex(+0.25f * hollowFactorF, -0.45f * hollowFactorF, 0.0f)); | 1638 | holeHull.AddVertex(new Vertex(0.0f, 0.707f * hollowFactorF, 0.0f)); // 120 degrees |
1554 | //holeHull.AddVertex(new Vertex(+0.25f * hollowFactorF, +0.45f * hollowFactorF, 0.0f)); | 1639 | holeHull.AddVertex(new Vertex(0.707f * hollowFactorF, 0.0f, 0.0f)); // 60 degrees |
1555 | ////holeHull.AddVertex(new Vertex(-0.5f * hollowFactorF, +0f * hollowFactorF, 0.0f)); | ||
1556 | } | ||
1557 | } | 1640 | } |
1558 | else | 1641 | else |
1559 | { | 1642 | { |
@@ -1687,6 +1770,16 @@ namespace OpenSim.Region.Physics.Meshing | |||
1687 | //System.Console.WriteLine("[MESH]: twistTop = " + twistTop.ToString() + "|" + extr.twistTop.ToString() + ", twistMid = " + twistMid.ToString() + "|" + extr.twistMid.ToString() + ", twistbot = " + twistBot.ToString() + "|" + extr.twistBot.ToString()); | 1770 | //System.Console.WriteLine("[MESH]: twistTop = " + twistTop.ToString() + "|" + extr.twistTop.ToString() + ", twistMid = " + twistMid.ToString() + "|" + extr.twistMid.ToString() + ", twistbot = " + twistBot.ToString() + "|" + extr.twistBot.ToString()); |
1688 | Mesh result = extr.ExtrudeCircularPath(m); | 1771 | Mesh result = extr.ExtrudeCircularPath(m); |
1689 | result.DumpRaw(baseDir, primName, "Z extruded"); | 1772 | result.DumpRaw(baseDir, primName, "Z extruded"); |
1773 | |||
1774 | #if SPAM | ||
1775 | int vCount = 0; | ||
1776 | |||
1777 | foreach ( Vertex v in result.vertices ) | ||
1778 | if ( v != null ) | ||
1779 | vCount++; | ||
1780 | System.Console.WriteLine( "Mesh vertex count: " + vCount.ToString()); | ||
1781 | #endif | ||
1782 | |||
1690 | return result; | 1783 | return result; |
1691 | } | 1784 | } |
1692 | 1785 | ||
@@ -1839,7 +1932,8 @@ namespace OpenSim.Region.Physics.Meshing | |||
1839 | { | 1932 | { |
1840 | if (primShape.PathCurve == (byte)Extrusion.Curve1 || primShape.PathCurve == (byte) Extrusion.Curve2) | 1933 | if (primShape.PathCurve == (byte)Extrusion.Curve1 || primShape.PathCurve == (byte) Extrusion.Curve2) |
1841 | { | 1934 | { |
1842 | mesh = CreateSphereMesh(primName, primShape, size); | 1935 | //mesh = CreateSphereMesh(primName, primShape, size); |
1936 | mesh = CreateCircularPathMesh(primName, primShape, size); | ||
1843 | CalcNormals(mesh); | 1937 | CalcNormals(mesh); |
1844 | } | 1938 | } |
1845 | } | 1939 | } |