private void Update() { if (activeFeature != null) { if (currentSketch != null && (currentSketch.GetSketch().IsConstraintsChanged() || currentSketch.GetSketch().IsEntitiesChanged()) || sys.IsDirty) { suppressSolve = false; } if (currentSketch != null && currentSketch.IsTopologyChanged()) { UpdateSystem(); } var res = (!suppressSolve || sys.HasDragged()) ? sys.Solve() : EquationSystem.SolveResult.DIDNT_CONVEGE; if (res == EquationSystem.SolveResult.DIDNT_CONVEGE) { suppressSolve = true; } string result = ""; result += (GC.GetTotalMemory(false) / 1024 / 1024.0).ToString("0.##") + " mb\n"; result += res.ToString() + "\n"; if (sys.dofChanged) { if (res == EquationSystem.SolveResult.OKAY && !sys.HasDragged()) { int dof; bool ok = sys.TestRank(out dof); if (!ok) { dofText = "<color=\"#FF3030\">DOF: " + dof + "</color>\n"; } else if (dof == 0) { dofText = "<color=\"#30FF30\">DOF: " + dof + "</color>\n"; } else { dofText = "<color=\"#FFFFFF\">DOF: " + dof + "</color>\n"; } } else { dofText = "<color=\"#303030\">DOF: ?</color>\n"; } } result += dofText; result += "Undo: " + undoRedo.Count() + "\n"; result += "UndoSize: " + undoRedo.Size() + "\n"; //result += sys.stats; resultText.text = result.ToString(); } detail.UpdateUntil(activeFeature); //detail.Update(); meshDirty = meshDirty | detail.features.OfType <MeshFeature>().Any(f => f.dirty); detail.MarkDirty(); detail.UpdateDirtyUntil(activeFeature); if (meshDirty && !suppressCombine) { meshDirty = false; mesh.Clear(); Solid result = null; int combinedCount = 0; foreach (var f in detail.features) { var mf = f as MeshFeature; if (mf != null) { if (result == null) { result = mf.solid; } else { if (mf.combined == null) { //#if UNITY_WEBGL //if(combinedCount > 0) { // break; //} //#endif switch (mf.operation) { case CombineOp.Union: mf.combined = Solids.Union(result, mf.solid); break; case CombineOp.Difference: mf.combined = Solids.Difference(result, mf.solid); break; case CombineOp.Intersection: mf.combined = Solids.Intersection(result, mf.solid); break; case CombineOp.Assembly: mf.combined = Solids.Assembly(result, mf.solid); break; } combinedCount++; } result = mf.combined; } } if (f == activeFeature) { break; } } Debug.Log("combined " + combinedCount + " meshes"); solid = result; if (result != null) { mesh.FromSolid(result); } } if (!CameraController.instance.IsMoving && !suppressHovering) { double dist = -1.0; hovered = detail.HoverUntil(Input.mousePosition, Camera.main, UnityEngine.Matrix4x4.identity, ref dist, activeFeature); /* * if(hovered == null && solid != null) { * var ray = Camera.main.ScreenPointToRay(Input.mousePosition); * var id = solid.Raytrace(ray); * selectedMesh.FromSolid(solid, id); * } else { * selectedMesh.Clear(); * }*/ } canvas.ClearStyle("hovered"); canvas.ClearStyle("hoveredPoints"); if (hovered != null) { DrawCadObject(hovered, "hovered"); } canvas.ClearStyle("selected"); canvas.ClearStyle("selectedPoints"); foreach (var idp in selection) { var obj = detail.GetObjectById(idp); if (obj == null) { continue; } DrawCadObject(obj, "selected"); } if (selection.Count == 1) { var obj = detail.GetObjectById(selection[0]); inspector.Inspect(obj); } else { inspector.Inspect(activeFeature); } if (activeFeature is SketchFeatureBase) { var sk = activeFeature as SketchFeatureBase; sk.DrawConstraints(canvas); //var skk = activeFeature as SketchFeature; //if(skk != null) skk.DrawTriangulation(canvas); } else { canvas.ClearStyle("constraints"); } }
private void Update() { if (activeFeature != null) { if (currentSketch != null && currentSketch.IsTopologyChanged()) { UpdateSystem(); } var res = sys.Solve(); string result = ""; result += (GC.GetTotalMemory(false) / 1024 / 1024.0).ToString("0.##") + " mb\n"; result += res.ToString() + "\n"; if (sys.dofChanged) { if (res == EquationSystem.SolveResult.OKAY && !sys.HasDragged()) { int dof; bool ok = sys.TestRank(out dof); if (!ok) { dofText = "<color=\"#FF3030\">DOF: " + dof + "</color>\n"; } else if (dof == 0) { dofText = "<color=\"#30FF30\">DOF: " + dof + "</color>\n"; } else { dofText = "<color=\"#FFFFFF\">DOF: " + dof + "</color>\n"; } } else { dofText = "<color=\"#303030\">DOF: ?</color>\n"; } } result += dofText; //result += sys.stats; resultText.text = result.ToString(); } detail.Update(); meshDirty = meshDirty | detail.features.OfType <MeshFeature>().Any(f => f.dirty); detail.MarkDirty(); detail.UpdateDirtyUntil(activeFeature); if (meshDirty && !suppressCombine) { meshDirty = false; mesh.Clear(); Solid result = null; int combinedCount = 0; foreach (var f in detail.features) { var mf = f as MeshFeature; if (mf != null) { if (result == null) { result = mf.solid; } else { if (mf.combined == null) { //#if UNITY_WEBGL //if(combinedCount > 0) { // break; //} //#endif switch (mf.operation) { case CombineOp.Union: mf.combined = Solids.Union(result, mf.solid); break; case CombineOp.Difference: mf.combined = Solids.Difference(result, mf.solid); break; case CombineOp.Intersection: mf.combined = Solids.Intersection(result, mf.solid); break; } combinedCount++; } result = mf.combined; } } if (f == activeFeature) { break; } } Debug.Log("combined " + combinedCount + " meshes"); solid = result; if (result != null) { mesh.FromSolid(result); } } double dist = -1.0; hovered = detail.HoverUntil(Input.mousePosition, Camera.main, UnityEngine.Matrix4x4.identity, ref dist, activeFeature); if (hovered == null && solid != null) { var ray = Camera.main.ScreenPointToRay(Input.mousePosition); var id = solid.Raytrace(ray); selectedMesh.FromSolid(solid, id); } else { selectedMesh.Clear(); } canvas.ClearStyle("hovered"); if (hovered != null) { canvas.SetStyle("hovered"); if (hovered is IEntity) { canvas.DrawSegments((hovered as IEntity).SegmentsInPlane(null)); } else if (hovered is SketchObject) { (hovered as SketchObject).Draw(canvas); } } if (activeFeature is SketchFeatureBase) { var sk = activeFeature as SketchFeatureBase; if (sk.ShouldRedrawConstraints() || justSwitchedToSketch) { sk.DrawConstraints(canvas); } } else { canvas.ClearStyle("constraints"); } }