Exemplo n.º 1
0
    public void Generate()
    {
        var wythoff = new WythoffPoly(PolyType, PrismP, PrismQ);

        wythoff.BuildFaces();
        poly = new ConwayPoly(wythoff);
        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.01, 0.01);
        }

        poly = poly.Transform(Position, Rotation, Scale);

        var pos = SlicePosition;

        if (animateSlice > 0)
        {
            pos.y = .1f + transform.position.y + ((Time.time % 2f) * animateSlice);
        }

        var result = poly.SliceByPlane(new Plane(Quaternion.Euler(SliceRotation) * Vector3.up, pos), Cap, includeTop, includeBottom);

        poly = result.bottom;
        var top = result.top.Transform(topTransform);

        poly.Append(top);

        // var sliceWythoff = new WythoffPoly(PolyTypes.Cube, 3, 3);
        // sliceWythoff.BuildFaces();
        // var slicePoly = new ConwayPoly(wythoff);
        // slicePoly = slicePoly.Transform(SlicePosition, SliceRotation, Vector3.one * SliceScale);
        // var result = poly.SliceByPoly(slicePoly, Cap);
        // poly = result.outside;
        // var top = result.outside.Transform(topTransform);

        if (Weld)
        {
            poly = poly.Weld(0.0001f);
        }

        if (ApplyOp)
        {
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 2
0
    public void Generate()
    {
        poly = Grids.Grids.MakeGrid(GridType, GridShape, width, depth);
        poly.ClearTags();
        poly.TagFaces("#FFFFFF", filter: whiteFilter);
        poly.TagFaces("#000000", filter: blackFilter);

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
            var o3 = new OpParams {
                valueA = op3Amount1, valueB = op3Amount2, facesel = op3Facesel
            };
            poly = poly.ApplyOp(op3, o3);
        }
        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, meshColors, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 3
0
    public void Generate()
    {
        var poly = JohnsonPoly.BuildOther(otherPolyType, sides, segments);

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }
        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.1, 0.1);
        }
        poly = poly.Transform(Position, Rotation, Scale);

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 4
0
    public void Generate()
    {
        poly = WatermanPoly.Build(1f, root, c, MergeFaces);

        if (ApplyOps)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.1, 0.1);
        }

        poly = poly.Transform(Position, Rotation, Scale);

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, Colors, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 5
0
    public void Generate()
    {
        var colorMethod = ColorBySides ? PolyHydraEnums.ColorMethods.BySides : PolyHydraEnums.ColorMethods.ByRole;
        var poly        = Grids.Grids.MakeGrid(GridType, GridShape, width, depth);

        poly = poly.FaceRemove(new OpParams {
            facesel = removeSelection
        });
        for (int i = 0; i < repeats; i++)
        {
            float angle = Mathf.Sin(((float)i / repeats) * frequency * Mathf.PI) * amplitude;
            poly = poly.ExtendBoundaries(new OpParams {
                valueA = amount, valueB = angle
            });
        }

        if (ApplyOp)
        {
            var o = new OpParams {
                valueA = opAmount, valueB = op2Amount, facesel = facesel
            };
            poly = poly.ApplyOp(op, o);
        }

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, colorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 6
0
        /// <summary>
        /// 更新後端作業選項
        /// </summary>
        public bool UpdateOperaionData(OpParams param)
        {
            bool result = false;

            using (EmployeeAuthorityDataAccess empAuthDao = new EmployeeAuthorityDataAccess())
            {
                Operations entity = empAuthDao.GetEmptyEntity <Operations>(new OperationsRequiredPropValues()
                {
                    OpId        = param.OpId,
                    IsNewWindow = !param.IsNewWindow,
                    IsHideSelf  = !param.IsHideSelf
                });

                entity.OpId           = param.OpId;
                entity.OpSubject      = param.OpSubject;
                entity.LinkUrl        = param.LinkUrl;
                entity.IsNewWindow    = param.IsNewWindow;
                entity.IconImageFile  = param.IconImageFile;
                entity.SortNo         = param.SortNo;
                entity.IsHideSelf     = param.IsHideSelf;
                entity.CommonClass    = param.CommonClass;
                entity.EnglishSubject = param.EnglishSubject;
                entity.MdfAccount     = param.PostAccount;
                entity.MdfDate        = DateTime.Now;

                result   = empAuthDao.Update();
                dbErrMsg = empAuthDao.GetErrMsg();
            }

            return(result);
        }
Exemplo n.º 7
0
    public void Generate()
    {
        var wythoff = new WythoffPoly(PolyType, PrismP, PrismQ);

        wythoff.BuildFaces();
        poly = new ConwayPoly(wythoff);

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.01, 0.01);
        }


        poly = poly.LoftAlongProfile(new OpParams(DomeDepth, DomeHeight, domeFaceSel), Profile, Shear, shearDirection, flipProfile: FlipProfile);

        // poly = poly.Transform(Position, Rotation, Scale);

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, Colors, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 8
0
    public void Generate()
    {
        var poly = Grids.Grids.MakeGrid(GridType, GridShape, width, depth);

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1 * Mathf.Abs(op1Animate ? Mathf.Sin(Time.time) : 1), valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
        }
        poly = poly.LoftAlongProfile(domeFaceSel, DomeHeight, DomeSegments, easingType);
        if (ApplyOp)
        {
            var o2 = new OpParams {
                valueA = op2Amount1 * Mathf.Abs(op2Animate ? Mathf.Cos(Time.time * .6f) : 1), valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }
        poly = poly.Transform(Position, Rotation, Scale);

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 9
0
    protected void rptSubitems_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        bool result = false;
        int  opId   = 0;

        switch (e.CommandName)
        {
        case "Del":
            string[] args = e.CommandArgument.ToString().Split(',');
            opId = Convert.ToInt32(args[0]);
            string   subject = args[1];
            OpParams param   = new OpParams()
            {
                OpId = opId
            };

            result = empAuth.DeleteOperationData(param);

            //新增後端操作記錄
            empAuth.InsertBackEndLogData(new BackEndLogData()
            {
                EmpAccount  = c.GetEmpAccount(),
                Description = string.Format(".刪除作業選項/Delete operation .代碼/id[{0}] 標題/subject[{1}] 結果/result[{2}]", opId, subject, result),
                IP          = c.GetClientIP()
            });

            // log to file
            c.LoggerOfUI.InfoFormat("{0} deletes {1}, result: {2}", c.GetEmpAccount(), "op-" + opId.ToString() + "-" + subject, result);

            if (!result)
            {
                if (param.IsThereSubitemOfOp)
                {
                    Master.ShowErrorMsg(Resources.Lang.ErrMsg_ThereIsSubitemofOp);
                }
                else
                {
                    Master.ShowErrorMsg(Resources.Lang.ErrMsg_DeleteOperationFailed);
                }
            }

            break;

        case "MoveUp":
            opId   = Convert.ToInt32(e.CommandArgument);
            result = empAuth.DecreaseOperationSortNo(opId, c.GetEmpAccount());
            break;

        case "MoveDown":
            opId   = Convert.ToInt32(e.CommandArgument);
            result = empAuth.IncreaseOperationSortNo(opId, c.GetEmpAccount());
            break;
        }

        if (result)
        {
            DisplaySubitems();
            Master.RefreshOpMenu();
        }
    }
