MagicNStuff/source/addons/boxconstructor/scripts/cube_grid.gd

74 lines
2.2 KiB
GDScript

@tool
extends StaticBody3D
class_name CubeGrid3D
var grid_scale: float = 1:
set(value):
grid_scale = value
_update_material()
emit_signal("grid_created", grid_scale)
var mesh_instance: MeshInstance3D
var grid_material: ShaderMaterial
var csg_root: CSGCombiner3D
signal grid_created(scale: float)
func _enter_tree() -> void:
if Engine.is_editor_hint():
set_meta("_edit_lock_", true)
# Check if the CubeGridMesh3D already exists
mesh_instance = get_node_or_null("CubeGridMesh3D")
if not mesh_instance:
mesh_instance = MeshInstance3D.new()
mesh_instance.name = "CubeGridMesh3D"
mesh_instance.set_meta("_edit_lock_", true)
var plane_mesh = PlaneMesh.new()
plane_mesh.size = Vector2(1, 1)
mesh_instance.mesh = plane_mesh
mesh_instance.scale = Vector3(4000, 0.001, 4000)
add_child(mesh_instance)
if Engine.is_editor_hint():
mesh_instance.owner = null
# Check if the CSGCombiner3D already exists
csg_root = self.get_node_or_null("CSGCombiner3D")
if not csg_root:
csg_root = CSGCombiner3D.new()
csg_root.name = "CSGCombiner3D"
csg_root.use_collision = true
add_child(csg_root)
if Engine.is_editor_hint():
csg_root.owner = get_tree().edited_scene_root
# Check if the CubeGridCollisionShape3D already exists
var collision_shape = get_node_or_null("CubeGridCollisionShape3D")
if not collision_shape:
collision_shape = CollisionShape3D.new()
var box_shape = BoxShape3D.new()
box_shape.size = Vector3(4000, 0.001, 4000)
collision_shape.shape = box_shape
collision_shape.name = "CubeGridCollisionShape3D"
add_child(collision_shape)
if Engine.is_editor_hint():
collision_shape.owner = null
_setup_shader()
emit_signal("grid_created", grid_scale)
func _setup_shader() -> void:
if not mesh_instance:
mesh_instance = get_node_or_null("CubeGridMesh3D")
if not mesh_instance:
push_error("Grid mesh instance not found!")
return
if not grid_material:
var base_material = preload("res://addons/boxconstructor/textures/cube_grid.tres")
grid_material = base_material.duplicate()
mesh_instance.material_override = grid_material
grid_material.set_shader_parameter("grid_scale", grid_scale)
func _update_material() -> void:
grid_material.set_shader_parameter("grid_scale", grid_scale)