public IEnumerator LoadObjectFromDiskCR(string path, MeshLoader loader, GCodeHandler mc) { int layernum = 0; //create object to put all mesh types in var objectName = loader.GetObjectNameFromPath(path); var rootFolderOfObject = loader.dataPath + "/" + objectName; mc.RootForObject.transform.localPosition = Vector3.zero; mc.RootForObject.transform.localScale = Vector3.one; mc.RootForObject.transform.localRotation = Quaternion.identity; SortedDictionary <int, List <string> > sortedLayers = new SortedDictionary <int, List <string> >(); foreach (var folder in Directory.GetDirectories(rootFolderOfObject)) { var files = Directory.GetFiles(folder); foreach (var file in Directory.GetFiles(folder)) { var l = Convert.ToInt32(file.Substring(file.LastIndexOf(@" ") + 1, file.LastIndexOf(".") - file.LastIndexOf(@" ") - 1)); if (!sortedLayers.ContainsKey(l)) { sortedLayers.Add(l, new List <string>()); sortedLayers[l].Add(file); } else { sortedLayers[l].Add(file); } } } foreach (var layers in sortedLayers) { foreach (var file in layers.Value) { var typeString = file.Substring(file.LastIndexOf(@"\") + 1, file.LastIndexOf(' ') - file.LastIndexOf(@"\") - 1); mc.CreateTypeObject(typeString); var layername = file.Substring(file.LastIndexOf(@"\") + 1, file.LastIndexOf(".") - file.LastIndexOf(@"\") - 1); //get mesh from file var mesh = MeshSerializer.DeserializeMesh(File.ReadAllBytes(file)); //get the biggest layer number var l = mc.createLayerObject(layername, typeString, mesh); if (l > layernum) { layernum = l; } } yield return(null); } mc.endloading(layernum); }
internal void Update(GCodeHandler source) { if (loadingFromDisk == true) { loadingFromDisk = false; source.StartCoroutine(LoadObjectFromDiskCR(path, source)); } if (loadQueue.Count > 0 && loadingFromDisk) { KeyValuePair <string, Mesh> KeyValuepPairLayer = loadQueue.Dequeue(); dequeuedMeshes++; KeyValuePair <String, int> LayerInfo = source.createLayerObjects(KeyValuepPairLayer); string parent = LayerInfo.Key; //get the biggest layer number var l = LayerInfo.Value; if (l > layernum) { layernum = l; } dequeuedMeshes++; if (dequeuedMeshes == EnqueuedMeshes) { source.endloading(layernum); source.StartCoroutine(closeProgress()); loadingFromDisk = false; source.doneLoading.Invoke(); source.loading = false; } } //lock (meshSimplifierQueueLock) { if (meshSimplifierQueue.Count > 0) { if (meshSimplifierQueue.Peek().simplified) { var layer = meshSimplifierQueue.Peek(); Mesh destMesh = layer.MeshSimplifier.ToMesh(); layer.MeshFilter.mesh = destMesh; layer.MeshFilter.gameObject.GetComponent <MeshRenderer>().enabled = true; string folder = dataPath + "/" + source.RootForObject.gameObject.name + "/" + layer.MeshFilter.gameObject.transform.parent.gameObject.name + "/"; string fileName = layer.MeshFilter.gameObject.name + ".mesh"; meshLoaderDisk.SaveLayerAsAsset(destMesh, folder, fileName); lock (meshSimplifierQueueLock) { meshSimplifierQueue.Dequeue(); } } if (!issimplifying && meshSimplifierQueue.Count > 0) { issimplifying = true; Task.Run(() => simplyfyOne()); //if (simplify.ThreadState == ThreadState.Stopped ||simplify.ThreadState == ThreadState.Unstarted ) //{ // try // { // simplify = new Thread(simplyfyOne); // issimplifying = true; // simplify.Start(); // } // catch (Exception ex) // { // } //} } } else { //Debug.Log("nothing to simplify"); } } gcodeMeshGenerator.Update(source, this); if (gcodeMeshGenerator.createdLayers == simplifiedLayers && source.loading && filesLoadingfinished) { source.StartCoroutine(closeProgress()); filesLoadingfinished = false; simplifiedLayers = 0; gcodeMeshGenerator.createdLayers = 0; source.endloading(layernum); } }
internal void Update(GCodeHandler source, int threadcount, float quality) { meshsimplifyquality = quality; gcodeMeshGenerator.Update(source, this); if (loadQueue.Count > 0 && loadingFromDisk) { KeyValuePair <string, Mesh> KeyValuepPairLayer = loadQueue.Dequeue(); dequeuedMeshes++; KeyValuePair <String, int> LayerInfo = source.createLayerObjects(KeyValuepPairLayer); string parent = LayerInfo.Key; //get the biggest layer number var l = LayerInfo.Value; if (l > layernum) { layernum = l; } dequeuedMeshes++; if (dequeuedMeshes == EnqueuedMeshes) { source.endloading(layernum); loadingFromDisk = false; source.loading = false; } } List <Task> tasks = new List <Task>(); int lastnum = 0; int lastsaved = 0; while (meshSimplifierQueue.Count > lastsaved) { if (meshSimplifierQueue[lastsaved].simplified) { //Console.WriteLine("a " + DateTimeOffset.Now); var layer = meshSimplifierQueue[lastsaved]; Mesh destMesh = layer.ToSimplify; meshLoaderNet.SaveLayerAsAsset(destMesh, layer.name); lastsaved++; //lock (meshSimplifierQueueLock) //{ // meshSimplifierQueue.RemoveAt(0); //} } else { if (tasks.Count < threadcount && meshSimplifierQueue.Count > lastnum) { int actnum = lastnum; Task t = Task.Run(() => simplyfyOne(actnum)); lastnum++; tasks.Add(t); } else { if (tasks.Count > 0) { Task.WaitAny(tasks[0]); tasks.RemoveAt(0); } } //simplyfyOne(); } } gcodeMeshGenerator.Update(source, this); if (gcodeMeshGenerator.createdLayers == simplifiedLayers && source.loading && filesLoadingfinished) { //source.StartCoroutine(closeProgress()); filesLoadingfinished = false; simplifiedLayers = 0; gcodeMeshGenerator.createdLayers = 0; source.endloading(layernum); } }