just before gpu mesh generation
This commit is contained in:
parent
d0375a15dc
commit
0a148d9db1
@ -15,6 +15,10 @@ layout(set = 0, binding = 1) uniform Params {
|
|||||||
float threshold;
|
float threshold;
|
||||||
} params;
|
} params;
|
||||||
|
|
||||||
|
uint index3(uint x, uint y, uint z) {
|
||||||
|
return x + y * params.world_size + z * params.world_size * params.world_size;
|
||||||
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
uvec3 id = gl_GlobalInvocationID;
|
uvec3 id = gl_GlobalInvocationID;
|
||||||
if (id.x >= uint(params.world_size) ||
|
if (id.x >= uint(params.world_size) ||
|
||||||
@ -22,8 +26,7 @@ void main() {
|
|||||||
id.z >= uint(params.world_size))
|
id.z >= uint(params.world_size))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint index = id.x + id.y * uint(params.world_size) + id.z * uint(params.world_size) * uint(params.world_size);
|
vec3 p = vec3(id) - params.world_size / 2 + 1;
|
||||||
vec3 p = vec3(id);
|
|
||||||
float d = length(p) - params.threshold;
|
float d = length(p) - params.threshold;
|
||||||
voxels.sample_points[index] = d;
|
voxels.sample_points[index3(id.x, id.y, id.z)] = d;
|
||||||
}
|
}
|
||||||
|
|||||||
104
smooth_world.gd
104
smooth_world.gd
@ -30,11 +30,10 @@ var surface_tool: SurfaceTool = SurfaceTool.new()
|
|||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
gpu_sdf = ComputeSdf.new()
|
gpu_sdf = ComputeSdf.new()
|
||||||
gpu_sdf.create_device()
|
gpu_sdf.create_device()
|
||||||
#initialize_sample_points()
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
clear()
|
clear()
|
||||||
sdf_buffer = gpu_sdf.compute(world_size * 2, RADIUS)
|
sdf_buffer = gpu_sdf.compute(world_size, RADIUS)
|
||||||
if !sdf_buffer.is_empty():
|
if !sdf_buffer.is_empty():
|
||||||
create_surface_points()
|
create_surface_points()
|
||||||
if show_surface_points:
|
if show_surface_points:
|
||||||
@ -53,29 +52,25 @@ func clear():
|
|||||||
child.queue_free()
|
child.queue_free()
|
||||||
|
|
||||||
func draw_sample_points():
|
func draw_sample_points():
|
||||||
for x in range(-world_size + 1, world_size):
|
for x in range(world_size):
|
||||||
for y in range(-world_size + 1, world_size):
|
for y in range(world_size):
|
||||||
for z in range(-world_size + 1, world_size):
|
for z in range(world_size):
|
||||||
if sample_points.has(Vector3i(x, y, z)):
|
if sample_points.has(Vector3i(x, y, z)):
|
||||||
DebugDraw3D.draw_square(Vector3i(x, y, z), 0.2, color)
|
DebugDraw3D.draw_square(Vector3i(x, y, z), 0.2, color)
|
||||||
#DebugDraw3D.draw_text(Vector3i(x, y, z), str(Vector3i(x, y, z)))
|
#DebugDraw3D.draw_text(Vector3i(x, y, z), str(Vector3i(x, y, z)))
|
||||||
|
|
||||||
func draw_surface_points():
|
func draw_surface_points():
|
||||||
for x in range(-world_size + 1, world_size):
|
for x in range(world_size):
|
||||||
for y in range(-world_size + 1, world_size):
|
for y in range(world_size):
|
||||||
for z in range(-world_size + 1, world_size):
|
for z in range(world_size):
|
||||||
if surface_points.has(Vector3i(x, y, z)):
|
if surface_points.has(Vector3i(x, y, z)):
|
||||||
DebugDraw3D.draw_square(Vector3i(x, y, z), 0.3, surface_point_color)
|
DebugDraw3D.draw_square(surface_points[Vector3i(x, y, z)].position , 0.3, surface_point_color)
|
||||||
|
DebugDraw3D.draw_text(surface_points[Vector3i(x, y, z)].position, str(surface_points[Vector3i(x, y, z)].position))
|
||||||
|
|
||||||
func initialize_sample_points():
|
|
||||||
sample_points = gpu_sdf.compute(world_size, RADIUS)
|
|
||||||
print("sample_points initialized", sample_points)
|
|
||||||
|
|
||||||
func create_surface_points():
|
func create_surface_points():
|
||||||
for x in range(-world_size + 1, world_size):
|
for x in range(world_size):
|
||||||
for y in range(-world_size + 1, world_size):
|
for y in range(world_size):
|
||||||
for z in range(-world_size + 1, world_size):
|
for z in range(world_size):
|
||||||
create_surface_point(Vector3i(x, y, z))
|
create_surface_point(Vector3i(x, y, z))
|
||||||
|
|
||||||
func create_surface_point(voxel: Vector3i):
|
func create_surface_point(voxel: Vector3i):
|
||||||
@ -83,25 +78,25 @@ func create_surface_point(voxel: Vector3i):
|
|||||||
var previous_sample_point
|
var previous_sample_point
|
||||||
var previous_sample_point_distance_from_sdf
|
var previous_sample_point_distance_from_sdf
|
||||||
var intersection_points_sum = Vector3.ZERO
|
var intersection_points_sum = Vector3.ZERO
|
||||||
var intersection_points_number = Vector3.ZERO
|
var intersection_points_number = 0
|
||||||
for sample_point_to_check_index in range(SURFACE_AXIS.size()):
|
for sample_point_to_check_index in range(SURFACE_AXIS.size()):
|
||||||
var sample_point_to_check = voxel + SURFACE_AXIS[sample_point_to_check_index]
|
var sample_point_to_check = voxel + SURFACE_AXIS[sample_point_to_check_index]
|
||||||
var normal_x = voxel.x + world_size - 1
|
var normal_x = sample_point_to_check.x + world_size - 1
|
||||||
var normal_y = voxel.y + world_size - 1
|
var normal_y = sample_point_to_check.y + world_size - 1
|
||||||
var normal_z = voxel.z + world_size - 1
|
var normal_z = sample_point_to_check.z + world_size - 1
|
||||||
var buffer_index = normal_x + normal_y * world_size + normal_z * world_size * world_size
|
var buffer_index = sample_point_to_check.x + sample_point_to_check.y * world_size + sample_point_to_check.z * world_size * world_size
|
||||||
if buffer_index < sdf_buffer.size():
|
if buffer_index < sdf_buffer.size():
|
||||||
var sample_point_distance_from_sdf = sdf_buffer[buffer_index]#get_sample_value(sample_point_to_check)
|
var sample_point_distance_from_sdf = sdf_buffer[buffer_index]#get_sample_value(sample_point_to_check)
|
||||||
sample_points[voxel] = sample_point_distance_from_sdf
|
sample_points[sample_point_to_check] = sample_point_distance_from_sdf
|
||||||
if previous_sign != 0 && sign(sample_point_distance_from_sdf) != previous_sign:
|
if previous_sign != 0 && sign(sample_point_distance_from_sdf) != previous_sign:
|
||||||
var intersection_point = (1-previous_sample_point_distance_from_sdf/(previous_sample_point_distance_from_sdf - sample_point_distance_from_sdf))*previous_sample_point+(previous_sample_point_distance_from_sdf/(previous_sample_point_distance_from_sdf-sample_point_distance_from_sdf)*sample_point_to_check)
|
var intersection_point = (1-previous_sample_point_distance_from_sdf/(previous_sample_point_distance_from_sdf - sample_point_distance_from_sdf))*previous_sample_point+(previous_sample_point_distance_from_sdf/(previous_sample_point_distance_from_sdf-sample_point_distance_from_sdf)*sample_point_to_check)
|
||||||
intersection_points_sum += intersection_point
|
intersection_points_sum += intersection_point
|
||||||
intersection_points_number += Vector3.ONE
|
intersection_points_number += 1
|
||||||
previous_sign = sign(sample_point_distance_from_sdf)
|
previous_sign = sign(sample_point_distance_from_sdf)
|
||||||
previous_sample_point = sample_point_to_check
|
previous_sample_point = sample_point_to_check
|
||||||
previous_sample_point_distance_from_sdf = sample_point_distance_from_sdf
|
previous_sample_point_distance_from_sdf = sample_point_distance_from_sdf
|
||||||
if intersection_points_sum != Vector3.ZERO && intersection_points_number != Vector3.ZERO:
|
if intersection_points_sum != Vector3.ZERO && intersection_points_number != 0:
|
||||||
var intersection_points_average = intersection_points_sum/intersection_points_number
|
var intersection_points_average = intersection_points_sum/Vector3(intersection_points_number, intersection_points_number, intersection_points_number)
|
||||||
var surface_point = SurfacePoint.new()
|
var surface_point = SurfacePoint.new()
|
||||||
surface_point.position = intersection_points_average
|
surface_point.position = intersection_points_average
|
||||||
surface_points[voxel] = surface_point
|
surface_points[voxel] = surface_point
|
||||||
@ -126,14 +121,15 @@ func create_surface_mesh(size: int = 6):
|
|||||||
func create_surface_mesh_quad(index: Vector3i):
|
func create_surface_mesh_quad(index: Vector3i):
|
||||||
for axis_index in range(AXIS.size()):
|
for axis_index in range(AXIS.size()):
|
||||||
var axis = AXIS[axis_index]
|
var axis = AXIS[axis_index]
|
||||||
|
if sample_points.has(index + axis):
|
||||||
|
|
||||||
var sample_value1 = sample_points[index]
|
var sample_value1 = sample_points[index]
|
||||||
var sample_value2 = sample_points[index + axis]
|
var sample_value2 = sample_points[index + axis]
|
||||||
|
|
||||||
if sample_value1 < 0 and sample_value2 >= 0:
|
if sample_value1 < 0 and sample_value2 >= 0:
|
||||||
add_quad(index, axis_index)
|
add_quad(index, axis_index)
|
||||||
elif sample_value1 >= 0 and sample_value2 < 0:
|
elif sample_value1 >= 0 and sample_value2 < 0:
|
||||||
add_reversed_quad(index, axis_index)
|
add_reversed_quad(index, axis_index)
|
||||||
|
|
||||||
const AXIS := [
|
const AXIS := [
|
||||||
Vector3i(1,0,0),
|
Vector3i(1,0,0),
|
||||||
@ -154,35 +150,37 @@ const SURFACE_AXIS := [
|
|||||||
|
|
||||||
func add_quad(index: Vector3i, axis_index: int):
|
func add_quad(index: Vector3i, axis_index: int):
|
||||||
var points = get_quad_points(index, axis_index)
|
var points = get_quad_points(index, axis_index)
|
||||||
|
if points != null:
|
||||||
|
surface_tool.add_vertex(points[0])
|
||||||
|
surface_tool.add_vertex(points[1])
|
||||||
|
surface_tool.add_vertex(points[2])
|
||||||
|
|
||||||
surface_tool.add_vertex(points[0])
|
surface_tool.add_vertex(points[0])
|
||||||
surface_tool.add_vertex(points[1])
|
surface_tool.add_vertex(points[2])
|
||||||
surface_tool.add_vertex(points[2])
|
surface_tool.add_vertex(points[3])
|
||||||
|
surface_tool.generate_normals()
|
||||||
surface_tool.add_vertex(points[0])
|
|
||||||
surface_tool.add_vertex(points[2])
|
|
||||||
surface_tool.add_vertex(points[3])
|
|
||||||
surface_tool.generate_normals()
|
|
||||||
|
|
||||||
func add_reversed_quad(index: Vector3i, axis_index: int):
|
func add_reversed_quad(index: Vector3i, axis_index: int):
|
||||||
var points = get_quad_points(index, axis_index)
|
var points = get_quad_points(index, axis_index)
|
||||||
|
|
||||||
surface_tool.add_vertex(points[0])
|
if points != null:
|
||||||
surface_tool.add_vertex(points[2])
|
surface_tool.add_vertex(points[0])
|
||||||
surface_tool.add_vertex(points[1])
|
surface_tool.add_vertex(points[2])
|
||||||
|
surface_tool.add_vertex(points[1])
|
||||||
|
|
||||||
surface_tool.add_vertex(points[0])
|
surface_tool.add_vertex(points[0])
|
||||||
surface_tool.add_vertex(points[3])
|
surface_tool.add_vertex(points[3])
|
||||||
surface_tool.add_vertex(points[2])
|
surface_tool.add_vertex(points[2])
|
||||||
surface_tool.generate_normals()
|
surface_tool.generate_normals()
|
||||||
|
|
||||||
func get_quad_points(index: Vector3i, axis_index: int):
|
func get_quad_points(index: Vector3i, axis_index: int):
|
||||||
return [
|
if surface_points.has(index + QUAD_POINTS[axis_index][0]) and surface_points.has(index + QUAD_POINTS[axis_index][1]) and surface_points.has(index + QUAD_POINTS[axis_index][2]) and surface_points.has(index + QUAD_POINTS[axis_index][3]):
|
||||||
surface_points[index + QUAD_POINTS[axis_index][0]].position,
|
return [
|
||||||
surface_points[index + QUAD_POINTS[axis_index][1]].position,
|
surface_points[index + QUAD_POINTS[axis_index][0]].position,
|
||||||
surface_points[index + QUAD_POINTS[axis_index][2]].position,
|
surface_points[index + QUAD_POINTS[axis_index][1]].position,
|
||||||
surface_points[index + QUAD_POINTS[axis_index][3]].position,
|
surface_points[index + QUAD_POINTS[axis_index][2]].position,
|
||||||
]
|
surface_points[index + QUAD_POINTS[axis_index][3]].position,
|
||||||
|
]
|
||||||
|
|
||||||
const QUAD_POINTS := [
|
const QUAD_POINTS := [
|
||||||
# x axis
|
# x axis
|
||||||
|
|||||||
@ -4,6 +4,4 @@
|
|||||||
|
|
||||||
[node name="SmoothWorld" type="Node3D"]
|
[node name="SmoothWorld" type="Node3D"]
|
||||||
script = ExtResource("1_4h467")
|
script = ExtResource("1_4h467")
|
||||||
RADIUS = 2.059
|
RADIUS = 6.789
|
||||||
show_sample_points = true
|
|
||||||
show_surface_points = true
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user