diff options
author | Teravus Ovares | 2008-06-19 04:17:04 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-06-19 04:17:04 +0000 |
commit | e6ce30d4f142a75bdf581f2cf92ccb5c1d17e2f0 (patch) | |
tree | bfd5326ed4af7543996f2697dccfbe6810e90b1b /OpenSim/Region | |
parent | Mantis#1566. Thank you kindly for a number of (diff) | |
download | opensim-SC-e6ce30d4f142a75bdf581f2cf92ccb5c1d17e2f0.zip opensim-SC-e6ce30d4f142a75bdf581f2cf92ccb5c1d17e2f0.tar.gz opensim-SC-e6ce30d4f142a75bdf581f2cf92ccb5c1d17e2f0.tar.bz2 opensim-SC-e6ce30d4f142a75bdf581f2cf92ccb5c1d17e2f0.tar.xz |
* 0001571: (PATCH) patch to implement editable sphere meshes for meshmerizer/ode (Initial Implementation) from Dahlia! Thanks Dahlia!!!
* The included patch implements the editor parameters twist, dimple, path cut, and profile cut to the sphere mesh for meshmerizer. The mesh will default back to the geodesic sphere if the parameters are adjusted to beyond a reasonable arbitrarily chosen threshold that would expose too many inverted normals on the mesh.
Diffstat (limited to 'OpenSim/Region')
-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 | } |