Generate noise heightmap cubes mixed with smooth voxels

master
Marc Gilleron 2017-04-06 23:48:33 +02:00
parent 376d312ae6
commit 13e4e8f7ff
10 changed files with 258 additions and 202 deletions

View File

@ -50,7 +50,7 @@ func _fixed_process(delta):
elif Input.is_action_just_pressed("action2"):
var pos = hit.prev_position
if can_place_voxel_at(pos):
_terrain.get_storage().set_voxel_v(1, pos)
_terrain.get_storage().set_voxel_v(2, pos)
_terrain.make_voxel_dirty(pos)
else:
print("Can't place here!")

163
project/axes.tscn Normal file
View File

@ -0,0 +1,163 @@
[gd_scene load_steps=4 format=2]
[sub_resource type="FixedSpatialMaterial" id=1]
flags_transparent = false
flags_unshaded = false
flags_on_top = false
flags_use_point_size = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_blend_mode = 0
params_cull_mode = 0
params_depth_draw_mode = 0
params_line_width = 1.0
params_point_size = 1.0
albedo_color = Color( 0.917969, 0.190048, 0.190048, 1 )
specular_mode = 0
specular_color = Color( 0.1, 0.1, 0.1, 1 )
specular_metalness = 0.1
specular_roughness = 0.0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
height_enabled = false
subsurf_scatter_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector2( 1, 1 )
uv1_offset = Vector2( 0, 0 )
uv2_scale = Vector2( 1, 1 )
uv2_offset = Vector2( 0, 0 )
[sub_resource type="FixedSpatialMaterial" id=2]
flags_transparent = false
flags_unshaded = false
flags_on_top = false
flags_use_point_size = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_blend_mode = 0
params_cull_mode = 0
params_depth_draw_mode = 0
params_line_width = 1.0
params_point_size = 1.0
albedo_color = Color( 0.359497, 0.742188, 0.401354, 1 )
specular_mode = 0
specular_color = Color( 0.1, 0.1, 0.1, 1 )
specular_metalness = 0.1
specular_roughness = 0.0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
height_enabled = false
subsurf_scatter_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector2( 1, 1 )
uv1_offset = Vector2( 0, 0 )
uv2_scale = Vector2( 1, 1 )
uv2_offset = Vector2( 0, 0 )
[sub_resource type="FixedSpatialMaterial" id=3]
flags_transparent = false
flags_unshaded = false
flags_on_top = false
flags_use_point_size = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_blend_mode = 0
params_cull_mode = 0
params_depth_draw_mode = 0
params_line_width = 1.0
params_point_size = 1.0
albedo_color = Color( 0.168533, 0.478846, 0.917969, 1 )
specular_mode = 0
specular_color = Color( 0.1, 0.1, 0.1, 1 )
specular_metalness = 0.1
specular_roughness = 0.0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
height_enabled = false
subsurf_scatter_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector2( 1, 1 )
uv1_offset = Vector2( 0, 0 )
uv2_scale = Vector2( 1, 1 )
uv2_offset = Vector2( 0, 0 )
[node name="axes" type="Spatial"]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
[node name="X" type="TestCube" parent="."]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 1.07512, 0, 0 )
layers = 1
material_override = SubResource( 1 )
cast_shadow = 1
extra_cull_margin = 0.0
use_as_billboard = false
use_as_y_billboard = false
use_depth_scale = false
visible_in_all_rooms = false
use_in_baked_light = false
lod_min_distance = 0.0
lod_min_hysteresis = 0.0
lod_max_distance = 0.0
lod_max_hysteresis = 0.0
[node name="Y" type="TestCube" parent="."]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 0.1, 0, 0, 0, 1, 0, 0, 0, 0.1, 0, 0.903888, 0 )
layers = 1
material_override = SubResource( 2 )
cast_shadow = 1
extra_cull_margin = 0.0
use_as_billboard = false
use_as_y_billboard = false
use_depth_scale = false
visible_in_all_rooms = false
use_in_baked_light = false
lod_min_distance = 0.0
lod_min_hysteresis = 0.0
lod_max_distance = 0.0
lod_max_hysteresis = 0.0
[node name="Z" type="TestCube" parent="."]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 0.1, 0, 0, 0, 0.1, 0, 0, 0, 1, 0, 0, 1.10346 )
layers = 1
material_override = SubResource( 3 )
cast_shadow = 1
extra_cull_margin = 0.0
use_as_billboard = false
use_as_y_billboard = false
use_depth_scale = false
visible_in_all_rooms = false
use_in_baked_light = false
lod_min_distance = 0.0
lod_min_hysteresis = 0.0
lod_max_distance = 0.0
lod_max_hysteresis = 0.0

