Guest User

Untitled

a guest
Jun 6th, 2025
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. @tool
  2. class_name BrickWall
  3. extends Node3D
  4.  
  5. @export var brick_wall_data: BrickWallData:
  6.     set(value):
  7.         if (
  8.             brick_wall_data != null
  9.             && brick_wall_data.changed.is_connected(_on_brick_wall_data_changed)
  10.         ):
  11.             brick_wall_data.changed.disconnect(_on_brick_wall_data_changed)
  12.         if value != null:
  13.             value.changed.connect(_on_brick_wall_data_changed)
  14.         brick_wall_data = value
  15. @export var width: int:
  16.     set(value):
  17.         if value != width:
  18.             width = value
  19.             if (
  20.                 mortar != null
  21.                 && brick_wall_data != null
  22.             ):
  23.                 resize()
  24.  
  25. var brick_scene: PackedScene = preload("res://resources/meshes/brick.blend")
  26. var brick_shader: Shader = preload("res://resources/shaders/brick.gdshader")
  27.  
  28. var bricks: Array[Node3D] = []
  29. var rng: RandomNumberGenerator
  30.  
  31. @onready var mortar: Node3D = $Mortar
  32.  
  33.  
  34. func _ready() -> void:
  35.     set_notify_transform(true)
  36.  
  37.     rng = RandomNumberGenerator.new()
  38.     if (
  39.         mortar != null
  40.         && brick_wall_data != null
  41.     ):
  42.         resize()
  43.  
  44.  
  45. func _notification(what: int) -> void:
  46.     if what == NOTIFICATION_TRANSFORM_CHANGED:
  47.         rng.seed = 10000 * position.x + 100 * position.y + position.z
  48.         if (
  49.             mortar != null
  50.             && brick_wall_data != null
  51.         ):
  52.             resize()
  53.  
  54.  
  55. func resize() -> void:
  56.     for brick: Node3D in bricks:
  57.         brick.queue_free()
  58.     bricks = []
  59.  
  60.     var mortar_mesh_instance_3d: MeshInstance3D = (
  61.         mortar.find_children("*", "MeshInstance3D").front()
  62.     )
  63.     if brick_wall_data.mortar_material != null:
  64.         mortar_mesh_instance_3d.material_override = brick_wall_data.mortar_material
  65.  
  66.     mortar.scale = (Vector3(
  67.         width + brick_wall_data.mortar_depth,
  68.         brick_wall_data.max_height,
  69.         brick_wall_data.mortar_depth
  70.     ))
  71.     mortar.position = Vector3(0, brick_wall_data.max_height / 2, 0)
  72.  
  73.     var i: int = 0
  74.     while i * brick_wall_data.brick_height < brick_wall_data.max_height:
  75.         for j: int in width * brick_wall_data.row_amount:
  76.             var brick: Node3D = brick_scene.instantiate()
  77.  
  78.             if brick_wall_data.brick_material != null:
  79.                 var brick_mesh_instance_3d: MeshInstance3D = (
  80.                     brick.find_children("*", "MeshInstance3D").front()
  81.                 )
  82.                 brick_mesh_instance_3d.material_override = brick_wall_data.brick_material
  83.                 (
  84.                     brick_mesh_instance_3d
  85.                     . set_instance_shader_parameter(
  86.                         "size",
  87.                         Vector3(
  88.                             1.0 / brick_wall_data.row_amount - brick_wall_data.brick_gap,
  89.                             brick_wall_data.brick_height - brick_wall_data.brick_gap,
  90.                             brick_wall_data.brick_depth - brick_wall_data.brick_gap,
  91.                         )
  92.                     )
  93.                 )
  94.                 if not brick_wall_data.brick_tint_dict.is_empty():
  95.                     brick_mesh_instance_3d.set_instance_shader_parameter(
  96.                         "tint",
  97.                         brick_wall_data.brick_tint_dict.keys()[rng.rand_weighted(
  98.                             brick_wall_data.brick_tint_dict.values()
  99.                         )]
  100.                     )
  101.  
  102.             brick.position = (Vector3(
  103.                 (
  104.                     2
  105.                     * (0.5 - i % 2)
  106.                     * (
  107.                         (j + 0.5) / brick_wall_data.row_amount
  108.                         + (brick_wall_data.brick_depth - width) / 2.0
  109.                     )
  110.                 ),
  111.                 (i + 0.5) * brick_wall_data.brick_height,
  112.                 0
  113.             ))
  114.             if j != width * brick_wall_data.row_amount - 1:
  115.                 brick.position += Vector3(
  116.                     rng.randf_range(
  117.                         -brick_wall_data.row_position_randomness.x,
  118.                         brick_wall_data.row_position_randomness.x
  119.                     ),
  120.                     rng.randf_range(
  121.                         -brick_wall_data.row_position_randomness.y,
  122.                         brick_wall_data.row_position_randomness.y
  123.                     ),
  124.                     rng.randf_range(
  125.                         -brick_wall_data.row_position_randomness.z,
  126.                         brick_wall_data.row_position_randomness.z
  127.                     )
  128.                 )
  129.             brick.rotation += Vector3(
  130.                 rng.randf_range(
  131.                     -brick_wall_data.row_rotation_randomness.x,
  132.                     brick_wall_data.row_rotation_randomness.x
  133.                 ),
  134.                 rng.randf_range(
  135.                     -brick_wall_data.row_rotation_randomness.y,
  136.                     brick_wall_data.row_rotation_randomness.y
  137.                 ),
  138.                 rng.randf_range(
  139.                     -brick_wall_data.row_rotation_randomness.z,
  140.                     brick_wall_data.row_rotation_randomness.z
  141.                 )
  142.             )
  143.             add_child(brick)
  144.  
  145.             bricks.append(brick)
  146.         i += 1
  147.  
  148.  
  149. func _on_brick_wall_data_changed() -> void:
  150.     if mortar != null && brick_wall_data != null:
  151.         resize()
Add Comment
Please, Sign In to add comment