Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @tool
- class_name BrickWall
- extends Node3D
- @export var brick_wall_data: BrickWallData:
- set(value):
- if (
- brick_wall_data != null
- && brick_wall_data.changed.is_connected(_on_brick_wall_data_changed)
- ):
- brick_wall_data.changed.disconnect(_on_brick_wall_data_changed)
- if value != null:
- value.changed.connect(_on_brick_wall_data_changed)
- brick_wall_data = value
- @export var width: int:
- set(value):
- if value != width:
- width = value
- if (
- mortar != null
- && brick_wall_data != null
- ):
- resize()
- var brick_scene: PackedScene = preload("res://resources/meshes/brick.blend")
- var brick_shader: Shader = preload("res://resources/shaders/brick.gdshader")
- var bricks: Array[Node3D] = []
- var rng: RandomNumberGenerator
- @onready var mortar: Node3D = $Mortar
- func _ready() -> void:
- set_notify_transform(true)
- rng = RandomNumberGenerator.new()
- if (
- mortar != null
- && brick_wall_data != null
- ):
- resize()
- func _notification(what: int) -> void:
- if what == NOTIFICATION_TRANSFORM_CHANGED:
- rng.seed = 10000 * position.x + 100 * position.y + position.z
- if (
- mortar != null
- && brick_wall_data != null
- ):
- resize()
- func resize() -> void:
- for brick: Node3D in bricks:
- brick.queue_free()
- bricks = []
- var mortar_mesh_instance_3d: MeshInstance3D = (
- mortar.find_children("*", "MeshInstance3D").front()
- )
- if brick_wall_data.mortar_material != null:
- mortar_mesh_instance_3d.material_override = brick_wall_data.mortar_material
- mortar.scale = (Vector3(
- width + brick_wall_data.mortar_depth,
- brick_wall_data.max_height,
- brick_wall_data.mortar_depth
- ))
- mortar.position = Vector3(0, brick_wall_data.max_height / 2, 0)
- var i: int = 0
- while i * brick_wall_data.brick_height < brick_wall_data.max_height:
- for j: int in width * brick_wall_data.row_amount:
- var brick: Node3D = brick_scene.instantiate()
- if brick_wall_data.brick_material != null:
- var brick_mesh_instance_3d: MeshInstance3D = (
- brick.find_children("*", "MeshInstance3D").front()
- )
- brick_mesh_instance_3d.material_override = brick_wall_data.brick_material
- (
- brick_mesh_instance_3d
- . set_instance_shader_parameter(
- "size",
- Vector3(
- 1.0 / brick_wall_data.row_amount - brick_wall_data.brick_gap,
- brick_wall_data.brick_height - brick_wall_data.brick_gap,
- brick_wall_data.brick_depth - brick_wall_data.brick_gap,
- )
- )
- )
- if not brick_wall_data.brick_tint_dict.is_empty():
- brick_mesh_instance_3d.set_instance_shader_parameter(
- "tint",
- brick_wall_data.brick_tint_dict.keys()[rng.rand_weighted(
- brick_wall_data.brick_tint_dict.values()
- )]
- )
- brick.position = (Vector3(
- (
- 2
- * (0.5 - i % 2)
- * (
- (j + 0.5) / brick_wall_data.row_amount
- + (brick_wall_data.brick_depth - width) / 2.0
- )
- ),
- (i + 0.5) * brick_wall_data.brick_height,
- 0
- ))
- if j != width * brick_wall_data.row_amount - 1:
- brick.position += Vector3(
- rng.randf_range(
- -brick_wall_data.row_position_randomness.x,
- brick_wall_data.row_position_randomness.x
- ),
- rng.randf_range(
- -brick_wall_data.row_position_randomness.y,
- brick_wall_data.row_position_randomness.y
- ),
- rng.randf_range(
- -brick_wall_data.row_position_randomness.z,
- brick_wall_data.row_position_randomness.z
- )
- )
- brick.rotation += Vector3(
- rng.randf_range(
- -brick_wall_data.row_rotation_randomness.x,
- brick_wall_data.row_rotation_randomness.x
- ),
- rng.randf_range(
- -brick_wall_data.row_rotation_randomness.y,
- brick_wall_data.row_rotation_randomness.y
- ),
- rng.randf_range(
- -brick_wall_data.row_rotation_randomness.z,
- brick_wall_data.row_rotation_randomness.z
- )
- )
- add_child(brick)
- bricks.append(brick)
- i += 1
- func _on_brick_wall_data_changed() -> void:
- if mortar != null && brick_wall_data != null:
- resize()
Add Comment
Please, Sign In to add comment