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;
    }
Beispiel #3
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;
    }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
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();

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