#@tool extends Node3D const CENTER := Vector3.ZERO @export var RADIUS: float = 5.0 var sample_points = {} var SamplePoint = preload("res://sample_point.gd") var surface_points = {} var SurfacePoint = preload("res://surface_point.gd") var ComputeSdf = preload("res://compute_samples.gd") var gpu_sdf var generate_mesh_shader = preload("res://generate_mesh.tres") @export var regenerate_mesh = false @export var world_size = 16 @export var show_sample_points = false @export var show_surface_points = false @export var show_surface = true @export var do_the_thing: bool = false @export var clear_the_thing: bool = false var color = Color.CORAL var surface_point_color = Color.CRIMSON var mesh var surface_tool: SurfaceTool = SurfaceTool.new() var meshinstance = MeshInstance3D.new() var material = ShaderMaterial.new() func _ready() -> void: material.shader = generate_mesh_shader meshinstance.material_override = material add_child(meshinstance) gpu_sdf = ComputeSdf.new() gpu_sdf.create_device() meshinstance.mesh = gpu_sdf.compute_mesh(world_size, RADIUS) func _input(event): if event is InputEventKey and event.is_action_released("RegenerateMesh"): if regenerate_mesh: regenerate_mesh = false else: regenerate_mesh = true func _process(_delta: float) -> void: if show_surface && regenerate_mesh: #regenerate_mesh = false clear() meshinstance.mesh = gpu_sdf.compute_mesh(world_size, RADIUS) if show_surface_points: var idx = 0 var text_id = 0 while idx < gpu_sdf.iout_surface_points.size(): text_id += 1 var value = Vector3(gpu_sdf.iout_surface_points.get(idx), gpu_sdf.iout_surface_points.get(idx+1), gpu_sdf.iout_surface_points.get(idx+2)) - Vector3(world_size / 2, world_size / 2, world_size / 2) if gpu_sdf.iout_surface_points.get(idx) != -1.0: DebugDraw3D.draw_square(value, 0.2, color.from_rgba8(255, 128, 128, 255)) if text_id % 3 == 0: DebugDraw3D.draw_text(value, str(value), 35) idx += 3 else: idx += 1 if show_sample_points: draw_sample_points() func clear(): surface_points = {} sample_points = {} mesh = ArrayMesh.new() func get_index_from_coords(coords: Vector3i): return coords.x + coords.y * world_size + coords.z * world_size * world_size func draw_sample_points(): for x in range(world_size): for y in range(world_size): for z in range(world_size): if sample_points.has(Vector3i(x, y, z)): DebugDraw3D.draw_square(Vector3i(x, y, z), 0.2, color.from_rgba8(sample_points.get(Vector3i(x, y, z)), 128, 128, 255)) #DebugDraw3D.draw_text(Vector3i(x, y, z), str(Vector3i(x, y, z))) func draw_surface_points(): for surface_point in surface_points: if surface_points[surface_point] != Vector3(0, 0, 0): DebugDraw3D.draw_square(surface_points[surface_point] , 0.3, surface_point_color) #DebugDraw3D.draw_text(surface_points[surface_point], str(surface_points[surface_point]))