Exemplo n.º 1
0
    public static ConwayPoly ApplyOp(ConwayPoly conway, ConwayOperator op)
    {
        switch (op.opType)
        {
        case Ops.Identity:
            break;

        case Ops.Kis:
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            break;

        case Ops.Dual:
            conway = conway.Dual();
            break;

        case Ops.Ambo:
            conway = conway.Ambo();
            break;

        case Ops.Zip:
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            conway = conway.Dual();
            break;

        case Ops.Expand:
            conway = conway.Ambo();
            conway = conway.Ambo();
            break;

        case Ops.Bevel:
            conway = conway.Ambo();
            conway = conway.Dual();
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            conway = conway.Dual();
            break;

        case Ops.Join:
            // conway = conway.Join(op.amount);  // Not currently used as it results in non-coplanar faces
            conway = conway.Ambo();
            conway = conway.Dual();
            break;

        case Ops.Needle:
            conway = conway.Dual();
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            break;

        case Ops.Ortho:
            conway = conway.Ambo();
            conway = conway.Ambo();
            conway = conway.Dual();
            break;

        case Ops.Meta:
            conway = conway.Ambo();
            conway = conway.Dual();
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            break;

        case Ops.Truncate:
            conway = conway.Dual();
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            conway = conway.Dual();
            break;

        case Ops.Gyro:
            conway = conway.Gyro(op.amount);
            break;

        case Ops.Snub:
            conway = conway.Gyro(op.amount);
            conway = conway.Dual();
            break;

        case Ops.Exalt:
            conway = conway.Dual();
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            conway = conway.Dual();
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            break;

        case Ops.Yank:
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            conway = conway.Dual();
            conway = conway.Kis(op.amount, op.faceSelections, op.randomize);
            conway = conway.Dual();
            break;

        case Ops.Subdivide:
            conway = conway.Subdivide();
            break;

        case Ops.Loft:
            conway = conway.Loft(op.amount, op.faceSelections);
            break;

        case Ops.Quinto:
            conway = conway.Quinto(op.amount);
            break;

        case Ops.JoinedLace:
            conway = conway.JoinedLace(op.amount);
            break;

        case Ops.Lace:
            conway = conway.Lace(op.amount, op.faceSelections);
            break;

        case Ops.Stake:
            conway = conway.Stake(op.amount, op.faceSelections);
            break;

//					case Ops.Medial:
//						conway = conway.Medial((int)op.amount);
//						break;
//					case Ops.EdgeMedial:
//						conway = conway.EdgeMedial((int)op.amount);
//						break;
//					case Ops.JoinedMedial:
//						conway = conway.JoinedMedial();
//						break;
        case Ops.Propeller:
            conway = conway.Propeller(op.amount);
            break;

        case Ops.Whirl:
            conway = conway.Whirl(op.amount);
            break;

        case Ops.Volute:
            conway = conway.Volute(op.amount);
            break;

        case Ops.Extrude:
            // Split faces
            conway = conway.FaceScale(0, ConwayPoly.FaceSelections.All, false);
            conway = conway.Extrude(op.amount, false, op.randomize);
            break;

        case Ops.VertexScale:
            conway = conway.VertexScale(op.amount, op.faceSelections, op.randomize);
            break;

        case Ops.FaceOffset:
            // Split faces
            var origRoles = conway.FaceRoles;
            conway           = conway.FaceScale(0, ConwayPoly.FaceSelections.All, false);
            conway.FaceRoles = origRoles;
            conway           = conway.Offset(op.amount, op.faceSelections, op.randomize);
            break;

        case Ops.FaceScale:
            conway = conway.FaceScale(op.amount, op.faceSelections, op.randomize);
            break;

        case Ops.FaceRotate:
            conway = conway.FaceRotate(op.amount, op.faceSelections, 0, op.randomize);
            break;

//					case Ops.Chamfer:
//						conway = conway.Chamfer();
//						break;
//					case Ops.Ribbon:
//						conway = conway.Ribbon(op.amount, false, 0.1f);
//						break;
//					case Ops.FaceTranslate:
//						conway = conway.FaceTranslate(op.amount, op.faceSelections);
//						break;
//					case Ops.FaceRotateX:
//						conway = conway.FaceRotate(op.amount, op.faceSelections, 1);
//						break;
//					case Ops.FaceRotateY:
//						conway = conway.FaceRotate(op.amount, op.faceSelections, 2);
//						break;
        case Ops.FaceRemove:
            conway = conway.FaceRemove(op.faceSelections, false);
            break;

        case Ops.FaceKeep:
            conway = conway.FaceRemove(op.faceSelections, true);
            break;

        case Ops.AddDual:
            conway = conway.AddDual(op.amount);
            break;

        case Ops.Canonicalize:
            conway = conway.Canonicalize(op.amount, op.amount);
            break;

        case Ops.CanonicalizeI:
            conway = conway.Canonicalize((int)op.amount, (int)op.amount);
            break;
        }

        return(conway);
    }