View File

@ -91,7 +91,7 @@ environment = null
h_offset = 0.0
v_offset = 0.0
script = ExtResource( 2 )
sensitivity = 0.4
sensitivity = 0.3
min_angle = -90
max_angle = 90
capture_mouse = true
@ -104,8 +104,8 @@ cursor_material = SubResource( 2 )
[node name="debug_label" type="Label" parent="."]
margin_right = 137.0
margin_bottom = 14.0
margin_right = 379.0
margin_bottom = 325.0
rect_clip_content = false
mouse_filter = 2
size_flags_vertical = 0

View File

@ -41,6 +41,7 @@ class Grid extends _Base:
class Heightmap extends _Base:
var _noise2 = OsnNoise.new()
var channel = Voxel.CHANNEL_TYPE
func _init():
_noise2.set_seed(_noise.get_seed() + 1)
@ -87,15 +88,17 @@ class Heightmap extends _Base:
if h >= 0:
if h < bs:
voxels.fill_area(dirt, Vector3(x,0,z), Vector3(x+1,h,z+1))
voxels.fill_area(air, Vector3(x,h,z), Vector3(x+1,bs,z+1))
voxels.fill_area(dirt, Vector3(x,0,z), Vector3(x+1,h,z+1), channel)
voxels.fill_area(air, Vector3(x,h,z), Vector3(x+1,bs,z+1), channel)
else:
voxels.fill_area(dirt, Vector3(x,0,z), Vector3(x+1,bs,z+1))
voxels.fill_area(dirt, Vector3(x,0,z), Vector3(x+1,bs,z+1), channel)
else:
voxels.fill_area(air, Vector3(x,0,z), Vector3(x+1,bs,z+1))
voxels.fill_area(air, Vector3(x,0,z), Vector3(x+1,bs,z+1), channel)
class Volume extends _Base:
var channel = Voxel.CHANNEL_TYPE
func generate(voxels, offset):
offset *= 16
var ox = offset.x
@ -119,13 +122,13 @@ class Volume extends _Base:
var gy = y+oy
var h = noise1.get_noise_3d(x+ox+2, gy, z+oz)
if h < 1-gy*0.005 - 1:
voxels.set_voxel(dirt, x, y, z)
voxels.set_voxel(dirt, x, y, z, channel)
empty = false
else:
if gy < 0:
voxels.set_voxel(4, x, y, z)
voxels.set_voxel(4, x, y, z, channel)
else:
voxels.set_voxel(0, x, y, z)
voxels.set_voxel(0, x, y, z, channel)
empty = false
return empty
@ -160,3 +163,43 @@ class Test extends _Base:
return false
class Mixed extends _Base:
var heightmap_generator = null
func _init():
heightmap_generator = Heightmap.new()
heightmap_generator.channel = Voxel.CHANNEL_TYPE
func generate(voxels, offset):
heightmap_generator.generate(voxels, offset)
var noise1 = OsnFractalNoise.new()
noise1.set_source_noise(_noise)
noise1.set_period(100)
noise1.set_octaves(4)
offset *= 16
var ox = offset.x
var oy = offset.y
var oz = offset.z
var empty = true
var bs = voxels.get_size_x()
var channel = Voxel.CHANNEL_ISOLEVEL
#voxels.fill(255, Voxel.CHANNEL_ISOLEVEL)
for z in range(0, bs):
for x in range(0, bs):
for y in range(0, bs):
var gy = y+oy
var h = noise1.get_noise_3d(x+ox+2, gy, z+oz)
if h < -0.2:
voxels.set_voxel(255, x,y,z, channel)
empty = false
return empty

View File

