small racing game im working on
Diffstat (limited to 'classes/platform.gd')
-rw-r--r--classes/platform.gd104
1 files changed, 104 insertions, 0 deletions
diff --git a/classes/platform.gd b/classes/platform.gd
new file mode 100644
index 0000000..5b86671
--- /dev/null
+++ b/classes/platform.gd
@@ -0,0 +1,104 @@
+@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])
+