@tool class_name Platform3D extends Block @export var mesh: MeshInstance3D var west_wall_scene: PackedScene var east_wall_scene: PackedScene var south_wall_scene: PackedScene var north_wall_scene: PackedScene func wall_scenes() -> Dictionary: return { WALL_W: west_wall_scene, WALL_E: east_wall_scene, WALL_S: south_wall_scene, WALL_N: north_wall_scene, } func wall_transforms() -> Dictionary: return { WALL_W: west_wall_transform, WALL_E: east_wall_transform, WALL_S: south_wall_transform, WALL_N: north_wall_transform, } var west_wall_transform: Transform3D = Transform3D(Basis(), Vector3()): set(wt): west_wall_transform = wt if is_instance_valid(walls[WALL_W]): walls[WALL_W].global_transform = wt var east_wall_transform: Transform3D = Transform3D(Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, -1), Vector3()): set(wt): east_wall_transform = wt if is_instance_valid(walls[WALL_E]): walls[WALL_E].global_transform = wt var south_wall_transform: Transform3D = Transform3D(Vector3(0, 0, -1), Vector3(0, 1, 0), Vector3(1, 0, 0), Vector3()): set(wt): south_wall_transform = wt if is_instance_valid(walls[WALL_S]): walls[WALL_S].global_transform = wt var north_wall_transform: Transform3D = Transform3D(Vector3(0, 0, 1), Vector3(0, 1, 0), Vector3(-1, 0, 0), Vector3()): set(wt): north_wall_transform = wt if is_instance_valid(walls[WALL_N]): walls[WALL_N].global_transform = wt @export_flags("West", "East", "South", "North") var wall_mode := WALL_W | WALL_E | WALL_S | WALL_N: set(wm): wall_mode = wm notify_property_list_changed() @export_flags("Test west", "Test east", "Test south", "Test north") var tests = 0: set(v): tests = v if v else 0 for wall in ITER: if has_walls(wall, true) and not tests & wall: remove_walls(wall, true) elif tests & wall: make_walls(wall, true) func _get_property_list() -> Array: var west_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_W else PROPERTY_USAGE_NO_EDITOR var east_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_E else PROPERTY_USAGE_NO_EDITOR var north_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_N else PROPERTY_USAGE_NO_EDITOR var south_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_S else PROPERTY_USAGE_NO_EDITOR return [ { "name": "west_wall_scene", "type": TYPE_OBJECT, "usage": west_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" }, { "name": "west_wall_transform", "type": TYPE_TRANSFORM3D, "usage": west_usage }, { "name": "east_wall_scene", "type": TYPE_OBJECT, "usage": east_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" }, { "name": "east_wall_transform", "type": TYPE_TRANSFORM3D, "usage": east_usage }, { "name": "north_wall_scene", "type": TYPE_OBJECT, "usage": north_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" }, { "name": "north_wall_transform", "type": TYPE_TRANSFORM3D, "usage": north_usage }, { "name": "south_wall_scene", "type": TYPE_OBJECT, "usage": south_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" }, { "name": "south_wall_transform", "type": TYPE_TRANSFORM3D, "usage": south_usage }, ] # virtual wall functions func make_walls(w: int, singular := false) -> void: for wall in walls: if w & wall: if is_instance_valid(walls[wall]): push_error("wall exists!") return var node: Wall = wall_scenes()[wall].instantiate() node.global_transform = wall_transforms()[wall] add_child(node) walls[wall] = node if singular: return func get_wall_mode() -> int: return wall_mode func get_aabb() -> AABB: return mesh.get_aabb() # virtual mat functions func materials_allowed() -> int: return 1|2|4 func default_mat() -> int: return 1 func set_mat(p_mat: int) -> void: mat = p_mat; reset_map() # virtual editor functions func un_highlight(): reset_map() func highlight() -> void: mesh.set_surface_override_material(0, MatMap.get_highlight(mat)) # utility functions func reset_map(): mesh.set_surface_override_material(0, MatMap.map[mat])