@ -1,7 +1,8 @@
extends MeshInstance
var step = 16
export var size = 4
export var step = 16
func _ready():
@ -12,23 +13,22 @@ func _ready():
st.add_color(Color(0,0,0))
var r = 4
var rv = 4 * step
var wsize = step * size
for i in range(-r, r):
for j in range(-r, r):
for i in range(0, size+1):
for j in range(0, size+1):
var x = i * step
var y = j * step
st.add_vertex(Vector3(x, -rv, y))
st.add_vertex(Vector3(x, rv, y))
st.add_vertex(Vector3(x, 0, y))
st.add_vertex(Vector3(x, wsize, y))
st.add_vertex(Vector3(x, y, -rv))
st.add_vertex(Vector3(x, y, rv))
st.add_vertex(Vector3(x, y, 0))
st.add_vertex(Vector3(x, y, wsize))
st.add_vertex(Vector3(-rv, x, y))
st.add_vertex(Vector3(rv, x, y))
st.add_vertex(Vector3(0, x, y))
st.add_vertex(Vector3(wsize, x, y))
mesh = st.commit()
#set_mesh(mesh)

View File

@ -1,10 +1,11 @@
[gd_scene load_steps=14 format=2]
[gd_scene load_steps=12 format=2]
[ext_resource path="res://voxel_map.gd" type="Script" id=1]
[ext_resource path="res://terrain.png" type="Texture" id=2]
[ext_resource path="res://grid.gd" type="Script" id=3]
[ext_resource path="res://character_avatar.tscn" type="PackedScene" id=4]
[ext_resource path="res://profiling_gui.gd" type="Script" id=5]
[ext_resource path="res://axes.tscn" type="PackedScene" id=5]
[ext_resource path="res://profiling_gui.gd" type="Script" id=6]
[sub_resource type="Environment" id=1]
@ -209,108 +210,6 @@ uv1_offset = Vector2( 0, 0 )
uv2_scale = Vector2( 1, 1 )
uv2_offset = Vector2( 0, 0 )
[sub_resource type="FixedSpatialMaterial" id=6]
flags_transparent = false
flags_unshaded = false
flags_on_top = false
flags_use_point_size = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_blend_mode = 0
params_cull_mode = 0
params_depth_draw_mode = 0
params_line_width = 1.0
params_point_size = 1.0
albedo_color = Color( 0.917969, 0.190048, 0.190048, 1 )
specular_mode = 0
specular_color = Color( 0.1, 0.1, 0.1, 1 )
specular_metalness = 0.1
specular_roughness = 0.0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
height_enabled = false
subsurf_scatter_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector2( 1, 1 )
uv1_offset = Vector2( 0, 0 )
uv2_scale = Vector2( 1, 1 )
uv2_offset = Vector2( 0, 0 )
[sub_resource type="FixedSpatialMaterial" id=7]
flags_transparent = false
flags_unshaded = false
flags_on_top = false
flags_use_point_size = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_blend_mode = 0
params_cull_mode = 0
params_depth_draw_mode = 0
params_line_width = 1.0
params_point_size = 1.0
albedo_color = Color( 0.359497, 0.742188, 0.401354, 1 )
specular_mode = 0
specular_color = Color( 0.1, 0.1, 0.1, 1 )
specular_metalness = 0.1
specular_roughness = 0.0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
height_enabled = false
subsurf_scatter_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector2( 1, 1 )
uv1_offset = Vector2( 0, 0 )
uv2_scale = Vector2( 1, 1 )
uv2_offset = Vector2( 0, 0 )
[sub_resource type="FixedSpatialMaterial" id=8]
flags_transparent = false
flags_unshaded = false
flags_on_top = false
flags_use_point_size = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_blend_mode = 0
params_cull_mode = 0
params_depth_draw_mode = 0
params_line_width = 1.0
params_point_size = 1.0
albedo_color = Color( 0.168533, 0.478846, 0.917969, 1 )
specular_mode = 0
specular_color = Color( 0.1, 0.1, 0.1, 1 )
specular_metalness = 0.1
specular_roughness = 0.0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
height_enabled = false
subsurf_scatter_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector2( 1, 1 )
uv1_offset = Vector2( 0, 0 )
uv2_scale = Vector2( 1, 1 )
uv2_offset = Vector2( 0, 0 )
[node name="Node" type="Node"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
@ -361,6 +260,8 @@ lod_max_hysteresis = 0.0
mesh = null
skeleton = NodePath("..")
script = ExtResource( 3 )
size = 4
step = 16
[node name="DirectionalLight" type="DirectionalLight" parent="."]
@ -372,7 +273,7 @@ light_energy = 1.0
light_negative = false
light_specular = 0.5
light_cull_mask = -1
shadow_enabled = false
shadow_enabled = true
shadow_color = Color( 0, 0, 0, 1 )
shadow_bias = 0.2
shadow_contact = 0.0
@ -412,82 +313,25 @@ directional_shadow_bias_split_scale = 0.1
[node name="CharacterAvatar" parent="." instance=ExtResource( 4 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 16.4052, 0 )
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 22.9488, 0 )
speed = 4.0
gravity = 30.0
jump_force = 9.0
terrain = NodePath("../VoxelTerrain")
[node name="axes" type="Spatial" parent="."]
editor/display_folded = true
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 14.3287, 0 )
[node name="X" type="TestCube" parent="axes"]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 1.07512, 0, 0 )
layers = 1
material_override = SubResource( 6 )
cast_shadow = 1
extra_cull_margin = 0.0
use_as_billboard = false
use_as_y_billboard = false
use_depth_scale = false
visible_in_all_rooms = false
use_in_baked_light = false
lod_min_distance = 0.0
lod_min_hysteresis = 0.0
lod_max_distance = 0.0
lod_max_hysteresis = 0.0
[node name="Y" type="TestCube" parent="axes"]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 0.1, 0, 0, 0, 1, 0, 0, 0, 0.1, 0, 0.903888, 0 )
layers = 1
material_override = SubResource( 7 )
cast_shadow = 1
extra_cull_margin = 0.0
use_as_billboard = false
use_as_y_billboard = false
use_depth_scale = false
visible_in_all_rooms = false
use_in_baked_light = false
lod_min_distance = 0.0
lod_min_hysteresis = 0.0
lod_max_distance = 0.0
lod_max_hysteresis = 0.0
[node name="Z" type="TestCube" parent="axes"]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 0.1, 0, 0, 0, 0.1, 0, 0, 0, 1, 0, 0, 1.10346 )
layers = 1
material_override = SubResource( 8 )
cast_shadow = 1
extra_cull_margin = 0.0
use_as_billboard = false
use_as_y_billboard = false
use_depth_scale = false
visible_in_all_rooms = false
use_in_baked_light = false
lod_min_distance = 0.0
lod_min_hysteresis = 0.0
lod_max_distance = 0.0
lod_max_hysteresis = 0.0
[node name="axes" parent="." instance=ExtResource( 5 )]
[node name="ProfilingInfo" type="Label" parent="."]
margin_right = 40.0
margin_bottom = 14.0
margin_top = 20.0
margin_right = 104.0
margin_bottom = 34.0
rect_clip_content = false
mouse_filter = 2
size_flags_vertical = 0
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
script = ExtResource( 5 )
script = ExtResource( 6 )

