Cleaned up demo to make it working normally

master
Marc Gilleron 2019-04-28 02:50:03 +01:00
parent 68af715c08
commit ff549feafa
2 changed files with 34 additions and 29 deletions

View File

@ -12,9 +12,6 @@ func _ready():
func _input(event): func _input(event):
return
if not Input.is_key_pressed(KEY_CONTROL):
return
if event is InputEventMouseButton: if event is InputEventMouseButton:
if event.pressed: if event.pressed:
if event.button_index == BUTTON_LEFT: if event.button_index == BUTTON_LEFT:
@ -64,8 +61,7 @@ func do_sphere(center, fradius, add):
if add: if add:
res = min(d, e) res = min(d, e)
else: else:
res = max(d, e) res = max(-d, e)
#print(res)
storage.set_voxel_f(res, x, y, z, channel) storage.set_voxel_f(res, x, y, z, channel)
_terrain.make_area_dirty(AABB(center - Vector3(r,r,r), 2*Vector3(r,r,r))) _terrain.make_area_dirty(AABB(center - Vector3(r,r,r), 2*Vector3(r,r,r)))

View File

@ -7,15 +7,17 @@ var _geometric_error = 0.01
var _mesh_instance = null var _mesh_instance = null
var _debug_mesh_instance = null var _debug_mesh_instance = null
var _sphere_mesh_instance = null var _sphere_mesh_instance = null
var _model_rotation = 0.0
var _voxels = VoxelBuffer.new() var _voxels = VoxelBuffer.new()
var _mesher = VoxelMesherDMC.new() var _mesher = VoxelMesherDMC.new()
var _need_generate = false var _need_generate = false
var _iso_scale = 1.0
func _ready(): func _ready():
_mesher.set_octree_mode(VoxelMesherDMC.OCTREE_NONE) _mesher.set_octree_mode(VoxelMesherDMC.OCTREE_NONE)
_voxels.create(18, 18, 18) _voxels.create(20, 20, 20)
_mesh_instance = MeshInstance.new() _mesh_instance = MeshInstance.new()
_mesh_instance.material_override = SpatialMaterial.new() _mesh_instance.material_override = SpatialMaterial.new()
@ -43,7 +45,7 @@ func generate_with_stats():
for k in stats_average: for k in stats_average:
stats_average[k] = 0.0 stats_average[k] = 0.0
var iterations = 100 var iterations = 1
for i in iterations: for i in iterations:
generate() generate()
var stats = _mesher.get_stats() var stats = _mesher.get_stats()
@ -55,7 +57,7 @@ func generate_with_stats():
print("---") print("---")
print("Sphere at ", _sphere_position, ", radius ", _sphere_radius) print("Sphere at ", _sphere_position, ", radius ", _sphere_radius)
print("Geometric error: ", _geometric_error) print("Geometric error: ", _geometric_error, ", iso_scale=", _iso_scale)
print(stats_average) print(stats_average)
#------------------------------------------------------ #------------------------------------------------------
@ -74,17 +76,19 @@ func generate():
_voxels.fill_iso(1.0, VoxelBuffer.CHANNEL_ISOLEVEL) _voxels.fill_iso(1.0, VoxelBuffer.CHANNEL_ISOLEVEL)
var vt = VoxelIsoSurfaceTool.new() var vt = VoxelIsoSurfaceTool.new()
vt.set_iso_scale(_iso_scale)
vt.set_offset(Vector3(1, 1, 1)) # For padding vt.set_offset(Vector3(1, 1, 1)) # For padding
vt.set_buffer(_voxels) vt.set_buffer(_voxels)
vt.do_sphere(_sphere_position, _sphere_radius) vt.do_cube(Transform(Basis(Vector3(1, 0, 0), _model_rotation), _sphere_position), Vector3(_sphere_radius, _sphere_radius, _sphere_radius))
vt.do_sphere(_sphere_position + Vector3(5,2,3), _sphere_radius / 1.5) #vt.do_sphere(_sphere_position, _sphere_radius)
vt.do_plane(make_plane(_sphere_position, Vector3(0,1,0))) #vt.do_sphere(_sphere_position + Vector3(5,2,3), _sphere_radius / 1.5)
#raster_terrain(_voxels) #vt.do_plane(make_plane(_sphere_position, Vector3(0,1,0)))
_mesher.set_mesh_mode(VoxelMesherDMC.MESH_NORMAL) _mesher.set_mesh_mode(VoxelMesherDMC.MESH_NORMAL)
_mesher.set_geometric_error(_geometric_error) _mesher.set_geometric_error(_geometric_error)
var mesh = _mesher.build_mesh(_voxels) var mesh = _mesher.build_mesh(_voxels)
_mesh_instance.mesh = mesh _mesh_instance.mesh = mesh
_mesh_instance.material_override = load("res://dmc_terrain/dmc_terrain_material.tres")
if false: if false:
_mesher.set_mesh_mode(VoxelMesherDMC.MODE_DEBUG_DUAL_GRID) _mesher.set_mesh_mode(VoxelMesherDMC.MODE_DEBUG_DUAL_GRID)
@ -161,24 +165,31 @@ func _input(event):
_geometric_error = 0.0 _geometric_error = 0.0
_need_generate = true _need_generate = true
elif event.scancode == KEY_KP_4:
_model_rotation -= PI / 32.0
_need_generate = true
elif event.scancode == KEY_KP_6:
_model_rotation += PI / 32.0
_need_generate = true
elif event.scancode == KEY_KP_7:
_iso_scale -= 0.1
if _iso_scale < 0.1:
_iso_scale = 0.1
_need_generate = true
elif event.scancode == KEY_KP_9:
_iso_scale += 0.1
_need_generate = true
elif event.scancode == KEY_P: elif event.scancode == KEY_P:
print_buffer_to_images(_voxels, VoxelBuffer.CHANNEL_ISOLEVEL, "isolevel", 10, false) print_buffer_to_images(_voxels, VoxelBuffer.CHANNEL_ISOLEVEL, "isolevel", 10)
print_buffer_to_images(_voxels, VoxelBuffer.CHANNEL_GRADIENT_X, "gradient", 10, true)
elif event.scancode == KEY_R: elif event.scancode == KEY_R:
_need_generate = true _need_generate = true
static func raster_terrain(voxels):
var ci = VoxelBuffer.CHANNEL_ISOLEVEL
var noise = OpenSimplexNoise.new()
for z in voxels.get_size_z():
for y in voxels.get_size_y():
for x in voxels.get_size_x():
var n = noise.get_noise_3d(x, y, z)
voxels.set_voxel_iso(n, x, y, z, ci)
func create_sphere(pos, r): func create_sphere(pos, r):
var mat = SpatialMaterial.new() var mat = SpatialMaterial.new()
mat.flags_transparent = true mat.flags_transparent = true
@ -194,7 +205,7 @@ func create_sphere(pos, r):
return mi return mi
static func print_buffer_to_images(voxels, channel, fname, upscale, gradient): static func print_buffer_to_images(voxels, channel, fname, upscale):
for y in voxels.get_size_y(): for y in voxels.get_size_y():
@ -206,10 +217,8 @@ static func print_buffer_to_images(voxels, channel, fname, upscale, gradient):
for z in voxels.get_size_z(): for z in voxels.get_size_z():
for x in voxels.get_size_x(): for x in voxels.get_size_x():
var r = 0.5 * voxels.get_voxel_iso(x, y, z, channel) + 0.5 var r = 0.5 * voxels.get_voxel_iso(x, y, z, channel) + 0.5
if gradient: if r < 0.5:
var g = 0.5 * voxels.get_voxel_iso(x, y, z, channel + 1) + 0.5 im.set_pixel(x, z, Color(r, r, r*0.5 + 0.5))
var b = 0.5 * voxels.get_voxel_iso(x, y, z, channel + 2) + 0.5
im.set_pixel(x, z, Color(r, g, b))
else: else:
im.set_pixel(x, z, Color(r, r, r)) im.set_pixel(x, z, Color(r, r, r))