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; }
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; }
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; }
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; }
public static ConwayPoly MakeUnitileGrid(int pattern, int gridShape, int rows = 5, int cols = 5, bool weld = false) { var ut = new Unitile(pattern, rows, cols, true); switch (gridShape) { case 0: ut.plane(); break; case 1: ut.torus(); break; case 2: ut.conic_frust(1); break; case 3: ut.conic_frust(0.00001f); break; case 4: ut.sphere(); break; case 5: ut.conic_frust(0.00001f, cols, 0); break; // case 5: // ut.mobius(); // break; // case 6: // ut.torus_trefoil(); // break; // case 7: // ut.klein(); // break; // case 8: // ut.klein2(); // break; // case 9: // ut.roman(); // break; // case 10: // ut.roman_boy(); // break; // case 11: // ut.cross_cap(); // break; // case 12: // ut.cross_cap2(); // break; } var vertexRoles = Enumerable.Repeat(ConwayPoly.Roles.New, ut.raw_verts.Count); var faceRoles = new List <ConwayPoly.Roles>(); int foo, isEven, width, height, coloringOffset; for (int i = 0; i < ut.raw_faces.Count; i++) { switch (pattern) { case 1: isEven = cols % 2 == 0 ? (Mathf.FloorToInt(i / (float)cols)) % 2 : 0; foo = ((i + isEven) % 2) + 2; faceRoles.Add((ConwayPoly.Roles)foo); break; case 2: // int width = Mathf.CeilToInt((rows / Mathf.Sqrt(3))) * 2 + 1; // int height = ut.raw_faces.Count / width; // isEven = 0; // foo = ((i/4/width) + isEven) % 2; foo = i < ut.raw_faces.Count / 2 ? 2 : 3; faceRoles.Add((ConwayPoly.Roles)foo); break; case 3: width = Mathf.CeilToInt((rows / Mathf.Sqrt(3))); height = ut.raw_faces.Count / width; coloringOffset = i < ut.raw_faces.Count / 2 ? 0 : 1; foo = i / (height / 2); if (coloringOffset == 1 && width % 3 == 0) { coloringOffset += 1; } if (coloringOffset == 1 && width % 3 == 2) { coloringOffset += 2; } foo += coloringOffset; foo = (foo % 3) + 2; faceRoles.Add((ConwayPoly.Roles)foo); break; case 4: foo = ut.raw_faces[i].Count == 3 ? 2 : 3; faceRoles.Add((ConwayPoly.Roles)foo); break; case 5: // TODO width = rows; height = (Mathf.FloorToInt(cols / 4) + 1) * 4; foo = i < ut.raw_faces.Count / 2 ? 2 : 3; faceRoles.Add((ConwayPoly.Roles)foo); break; case 6: // TODO foo = ut.raw_faces[i].Count == 3 ? 2 : 3; faceRoles.Add((ConwayPoly.Roles)foo); break; // case 7: // foo = i < ut.raw_faces.Count / 2 ? 0 : 1; // faceRoles.Add((Roles)foo); // break; case 8: // TODO foo = ut.raw_faces[i].Count == 3 ? 2 : 3; faceRoles.Add((ConwayPoly.Roles)foo); break; case 9: // TODO foo = ut.raw_faces[i].Count == 8 ? 2 : 3; faceRoles.Add((ConwayPoly.Roles)foo); break; case 10: switch (ut.raw_faces[i].Count) { case 3: foo = 2; break; case 4: foo = 3; break; case 6: foo = 4; break; default: foo = 5; break; } ; faceRoles.Add((ConwayPoly.Roles)foo); break; case 11: switch (ut.raw_faces[i].Count) { case 4: foo = 2; break; case 6: foo = 3; break; case 12: foo = 4; break; default: foo = 5; break; } ; faceRoles.Add((ConwayPoly.Roles)foo); break; default: faceRoles.Add((ConwayPoly.Roles)((i % 2) + 2)); break; } } var poly = new ConwayPoly(ut.raw_verts, ut.raw_faces, faceRoles, vertexRoles); poly.Recenter(); if (gridShape > 0 && weld) { poly = poly.Weld(0.001f); } if (gridShape == 5) { poly = poly.Rotate(Vector3.left, 90); } return(poly); }
public static ConwayPoly MakeGrid(PolyHydraEnums.GridTypes gridType, PolyHydraEnums.GridShapes gridShape, int p, int q, bool weld = true) { ConwayPoly conway = null; switch (gridType) { case PolyHydraEnums.GridTypes.Square: conway = MakeUnitileGrid(1, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.Isometric: conway = MakeUnitileGrid(2, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.Hex: conway = MakeUnitileGrid(3, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.U_3_6_3_6: conway = MakeUnitileGrid(4, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.U_3_3_3_4_4: conway = MakeUnitileGrid(5, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.U_3_3_4_3_4: conway = MakeUnitileGrid(6, (int)gridShape, p, q); break; // case GridTypes.U_3_3_3_3_6: // conway = MakeUnitileGrid(7, (int)gridShape, p, q); // break; case PolyHydraEnums.GridTypes.U_3_12_12: conway = MakeUnitileGrid(8, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.U_4_8_8: conway = MakeUnitileGrid(9, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.U_3_4_6_4: conway = MakeUnitileGrid(10, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.U_4_6_12: conway = MakeUnitileGrid(11, (int)gridShape, p, q); break; case PolyHydraEnums.GridTypes.Polar: conway = MakePolarGrid(p, q); break; } // Welding only seems to work reliably on simpler shapes if (weld && gridShape != PolyHydraEnums.GridShapes.Plane) { conway = conway.Weld(0.001f); } return(conway); }
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; }
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; }
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(); if (SliceDistance < 0.01f) { return(result); } float offset = SliceStart; 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), true, false, false, true); result.Append(sliced.cap); } while (offset < SliceEnd); return(result); } var output = new ConwayPoly(); if (SliceX) { output.Append(DoSlices(poly, Vector3.right)); } if (SliceY) { output.Append(DoSlices(poly, Vector3.up)); } if (SliceZ) { output.Append(DoSlices(poly, Vector3.forward)); } if (Shell) { var shellParams = new OpParams { valueA = SliceDistance - ShellSpacing }; output = output.ApplyOp(Ops.Shell, shellParams); } 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); } var mesh = PolyMeshBuilder.BuildMeshFromConwayPoly(output, false, null, ColorMethod); GetComponent <MeshFilter>().mesh = mesh; }