class_name Block const BLOCK_SIZE := Vector3(1.0, 1.0, 1.0) enum Face { FRONT, BACK, LEFT, RIGHT, TOP, BOTTOM, } var FACES = [ [ # FRONT [Vector3(-1.0, 1.0, 1.0), Vector3(1.0, -1.0, 1.0), Vector3(-1.0, -1.0, 1.0)], [Vector3(-1.0, 1.0, 1.0), Vector3(1.0, 1.0, 1.0), Vector3(1.0, -1.0, 1.0)], ], [ # BACK [Vector3(1.0, 1.0, -1.0), Vector3(-1.0, -1.0, -1.0), Vector3(1.0, -1.0, -1.0)], [Vector3(1.0, 1.0, -1.0), Vector3(-1.0, 1.0, -1.0), Vector3(-1.0, -1.0, -1.0)], ], [ # LEFT [Vector3(-1.0, 1.0, -1.0), Vector3(-1.0, -1.0, 1.0), Vector3(-1.0, -1.0, -1.0)], [Vector3(-1.0, 1.0, -1.0), Vector3(-1.0, 1.0, 1.0), Vector3(-1.0, -1.0, 1.0)], ], [ # RIGHT [Vector3(1.0, 1.0, 1.0), Vector3(1.0, -1.0, -1.0), Vector3(1.0, -1.0, 1.0)], [Vector3(1.0, 1.0, 1.0), Vector3(1.0, 1.0, -1.0), Vector3(1.0, -1.0, -1.0)], ], [ # TOP [Vector3(-1.0, 1.0, -1.0), Vector3(1.0, 1.0, 1.0), Vector3(-1.0, 1.0, 1.0)], [Vector3(-1.0, 1.0, -1.0), Vector3(1.0, 1.0, -1.0), Vector3(1.0, 1.0, 1.0)], ], [ # BOTTOM [Vector3(-1.0, -1.0, 1.0), Vector3(1.0, -1.0, -1.0), Vector3(-1.0, -1.0, -1.0)], [Vector3(-1.0, -1.0, 1.0), Vector3(1.0, -1.0, 1.0), Vector3(1.0, -1.0, -1.0)], ], ] var FACE_UVS = [ [ # FRONT [Vector2(0.0, 0.0), Vector2(1.0, 1.0), Vector2(0.0, 1.0)], [Vector2(0.0, 0.0), Vector2(1.0, 0.0), Vector2(1.0, 1.0)], ], [ # BACK [Vector2(0.0, 0.0), Vector2(1.0, 1.0), Vector2(0.0, 1.0)], [Vector2(0.0, 0.0), Vector2(1.0, 0.0), Vector2(1.0, 1.0)], ], [ # LEFT [Vector2(0.0, 0.0), Vector2(1.0, 1.0), Vector2(0.0, 1.0)], [Vector2(0.0, 0.0), Vector2(1.0, 0.0), Vector2(1.0, 1.0)], ], [ # RIGHT [Vector2(0.0, 0.0), Vector2(1.0, 1.0), Vector2(0.0, 1.0)], [Vector2(0.0, 0.0), Vector2(1.0, 0.0), Vector2(1.0, 1.0)], ], [ # TOP [Vector2(0.0, 1.0), Vector2(1.0, 2.0), Vector2(0.0, 2.0)], [Vector2(0.0, 1.0), Vector2(1.0, 1.0), Vector2(1.0, 2.0)], ], [ # BOTTOM [Vector2(1.0, 0.0), Vector2(2.0, 1.0), Vector2(1.0, 1.0)], [Vector2(1.0, 0.0), Vector2(2.0, 0.0), Vector2(2.0, 1.0)], ], ] var FACE_NORMALS = [ Vector3(0, 0, 1), # FRONT Vector3(0, 0, -1), # BACK Vector3(-1, 0, 0), # LEFT Vector3(1, 0, 0), # RIGHT Vector3(0, 1, 0), # TOP Vector3(0, -1, 0), # BOTTOM ] enum Type { AIR, GRASS, DIRT, LEAVES, STONE, ICE, WOOD, SAND, PLANKS, YELLOW_STONE, BLUE_STONE, RED_STONE, BLACK_STONE, SELECTION, } var BLOCK_TYPES = { Type.GRASS: { "uv2s": [ Vector2(0, 0), # FRONT Vector2(0, 0), # BACK Vector2(0, 0), # LEFT Vector2(0, 0), # RIGHT Vector2(0, 1), # TOP Vector2(1, 0), # BOTTOM ], }, Type.DIRT: { "uv2s": [ Vector2(1, 0), # FRONT Vector2(1, 0), # BACK Vector2(1, 0), # LEFT Vector2(1, 0), # RIGHT Vector2(1, 0), # TOP Vector2(1, 0), # BOTTOM ], }, Type.LEAVES: { "uv2s": [ Vector2(2, 2), # FRONT Vector2(2, 2), # BACK Vector2(2, 2), # LEFT Vector2(2, 2), # RIGHT Vector2(2, 2), # TOP Vector2(2, 2), # BOTTOM ], }, Type.STONE: { "uv2s": [ Vector2(2, 0), # FRONT Vector2(2, 0), # BACK Vector2(2, 0), # LEFT Vector2(2, 0), # RIGHT Vector2(2, 0), # TOP Vector2(2, 0), # BOTTOM ], }, Type.ICE: { "uv2s": [ Vector2(2, 1), # FRONT Vector2(2, 1), # BACK Vector2(2, 1), # LEFT Vector2(2, 1), # RIGHT Vector2(2, 1), # TOP Vector2(2, 1), # BOTTOM ], }, Type.WOOD: { "uv2s": [ Vector2(5, 0), # FRONT Vector2(5, 0), # BACK Vector2(5, 0), # LEFT Vector2(5, 0), # RIGHT Vector2(5, 0), # TOP Vector2(5, 0), # BOTTOM ], }, Type.SAND: { "uv2s": [ Vector2(4, 0), # FRONT Vector2(4, 0), # BACK Vector2(4, 0), # LEFT Vector2(4, 0), # RIGHT Vector2(4, 0), # TOP Vector2(4, 0), # BOTTOM ], }, Type.PLANKS: { "uv2s": [ Vector2(0, 2), # FRONT Vector2(0, 2), # BACK Vector2(0, 2), # LEFT Vector2(0, 2), # RIGHT Vector2(0, 2), # TOP Vector2(0, 2), # BOTTOM ], }, Type.YELLOW_STONE: { "uv2s": [ Vector2(3, 1), # FRONT Vector2(3, 1), # BACK Vector2(3, 1), # LEFT Vector2(3, 1), # RIGHT Vector2(3, 1), # TOP Vector2(3, 1), # BOTTOM ], }, Type.BLUE_STONE: { "uv2s": [ Vector2(4, 1), # FRONT Vector2(4, 1), # BACK Vector2(4, 1), # LEFT Vector2(4, 1), # RIGHT Vector2(4, 1), # TOP Vector2(4, 1), # BOTTOM ], }, Type.RED_STONE: { "uv2s": [ Vector2(5, 1), # FRONT Vector2(5, 1), # BACK Vector2(5, 1), # LEFT Vector2(5, 1), # RIGHT Vector2(5, 1), # TOP Vector2(5, 1), # BOTTOM ], }, Type.BLACK_STONE: { "uv2s": [ Vector2(1, 2), # FRONT Vector2(1, 2), # BACK Vector2(1, 2), # LEFT Vector2(1, 2), # RIGHT Vector2(1, 2), # TOP Vector2(1, 2), # BOTTOM ], }, Type.SELECTION: { "uv2s": [ Vector2(3, 2), # FRONT Vector2(3, 2), # BACK Vector2(3, 2), # LEFT Vector2(3, 2), # RIGHT Vector2(3, 2), # TOP Vector2(3, 2), # BOTTOM ], }, } var position: Vector3 var type: Type func add_face(surface_tool: SurfaceTool, face: Face): var uv2s = [] uv2s.resize(3) uv2s.fill(BLOCK_TYPES[type].uv2s[face]) var normals = [] normals.resize(3) normals.fill(FACE_NORMALS[face]) for idx in FACES[face].size(): var triangle = FACES[face][idx] var triangle_positions = triangle.map(func(item): return (item * (BLOCK_SIZE * 0.5)) + position + (BLOCK_SIZE * 0.5) ) var uvs = FACE_UVS[face][idx] surface_tool.add_triangle_fan( PackedVector3Array(triangle_positions), PackedVector2Array(uvs), PackedColorArray(), PackedVector2Array(uv2s), PackedVector3Array(normals) )