GodotShade/smooth_world.gd
2026-02-12 02:00:03 +01:00

85 lines
2.4 KiB
GDScript

#@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 !surface_points.is_empty():
if show_surface_points:
draw_surface_points()
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]))