View File

@ -22,3 +22,10 @@ func save_json(infos, path):
else:
print("Could not dump profiling info (error " + str(ret) + ")")
func _process(delta):
var m = OS.get_dynamic_memory_usage()
var mb = m / 1000000
var mbr = m % 1000000
set_text(str(mb) + "." + str(mbr) + " Mb")

View File

@ -6,7 +6,7 @@ var _generator = null
func _init():
_generator = Generators.Volume.new()
_generator = Generators.Mixed.new()
func emerge_block(out_buffer, block_pos):

View File

@ -1,7 +1,7 @@
extends VoxelTerrain
#const CustomProvider = preload("provider.gd")
const CustomProvider = preload("provider.gd")
export(Material) var solid_material = null
export(Material) var transparent_material = null
@ -37,19 +37,18 @@ func _ready():
var mesher = get_mesher()
mesher.set_library(_library)
mesher.set_material(solid_material, 0)
mesher.set_material(transparent_material, 1)
#mesher.set_material(transparent_material, 1)
mesher.set_occlusion_enabled(true)
mesher.set_occlusion_darkness(1.0)
mesher.set_occlusion_darkness(0.5)
set_generate_collisions(true)
set_viewer(get_parent().get_node("CharacterAvatar").get_path())
#set_provider(CustomProvider.new())
var provider = VoxelProviderTest.new()
provider.set_mode(VoxelProviderTest.MODE_WAVES)
provider.set_pattern_size(Vector3(10,8,10))
set_provider(provider)
make_blocks_dirty(Vector3(-16,-4,-16), Vector3(33,8,33))
set_provider(CustomProvider.new())
#var provider = VoxelProviderTest.new()
# provider.set_mode(VoxelProviderTest.MODE_WAVES)
# provider.set_pattern_size(Vector3(10,8,10))
# set_provider(provider)
make_blocks_dirty(Vector3(-8,-4,-8), Vector3(17,9,17))
#make_blocks_dirty(Vector3(-16,-8,-16), Vector3(33,17,33))

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB