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); }
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; } }