Exemplo n.º 2
0
    public void MakeMesh()
    {
        var mesh = new Mesh();

        if (BypassOps)
        {
            _polyhedron.BuildMesh();
            mesh = _polyhedron.mesh;
            mesh.RecalculateNormals();
        }
        else
        {
            if (ConwayOperators != null)
            {
                conway = new ConwayPoly(_polyhedron);
                foreach (var c in ConwayOperators)
                {
                    switch (c.op)
                    {
                    case Ops.Identity:
                        break;

                    case Ops.Scale:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Foo(c.amount);
                        break;

                    case Ops.Kis:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Kis(c.amount);
                        break;

                    case Ops.Kis3:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.KisN(c.amount, 3);
                        break;

                    case Ops.Kis4:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.KisN(c.amount, 4);
                        break;

                    case Ops.Kis5:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.KisN(c.amount, 5);
                        break;

                    case Ops.Kis6:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.KisN(c.amount, 6);
                        break;

                    case Ops.Kis8:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.KisN(c.amount, 8);
                        break;

                    case Ops.Dual:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Dual();
                        break;

                    case Ops.Ambo:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Ambo();
                        break;

                    case Ops.Zip:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Kis(c.amount);
                        conway = conway.Dual();
                        break;

                    case Ops.Expand:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Ambo();
                        conway = conway.Ambo();
                        break;

                    case Ops.Bevel:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Ambo();
                        conway = conway.Dual();
                        conway = conway.Kis(c.amount);
                        conway = conway.Dual();
                        break;

                    case Ops.Join:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Ambo();
                        conway = conway.Dual();
                        break;

                    case Ops.Needle:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Dual();
                        conway = conway.Kis(c.amount);
                        break;

                    case Ops.Ortho:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Ambo();
                        conway = conway.Ambo();
                        conway = conway.Dual();
                        break;

                    case Ops.Meta:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Ambo();
                        conway = conway.Dual();
                        conway = conway.Kis(c.amount);
                        break;

                    case Ops.Truncate:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Dual();
                        conway = conway.Kis(c.amount);
                        conway = conway.Dual();
                        break;

                    case Ops.Gyro:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Gyro(0.3333333f, c.amount);
                        break;

                    case Ops.Snub:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Gyro(0.3333333f, c.amount);
                        conway = conway.Dual();
                        break;



                    case Ops.Exalt:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Dual();
                        conway = conway.Kis(c.amount);
                        conway = conway.Dual();
                        conway = conway.Kis(c.amount);
                        break;

                    case Ops.Yank:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Kis(c.amount);
                        conway = conway.Dual();
                        conway = conway.Kis(c.amount);
                        conway = conway.Dual();
                        break;

                    case Ops.Subdivide:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Subdivide();
                        break;

                    case Ops.Chamfer:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Chamfer();
                        break;


                    case Ops.Offset:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Offset(c.amount);
                        break;

                    case Ops.Extrude:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Extrude(c.amount, false);
                        break;

                    case Ops.Ribbon:
                        if (c.disabled)
                        {
                            break;
                        }
                        conway = conway.Ribbon(c.amount, false, 0.1f);
                        break;

                    case Ops.Test:
                        if (c.disabled)
                        {
                            break;
                        }

                        break;
                    }
                }
            }

            conway.ScaleToUnitSphere();

            // If we Kis we don't need fan triangulation (which breaks on non-convex faces)
            conway = conway.Kis(0, true);
            mesh   = conway.ToUnityMesh(forceTwosided: TwoSided);
        }

        //_polyhedron.CreateBlendShapes();

        mesh.RecalculateTangents();
        mesh.RecalculateBounds();
        if (meshFilter != null)
        {
            meshFilter.mesh = mesh;
        }
    }