Exemple #1
0
    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;
    }
Exemple #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;
    }
    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;
    }
Exemple #5
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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
    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;
    }
Exemple #8
0
    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;
    }
Exemple #9
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;
    }