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