Ejemplo n.º 1
0
    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");
        }
    }