private static void AddBoards(FlatMeshBuilder meshBuilder, BoardsInput input)
        {
            var vertices = Squares.Vertices();

            var boardVertices = new Vector3[vertices.Length];

            for (int i = 0; i < boardVertices.Length; ++i)
            {
                boardVertices[i] = Mathx.Multiply(vertices[i].X_Y(), input.extents) + input.offset;
            }

            var boardHeight = input.height / input.count;

            for (int i = 0; i < input.count; ++i)
            {
                var boardTop = input.top - boardHeight * i;

                var v0 = boardVertices[0] + boardTop;
                var v1 = boardVertices[1] + boardTop;
                var v2 = boardVertices[2] + boardTop;
                var v3 = boardVertices[3] + boardTop;

                var v4 = (v0 + v1) * 0.5f - boardHeight;
                var v5 = (v2 + v3) * 0.5f - boardHeight;

                meshBuilder.AddTriangle(v0, v1, v2);
                meshBuilder.AddTriangle(v0, v2, v3);

                meshBuilder.AddTriangle(v1, v4, v5);
                meshBuilder.AddTriangle(v1, v5, v2);

                meshBuilder.AddTriangle(v4, v0, v3);
                meshBuilder.AddTriangle(v4, v3, v5);
            }
        }
예제 #2
0
        private MeshBuilder Generate(bool[,] map)
        {
            var builder = new FlatMeshBuilder()
            {
                Options = EMeshBuildingOptions.NONE
            };

            var width  = map.GetWidth();
            var height = map.GetHeight();

            var wallOffset = new Vector3(0.0f, 0.0f, wallHeight);

            var vertices = MarchingSquares.Vertices();

            for (int y = 0; y < height - 1; y++)
            {
                for (int x = 0; x < width - 1; x++)
                {
                    var active0 = !map[x, y];
                    var active1 = !map[x, y + 1];
                    var active2 = !map[x + 1, y + 1];
                    var active3 = !map[x + 1, y];

                    var configuration = MarchingSquares.GetConfiguration(active0, active1, active2, active3);
                    var triangles     = MarchingSquares.Triangles[configuration];

                    var offset = new Vector3(x, y) - wallOffset;

                    int i = 0;
                    for (; i < triangles.Length && triangles[i] != -1; i += 3)
                    {
                        var t0 = triangles[i + 0];
                        var t1 = triangles[i + 1];
                        var t2 = triangles[i + 2];

                        var v0 = (Vector3)vertices[t0] + offset;
                        var v1 = (Vector3)vertices[t1] + offset;
                        var v2 = (Vector3)vertices[t2] + offset;

                        builder.AddTriangle(v0, v1, v2);
                    }

                    if (configuration > 0 && configuration < MarchingSquares.Triangles.Length - 1)
                    {
                        var wt0 = triangles[i - 1];
                        var wt1 = triangles[i - 2];

                        var wv0 = (Vector3)vertices[wt0] + offset;
                        var wv1 = (Vector3)vertices[wt1] + offset;
                        var wv2 = wv1 + wallOffset;
                        var wv3 = wv0 + wallOffset;

                        builder.AddTriangle(wv0, wv1, wv2);
                        builder.AddTriangle(wv0, wv2, wv3);
                    }
                }
            }

            return(builder);
        }
        private static void AddBar(FlatMeshBuilder meshBuilder, BarInput input)
        {
            var barRotationY = Quaternion.AngleAxis(input.angleY, Vector3.up);

            var v0 = -input.spike + input.offset;
            var v5 = input.height + input.spike + input.offset;

            var vertices = Squares.Vertices();

            for (int i1 = 0, i0 = vertices.Length - 1; i1 < vertices.Length; i0 = i1++)
            {
                var vertex0 = vertices[i0].X_Y();
                var vertex1 = vertices[i1].X_Y();

                var v1 = barRotationY * vertex0 * input.radius + input.offset;
                var v2 = barRotationY * vertex1 * input.radius + input.offset;
                var v3 = v1 + input.height;
                var v4 = v2 + input.height;

                meshBuilder.AddTriangle(v0, v2, v1);
                meshBuilder.AddTriangle(v1, v2, v4);
                meshBuilder.AddTriangle(v1, v4, v3);
                meshBuilder.AddTriangle(v3, v4, v5);
            }
        }
        public static FlatMeshBuilder Create(ref Input input)
        {
            var meshBuilder = new FlatMeshBuilder();

            var frameOffset       = new Vector3(input.width * 0.5f, 0.0f, 0.0f);
            var frameHeight       = new Vector3(0.0f, input.height, 0.0f);
            var frameSpike        = new Vector3(0.0f, input.barSpike, 0.0f);
            var frameLeftBarInput = new BarInput
            {
                angleY = input.frameAngleY,
                radius = input.barRadius,
                offset = -frameOffset,
                height = frameHeight,
                spike  = frameSpike
            };
            var frameRightBarInput = new BarInput
            {
                angleY = -input.frameAngleY,
                radius = input.barRadius,
                offset = frameOffset,
                height = frameHeight,
                spike  = frameSpike
            };

            AddBar(meshBuilder, frameLeftBarInput);
            AddBar(meshBuilder, frameRightBarInput);

            var topBoardsExtents = new Vector3(input.width, 0.0f, input.boardThickness * 0.5f);
            var topBoardsInput   = new BoardsInput
            {
                extents = topBoardsExtents,
                top     = frameHeight,
                height  = frameHeight,
                count   = input.boardsCount
            };

            AddBoards(meshBuilder, topBoardsInput);

            return(meshBuilder);
        }
        public static FlatMeshBuilder Create(Input input)
        {
            var meshBuilder = new FlatMeshBuilder();

            const float WINDOW_BAR_ANGLE_Y = 45.0f;

            var frameOffset       = new Vector3(input.width * 0.5f, 0.0f, 0.0f);
            var frameHeight       = new Vector3(0.0f, input.height, 0.0f);
            var frameSpike        = new Vector3(0.0f, input.frameBarSpike, 0.0f);
            var frameLeftBarInput = new BarInput
            {
                angleY = -input.frameBarAngleY,
                radius = input.frameBarRadius,
                offset = -frameOffset,
                height = frameHeight,
                spike  = frameSpike
            };
            var frameRightBarInput = new BarInput
            {
                angleY = input.frameBarAngleY,
                radius = input.frameBarRadius,
                offset = frameOffset,
                height = frameHeight,
                spike  = frameSpike
            };

            AddBar(meshBuilder, frameLeftBarInput);
            AddBar(meshBuilder, frameRightBarInput);

            var windowHeight       = frameHeight * input.windowHeightFill;
            var windowOffset       = frameOffset * input.windowWidthFill;
            var windowHeightOffset = frameHeight * input.windowHeightOffsetFill;
            var windowLeftBarInput = new BarInput
            {
                angleY = -WINDOW_BAR_ANGLE_Y,
                radius = input.windowBarRadius,
                offset = -windowOffset + windowHeightOffset,
                height = windowHeight,
                spike  = frameSpike
            };
            var windowRightBarInput = new BarInput
            {
                angleY = WINDOW_BAR_ANGLE_Y,
                radius = input.windowBarRadius,
                offset = windowOffset + windowHeightOffset,
                height = windowHeight,
                spike  = frameSpike
            };

            AddBar(meshBuilder, windowLeftBarInput);
            AddBar(meshBuilder, windowRightBarInput);

            var wideBoardsExtents = new Vector3(input.width, 0.0f, input.boardThickness * 0.5f);
            var topBoardsHeight   = frameHeight - windowHeight - windowHeightOffset;
            var topBoardsInput    = new BoardsInput
            {
                extents = wideBoardsExtents,
                top     = frameHeight,
                height  = topBoardsHeight,
                count   = input.topBoardsCount
            };
            var bottomBoardsInput = new BoardsInput
            {
                extents = wideBoardsExtents,
                top     = windowHeightOffset,
                height  = windowHeightOffset,
                count   = input.bottomBoardsCount
            };

            AddBoards(meshBuilder, topBoardsInput);
            AddBoards(meshBuilder, bottomBoardsInput);

            var sideBoardsOffset    = windowOffset + (frameOffset - windowOffset) * 0.5f;
            var sideBoardsExtents   = (wideBoardsExtents - windowOffset * 2.0f) * 0.5f;
            var leftSideBoardsInput = new BoardsInput
            {
                offset  = -sideBoardsOffset + windowHeightOffset,
                extents = sideBoardsExtents,
                top     = windowHeight,
                height  = windowHeight,
                count   = input.sideBoardsCount
            };
            var rightSideBoardsInput = new BoardsInput
            {
                offset  = sideBoardsOffset + windowHeightOffset,
                extents = sideBoardsExtents,
                top     = windowHeight,
                height  = windowHeight,
                count   = input.sideBoardsCount
            };

            AddBoards(meshBuilder, leftSideBoardsInput);
            AddBoards(meshBuilder, rightSideBoardsInput);

            return(meshBuilder);
        }