aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs133
1 files changed, 115 insertions, 18 deletions
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
index 0117800..c14abd0 100644
--- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
+++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs
@@ -43,8 +43,6 @@ using log4net;
43using Nini.Config; 43using Nini.Config;
44using System.Reflection; 44using System.Reflection;
45using System.IO; 45using System.IO;
46using System.Runtime.Serialization;
47using System.Runtime.Serialization.Formatters.Binary;
48 46
49using Mono.Addins; 47using Mono.Addins;
50 48
@@ -72,6 +70,8 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
72 private const string baseDir = null; //"rawFiles"; 70 private const string baseDir = null; //"rawFiles";
73 71
74 private bool useMeshiesPhysicsMesh = false; 72 private bool useMeshiesPhysicsMesh = false;
73 private bool doConvexPrims = true;
74 private bool doConvexSculpts = true;
75 75
76 private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh 76 private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh
77 77
@@ -103,18 +103,14 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
103 if (mesh_config != null) 103 if (mesh_config != null)
104 { 104 {
105 useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh); 105 useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh);
106 if (useMeshiesPhysicsMesh) 106
107 { 107 doConvexPrims = mesh_config.GetBoolean("ConvexPrims",doConvexPrims);
108 doMeshFileCache = mesh_config.GetBoolean("MeshFileCache", doMeshFileCache); 108 doConvexSculpts = mesh_config.GetBoolean("ConvexSculpts",doConvexPrims);
109 cachePath = mesh_config.GetString("MeshFileCachePath", cachePath); 109
110 fcache = mesh_config.GetFloat("MeshFileCacheExpireHours", fcache); 110 doMeshFileCache = mesh_config.GetBoolean("MeshFileCache", doMeshFileCache);
111 doCacheExpire = mesh_config.GetBoolean("MeshFileCacheDoExpire", doCacheExpire); 111 cachePath = mesh_config.GetString("MeshFileCachePath", cachePath);
112 } 112 fcache = mesh_config.GetFloat("MeshFileCacheExpireHours", fcache);
113 else 113 doCacheExpire = mesh_config.GetBoolean("MeshFileCacheDoExpire", doCacheExpire);
114 {
115 doMeshFileCache = false;
116 doCacheExpire = false;
117 }
118 114
119 m_Enabled = true; 115 m_Enabled = true;
120 } 116 }
@@ -330,6 +326,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
330 326
331 List<Coord> coords; 327 List<Coord> coords;
332 List<Face> faces; 328 List<Face> faces;
329 bool needsConvexProcessing = convex;
333 330
334 if (primShape.SculptEntry) 331 if (primShape.SculptEntry)
335 { 332 {
@@ -340,23 +337,49 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
340 337
341 if (!GenerateCoordsAndFacesFromPrimMeshData(primName, primShape, out coords, out faces, convex)) 338 if (!GenerateCoordsAndFacesFromPrimMeshData(primName, primShape, out coords, out faces, convex))
342 return null; 339 return null;
340 needsConvexProcessing = false;
343 } 341 }
344 else 342 else
345 { 343 {
346 if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, lod, out coords, out faces)) 344 if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, lod, out coords, out faces))
347 return null; 345 return null;
346 needsConvexProcessing &= doConvexSculpts;
348 } 347 }
349 } 348 }
350 else 349 else
351 { 350 {
352 if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, lod, convex, out coords, out faces)) 351 if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, lod, convex, out coords, out faces))
353 return null; 352 return null;
353 needsConvexProcessing &= doConvexPrims;
354 } 354 }
355 355
356
357 int numCoords = coords.Count; 356 int numCoords = coords.Count;
358 int numFaces = faces.Count; 357 int numFaces = faces.Count;
359 358
359 if(numCoords < 3 || (!needsConvexProcessing && numFaces < 1))
360 {
361 m_log.ErrorFormat("[MESH]: invalid degenerated mesh for prim {0} ignored", primName);
362 return null;
363 }
364
365 if(needsConvexProcessing)
366 {
367 List<Coord> convexcoords;
368 List<Face> convexfaces;
369 if(CreateHull(coords, out convexcoords, out convexfaces) && convexcoords != null && convexfaces != null)
370 {
371 coords.Clear();
372 coords = convexcoords;
373 numCoords = coords.Count;
374
375 faces.Clear();
376 faces = convexfaces;
377 numFaces = faces.Count;
378 }
379 else
380 m_log.ErrorFormat("[ubMESH]: failed to create convex for {0} using normal mesh", primName);
381 }
382
360 Mesh mesh = new Mesh(true); 383 Mesh mesh = new Mesh(true);
361 // Add the corresponding triangles to the mesh 384 // Add the corresponding triangles to the mesh
362 for (int i = 0; i < numFaces; i++) 385 for (int i = 0; i < numFaces; i++)
@@ -371,10 +394,10 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
371 faces.Clear(); 394 faces.Clear();
372 395
373 if(mesh.numberVertices() < 3 || mesh.numberTriangles() < 1) 396 if(mesh.numberVertices() < 3 || mesh.numberTriangles() < 1)
374 { 397 {
375 m_log.ErrorFormat("[MESH]: invalid degenerated mesh for prim " + primName + " ignored"); 398 m_log.ErrorFormat("[MESH]: invalid degenerated mesh for prim {0} ignored", primName);
376 return null; 399 return null;
377 } 400 }
378 401
379 primShape.SculptData = Utils.EmptyBytes; 402 primShape.SculptData = Utils.EmptyBytes;
380 403
@@ -1583,5 +1606,79 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
1583 catch { } 1606 catch { }
1584 } 1607 }
1585 } 1608 }
1609
1610 public bool CreateHull(List<Coord> inputVertices, out List<Coord> convexcoords, out List<Face> newfaces)
1611 {
1612 convexcoords = null;
1613 newfaces = null;
1614 HullDesc desc = new HullDesc();
1615 HullResult result = new HullResult();
1616
1617 int nInputVerts = inputVertices.Count;
1618 int i;
1619
1620 List<float3> vs = new List<float3>(nInputVerts);
1621 float3 f3;
1622
1623 //useless copy
1624 for(i = 0 ; i < nInputVerts; i++)
1625 {
1626 f3 = new float3(inputVertices[i].X, inputVertices[i].Y, inputVertices[i].Z);
1627 vs.Add(f3);
1628 }
1629
1630 desc.Vertices = vs;
1631 desc.Flags = HullFlag.QF_TRIANGLES;
1632 desc.MaxVertices = 256;
1633
1634 try
1635 {
1636 HullError ret = HullUtils.CreateConvexHull(desc, ref result);
1637 if (ret != HullError.QE_OK)
1638 return false;
1639 int nverts = result.OutputVertices.Count;
1640 int nindx = result.Indices.Count;
1641 if(nverts < 3 || nindx< 3)
1642 return false;
1643 if(nindx % 3 != 0)
1644 return false;
1645
1646 convexcoords = new List<Coord>(nverts);
1647 Coord c;
1648 vs = result.OutputVertices;
1649
1650 for(i = 0 ; i < nverts; i++)
1651 {
1652 c = new Coord(vs[i].x, vs[i].y, vs[i].z);
1653 convexcoords.Add(c);
1654 }
1655
1656 newfaces = new List<Face>(nindx / 3);
1657 List<int> indxs = result.Indices;
1658 int k, l, m;
1659 Face f;
1660 for(i = 0 ; i < nindx;)
1661 {
1662 k = indxs[i++];
1663 l = indxs[i++];
1664 m = indxs[i++];
1665 if(k > nInputVerts)
1666 continue;
1667 if(l > nInputVerts)
1668 continue;
1669 if(m > nInputVerts)
1670 continue;
1671 f = new Face(k,l,m);
1672 newfaces.Add(f);
1673 }
1674 return true;
1675 }
1676 catch
1677 {
1678
1679 return false;
1680 }
1681 return false;
1682 }
1586 } 1683 }
1587} 1684}