From 8b2e95d1c1e1beb83c03bae435ae34ac479de292 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 23 Jul 2017 14:23:44 +0100 Subject: [PATCH] add a rudimentary version control to ubOde meshs cache --- .../ubOdeMeshing/Meshmerizer.cs | 180 +++++++++--------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index 010262fbdb..1233d48007 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs @@ -36,7 +36,7 @@ using OpenSim.Region.PhysicsModules.ConvexDecompositionDotNet; using OpenMetaverse; using OpenMetaverse.StructuredData; using System.Drawing; -using System.Drawing.Imaging; +using System.Threading; using System.IO.Compression; using PrimMesher; using log4net; @@ -56,15 +56,15 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing // Setting baseDir to a path will enable the dumping of raw files // raw files can be imported by blender so a visual inspection of the results can be done + private static string cacheControlFilename = "cntr"; private bool m_Enabled = false; public static object diskLock = new object(); public bool doMeshFileCache = true; - + public bool doCacheExpire = true; public string cachePath = "MeshCache"; public TimeSpan CacheExpire; - public bool doCacheExpire = true; // const string baseDir = "rawFiles"; private const string baseDir = null; //"rawFiles"; @@ -101,10 +101,8 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing if (mesh_config != null) { useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh); - doConvexPrims = mesh_config.GetBoolean("ConvexPrims",doConvexPrims); doConvexSculpts = mesh_config.GetBoolean("ConvexSculpts",doConvexPrims); - doMeshFileCache = mesh_config.GetBoolean("MeshFileCache", doMeshFileCache); cachePath = mesh_config.GetString("MeshFileCachePath", cachePath); fcache = mesh_config.GetFloat("MeshFileCacheExpireHours", fcache); @@ -115,22 +113,19 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing CacheExpire = TimeSpan.FromHours(fcache); - lock (diskLock) + if(String.IsNullOrEmpty(cachePath)) + doMeshFileCache = false; + + if(doMeshFileCache) { - if(doMeshFileCache && cachePath != "") + if(!checkCache()) { - try - { - if (!Directory.Exists(cachePath)) - Directory.CreateDirectory(cachePath); - } - catch - { - doMeshFileCache = false; - doCacheExpire = false; - } + doMeshFileCache = false; + doCacheExpire = false; } } + else + doCacheExpire = false; } } @@ -283,7 +278,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing { List convexcoords; List convexfaces; - if(CreateHull(coords, out convexcoords, out convexfaces) && convexcoords != null && convexfaces != null) + if(CreateBoundingHull(coords, out convexcoords, out convexfaces) && convexcoords != null && convexfaces != null) { coords.Clear(); coords = convexcoords; @@ -565,45 +560,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing vs.Clear(); continue; } - /* - if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f)) - { - vs.Clear(); - continue; - } - nverts = hullr.Vertices.Count; - nindexs = hullr.Indices.Count; - - if (nindexs % 3 != 0) - { - vs.Clear(); - continue; - } - - for (i = 0; i < nverts; i++) - { - c.X = hullr.Vertices[i].x; - c.Y = hullr.Vertices[i].y; - c.Z = hullr.Vertices[i].z; - coords.Add(c); - } - - for (i = 0; i < nindexs; i += 3) - { - t1 = hullr.Indices[i]; - if (t1 > nverts) - break; - t2 = hullr.Indices[i + 1]; - if (t2 > nverts) - break; - t3 = hullr.Indices[i + 2]; - if (t3 > nverts) - break; - f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3); - faces.Add(f); - } - */ List indices; if (!HullUtils.ComputeHull(vs, out indices)) { @@ -709,38 +666,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing vs.Clear(); return true; } -/* - if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f)) - return false; - nverts = hullr.Vertices.Count; - nindexs = hullr.Indices.Count; - - if (nindexs % 3 != 0) - return false; - - for (i = 0; i < nverts; i++) - { - c.X = hullr.Vertices[i].x; - c.Y = hullr.Vertices[i].y; - c.Z = hullr.Vertices[i].z; - coords.Add(c); - } - for (i = 0; i < nindexs; i += 3) - { - t1 = hullr.Indices[i]; - if (t1 > nverts) - break; - t2 = hullr.Indices[i + 1]; - if (t2 > nverts) - break; - t3 = hullr.Indices[i + 2]; - if (t3 > nverts) - break; - f = new Face(t1, t2, t3); - faces.Add(f); - } -*/ List indices; if (!HullUtils.ComputeHull(vs, out indices)) return false; @@ -1353,7 +1279,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing } } - public void FileNames(AMeshKey key, out string dir,out string fullFileName) + public void FileNames(AMeshKey key, out string dir, out string fullFileName) { string id = key.ToString(); string init = id.Substring(0, 1); @@ -1470,7 +1396,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing if (!doCacheExpire) return; - string controlfile = System.IO.Path.Combine(cachePath, "cntr"); + string controlfile = System.IO.Path.Combine(cachePath, cacheControlFilename); lock (diskLock) { @@ -1524,7 +1450,81 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing } } - public bool CreateHull(List inputVertices, out List convexcoords, out List newfaces) + public bool checkCache() + { + string controlfile = System.IO.Path.Combine(cachePath, cacheControlFilename); + lock (diskLock) + { + try + { + if (!Directory.Exists(cachePath)) + { + Directory.CreateDirectory(cachePath); + Thread.Sleep(100); + FileStream fs = File.Create(controlfile, 4096, FileOptions.WriteThrough); + fs.Close(); + return true; + } + } + catch + { + doMeshFileCache = false; + doCacheExpire = false; + return false; + } + finally {} + + if (File.Exists(controlfile)) + return true; + + try + { + Directory.Delete(cachePath, true); + while(Directory.Exists(cachePath)) + Thread.Sleep(100); + } + catch(Exception e) + { + m_log.Error("[MESH CACHE]: failed to delete old version of the cache: " + e.Message); + doMeshFileCache = false; + doCacheExpire = false; + return false; + } + finally {} + try + { + Directory.CreateDirectory(cachePath); + while(!Directory.Exists(cachePath)) + Thread.Sleep(100); + } + catch(Exception e) + { + m_log.Error("[MESH CACHE]: failed to create new cache folder: " + e.Message); + doMeshFileCache = false; + doCacheExpire = false; + return false; + } + finally {} + + try + { + FileStream fs = File.Create(controlfile, 4096, FileOptions.WriteThrough); + fs.Close(); + } + catch(Exception e) + { + m_log.Error("[MESH CACHE]: failed to create new control file: " + e.Message); + doMeshFileCache = false; + doCacheExpire = false; + return false; + } + finally {} + + return true; + } + } + + public bool CreateBoundingHull(List inputVertices, out List convexcoords, out List newfaces) { convexcoords = null; newfaces = null;