Exemplo n.º 10
0
    public void Generate()
    {
        var wythoff = new WythoffPoly(PolyType, PrismP, PrismQ);

        wythoff.BuildFaces();
        poly = new ConwayPoly(wythoff);
        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.01, 0.01);
        }

        poly = poly.Transform(Position, Rotation, Scale);

        var pos = SlicePosition;

        if (animateSlice > 0)
        {
            pos.y = .1f + transform.position.y + ((Time.time % 2f) * animateSlice);
        }

        var rot        = Quaternion.Euler(SliceRotation) * Vector3.up;
        var slicePlane = new Plane(rot, pos);
        var result     = poly.SliceByPlane(slicePlane, Cap, includeTop, includeBottom);

        poly = result.bottom;
        var slicePoint = slicePlane.normal * (-slicePlane.distance + SegmentHeight);

        slicePlane.SetNormalAndPosition(slicePlane.normal, slicePoint);
        var(top, segment, _) = result.top.SliceByPlane(slicePlane, Cap, includeTop, includeBottom);
        segment = segment.Transform(SegmentTransform);
        poly.Append(top);
        poly.Append(segment);

        if (Weld)
        {
            poly = poly.Weld(0.0001f);
        }

        if (ApplyOp)
        {
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 11
0
    public void Generate()
    {
        var wythoff = new WythoffPoly(PolyType, PrismP, PrismQ);

        wythoff.BuildFaces();
        var        poly = new ConwayPoly(wythoff);
        ConwayPoly d, x, xd, dx, dxd;
        var        o = new OpParams {
            valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
        };

        d = poly.Dual();

        x = poly.ApplyOp(op, o);

        xd = d.ApplyOp(op, o);

        dx = poly.ApplyOp(op, o);
        dx = dx.Dual();

        dxd = d.ApplyOp(op, o);
        dxd = dxd.Dual();

        if (Canonicalize)
        {
            x   = x.Canonicalize(0.01, 0.01);
            dx  = dx.Canonicalize(0.01, 0.01);
            dxd = dxd.Canonicalize(0.01, 0.01);
            xd  = xd.Canonicalize(0.01, 0.01);
        }

        Debug.Log($"x: {x.vef.v},{x.vef.e},{x.vef.f}");
        Debug.Log($"xd: {xd.vef.v},{xd.vef.e},{xd.vef.f}");
        Debug.Log($"dx: {dx.vef.v},{dx.vef.e},{dx.vef.f}");
        Debug.Log($"dxd: {dxd.vef.v},{dxd.vef.e},{dxd.vef.f}");

        var allPoly = new ConwayPoly();

        x   = x.Transform(-Vector3.left);
        xd  = xd.Transform(Vector3.left * 2);
        dx  = dx.Transform(Vector3.left * 4);
        dxd = dxd.Transform(Vector3.left * 6);

        allPoly.Append(x);
        allPoly.Append(xd);
        allPoly.Append(dx);
        allPoly.Append(dxd);
        allPoly.Recenter();

        allPoly = allPoly.Transform(Position, Rotation, Scale);

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(allPoly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 12
0
    public void FindOpMatches(ConwayPoly sourcePoly, string sourcePolyName, ConwayPoly targetPoly, string targetPolyName)
    {
        // int v = poly.Vertices.Count;
        // int e = poly.EdgeCount;
        // int f = poly.Faces.Count;
        //
        // // Compare predicted and actual v,e,f
        // Debug.Log($"{v} {e} {f} = {PolyHydraEnums.CalcVef(poly, op2)}");

        // Loops through all Conway ops and records which ones
        // Result in matching Vertex, Edge and Face counts

        var matches = new Dictionary <int[], List <Ops> >();

        // For all ops use:
        // var opCount = ((Ops[]) Enum.GetValues(typeof(Ops))).Length;
        // Just the conway ops
        var opCount = 34;

        var targetFaceTypes = targetPoly.GetFaceCountsByType();

        for (var i = 1; i < 34; i++)
        {
            var o = new OpParams {
                valueA = 0.2f, valueB = 0.2f, facesel = FaceSelections.All
            };
            var newPoly = sourcePoly.ApplyOp((Ops)i, o);

            var sourceFaceTypes = newPoly.GetFaceCountsByType();
            if (!sourceFaceTypes.SequenceEqual(targetFaceTypes))
            {
                continue;
            }
            if (!matches.ContainsKey(sourceFaceTypes))
            {
                matches[sourceFaceTypes] = new List <Ops>();
            }
            matches[sourceFaceTypes].Add((Ops)i);
        }

        if (matches.Count < 1)
        {
            return;
        }
        Debug.Log($"Matching {sourcePolyName} and {targetPolyName}: {matches.Count} matches");
        foreach (var match in matches)
        {
            // if (match.Value.Count < 2) continue;
            var lst = string.Join(",", match.Value);
            Debug.Log($"{lst}");
        }
    }
Exemplo n.º 13
0
    public static ConwayPoly ApplyOp(ConwayPoly conway, ref ConwayPoly stash, ConwayOperator op)
    {
        float amount   = op.amount;
        var   opParams = new OpParams
        {
            valueA    = amount,
            valueB    = op.amount2,
            randomize = op.randomize,
            facesel   = op.faceSelections
        };

        conway = conway.ApplyOp(op.opType, opParams);
        return(conway);
    }
Exemplo n.º 14
0
        /// <summary>
        /// 刪除後端作業選項
        /// </summary>
        public bool DeleteOperationData(OpParams param)
        {
            bool result = false;

            using (EmployeeAuthorityDataAccess empAuthDao = new EmployeeAuthorityDataAccess())
            {
                result   = empAuthDao.DeleteOperationData(param.OpId);
                dbErrMsg = empAuthDao.GetErrMsg();

                if (!result && empAuthDao.GetSqlErrNumber() == 50000 && empAuthDao.GetSqlErrState() == 2)
                {
                    param.IsThereSubitemOfOp = true;
                }
            }

            return(result);
        }
Exemplo n.º 15
0
    public void Generate()
    {
        switch (ShapeType)
        {
        case ShapeTypes.Wythoff:
            var wythoff1 = new WythoffPoly(PolyType1, P1, Q1);
            wythoff1.BuildFaces();
            poly1 = new ConwayPoly(wythoff1);
            var wythoff2 = new WythoffPoly(PolyType2, P2, Q2);
            wythoff2.BuildFaces();
            poly2 = new ConwayPoly(wythoff2);
            break;

        case ShapeTypes.Johnson:
            poly1 = JohnsonPoly.Build(JohnsonPolyType1, P1);
            poly2 = JohnsonPoly.Build(JohnsonPolyType2, P2);
            break;

        case ShapeTypes.Grid:
            poly1 = Grids.Grids.MakeGrid(GridType, GridShape1, P1, Q1, false);
            poly2 = Grids.Grids.MakeGrid(GridType, GridShape2, P2, Q2, false);
            break;
        }

        var o1 = new OpParams {
            valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
        };

        poly1 = poly1.ApplyOp(op1, o1);

        var o2 = new OpParams {
            valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
        };

        poly2 = poly2.ApplyOp(op2, o2);

        poly1.Morph(poly2, morphAmount, reverseVertexOrder);

        // Final Mesh
        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly1, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 16
0
    public void Generate()
    {
        poly = JohnsonPoly.Build(JohnsonPolyType, sides);


        Face face;
        var  sidesFilter = poly.FaceselToFaceFilterFunc(FaceSelections.FourSided);
        var  roleFilter  = poly.FaceselToFaceFilterFunc(FaceSelections.New);
        Func <FilterParams, bool> filterFunc = x => sidesFilter(x);

        for (int i = 0; i < splits; i++)
        {
            face = poly.GetFace(new OpParams(filterFunc), 0);
            if (face != null)
            {
                var edges = face.GetHalfedges();
                poly = poly.SplitLoop(poly.GetFaceLoop(edges[edgeIndex % edges.Count]), splitRatio);
            }
            // Change the filter after the first loop iteration as we can
            // ensure we get the right face based on it's role
            filterFunc = x => sidesFilter(x) && roleFilter(x);
        }

        if (ApplyOp)
        {
            var o1 = new OpParams(op1Amount1, op1Amount2, op1Facesel);
            poly = poly.ApplyOp(op1, o1);

            var o2 = new OpParams(op2Amount1, op2Amount2, op2Facesel);
            poly = poly.ApplyOp(op2, o2);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.1, 0.1);
        }

        poly = poly.Transform(Position, Rotation, Scale);

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 17
0
        /// <summary>
        /// 新增後端作業選項
        /// </summary>
        public bool InsertOperationData(OpParams param)
        {
            InsertResult insResult = new InsertResult()
            {
                IsSuccess = false
            };

            using (EmployeeAuthorityDataAccess empAuthDao = new EmployeeAuthorityDataAccess())
            {
                int?objParentId = null;

                if (param.ParentId != 0)
                {
                    objParentId = param.ParentId;
                }

                Operations entity = new Operations()
                {
                    ParentId       = objParentId,
                    OpSubject      = param.OpSubject,
                    LinkUrl        = param.LinkUrl,
                    IsNewWindow    = param.IsNewWindow,
                    IconImageFile  = param.IconImageFile,
                    SortNo         = param.SortNo,
                    IsHideSelf     = param.IsHideSelf,
                    CommonClass    = param.CommonClass,
                    EnglishSubject = param.EnglishSubject,
                    PostAccount    = param.PostAccount,
                    PostDate       = DateTime.Now
                };

                insResult = empAuthDao.Insert <Operations>(entity);
                dbErrMsg  = empAuthDao.GetErrMsg();

                if (insResult.IsSuccess)
                {
                    param.OpId = (int)insResult.NewId;
                }
            }

            return(insResult.IsSuccess);
        }
Exemplo n.º 18
0
    public void Generate()
    {
        var poly        = Grids.Grids.MakeGrid(GridType, GridShape, width, depth);
        var colorMethod = ColorBySides ? PolyHydraEnums.ColorMethods.BySides : PolyHydraEnums.ColorMethods.ByRole;

        if (ApplyOp)
        {
            var o = new OpParams {
                valueA = opAmount, valueB = op2Amount, facesel = facesel
            };
            poly = poly.ApplyOp(op, o);
        }

        var bitsJoined = Enumerable.Repeat("".PadRight(width, '1'), depth).ToArray();

        for (var i = 0; i < bits.Split(new[] { Environment.NewLine }, StringSplitOptions.None).Length; i++)
        {
            var line = bits.Split(new[] { Environment.NewLine }, StringSplitOptions.None)[i];
            bitsJoined[i] = line.PadRight(width, '0').Substring(0, width);
        }
        Func <FilterParams, bool> filterFunc = f =>
        {
            int x = Mathf.FloorToInt(f.index / width);
            int y = f.index % width;
            Debug.Log($"{f.index} {x}x{y}");
            return(!(x < bitsJoined[y].Length && bitsJoined[y].Substring(x, 1) == "1"));
        };

        poly = poly.FaceRemove(new OpParams {
            filterFunc = filterFunc
        });
        poly = poly.Shell(new OpParams {
            valueA = extrusionAmount
        });

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, colorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 19
0
    public Mesh MakeMorphTarget(int morphIndex, float amount)
    {
        var morphedPoly = poly.Duplicate();

        for (var i = 0; i < Morphs.Count; i++)
        {
            float a           = i == morphIndex ? amount : 0; // Zero amount for ops other than the requested one
            var   morphOp     = Morphs[i];
            var   morphParams = new OpParams(
                Mathf.Lerp(morphOp.opAmount1Start, morphOp.opAmount1End, a),
                Mathf.Lerp(morphOp.opAmount2Start, morphOp.opAmount2End, a),
                morphOp.opFacesel
                );
            morphedPoly = morphedPoly.ApplyOp(morphOp.op, morphParams);
            morphedPoly = morphedPoly.ApplyOp(PostMorph.op, new OpParams(PostMorph.opAmount1, PostMorph.opAmount2, PostMorph.opFacesel));
        }
        var result = PolyMeshBuilder.BuildMeshFromConwayPoly(morphedPoly, false, null, ColorMethod);

        // result.RecalculateNormals();
        // result.RecalculateTangents();
        return(result);
    }
Exemplo n.º 20
0
    public void Generate()
    {
        var colorMethod = ColorBySides ? PolyHydraEnums.ColorMethods.BySides : PolyHydraEnums.ColorMethods.ByRole;
        var poly        = Grids.Grids.MakeGrid(GridType, GridShape, width, depth);

        poly = poly.FaceRemove(new OpParams {
            facesel = removeSelection
        });
        poly = poly.ExtendBoundaries(new OpParams {
            valueA = amount, valueB = angle
        });

        if (ApplyOp)
        {
            var o = new OpParams {
                valueA = opAmount, valueB = op2Amount, facesel = facesel
            };
            poly = poly.ApplyOp(op, o);
        }

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, colorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 21
0
    public void Generate()
    {
        if (Random.seed != 0)
        {
            Random.seed = RandomSeed;
        }

        poly = JohnsonPoly.Build(JohnsonPolyType, Sides);
        poly = poly.Transform(PositionBefore, RotationBefore, ScaleBefore);

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.01, 0.01);
        }

        // poly.Recenter();

        ConwayPoly DoSlices(ConwayPoly input, Vector3 axis)
        {
            var   result = new ConwayPoly();
            float offset = SliceStart;

            do
            {
                offset += Random.Range(SliceMin, SliceMax);
                var planePos  = new Vector3(offset * axis.x, offset * axis.y, offset * axis.z);
                var sliced    = input.SliceByPlane(new Plane(Quaternion.Euler(SliceAngle) * axis, planePos), Cap);
                var gapVector = new Vector3(-Gap * axis.x, -Gap * axis.y, -Gap * axis.z);
                result = result.Transform(gapVector);
                float randomShift       = Random.Range(ShiftMin, ShiftMax);
                var   randomShiftVector = new Vector3(randomShift * axis.y, randomShift * axis.z, randomShift * axis.x);
                result.Append(sliced.bottom.Transform(randomShiftVector));
                input = sliced.top;
            } while (offset < SliceEnd);

            result.Append(input);
            if (Weld)
            {
                result = result.Weld(0.0001f);
            }
            return(result);
        }

        if (SliceX)
        {
            poly = DoSlices(poly, Vector3.right);
        }
        if (SliceY)
        {
            poly = DoSlices(poly, Vector3.up);
        }
        if (SliceZ)
        {
            poly = DoSlices(poly, Vector3.forward);
        }

        // if (Weld)
        // {
        //     poly = poly.Weld(0.0001f);
        // }

        if (ApplyOp)
        {
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }

        // poly.Recenter();

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 22
0
    protected void btnSave_Click(object sender, EventArgs e)
    {
        if (!IsValid)
        {
            return;
        }

        try
        {
            txtOpSubject.Text      = txtOpSubject.Text.Trim();
            txtEnglishSubject.Text = txtEnglishSubject.Text.Trim();
            txtIconImageFile.Text  = txtIconImageFile.Text.Trim();
            txtLinkUrl.Text        = txtLinkUrl.Text.Trim();
            txtCommonClass.Text    = txtCommonClass.Text.Trim();

            OpParams param = new OpParams()
            {
                SortNo         = Convert.ToInt32(txtSortNo.Text),
                OpSubject      = txtOpSubject.Text,
                EnglishSubject = txtEnglishSubject.Text,
                IconImageFile  = txtIconImageFile.Text,
                LinkUrl        = txtLinkUrl.Text,
                IsNewWindow    = chkIsNewWindow.Checked,
                IsHideSelf     = chkIsHideSelf.Checked,
                CommonClass    = txtCommonClass.Text,
                PostAccount    = c.GetEmpAccount()
            };

            bool result = false;

            if (c.qsAct == ConfigFormAction.add)
            {
                param.ParentId = c.qsId;
                result         = empAuth.InsertOperationData(param);

                if (!result)
                {
                    Master.ShowErrorMsg(Resources.Lang.ErrMsg_AddFailed);
                }
            }
            else if (c.qsAct == ConfigFormAction.edit)
            {
                param.OpId = c.qsId;
                result     = empAuth.UpdateOperaionData(param);

                if (!result)
                {
                    Master.ShowErrorMsg(Resources.Lang.ErrMsg_UpdateFailed);
                }
            }

            if (result)
            {
                ClientScript.RegisterStartupScript(this.GetType(), "", StringUtility.GetNoticeOpenerJs("Config"), true);
            }

            //新增後端操作記錄
            empAuth.InsertBackEndLogData(new BackEndLogData()
            {
                EmpAccount  = c.GetEmpAccount(),
                Description = string.Format(".{0} .儲存後端作業選項/Save operation[{1}][{2}] OpId[{3}] 結果/result[{4}]", Title, txtOpSubject.Text, txtEnglishSubject.Text, param.OpId, result),
                IP          = c.GetClientIP()
            });
        }
        catch (Exception ex)
        {
            c.LoggerOfUI.Error("", ex);
            Master.ShowErrorMsg(ex.Message);
        }
    }
Exemplo n.º 23
0
    public void Generate()
    {
        switch (ShapeType)
        {
        case ShapeTypes.Wythoff:
            var wythoff = new WythoffPoly(PolyType, PrismP, PrismQ);
            wythoff.BuildFaces();
            poly = new ConwayPoly(wythoff);
            break;

        case ShapeTypes.Johnson:
            poly = JohnsonPoly.Build(JohnsonPolyType, PrismP);
            break;

        case ShapeTypes.Grid:
            poly = Grids.Grids.MakeGrid(GridType, GridShape, PrismP, PrismQ);
            break;
        }

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
        }

        if (PreCanonicalize)
        {
            poly = poly.Canonicalize(0.01, 0.01);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.01, 0.01);
        }

        if (ApplyOp)
        {
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
            var o3 = new OpParams {
                valueA = op3Amount1, valueB = op3Amount2, facesel = op3Facesel
            };
            poly = poly.ApplyOp(op3, o3);
        }

        var points = poly.ListVerticesByPoints().ToList();

        if (JitterAmount > 0)
        {
            for (int i = 0; i < points.Count(); i++)
            {
                var point = points[i];
                points[i] = new Vector3(
                    point.x + Random.value * JitterAmount,
                    point.y + Random.value * JitterAmount,
                    point.z + Random.value * JitterAmount
                    );
            }
        }
        var faceIndices = poly.ListFacesByVertexIndices();

        // This whole mess is because I can't find a way to regenerate
        // a probuilder mesh and therefore have to continually create/destroy gameobjects
        // (which is a mess in edit mode)
        // If anyone can explain how to simply take an existing probuilder object clear it
        // and pass in a list of Vector3's and lists of ordered indexes for faces
        // then please do.

        if (pbmesh != null && pbmesh.gameObject != null)
        {
            if (Application.isPlaying)
            {
                Destroy(pbmesh.gameObject);
            }
            else
            {
                var go = pbmesh.gameObject;
                UnityEditor.EditorApplication.delayCall += () =>
                {
                    DestroyImmediate(go);
                };
            }
        }
        var colors = Enumerable.Range(0, 8).Select(x => Colors.Evaluate(((x / 8f) * ColorRange + ColorOffset) % 1)).ToArray();

        pbmesh = ProBuilderMesh.Create(points, new List <Face>());
        var faces = new List <PBFace>();

        for (var i = 0; i < faceIndices.Length; i++)
        {
            var face   = faceIndices[i];
            var result = AppendElements.CreatePolygon(pbmesh, face, false);
            if (result != null)
            {
                pbmesh.SetFaceColor(result, colors[(int)poly.FaceRoles[i]]);
                faces.Add(result);
            }
        }

        if (faces.Count < 1 || pbmesh == null)
        {
            return;
        }

        pbmesh.SetMaterial(faces, material);
        pbmesh.ToMesh();
        pbmesh.Refresh();
    }
Exemplo n.º 24
0
    public void Generate()
    {
        poly = JohnsonPoly.Build(JohnsonPolyType, sides);

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
        }

        // Find and remove the edge loop
        var face         = poly.Faces[ConwayPoly.ActualMod(StartingFace, poly.Faces.Count)];
        var edges        = face.GetHalfedges();
        var startingEdge = edges[ConwayPoly.ActualMod(StartingEdge, edges.Count)];

        loop = poly.GetFaceLoop(startingEdge);
        var faceIndices = loop.Select(x => x.Item1).ToList();

        if (LoopAction == LoopActions.Remove)
        {
            poly = poly.FaceRemove(false, faceIndices);
        }
        else if (LoopAction == LoopActions.Keep)
        {
            poly = poly.FaceRemove(true, faceIndices);
        }
        else if (LoopAction == LoopActions.SplitFaces)
        {
            poly = poly.SplitLoop(loop);
        }
        else if (LoopAction == LoopActions.Split)
        {
            ConwayPoly otherPoly;

            (otherPoly, poly)     = poly.Split(new OpParams(x => faceIndices.Contains(x.index)));
            poly.FaceRoles        = Enumerable.Repeat(ConwayPoly.Roles.Existing, poly.Faces.Count).ToList();
            poly.VertexRoles      = Enumerable.Repeat(ConwayPoly.Roles.Existing, poly.Vertices.Count).ToList();
            otherPoly.FaceRoles   = Enumerable.Repeat(ConwayPoly.Roles.New, otherPoly.Faces.Count).ToList();
            otherPoly.VertexRoles = Enumerable.Repeat(ConwayPoly.Roles.New, otherPoly.Vertices.Count).ToList();

            poly.Append(otherPoly);
        }
        else if (LoopAction == LoopActions.SetRole)
        {
            var faceRoles = new List <ConwayPoly.Roles>();
            for (var faceIndex = 0; faceIndex < poly.Faces.Count; faceIndex++)
            {
                faceRoles.Add(faceIndices.Contains(faceIndex) ? ConwayPoly.Roles.Existing : ConwayPoly.Roles.New);
            }
            poly.FaceRoles = faceRoles;
        }

        if (ApplyOp)
        {
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.1, 0.1);
        }

        poly = poly.Transform(Position, Rotation, Scale);

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 25
0
    public void Generate()
    {
        poly = JohnsonPoly.Build(JohnsonPolyType, Sides);
        poly = poly.Transform(PositionBefore, RotationBefore, ScaleBefore);

        if (ApplyOp)
        {
            var o0 = new OpParams {
                valueA = op0Amount1, valueB = op0Amount2, facesel = op0Facesel
            };
            poly = poly.ApplyOp(op0, o0);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.01, 0.01);
        }

        poly.Recenter();

        ConwayPoly DoSlices(ConwayPoly input, Vector3 axis)
        {
            var   result = new ConwayPoly();
            float offset = SliceStart;

            int failsafe = 100;

            do
            {
                offset += SliceDistance;
                var planePos  = new Vector3(offset * axis.x, offset * axis.y, offset * axis.z);
                var sliced    = input.SliceByPlane(new Plane(Quaternion.Euler(SliceAngle) * axis, planePos), Cap);
                var gapVector = new Vector3(-SliceGap * axis.x, -SliceGap * axis.y, -SliceGap * axis.z);
                result = result.Transform(gapVector);
                var lerp  = Mathf.InverseLerp(SliceStart, SliceEnd, offset);
                var shift = new Vector3(Mathf.Sin(lerp * frequency) * amplitude, 0, 0);
                result.Append(sliced.bottom.Transform(shift));
                input = sliced.top;
                failsafe--;
            } while (offset < SliceEnd && failsafe > 0);

            result.Append(input);
            if (Weld)
            {
                result = result.Weld(0.0001f);
            }
            return(result);
        }

        var output = new ConwayPoly();

        output.Append(DoSlices(poly, Vector3.up));

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            output = output.ApplyOp(op1, o1);
            if (Weld)
            {
                poly = poly.Weld(0.0001f);
            }
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            output = output.ApplyOp(op2, o2);
        }

        output.Recenter();

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(output, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 26
0
    public void Generate()
    {
        var multigrid = new MultiGrid(Divisions, Dimensions, Offset, MinDistance, MaxDistance, colorRatio, colorIndex, colorIntersect);

        (poly, shapes, colors) = multigrid.Build(SharedVertices, randomize);
        if (shapes.Count == 0)
        {
            return;
        }
        if (ColorMethod == PolyHydraEnums.ColorMethods.ByTags)
        {
            float colorMin = colors.Min();
            float colorMax = colors.Max();

            for (var faceIndex = 0; faceIndex < poly.Faces.Count; faceIndex++)
            {
                var   face       = poly.Faces[faceIndex];
                var   colorIndex = colors[faceIndex];
                float colorValue;
                switch (ColorFunction)
                {
                case ColorFunctions.Mod:
                    colorValue = colorIndex % 1;
                    break;

                case ColorFunctions.ActualMod:
                    colorValue = PolyUtils.ActualMod(colorIndex, 1);
                    break;

                case ColorFunctions.Normalized:
                    colorValue = Mathf.InverseLerp(colorMin, colorMax, colorIndex);
                    break;

                case ColorFunctions.Abs:
                    colorValue = Mathf.Abs(colorIndex);
                    break;

                default:
                    colorValue = colorIndex;
                    break;
                }
                string colorString = ColorUtility.ToHtmlStringRGB(ColorGradient.Evaluate(colorValue));
                var    tag         = new Tuple <string, ConwayPoly.TagType>(
                    $"#{colorString}",
                    TagType);
                poly.FaceTags[faceIndex].Add(tag);
            }
        }

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
            var o3 = new OpParams {
                valueA = op3Amount1, valueB = op3Amount2, facesel = op3Facesel
            };
            poly = poly.ApplyOp(op3, o3);
        }

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 27
0
    public void Generate()
    {
        var wythoff = new WythoffPoly(PolyType, PrismP, PrismQ);

        wythoff.BuildFaces();
        poly = new ConwayPoly(wythoff);
        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
            };
            poly = poly.ApplyOp(op1, o1);
        }

        if (Canonicalize)
        {
            poly = poly.Canonicalize(0.01, 0.01);
        }

        poly = poly.Transform(Position, Rotation, Scale);

        var rot = SliceRotation;

        if (animateSlice > 0)
        {
            rot.y = Time.time * animateSlice;
        }
        SliceRotation = rot;

        var sliceWythoff = new WythoffPoly(SlicePolyType, 3, 3);

        sliceWythoff.BuildFaces();
        var slicePoly = new ConwayPoly(sliceWythoff);

        slicePoly = slicePoly.Transform(SlicePosition, SliceRotation, Vector3.one * SliceScale);
        var result = poly.SliceByPoly(slicePoly, Cap, FaceCount);

        poly = result.outside;
        var inside = result.inside.Transform(insideTransform);

        poly.Append(inside);

        if (ShowSlicePoly)
        {
            poly.Append(slicePoly);
        }

        if (Weld)
        {
            poly = poly.Weld(0.0001f);
        }

        if (ApplyOp)
        {
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            poly = poly.ApplyOp(op2, o2);
        }

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 28
0
    public void Generate()
    {
        switch (ShapeType)
        {
        case ShapeTypes.Wythoff:
            var wythoff = new WythoffPoly(PolyType, PrismP, PrismQ);
            wythoff.BuildFaces();
            poly = new ConwayPoly(wythoff);
            break;

        case ShapeTypes.Johnson:
            poly = JohnsonPoly.Build(JohnsonPolyType, PrismP);
            break;

        case ShapeTypes.Grid:
            poly = Grids.Grids.MakeGrid(GridType, GridShape, PrismP, PrismQ);
            break;

        case ShapeTypes.Other:
            poly = JohnsonPoly.BuildOther(OtherPolyType, PrismP, PrismQ);
            break;
        }

        if (applyPreOp)
        {
            var preOpParams = new OpParams {
                valueA = preOpAmount1, valueB = preOpAmount2, facesel = preOpFacesel
            };
            for (int i = 0; i < preOpIterations; i++)
            {
                poly = poly.ApplyOp(preOp, preOpParams);
            }
        }

        OpParams amount1Func = null;

        switch (Equation)
        {
        case Equations.LinearX:
            amount1Func = new OpParams
            {
                funcA = x => offset1 + Mathf.Sin((x.poly.Faces[x.index].Centroid.x * frequency1 + phase1 - (Time.time * animationSpeed1))) * amplitude1,
                funcB = x => offset2 + Mathf.Sin((x.poly.Faces[x.index].Centroid.x * frequency2 + phase2 - (Time.time * animationSpeed2))) * amplitude2
            };
            break;

        case Equations.LinearY:
            amount1Func = new OpParams
            {
                funcA = x => offset1 + Mathf.Sin((x.poly.Faces[x.index].Centroid.y * frequency1 + phase1 - (Time.time * animationSpeed1))) * amplitude1,
                funcB = x => offset2 + Mathf.Sin((x.poly.Faces[x.index].Centroid.y * frequency2 + phase2 - (Time.time * animationSpeed2))) * amplitude2
            };
            break;

        case Equations.LinearZ:
            amount1Func = new OpParams
            {
                funcA = x => offset1 + Mathf.Sin((x.poly.Faces[x.index].Centroid.z * frequency1 + phase1 - (Time.time * animationSpeed1))) * amplitude1,
                funcB = x => offset2 + Mathf.Sin((x.poly.Faces[x.index].Centroid.z * frequency2 + phase2 - (Time.time * animationSpeed2))) * amplitude2
            };
            break;

        case Equations.Radial:
            amount1Func = new OpParams
            {
                funcA = x => offset1 + Mathf.Sin((x.poly.Faces[x.index].Centroid.magnitude * frequency1 + phase1 - (Time.time * animationSpeed1))) * amplitude1,
                funcB = x => offset2 + Mathf.Sin((x.poly.Faces[x.index].Centroid.magnitude * frequency2 + phase2 - (Time.time * animationSpeed2))) * amplitude2
            };
            break;

        case Equations.Perlin:
            amount1Func = new OpParams
            {
                funcA = x => offset1 + Mathf.PerlinNoise(x.poly.Faces[x.index].Centroid.x * frequency1 + phase1 - (Time.time * animationSpeed1), x.poly.Faces[x.index].Centroid.z * frequency1 + phase1 - (Time.time * animationSpeed1)) * amplitude1,
                funcB = x => offset2 + Mathf.PerlinNoise(x.poly.Faces[x.index].Centroid.x * frequency2 + phase2 - (Time.time * animationSpeed2), x.poly.Faces[x.index].Centroid.z * frequency2 + phase2 - Time.time) * amplitude2,
            };
            break;
        }

        poly = poly.ApplyOp(op, amount1Func);
        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(poly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 29
0
    public void Generate()
    {
        switch (ShapeType)
        {
        case ShapeTypes.Wythoff:
            var wythoff = new WythoffPoly(PolyType, P, Q);
            wythoff.BuildFaces();
            polyBeforeOp = new ConwayPoly(wythoff);
            break;

        case ShapeTypes.Johnson:
            polyBeforeOp = JohnsonPoly.Build(JohnsonPolyType, P);
            break;

        case ShapeTypes.Grid:
            polyBeforeOp = Grids.Grids.MakeGrid(GridType, GridShape, P, Q);
            break;
        }

        var o1 = new OpParams {
            valueA = op1Amount1, valueB = op1Amount2, facesel = op1Facesel
        };

        polyBeforeOp = polyBeforeOp.ApplyOp(op1, o1);

        // Collision Mesh
        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(polyBeforeOp, false, null, ColorMethod);

        GetComponent <MeshCollider>().sharedMesh = mesh;
        miscUVs2 = new List <Vector4>();
        mesh.GetUVs(4, miscUVs2);

        if (PolyHydraEnums.OpConfigs[op2].usesFaces)
        {
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, filterFunc = x => SelectedFaces.Contains(x.index)
            };
            polyAfterOp = polyBeforeOp.ApplyOp(op2, o2);
        }
        else
        {
            var(excluded, included) = polyBeforeOp.Split(new OpParams {
                filterFunc = x => SelectedFaces.Contains(x.index)
            });
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2
            };
            polyAfterOp = included.ApplyOp(op2, o2);
            polyAfterOp.Append(excluded);
            if (AttemptToFillHoles)
            {
                polyAfterOp = polyAfterOp.Weld(0.1f);
                polyAfterOp = polyAfterOp.FillHoles();
            }
        }


        // Final Mesh
        mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(polyAfterOp, false, null, ColorMethod);
        GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 30
0
    public void Generate()
    {
        switch (ShapeType)
        {
        case ShapeTypes.Wythoff:
            var wythoff = new WythoffPoly(PolyType, PrismP, PrismQ);
            wythoff.BuildFaces();
            preOpPoly = new ConwayPoly(wythoff);
            break;

        case ShapeTypes.Johnson:
            preOpPoly = JohnsonPoly.Build(JohnsonPolyType, PrismP);
            break;

        case ShapeTypes.Grid:
            preOpPoly = Grids.Grids.MakeGrid(GridType, GridShape, PrismP, PrismQ);
            break;
        }

        // var animValue1 = Mathf.PerlinNoise(Time.time / AnimateAmountRate, 0) * Mathf.PerlinNoise(Time.time / AnimateAmountRate * 3.1f, Time.time);
        var animValue1 = 1;

        if (ApplyOp)
        {
            var o1 = new OpParams {
                valueA = op1Amount1 * animValue1, valueB = op1Amount2, facesel = op1Facesel
            };
            preOpPoly = preOpPoly.ApplyOp(op1, o1);
        }

        if (PreCanonicalize)
        {
            preOpPoly = preOpPoly.Canonicalize(0.01, 0.01);
        }

        var postOpPoly = preOpPoly.Transform(Position, Rotation, Scale);

        var animValue2 = Mathf.Sin(Time.time / AnimateAmountRate);
        // var animValue2 = Mathf.PerlinNoise(Time.time / AnimateAmountRate, 0) * Mathf.PerlinNoise(Time.time / AnimateAmountRate * .3f, 10) -.5f;
        var _amount = AnimateAmount > 0 ? animValue2 * AnimateAmount : Amount;
        var o       = new OpParams(_amount, NormalBlend, Facesel);

        postOpPoly = postOpPoly.Segment(o);

        if (Canonicalize)
        {
            postOpPoly = postOpPoly.Canonicalize(0.01, 0.01);
        }

        if (ApplyOp)
        {
            var o2 = new OpParams {
                valueA = op2Amount1, valueB = op2Amount2, facesel = op2Facesel
            };
            postOpPoly = postOpPoly.ApplyOp(op2, o2);
        }

        var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(postOpPoly, false, null, ColorMethod);

        GetComponent <MeshFilter>().mesh = mesh;
    }