void Rebuild() { // Build the initial poly polymorphSkinnedMeshRenderer = gameObject.GetComponent <SkinnedMeshRenderer>(); poly = JohnsonPoly.Build(JohnsonPolyType, sides); poly.Recenter(); poly = poly.ApplyOp(PreMorph.op, new OpParams(PreMorph.opAmount1, PreMorph.opAmount2, PreMorph.opFacesel)); // Build the mesh without any morph ops var baseMesh = MakeMorphTarget(0, 0); baseMesh.ClearBlendShapes(); baseMesh = AddBlendShapeFrameFromMesh("Base", baseMesh, baseMesh); baseMesh.RecalculateNormals(); baseMesh.RecalculateTangents(); // Build the morphed meshes for (var i = 0; i < Morphs.Count; i++) { var morphedMesh = MakeMorphTarget(i, 1); baseMesh = AddBlendShapeFrameFromMesh(i.ToString(), baseMesh, morphedMesh); // baseMesh.RecalculateNormals(); // baseMesh.RecalculateTangents(); } polymorphSkinnedMeshRenderer.sharedMesh = baseMesh; initialized = true; }
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; }
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 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 MakeHexGrid(int cols = 4, int rows = 4) { // Flag if the number of columns is odd. bool oddCols = cols % 2 == 1; // We measure rows by the 6 triangles in each hex cols = ((cols * 3) / 2) + (oddCols?3:1); rows = rows * 2 + 2; float colScale = 1f; float rowScale = Mathf.Sqrt(3) / 2; float colOffset = rows * colScale * 0.5f; float rowOffset = cols * rowScale * 0.5f; var vertexPoints = new List <Vector3>(); var faceIndices = new List <List <int> >(); for (int row = 0; row <= rows + 2; row++) { for (int col = 0; col <= cols; col++) { var pos = new Vector3(-colOffset + col * colScale, 0, -rowOffset + row * rowScale); if (row % 2 > 0) { pos.x -= colScale / 2f; } vertexPoints.Add(pos); } } for (int row = 0; row < rows - 3; row += 2) { for (int col = 0; col < cols - 3; col += 3) { int corner = row * (cols + 1) + col; var hex1 = new List <int> { corner, corner + cols + 1, corner + cols + cols + 2, corner + cols + cols + 3, corner + cols + 3, corner + 1 }; faceIndices.Add(hex1); if (oddCols && col == cols - 4) { continue; } corner += cols + 3; var hex2 = new List <int> { corner, corner + cols, corner + cols + cols + 2, corner + cols + cols + 3, corner + cols + 2, corner + 1 }; faceIndices.Add(hex2); } } var faceRoles = Enumerable.Repeat(ConwayPoly.Roles.New, faceIndices.Count); var vertexRoles = Enumerable.Repeat(ConwayPoly.Roles.New, vertexPoints.Count); var poly = new ConwayPoly(vertexPoints, faceIndices, faceRoles, vertexRoles); poly.Recenter(); return(poly); }
public static ConwayPoly MakeIsoGrid(int cols = 5, int rows = 5) { float colScale = 1; float rowScale = Mathf.Sqrt(3) / 2; float colOffset = rows * colScale * 0.5f; float rowOffset = cols * rowScale * 0.5f; var vertexPoints = new List <Vector3>(); var faceIndices = new List <List <int> >(); for (int row = 0; row <= rows; row++) { for (int col = 0; col <= cols; col++) { var pos = new Vector3(-colOffset + col * colScale, 0, -rowOffset + row * rowScale); if (row % 2 > 0) { pos.x -= colScale / 2f; } vertexPoints.Add(pos); } } for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { int corner = row * (cols + 1) + col; if (row % 2 == 0) { var face1 = new List <int> { corner, corner + cols + 1, corner + cols + 2, }; faceIndices.Add(face1); var face2 = new List <int> { corner, corner + cols + 2, corner + 1 }; faceIndices.Add(face2); } else { var face1 = new List <int> { corner, corner + cols + 1, corner + 1 }; faceIndices.Add(face1); var face2 = new List <int> { corner + 1, corner + cols + 1, corner + cols + 2 }; faceIndices.Add(face2); } } } var faceRoles = Enumerable.Repeat(ConwayPoly.Roles.New, faceIndices.Count); var vertexRoles = Enumerable.Repeat(ConwayPoly.Roles.New, vertexPoints.Count); var poly = new ConwayPoly(vertexPoints, faceIndices, faceRoles, vertexRoles); poly.Recenter(); return(poly); }
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; }