Reorganized project, added dual marching cubes test

master
Marc Gilleron 2019-04-24 01:20:15 +01:00
parent a01c7e8db7
commit 0c441eca6b
40 changed files with 1238 additions and 1458 deletions

View File

@ -1,147 +1,162 @@
extends Node
export(NodePath) var terrain_path = null
export(Material) var cursor_material = null
const COLLISION_LAYER_AVATAR = 2
var _terrain = null
var _cursor = null
onready var _head = get_parent().get_node("Camera")
func _ready():
if terrain_path == null:
_terrain = get_parent().get_node(get_parent().terrain)
terrain_path = _terrain.get_path() # For correctness
else:
_terrain = get_node(terrain_path)
_cursor = _make_cursor()
_terrain.add_child(_cursor)
func get_pointed_voxel():
var origin = _head.get_global_transform().origin
var forward = -_head.get_transform().basis.z.normalized()
var hit = _terrain.raycast(origin, forward, 10)
return hit
func _physics_process(delta):
if _terrain == null:
return
var hit = get_pointed_voxel()
if hit != null:
_cursor.show()
_cursor.set_translation(hit.position + Vector3(1,1,1)*0.5)
get_parent().get_node("debug_label").text = str(hit.position)
else:
_cursor.hide()
get_parent().get_node("debug_label").text = "---"
# These inputs have to be in _fixed_process because they rely on collision queries
if hit != null:
var has_cube = _terrain.get_storage().get_voxel_v(hit.position) != 0
if Input.is_action_just_pressed("action1") and has_cube:
var pos = hit.position
do_sphere(pos, 5, 0)
#_terrain.get_storage().set_voxel_v(0, pos)
#_terrain.make_voxel_dirty(pos)
elif Input.is_action_just_pressed("action2"):
var pos = hit.prev_position
if has_cube == false:
pos = hit.position
if can_place_voxel_at(pos):
do_sphere(pos, 4, 2)
#_terrain.get_storage().set_voxel_v(2, pos)
#_terrain.make_voxel_dirty(pos)
print("Place voxel at ", pos)
else:
print("Can't place here!")
func can_place_voxel_at(pos):
var space_state = get_viewport().get_world().get_direct_space_state()
var params = PhysicsShapeQueryParameters.new()
params.collision_mask = COLLISION_LAYER_AVATAR
params.transform = Transform(Basis(), pos + Vector3(1,1,1)*0.5)
var shape = BoxShape.new()
var ex = 0.5
shape.extents = Vector3(ex, ex, ex)
params.set_shape(shape)
var hits = space_state.intersect_shape(params)
return hits.size() == 0
func _make_cursor():
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_LINES)
_add_wireframe_cube(st, -Vector3(1,1,1)*0.5, 1, Color(0,0,0))
var mesh = st.commit()
var mesh_instance = MeshInstance.new()
mesh_instance.mesh = mesh
if cursor_material != null:
mesh_instance.material_override = cursor_material
mesh_instance.set_scale(Vector3(1,1,1)*1.01)
return mesh_instance
func do_sphere(center, r, type):
var storage = _terrain.get_storage()
for z in range(-r, r):
for x in range(-r, r):
for y in range(-r, r):
var pos = Vector3(x, y, z)
if pos.length() <= r:
storage.set_voxel_v(type, center + pos, 0)
_terrain.make_area_dirty(AABB(center - Vector3(r,r,r), 2*Vector3(r,r,r)))
static func _add_wireframe_cube(st, pos, step, color):
st.add_color(color)
st.add_vertex(pos)
st.add_vertex(pos + Vector3(step, 0, 0))
st.add_vertex(pos + Vector3(step, 0, 0))
st.add_vertex(pos + Vector3(step, 0, step))
st.add_vertex(pos + Vector3(step, 0, step))
st.add_vertex(pos + Vector3(0, 0, step))
st.add_vertex(pos + Vector3(0, 0, step))
st.add_vertex(pos)
st.add_vertex(pos + Vector3(0, step, 0))
st.add_vertex(pos + Vector3(step, step, 0))
st.add_vertex(pos + Vector3(step, step, 0))
st.add_vertex(pos + Vector3(step, step, step))
st.add_vertex(pos + Vector3(step, step, step))
st.add_vertex(pos + Vector3(0, step, step))
st.add_vertex(pos + Vector3(0, step, step))
st.add_vertex(pos + Vector3(0, step, 0))
st.add_vertex(pos)
st.add_vertex(pos + Vector3(0, step, 0))
st.add_vertex(pos + Vector3(step, 0, 0))
st.add_vertex(pos + Vector3(step, step, 0))
st.add_vertex(pos + Vector3(step, 0, step))
st.add_vertex(pos + Vector3(step, step, step))
st.add_vertex(pos + Vector3(0, 0, step))
st.add_vertex(pos + Vector3(0, step, step))
extends Node
export(NodePath) var terrain_path = null
export(Material) var cursor_material = null
const COLLISION_LAYER_AVATAR = 2
var _terrain = null
var _cursor = null
var _action_place = false
var _action_remove = false
onready var _head = get_parent().get_node("Camera")
func _ready():
if terrain_path == null:
_terrain = get_parent().get_node(get_parent().terrain)
terrain_path = _terrain.get_path() # For correctness
else:
_terrain = get_node(terrain_path)
_cursor = _make_cursor()
_terrain.add_child(_cursor)
func get_pointed_voxel():
var origin = _head.get_global_transform().origin
var forward = -_head.get_transform().basis.z.normalized()
var hit = _terrain.raycast(origin, forward, 10)
return hit
func _physics_process(delta):
if _terrain == null:
return
var hit = get_pointed_voxel()
if hit != null:
_cursor.show()
_cursor.set_translation(hit.position + Vector3(1,1,1)*0.5)
get_parent().get_node("debug_label").text = str(hit.position)
else:
_cursor.hide()
get_parent().get_node("debug_label").text = "---"
# These inputs have to be in _fixed_process because they rely on collision queries
if hit != null:
var has_cube = _terrain.get_storage().get_voxel_v(hit.position) != 0
if _action_place and has_cube:
var pos = hit.position
do_sphere(pos, 5, 0)
#_terrain.get_storage().set_voxel_v(0, pos)
#_terrain.make_voxel_dirty(pos)
elif _action_remove:
var pos = hit.prev_position
if has_cube == false:
pos = hit.position
if can_place_voxel_at(pos):
do_sphere(pos, 4, 2)
#_terrain.get_storage().set_voxel_v(2, pos)
#_terrain.make_voxel_dirty(pos)
print("Place voxel at ", pos)
else:
print("Can't place here!")
_action_place = false
_action_remove = false
func _input(event):
if event is InputEventMouseButton:
if event.pressed:
if event.button_index == BUTTON_LEFT:
_action_place = true
elif event.button_index == BUTTON_RIGHT:
_action_remove = true
func can_place_voxel_at(pos):
var space_state = get_viewport().get_world().get_direct_space_state()
var params = PhysicsShapeQueryParameters.new()
params.collision_mask = COLLISION_LAYER_AVATAR
params.transform = Transform(Basis(), pos + Vector3(1,1,1)*0.5)
var shape = BoxShape.new()
var ex = 0.5
shape.extents = Vector3(ex, ex, ex)
params.set_shape(shape)
var hits = space_state.intersect_shape(params)
return hits.size() == 0
# Makes a 3D wireframe cube cursor
func _make_cursor():
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_LINES)
_add_wireframe_cube(st, -Vector3(1,1,1)*0.5, 1, Color(0,0,0))
var mesh = st.commit()
var mesh_instance = MeshInstance.new()
mesh_instance.mesh = mesh
if cursor_material != null:
mesh_instance.material_override = cursor_material
mesh_instance.set_scale(Vector3(1,1,1)*1.01)
return mesh_instance
func do_sphere(center, r, type):
var storage = _terrain.get_storage()
for z in range(-r, r):
for x in range(-r, r):
for y in range(-r, r):
var pos = Vector3(x, y, z)
if pos.length() <= r:
storage.set_voxel_v(type, center + pos, 0)
_terrain.make_area_dirty(AABB(center - Vector3(r,r,r), 2*Vector3(r,r,r)))
static func _add_wireframe_cube(st, pos, step, color):
st.add_color(color)
st.add_vertex(pos)
st.add_vertex(pos + Vector3(step, 0, 0))
st.add_vertex(pos + Vector3(step, 0, 0))
st.add_vertex(pos + Vector3(step, 0, step))
st.add_vertex(pos + Vector3(step, 0, step))
st.add_vertex(pos + Vector3(0, 0, step))
st.add_vertex(pos + Vector3(0, 0, step))
st.add_vertex(pos)
st.add_vertex(pos + Vector3(0, step, 0))
st.add_vertex(pos + Vector3(step, step, 0))
st.add_vertex(pos + Vector3(step, step, 0))
st.add_vertex(pos + Vector3(step, step, step))
st.add_vertex(pos + Vector3(step, step, step))
st.add_vertex(pos + Vector3(0, step, step))
st.add_vertex(pos + Vector3(0, step, step))
st.add_vertex(pos + Vector3(0, step, 0))
st.add_vertex(pos)
st.add_vertex(pos + Vector3(0, step, 0))
st.add_vertex(pos + Vector3(step, 0, 0))
st.add_vertex(pos + Vector3(step, step, 0))
st.add_vertex(pos + Vector3(step, 0, step))
st.add_vertex(pos + Vector3(step, step, step))
st.add_vertex(pos + Vector3(0, 0, step))
st.add_vertex(pos + Vector3(0, step, step))

View File

@ -1,10 +1,14 @@
[gd_scene load_steps=8 format=2]
[ext_resource path="res://character_controller.gd" type="Script" id=1]
[ext_resource path="res://blocky_terrain/character_controller.gd" type="Script" id=1]
[ext_resource path="res://mouse_look.gd" type="Script" id=2]
[ext_resource path="res://avatar_interaction.gd" type="Script" id=3]
[ext_resource path="res://crosshair.png" type="Texture" id=4]
[ext_resource path="res://center.gd" type="Script" id=5]
[ext_resource path="res://blocky_terrain/avatar_interaction.gd" type="Script" id=3]
[ext_resource path="res://blocky_terrain/crosshair.png" type="Texture" id=4]
[ext_resource path="res://blocky_terrain/center.gd" type="Script" id=5]
[sub_resource type="SpatialMaterial" id=1]

View File

@ -1,92 +1,92 @@
extends Spatial
export var speed = 5.0
export var gravity = 9.8
export var jump_force = 5.0
export(NodePath) var head = null
# Not used in this script, but might be useful for child nodes because
# this controller will most likely be on the root
export(NodePath) var terrain = null
var _velocity = Vector3()
var _grounded = false
var _head = null
var _box_mover = VoxelBoxMover.new()
func _ready():
_head = get_node(head)
# FIX
#set_shape_transform(0, Transform().rotated(Vector3(1,0,0), PI/2.0))
func _input(event):
if event is InputEventKey:
if event.pressed:
if event.scancode == KEY_1:
var light = get_node("../DirectionalLight")
light.shadow_enabled = not light.shadow_enabled
elif event.scancode == KEY_2:
OS.set_use_vsync(not OS.is_vsync_enabled())
print("Vsync: ", OS.is_vsync_enabled())
func _physics_process(delta):
var forward = _head.get_transform().basis.z.normalized()
forward = Plane(Vector3(0, 1, 0), 0).project(forward)
var right = _head.get_transform().basis.x.normalized()
var motor = Vector3()
if Input.is_key_pressed(KEY_UP) or Input.is_key_pressed(KEY_Z) or Input.is_key_pressed(KEY_W):
motor -= forward
if Input.is_key_pressed(KEY_DOWN) or Input.is_key_pressed(KEY_S):
motor += forward
if Input.is_key_pressed(KEY_LEFT) or Input.is_key_pressed(KEY_Q) or Input.is_key_pressed(KEY_A):
motor -= right
if Input.is_key_pressed(KEY_RIGHT) or Input.is_key_pressed(KEY_D):
motor += right
motor = motor.normalized() * speed
_velocity.x = motor.x
_velocity.z = motor.z
_velocity.y -= gravity * delta
#if _grounded and Input.is_key_pressed(KEY_SPACE):
if Input.is_key_pressed(KEY_SPACE):
_velocity.y = jump_force
#_grounded = false
var motion = _velocity * delta
if has_node(terrain):
var aabb = AABB(Vector3(-0.4, -0.9, -0.4), Vector3(0.8, 1.8, 0.8))
var terrain_node = get_node(terrain)
motion = _box_mover.get_motion(get_translation(), motion, aabb, terrain_node)
global_translate(motion)
assert(delta > 0)
_velocity = motion / delta
#var rem = move(motion)
# TODO Fix it, obsolete code
# if is_colliding():
# var n = get_collision_normal()
# var k = 1.0#clamp(n.y, 0, 1)
# rem = rem.slide(n)*k
# _velocity = _velocity.slide(n)*k
# #rem = n.slide(rem)*k
# #_velocity = n.slide(_velocity)*k
# _grounded = true
# move(rem)
# else:
# _grounded = false
#get_node("debug").set_text("Grounded=" + str(_grounded))
extends Spatial
export var speed = 5.0
export var gravity = 9.8
export var jump_force = 5.0
export(NodePath) var head = null
# Not used in this script, but might be useful for child nodes because
# this controller will most likely be on the root
export(NodePath) var terrain = null
var _velocity = Vector3()
var _grounded = false
var _head = null
var _box_mover = VoxelBoxMover.new()
func _ready():
_head = get_node(head)
# FIX
#set_shape_transform(0, Transform().rotated(Vector3(1,0,0), PI/2.0))
func _input(event):
if event is InputEventKey:
if event.pressed:
if event.scancode == KEY_1:
var light = get_node("../DirectionalLight")
light.shadow_enabled = not light.shadow_enabled
elif event.scancode == KEY_2:
OS.set_use_vsync(not OS.is_vsync_enabled())
print("Vsync: ", OS.is_vsync_enabled())
func _physics_process(delta):
var forward = _head.get_transform().basis.z.normalized()
forward = Plane(Vector3(0, 1, 0), 0).project(forward)
var right = _head.get_transform().basis.x.normalized()
var motor = Vector3()
if Input.is_key_pressed(KEY_UP) or Input.is_key_pressed(KEY_Z) or Input.is_key_pressed(KEY_W):
motor -= forward
if Input.is_key_pressed(KEY_DOWN) or Input.is_key_pressed(KEY_S):
motor += forward
if Input.is_key_pressed(KEY_LEFT) or Input.is_key_pressed(KEY_Q) or Input.is_key_pressed(KEY_A):
motor -= right
if Input.is_key_pressed(KEY_RIGHT) or Input.is_key_pressed(KEY_D):
motor += right
motor = motor.normalized() * speed
_velocity.x = motor.x
_velocity.z = motor.z
_velocity.y -= gravity * delta
#if _grounded and Input.is_key_pressed(KEY_SPACE):
if Input.is_key_pressed(KEY_SPACE):
_velocity.y = jump_force
#_grounded = false
var motion = _velocity * delta
if has_node(terrain):
var aabb = AABB(Vector3(-0.4, -0.9, -0.4), Vector3(0.8, 1.8, 0.8))
var terrain_node = get_node(terrain)
motion = _box_mover.get_motion(get_translation(), motion, aabb, terrain_node)
global_translate(motion)
assert(delta > 0)
_velocity = motion / delta
#var rem = move(motion)
# TODO Fix it, obsolete code
# if is_colliding():
# var n = get_collision_normal()
# var k = 1.0#clamp(n.y, 0, 1)
# rem = rem.slide(n)*k
# _velocity = _velocity.slide(n)*k
# #rem = n.slide(rem)*k
# #_velocity = n.slide(_velocity)*k
# _grounded = true
# move(rem)
# else:
# _grounded = false
#get_node("debug").set_text("Grounded=" + str(_grounded))

View File

Before

Width:  |  Height:  |  Size: 240 B

After

Width:  |  Height:  |  Size: 240 B

View File

@ -2,12 +2,15 @@
importer="texture"
type="StreamTexture"
path="res://.import/crosshair.png-b7f9cb2e0fc32a087972fec001d3421e.stex"
path="res://.import/crosshair.png-de88e5fb0261d6bf3bea6192d82f5d8f.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://crosshair.png"
dest_files=[ "res://.import/crosshair.png-b7f9cb2e0fc32a087972fec001d3421e.stex" ]
source_file="res://blocky_terrain/crosshair.png"
dest_files=[ "res://.import/crosshair.png-de88e5fb0261d6bf3bea6192d82f5d8f.stex" ]
[params]

View File

@ -1,109 +1,109 @@
extends MeshInstance
var _boxes = []
var _colors = []
var _mesh = null
# Who said "use ImmediateGeometry" node?
func draw_wire_box(box, color=Color(1,1,1,1)):
_boxes.append(box)
_colors.append(color)
func _fixed_process(delta):
if _mesh == null:
_mesh = ArrayMesh.new()
mesh = _mesh
if _mesh.get_surface_count() != 0:
_mesh.surface_remove(0)
var positions = PoolVector3Array()
var colors = PoolColorArray()
var indices = PoolIntArray()
for i in range(0, _boxes.size()):
var box = _boxes[i]
var color = _colors[i]
var vi = positions.size()
var pos = box.position
var end = box.end
var x0 = pos.x
var y0 = pos.y
var z0 = pos.z
var x1 = end.x
var y1 = end.y
var z1 = end.z
positions.append_array([
Vector3(x0, y0, z0),
Vector3(x1, y0, z0),
Vector3(x1, y0, z1),
Vector3(x0, y0, z1),
Vector3(x0, y1, z0),
Vector3(x1, y1, z0),
Vector3(x1, y1, z1),
Vector3(x0, y1, z1)
])
colors.append_array([
color,
color,
color,
color,
color,
color,
color,
color
])
indices.append_array([
indices.append(vi),
indices.append(vi+1),
indices.append(vi+1),
indices.append(vi+2),
indices.append(vi+2),
indices.append(vi+3),
indices.append(vi+3),
indices.append(vi),
indices.append(vi+4),
indices.append(vi+5),
indices.append(vi+5),
indices.append(vi+6),
indices.append(vi+6),
indices.append(vi+7),
indices.append(vi+7),
indices.append(vi+4),
indices.append(vi),
indices.append(vi+4),
indices.append(vi+1),
indices.append(vi+5),
indices.append(vi+2),
indices.append(vi+6),
indices.append(vi+3),
indices.append(vi+7)
])
if positions.size() != 0:
var arrays = []
# TODO Use ArrayMesh.ARRAY_MAX
arrays.resize(9)
arrays[ArrayMesh.ARRAY_VERTEX] = positions
arrays[ArrayMesh.ARRAY_COLOR] = colors
arrays[ArrayMesh.ARRAY_INDEX] = indices
_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_LINES, arrays)
_boxes.clear()
_colors.clear()
extends MeshInstance
var _boxes = []
var _colors = []
var _mesh = null
# Who said "use ImmediateGeometry" node?
func draw_wire_box(box, color=Color(1,1,1,1)):
_boxes.append(box)
_colors.append(color)
func _fixed_process(delta):
if _mesh == null:
_mesh = ArrayMesh.new()
mesh = _mesh
if _mesh.get_surface_count() != 0:
_mesh.surface_remove(0)
var positions = PoolVector3Array()
var colors = PoolColorArray()
var indices = PoolIntArray()
for i in range(0, _boxes.size()):
var box = _boxes[i]
var color = _colors[i]
var vi = positions.size()
var pos = box.position
var end = box.end
var x0 = pos.x
var y0 = pos.y
var z0 = pos.z
var x1 = end.x
var y1 = end.y
var z1 = end.z
positions.append_array([
Vector3(x0, y0, z0),
Vector3(x1, y0, z0),
Vector3(x1, y0, z1),
Vector3(x0, y0, z1),
Vector3(x0, y1, z0),
Vector3(x1, y1, z0),
Vector3(x1, y1, z1),
Vector3(x0, y1, z1)
])
colors.append_array([
color,
color,
color,
color,
color,
color,
color,
color
])
indices.append_array([
indices.append(vi),
indices.append(vi+1),
indices.append(vi+1),
indices.append(vi+2),
indices.append(vi+2),
indices.append(vi+3),
indices.append(vi+3),
indices.append(vi),
indices.append(vi+4),
indices.append(vi+5),
indices.append(vi+5),
indices.append(vi+6),
indices.append(vi+6),
indices.append(vi+7),
indices.append(vi+7),
indices.append(vi+4),
indices.append(vi),
indices.append(vi+4),
indices.append(vi+1),
indices.append(vi+5),
indices.append(vi+2),
indices.append(vi+6),
indices.append(vi+3),
indices.append(vi+7)
])
if positions.size() != 0:
var arrays = []
# TODO Use ArrayMesh.ARRAY_MAX
arrays.resize(9)
arrays[ArrayMesh.ARRAY_VERTEX] = positions
arrays[ArrayMesh.ARRAY_COLOR] = colors
arrays[ArrayMesh.ARRAY_INDEX] = indices
_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_LINES, arrays)
_boxes.clear()
_colors.clear()

View File

@ -0,0 +1,122 @@
[gd_scene load_steps=18 format=2]
[ext_resource path="res://blocky_terrain/provider_image.tres" type="VoxelProviderImage" id=1]
[ext_resource path="res://blocky_terrain/terrain_material.tres" type="Material" id=2]
[ext_resource path="res://blocky_terrain/terrain_marerial_transparent.tres" type="Material" id=3]
[ext_resource path="res://blocky_terrain/character_avatar.tscn" type="PackedScene" id=4]
[ext_resource path="res://grid.gd" type="Script" id=5]
[ext_resource path="res://axes.tscn" type="PackedScene" id=6]
[ext_resource path="res://blocky_terrain/profiling_gui.gd" type="Script" id=8]
[ext_resource path="res://blocky_terrain/debug3d.gd" type="Script" id=9]
[sub_resource type="ProceduralSky" id=1]
sky_top_color = Color( 0.268204, 0.522478, 0.847656, 1 )
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
sky_curve = 0.25
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
ground_curve = 0.01
sun_curve = 0.0176777
sun_energy = 16.0
[sub_resource type="Environment" id=2]
background_mode = 2
background_sky = SubResource( 1 )
ambient_light_color = Color( 0.0546875, 0.0546875, 0.0546875, 1 )
ambient_light_sky_contribution = 0.7
fog_enabled = true
fog_color = Color( 0.552734, 0.818359, 0.908691, 1 )
fog_depth_begin = 40.0
fog_height_min = -100.0
fog_height_max = -50.0
fog_height_curve = 0.965937
ssao_blur = 1
dof_blur_far_distance = 128.0
dof_blur_far_transition = 10.0
glow_hdr_threshold = 0.5
[sub_resource type="Voxel" id=3]
transparent = true
[sub_resource type="Voxel" id=4]
geometry_type = 1
cube_geometry/padding_y = 0.0
cube_tiles/left = Vector2( 0, 0 )
cube_tiles/right = Vector2( 0, 0 )
cube_tiles/bottom = Vector2( 0, 0 )
cube_tiles/top = Vector2( 0, 0 )
cube_tiles/back = Vector2( 0, 0 )
cube_tiles/front = Vector2( 0, 0 )
[sub_resource type="Voxel" id=5]
geometry_type = 1
cube_geometry/padding_y = 0.0
cube_tiles/left = Vector2( 1, 0 )
cube_tiles/right = Vector2( 1, 0 )
cube_tiles/bottom = Vector2( 1, 0 )
cube_tiles/top = Vector2( 1, 0 )
cube_tiles/back = Vector2( 1, 0 )
cube_tiles/front = Vector2( 1, 0 )
[sub_resource type="VoxelLibrary" id=6]
atlas_size = 4
voxels/0 = SubResource( 3 )
voxels/1 = SubResource( 4 )
voxels/2 = SubResource( 5 )
[sub_resource type="SpatialMaterial" id=7]
albedo_color = Color( 0.7, 0.7, 0.7, 1 )
roughness = 0.0
[sub_resource type="SpatialMaterial" id=8]
flags_unshaded = true
vertex_color_use_as_albedo = true
[sub_resource type="QuadMesh" id=9]
[node name="Node" type="Node"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource( 2 )
[node name="VoxelTerrain" type="VoxelTerrain" parent="."]
provider = ExtResource( 1 )
voxel_library = SubResource( 6 )
view_distance = 256
viewer_path = NodePath("../CharacterAvatar")
generate_collisions = true
material/0 = ExtResource( 2 )
material/1 = ExtResource( 3 )
[node name="Grid" type="MeshInstance" parent="."]
visible = false
material_override = SubResource( 7 )
script = ExtResource( 5 )
size = 8
[node name="DirectionalLight" type="DirectionalLight" parent="."]
transform = Transform( -0.985468, 0.124099, -0.11598, 0.0154004, 0.745271, 0.666584, 0.169159, 0.655111, -0.736353, 1.51966, 19.7004, 14.0879 )
directional_shadow_normal_bias = 0.1
[node name="CharacterAvatar" parent="." instance=ExtResource( 4 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 58.0914, 17 )
terrain = NodePath("../VoxelTerrain")
[node name="axes" parent="." instance=ExtResource( 6 )]
visible = false
[node name="ProfilingInfo" type="Label" parent="."]
margin_top = 20.0
margin_right = 104.0
margin_bottom = 34.0
size_flags_vertical = 0
script = ExtResource( 8 )
[node name="Debug3D" type="MeshInstance" parent="."]
material_override = SubResource( 8 )
script = ExtResource( 9 )
[node name="MeshInstance2" type="MeshInstance" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 3.24619, 16.9203, 17.301 )
mesh = SubResource( 9 )
material/0 = null

View File

Before

Width:  |  Height:  |  Size: 654 KiB

After

Width:  |  Height:  |  Size: 654 KiB

View File

@ -0,0 +1,13 @@
[remap]
importer="image"
type="Image"
path="res://.import/noise_distorted.png-431e74ee8f15629296a2c1f483b52286.image"
[deps]
source_file="res://blocky_terrain/noise_distorted.png"
dest_files=[ "res://.import/noise_distorted.png-431e74ee8f15629296a2c1f483b52286.image" ]
[params]

View File

@ -1,6 +1,7 @@
[gd_resource type="VoxelProviderImage" load_steps=2 format=2]
[ext_resource path="res://noise_distorted.png" type="Image" id=1]
[ext_resource path="res://blocky_terrain/noise_distorted.png" type="Image" id=1]
[resource]

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -2,12 +2,15 @@
importer="texture"
type="StreamTexture"
path="res://.import/terrain.png-84a626877af7de08ecf24965bda52835.stex"
path="res://.import/terrain.png-e0899df1ff98b4b3077afba8244941f8.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://terrain.png"
dest_files=[ "res://.import/terrain.png-84a626877af7de08ecf24965bda52835.stex" ]
source_file="res://blocky_terrain/terrain.png"
dest_files=[ "res://.import/terrain.png-e0899df1ff98b4b3077afba8244941f8.stex" ]
[params]

View File

@ -1,6 +1,7 @@
[gd_resource type="SpatialMaterial" load_steps=2 format=2]
[ext_resource path="res://terrain.png" type="Texture" id=1]
[ext_resource path="res://blocky_terrain/terrain.png" type="Texture" id=1]
[resource]

View File

@ -1,6 +1,7 @@
[gd_resource type="SpatialMaterial" load_steps=2 format=2]
[ext_resource path="res://terrain.png" type="Texture" id=1]
[ext_resource path="res://blocky_terrain/terrain.png" type="Texture" id=1]
[resource]

View File

@ -1,121 +0,0 @@
const EPSILON = 0.001
# Gets the transformed vector for moving a box and slide.
# This algorithm is free from tunnelling for axis-aligned movement,
# except in some high-speed diagonal cases or huge size differences:
# For example, if a box is fast enough to have a diagonal motion jumping from A to B,
# it will pass through C if that other box is the only other one:
#
# o---o
# | A |
# o---o
# o---o
# | C |
# o---o
# o---o
# | B |
# o---o
#
# TODO one way to fix this would be to try a "hot side" projection instead
#
static func get_motion(box, motion, other_boxes):
# The bounding box is expanded to include it's estimated version at next update.
# This also makes the algorithm tunnelling-free
var expanded_box = expand_with_vector(box, motion)
var colliding_boxes = []
for other in other_boxes:
if expanded_box.intersects(other):
colliding_boxes.append(other)
if colliding_boxes.size() == 0:
return motion
#print("Colliding: ", colliding_boxes.size())
var new_motion = motion
for other in colliding_boxes:
new_motion.y = calculate_y_offset(other, box, new_motion.y)
box.position.y += new_motion.y
for other in colliding_boxes:
new_motion.x = calculate_x_offset(other, box, new_motion.x)
box.position.x += new_motion.x
for other in colliding_boxes:
new_motion.z = calculate_z_offset(other, box, new_motion.z)
box.position.z += new_motion.z
return new_motion
static func expand_with_vector(box, v):
if v.x > 0:
box.size.x += v.x
elif v.x < 0:
box.position.x += v.x
box.size.x -= v.x
if v.y > 0:
box.size.y += v.y
elif v.y < 0:
box.position.y += v.y
box.size.y -= v.y
if v.z > 0:
box.size.z += v.z
elif v.z < 0:
box.position.z += v.z
box.size.z -= v.z
return box
static func calculate_z_offset(box, other, motion_z):
if other.end.y <= box.position.y || other.position.y >= box.end.y:
return motion_z
if other.end.x <= box.position.x || other.position.x >= box.end.x:
return motion_z
if motion_z > 0.0 and other.end.z <= box.position.z:
var off = box.position.z - other.end.z - EPSILON
if off < motion_z:
motion_z = off
if motion_z < 0.0 and other.position.z >= box.end.z:
var off = box.end.z - other.position.z + EPSILON
if off > motion_z:
motion_z = off
return motion_z
static func calculate_x_offset(box, other, motion_x):
if other.end.z <= box.position.z || other.position.z >= box.end.z:
return motion_x
if other.end.y <= box.position.y || other.position.y >= box.end.y:
return motion_x
if motion_x > 0.0 and other.end.x <= box.position.x:
var off = box.position.x - other.end.x - EPSILON
if off < motion_x:
motion_x = off
if motion_x < 0.0 and other.position.x >= box.end.x:
var off = box.end.x - other.position.x + EPSILON
if off > motion_x:
motion_x = off
return motion_x
static func calculate_y_offset(box, other, motion_y):
if other.end.z <= box.position.z || other.position.z >= box.end.z:
return motion_y
if other.end.x <= box.position.x || other.position.x >= box.end.x:
return motion_y
if motion_y > 0.0 and other.end.y <= box.position.y:
var off = box.position.y - other.end.y - EPSILON
if off < motion_y:
motion_y = off
if motion_y < 0.0 and other.position.y >= box.end.y:
var off = box.end.y - other.position.y + EPSILON
if off > motion_y:
motion_y = off
return motion_y
static func box_from_center_extents(center, extents):
return AABB(center - extents, 2.0*extents)

72
project/ddd.gd Normal file
View File

@ -0,0 +1,72 @@
# Single-file autoload for debug drawing and printing.
# Draw and print on screen from anywhere in a single line of code.
# Find it quickly by naming it "DDD".
extends Node
const TEXT_LINGER_FRAMES = 5
const LINES_LINGER_FRAMES = 1
var _lines = []
var _line_material = null
var _label = null
var _texts = {}
func draw_line(a, b, color):
var g = ImmediateGeometry.new()
g.material_override = _get_line_material()
g.begin(Mesh.PRIMITIVE_LINES)
g.set_color(color)
g.add_vertex(a)
g.add_vertex(b)
g.end()
add_child(g)
_lines.append({
"frame": Engine.get_frames_drawn() + LINES_LINGER_FRAMES,
"node": g
})
func _get_line_material():
if _line_material == null:
var mat = SpatialMaterial.new()
mat.flags_unshaded = true
mat.vertex_color_use_as_albedo = true
_line_material = mat
return _line_material
func _process(delta):
var i = 0
while i < len(_lines):
var d = _lines[i]
if d.frame <= Engine.get_frames_drawn():
d.node.queue_free()
_lines[i] = _lines[i - 1]
_lines.pop_back()
else:
i += 1
if _label != null:
var text = ""
for key in _texts.keys():
var t = _texts[key]
if t.frame <= Engine.get_frames_drawn():
_texts.erase(key)
else:
text = str(text, key, ": ", t.text, "\n")
_label.text = text
func set_text(key, text):
if _label == null:
_label = Label.new()
add_child(_label)
_texts[key] = {
"text": text,
"frame": Engine.get_frames_drawn() + TEXT_LINGER_FRAMES
}

View File

@ -0,0 +1,23 @@
[gd_resource type="AudioBusLayout" format=2]
[resource]
bus/0/name = "Master"
bus/0/solo = false
bus/0/mute = false
bus/0/bypass_fx = false
bus/0/volume_db = 0.0
bus/0/send = ""
bus/1/name = "New Bus"
bus/1/solo = false
bus/1/mute = false
bus/1/bypass_fx = true
bus/1/volume_db = 0.0
bus/1/send = "Master"
bus/2/name = "New Bus 2"
bus/2/solo = false
bus/2/mute = false
bus/2/bypass_fx = false
bus/2/volume_db = 0.0
bus/2/send = "Master"

7
project/default_env.tres Normal file
View File

@ -0,0 +1,7 @@
[gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1]
[resource]
background_mode = 2
background_sky = SubResource( 1 )

225
project/dmc_test/main.gd Normal file
View File

@ -0,0 +1,225 @@
extends Node
var _sphere_position = Vector3(8, 8, 8)
var _sphere_radius = 3.5
var _geometric_error = 0.01
var _mesh_instance = null
var _debug_mesh_instance = null
var _sphere_mesh_instance = null
var _voxels = VoxelBuffer.new()
var _mesher = VoxelMesherDMC.new()
var _need_generate = false
func _ready():
_mesher.set_octree_mode(VoxelMesherDMC.OCTREE_NONE)
_voxels.create(18, 18, 18)
_mesh_instance = MeshInstance.new()
_mesh_instance.material_override = SpatialMaterial.new()
add_child(_mesh_instance)
var mat = SpatialMaterial.new()
mat.flags_unshaded = true
mat.vertex_color_use_as_albedo = true
_debug_mesh_instance = MeshInstance.new()
_debug_mesh_instance.material_override = mat
add_child(_debug_mesh_instance)
_sphere_mesh_instance = create_sphere(_sphere_position, _sphere_radius)
generate()
static func make_plane(pos, dir):
return Plane(dir, dir.dot(pos))
func generate_with_stats():
var stats_average = _mesher.get_stats()
for k in stats_average:
stats_average[k] = 0.0
var iterations = 100
for i in iterations:
generate()
var stats = _mesher.get_stats()
for k in stats:
stats_average[k] += stats[k]
for k in stats_average:
stats_average[k] = stats_average[k] / float(iterations)
print("---")
print("Sphere at ", _sphere_position, ", radius ", _sphere_radius)
print("Geometric error: ", _geometric_error)
print(stats_average)
#------------------------------------------------------
#_sphere_position = Vector3(8, 8, 8)
#_sphere_radius = 3.5
#_geometric_error = 0.01
# On 3c366b1f098f7aa62b0c0bf61f97ef5e38531caa
# {commit_time:663.96, dualgrid_derivation_time:4422, meshing_time:14576.8, octree_build_time:61293.9}
# On 0e569df945f0277869d90b5df189df2a39d11ee0
# {commit_time:588.13, dualgrid_derivation_time:2155.79, meshing_time:14476.36, octree_build_time:5830.69}
func generate():
_voxels.fill_iso(1.0, VoxelBuffer.CHANNEL_ISOLEVEL)
var vt = VoxelIsoSurfaceTool.new()
vt.set_offset(Vector3(1, 1, 1)) # For padding
vt.set_buffer(_voxels)
vt.do_sphere(_sphere_position, _sphere_radius)
vt.do_sphere(_sphere_position + Vector3(5,2,3), _sphere_radius / 1.5)
vt.do_plane(make_plane(_sphere_position, Vector3(0,1,0)))
#raster_terrain(_voxels)
_mesher.set_mesh_mode(VoxelMesherDMC.MESH_NORMAL)
_mesher.set_geometric_error(_geometric_error)
var mesh = _mesher.build_mesh(_voxels)
_mesh_instance.mesh = mesh
if false:
_mesher.set_mesh_mode(VoxelMesherDMC.MODE_DEBUG_DUAL_GRID)
mesh = _mesher.build_mesh(_voxels)
_debug_mesh_instance.mesh = mesh
_sphere_mesh_instance.translation = _sphere_position
func _process(delta):
if _need_generate:
generate_with_stats()
_need_generate = false
func _input(event):
if event is InputEventKey:
if event.pressed:
# Doesn't work, because reasons
#if event.scancode == KEY_TAB:
# if get_viewport().debug_draw == Viewport.DEBUG_DRAW_DISABLED:
# print("Switched to wireframe render")
# get_viewport().debug_draw = Viewport.DEBUG_DRAW_WIREFRAME
# else:
# print("Switched to normal render")
# get_viewport().debug_draw = Viewport.DEBUG_DRAW_DISABLED
if event.scancode == KEY_RIGHT:
_sphere_position.x += 0.1
_need_generate = true
elif event.scancode == KEY_LEFT:
_sphere_position.x -= 0.1
_need_generate = true
elif event.scancode == KEY_UP:
_sphere_position.z += 0.1
_need_generate = true
elif event.scancode == KEY_DOWN:
_sphere_position.z -= 0.1
_need_generate = true
elif event.scancode == KEY_PAGEUP:
_sphere_position.y += 0.1
_need_generate = true
elif event.scancode == KEY_PAGEDOWN:
_sphere_position.y -= 0.1
_need_generate = true
elif event.scancode == KEY_KP_ADD:
_sphere_radius += 0.1
_sphere_mesh_instance.mesh.radius = _sphere_radius
_sphere_mesh_instance.mesh.height = 2.0 * _sphere_radius
_need_generate = true
elif event.scancode == KEY_KP_SUBTRACT:
_sphere_radius -= 0.1
if _sphere_radius < 0.1:
_sphere_radius = 0.1
_sphere_mesh_instance.mesh.radius = _sphere_radius
_sphere_mesh_instance.mesh.height = 2.0 * _sphere_radius
_need_generate = true
elif event.scancode == KEY_KP_8:
_geometric_error += 0.025
_need_generate = true
elif event.scancode == KEY_KP_2:
_geometric_error -= 0.025
if _geometric_error < 0.0:
_geometric_error = 0.0
_need_generate = true
elif event.scancode == KEY_P:
print_buffer_to_images(_voxels, VoxelBuffer.CHANNEL_ISOLEVEL, "isolevel", 10, false)
print_buffer_to_images(_voxels, VoxelBuffer.CHANNEL_GRADIENT_X, "gradient", 10, true)
elif event.scancode == KEY_R:
_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):
var mat = SpatialMaterial.new()
mat.flags_transparent = true
mat.albedo_color = Color(0,0,1,0.3)
var mesh = SphereMesh.new()
mesh.radius = r
mesh.height = r * 2.0
var mi = MeshInstance.new()
mi.translation = pos
mi.mesh = mesh
mi.material_override = mat
add_child(mi)
return mi
static func print_buffer_to_images(voxels, channel, fname, upscale, gradient):
for y in voxels.get_size_y():
var im = Image.new()
im.create(voxels.get_size_x(), voxels.get_size_z(), false, Image.FORMAT_RGB8)
im.lock()
for z in voxels.get_size_z():
for x in voxels.get_size_x():
var r = 0.5 * voxels.get_voxel_iso(x, y, z, channel) + 0.5
if gradient:
var g = 0.5 * voxels.get_voxel_iso(x, y, z, channel + 1) + 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:
im.set_pixel(x, z, Color(r, r, r))
im.unlock()
if upscale > 1:
im.resize(im.get_width() * upscale, im.get_height() * upscale, Image.INTERPOLATE_NEAREST)
var fname_png = str(fname, "_", y, ".png")
print("Saved ", fname_png)
im.save_png(fname_png)

View File

@ -0,0 +1,30 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://dmc_test/main.gd" type="Script" id=1]
[ext_resource path="res://axes.tscn" type="PackedScene" id=2]
[ext_resource path="res://spectator_avatar.tscn" type="PackedScene" id=3]
[sub_resource type="ProceduralSky" id=1]
sky_top_color = Color( 0.388235, 0.533333, 0.615686, 1 )
sun_curve = 0.018301
[sub_resource type="Environment" id=2]
background_mode = 2
background_sky = SubResource( 1 )
ambient_light_sky_contribution = 0.5
[node name="Node" type="Node"]
script = ExtResource( 1 )
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource( 2 )
[node name="DirectionalLight" type="DirectionalLight" parent="."]
transform = Transform( 0.912457, -0.352848, 0.207171, 0, 0.506317, 0.862348, -0.409172, -0.786855, 0.461992, 14.4885, 6.21497, 0 )
shadow_enabled = true
shadow_bias = 0.05
[node name="Axes" parent="." instance=ExtResource( 2 )]
[node name="SpectatorAvatar" parent="." instance=ExtResource( 3 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.20169, 17.285 )

View File

@ -1,341 +0,0 @@
[convert_images]
action="none"
compress_quality=0.7
formats="png"
shrink=1.0
[convert_samples]
action="none"
max_hz=44100
trim=false
[convert_scenes]
convert_text_scenes=true
[export_filter]
filter=""
filter_exclude=""
type="resources"
[platform:Android]
apk_expansion/SALT=""
apk_expansion/enable=false
apk_expansion/public_key=""
architecture/arm=true
architecture/x86=false
command_line/extra_args=""
custom_package/debug=""
custom_package/release=""
debug/debugging_enabled=true
keystore/release=""
keystore/release_password=""
keystore/release_user=""
one_click_deploy/clear_previous_install=true
package/icon=""
package/name=""
package/signed=true
package/unique_name="org.godotengine.$genname"
permissions/access_checkin_properties=false
permissions/access_coarse_location=false
permissions/access_fine_location=false
permissions/access_location_extra_commands=false
permissions/access_mock_location=false
permissions/access_network_state=false
permissions/access_surface_flinger=false
permissions/access_wifi_state=false
permissions/account_manager=false
permissions/add_voicemail=false
permissions/authenticate_accounts=false
permissions/battery_stats=false
permissions/bind_accessibility_service=false
permissions/bind_appwidget=false
permissions/bind_device_admin=false
permissions/bind_input_method=false
permissions/bind_nfc_service=false
permissions/bind_notification_listener_service=false
permissions/bind_print_service=false
permissions/bind_remoteviews=false
permissions/bind_text_service=false
permissions/bind_vpn_service=false
permissions/bind_wallpaper=false
permissions/bluetooth=false
permissions/bluetooth_admin=false
permissions/bluetooth_privileged=false
permissions/brick=false
permissions/broadcast_package_removed=false
permissions/broadcast_sms=false
permissions/broadcast_sticky=false
permissions/broadcast_wap_push=false
permissions/call_phone=false
permissions/call_privileged=false
permissions/camera=false
permissions/capture_audio_output=false
permissions/capture_secure_video_output=false
permissions/capture_video_output=false
permissions/change_component_enabled_state=false
permissions/change_configuration=false
permissions/change_network_state=false
permissions/change_wifi_multicast_state=false
permissions/change_wifi_state=false
permissions/clear_app_cache=false
permissions/clear_app_user_data=false
permissions/control_location_updates=false
permissions/delete_cache_files=false
permissions/delete_packages=false
permissions/device_power=false
permissions/diagnostic=false
permissions/disable_keyguard=false
permissions/dump=false
permissions/expand_status_bar=false
permissions/factory_test=false
permissions/flashlight=false
permissions/force_back=false
permissions/get_accounts=false
permissions/get_package_size=false
permissions/get_tasks=false
permissions/get_top_activity_info=false
permissions/global_search=false
permissions/hardware_test=false
permissions/inject_events=false
permissions/install_location_provider=false
permissions/install_packages=false
permissions/install_shortcut=false
permissions/internal_system_window=false
permissions/internet=false
permissions/kill_background_processes=false
permissions/location_hardware=false
permissions/manage_accounts=false
permissions/manage_app_tokens=false
permissions/manage_documents=false
permissions/master_clear=false
permissions/media_content_control=false
permissions/modify_audio_settings=false
permissions/modify_phone_state=false
permissions/mount_format_filesystems=false
permissions/mount_unmount_filesystems=false
permissions/nfc=false
permissions/persistent_activity=false
permissions/process_outgoing_calls=false
permissions/read_calendar=false
permissions/read_call_log=false
permissions/read_contacts=false
permissions/read_external_storage=false
permissions/read_frame_buffer=false
permissions/read_history_bookmarks=false
permissions/read_input_state=false
permissions/read_logs=false
permissions/read_phone_state=false
permissions/read_profile=false
permissions/read_sms=false
permissions/read_social_stream=false
permissions/read_sync_settings=false
permissions/read_sync_stats=false
permissions/read_user_dictionary=false
permissions/reboot=false
permissions/receive_boot_completed=false
permissions/receive_mms=false
permissions/receive_sms=false
permissions/receive_wap_push=false
permissions/record_audio=false
permissions/reorder_tasks=false
permissions/restart_packages=false
permissions/send_respond_via_message=false
permissions/send_sms=false
permissions/set_activity_watcher=false
permissions/set_alarm=false
permissions/set_always_finish=false
permissions/set_animation_scale=false
permissions/set_debug_app=false
permissions/set_orientation=false
permissions/set_pointer_speed=false
permissions/set_preferred_applications=false
permissions/set_process_limit=false
permissions/set_time=false
permissions/set_time_zone=false
permissions/set_wallpaper=false
permissions/set_wallpaper_hints=false
permissions/signal_persistent_processes=false
permissions/status_bar=false
permissions/subscribed_feeds_read=false
permissions/subscribed_feeds_write=false
permissions/system_alert_window=false
permissions/transmit_ir=false
permissions/uninstall_shortcut=false
permissions/update_device_stats=false
permissions/use_credentials=false
permissions/use_sip=false
permissions/vibrate=false
permissions/wake_lock=false
permissions/write_apn_settings=false
permissions/write_calendar=false
permissions/write_call_log=false
permissions/write_contacts=false
permissions/write_external_storage=false
permissions/write_gservices=false
permissions/write_history_bookmarks=false
permissions/write_profile=false
permissions/write_secure_settings=false
permissions/write_settings=false
permissions/write_sms=false
permissions/write_social_stream=false
permissions/write_sync_settings=false
permissions/write_user_dictionary=false
screen/immersive_mode=true
screen/orientation=0
screen/support_large=true
screen/support_normal=true
screen/support_small=true
screen/support_xlarge=true
screen/use_32_bits_view=true
user_permissions/0=""
user_permissions/1=""
user_permissions/10=""
user_permissions/11=""
user_permissions/12=""
user_permissions/13=""
user_permissions/14=""
user_permissions/15=""
user_permissions/16=""
user_permissions/17=""
user_permissions/18=""
user_permissions/19=""
user_permissions/2=""
user_permissions/3=""
user_permissions/4=""
user_permissions/5=""
user_permissions/6=""
user_permissions/7=""
user_permissions/8=""
user_permissions/9=""
version/code=1
version/name="1.0"
[platform:BlackBerry 10]
debug/debugging_enabled=true
package/category="core.games"
package/custom_template=""
package/description="Game made with Godot Engine"
package/icon=""
package/name=""
package/unique_name="com.godot.noname"
release/author="Cert. Name"
release/author_id="Cert. ID"
version/code=1
version/name="1.0"
[platform:HTML5]
browser/enable_run=false
custom_package/debug=""
custom_package/release=""
debug/debugging_enabled=true
html/controls_enabled=true
html/font_family="arial,sans-serif"
html/head_include=""
html/style_include=""
html/title=""
options/memory_size=3
[platform:Linux X11]
binary/64_bits=true
custom_binary/debug=""
custom_binary/release=""
debug/debugging_enabled=true
resources/bundle_dependencies_(for_optical_disc)=false
resources/pack_mode=1
[platform:Mac OSX]
application/bits_mode=0
application/copyright=""
application/icon=""
application/identifier="com.godot.macgame"
application/info="This Game is Nice"
application/name=""
application/short_version="1.0"
application/signature="godotmacgame"
application/version="1.0"
custom_package/debug=""
custom_package/release=""
debug/debugging_enabled=true
display/high_res=false
[platform:Windows Desktop]
binary/64_bits=true
custom_binary/debug=""
custom_binary/release=""
debug/debugging_enabled=true
resources/bundle_dependencies_(for_optical_disc)=false
resources/pack_mode=0
[platform:Windows Universal]
architecture/target=1
capabilities/all_Joyn=false
capabilities/appointments=false
capabilities/blocked_Chat_Messages=false
capabilities/bluetooth=false
capabilities/chat=false
capabilities/code_Generation=false
capabilities/contacts=false
capabilities/enterprise_Authentication=false
capabilities/internet_Client=false
capabilities/internet_Client_Server=false
capabilities/location=false
capabilities/microphone=false
capabilities/music_Library=false
capabilities/objects3_D=false
capabilities/phone_Call=false
capabilities/pictures_Library=false
capabilities/private_Network_Client_Server=false
capabilities/proximity=false
capabilities/removable_Storage=false
capabilities/shared_User_Certificates=false
capabilities/user_Account_Information=false
capabilities/videos_Library=false
capabilities/voip_Call=false
capabilities/webcam=false
command_line/extra_args=""
custom_package/debug=""
custom_package/release=""
debug/debugging_enabled=true
identity/product_guid="00000000-0000-0000-0000-000000000000"
identity/publisher_guid="00000000-0000-0000-0000-000000000000"
images/background_color="transparent"
images/splash_screen=null
images/square150x150_logo=null
images/square310x310_logo=null
images/square44x44_logo=null
images/square71x71_logo=null
images/store_logo=null
images/wide310x150_logo=null
orientation/landscape=true
orientation/landscape_flipped=true
orientation/portrait=true
orientation/portrait_flipped=true
package/description="Godot Engine"
package/display_name=""
package/publisher="CN=GodotEngine"
package/publisher_display_name="Godot Engine"
package/short_name="Godot"
package/unique_name="Godot.Engine"
tiles/show_name_on_square150x150=false
tiles/show_name_on_square310x310=false
tiles/show_name_on_wide310x150=false
version/build=0
version/major=1
version/minor=0
version/revision=0
[script]
action="compile"
encrypt_key=""

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1 +0,0 @@
gen_mipmaps=false

View File

@ -3,6 +3,9 @@
importer="texture"
type="StreamTexture"
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
metadata={
"vram_texture": false
}
[deps]

View File

@ -1,15 +0,0 @@
extends Node
# member variables here, example:
# var a=2
# var b="textvar"
func _ready():
pass
func _on_Node_pressed():
get_tree().change_scene("res://main.tscn")

View File

@ -1,24 +0,0 @@
[gd_scene load_steps=2 format=1]
[ext_resource path="res://launcher.gd" type="Script" id=1]
[node name="Node" type="Button"]
focus/ignore_mouse = false
focus/stop_mouse = true
size_flags/horizontal = 2
size_flags/vertical = 2
margin/left = 66.0
margin/top = 116.0
margin/right = 394.0
margin/bottom = 156.0
toggle_mode = false
enabled_focus_mode = 2
shortcut = null
text = "Start"
flat = false
script/script = ExtResource( 1 )
[connection signal="pressed" from="." to="." method="_on_Node_pressed"]

View File

@ -1,400 +0,0 @@
[gd_scene load_steps=19 format=2]
[ext_resource path="res://provider_image.tres" type="VoxelProviderImage" id=1]
[ext_resource path="res://terrain_material.tres" type="Material" id=2]
[ext_resource path="res://terrain_marerial_transparent.tres" type="Material" id=3]
[ext_resource path="res://voxel_map.gd" type="Script" id=4]
[ext_resource path="res://grid.gd" type="Script" id=5]
[ext_resource path="res://character_avatar.tscn" type="PackedScene" id=6]
[ext_resource path="res://axes.tscn" type="PackedScene" id=7]
[ext_resource path="res://profiling_gui.gd" type="Script" id=8]
[ext_resource path="res://debug3d.gd" type="Script" id=9]
[sub_resource type="ProceduralSky" id=1]
radiance_size = 4
sky_top_color = Color( 0.268204, 0.522478, 0.847656, 1 )
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
sky_curve = 0.25
sky_energy = 1.0
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
ground_curve = 0.01
ground_energy = 1.0
sun_color = Color( 1, 1, 1, 1 )
sun_latitude = 35.0
sun_longitude = 0.0
sun_angle_min = 1.0
sun_angle_max = 100.0
sun_curve = 0.0176777
sun_energy = 16.0
texture_size = 2
_sections_unfolded = [ "Sky", "Sun" ]
[sub_resource type="Environment" id=2]
background_mode = 2
background_sky = SubResource( 1 )
background_sky_custom_fov = 0.0
background_color = Color( 0, 0, 0, 1 )
background_energy = 1.0
background_canvas_max_layer = 0
ambient_light_color = Color( 0.0546875, 0.0546875, 0.0546875, 1 )
ambient_light_energy = 1.0
ambient_light_sky_contribution = 0.7
fog_enabled = true
fog_color = Color( 0.552734, 0.818359, 0.908691, 1 )
fog_sun_color = Color( 1, 0.9, 0.7, 1 )
fog_sun_amount = 0.0
fog_depth_enabled = true
fog_depth_begin = 40.0
fog_depth_curve = 1.0
fog_transmit_enabled = false
fog_transmit_curve = 1.0
fog_height_enabled = false
fog_height_min = -100.0
fog_height_max = -50.0
fog_height_curve = 0.965937
tonemap_mode = 0
tonemap_exposure = 1.0
tonemap_white = 1.0
auto_exposure_enabled = false
auto_exposure_scale = 0.4
auto_exposure_min_luma = 0.05
auto_exposure_max_luma = 8.0
auto_exposure_speed = 0.5
ss_reflections_enabled = false
ss_reflections_max_steps = 64
ss_reflections_fade_in = 0.15
ss_reflections_fade_out = 2.0
ss_reflections_depth_tolerance = 0.2
ss_reflections_roughness = true
ssao_enabled = false
ssao_radius = 1.0
ssao_intensity = 1.0
ssao_radius2 = 0.0
ssao_intensity2 = 1.0
ssao_bias = 0.01
ssao_light_affect = 0.0
ssao_ao_channel_affect = 0.0
ssao_color = Color( 0, 0, 0, 1 )
ssao_quality = 0
ssao_blur = 1
ssao_edge_sharpness = 4.0
dof_blur_far_enabled = false
dof_blur_far_distance = 128.0
dof_blur_far_transition = 10.0
dof_blur_far_amount = 0.1
dof_blur_far_quality = 1
dof_blur_near_enabled = false
dof_blur_near_distance = 2.0
dof_blur_near_transition = 1.0
dof_blur_near_amount = 0.1
dof_blur_near_quality = 1
glow_enabled = false
glow_levels/1 = false
glow_levels/2 = false
glow_levels/3 = true
glow_levels/4 = false
glow_levels/5 = true
glow_levels/6 = false
glow_levels/7 = false
glow_intensity = 0.8
glow_strength = 1.0
glow_bloom = 0.0
glow_blend_mode = 2
glow_hdr_threshold = 0.5
glow_hdr_scale = 2.0
glow_bicubic_upscale = false
adjustment_enabled = false
adjustment_brightness = 1.0
adjustment_contrast = 1.0
adjustment_saturation = 1.0
_sections_unfolded = [ "Ambient Light", "Background", "Fog", "Glow" ]
[sub_resource type="Voxel" id=3]
voxel_name = ""
color = Color( 1, 1, 1, 1 )
transparent = true
material_id = 0
geometry_type = 0
[sub_resource type="Voxel" id=4]
voxel_name = ""
color = Color( 1, 1, 1, 1 )
transparent = false
material_id = 0
geometry_type = 1
cube_geometry/padding_y = 0.0
cube_tiles/left = Vector2( 0, 0 )
cube_tiles/right = Vector2( 0, 0 )
cube_tiles/bottom = Vector2( 0, 0 )
cube_tiles/top = Vector2( 0, 0 )
cube_tiles/back = Vector2( 0, 0 )
cube_tiles/front = Vector2( 0, 0 )
[sub_resource type="Voxel" id=5]
voxel_name = ""
color = Color( 1, 1, 1, 1 )
transparent = false
material_id = 0
geometry_type = 1
cube_geometry/padding_y = 0.0
cube_tiles/left = Vector2( 1, 0 )
cube_tiles/right = Vector2( 1, 0 )
cube_tiles/bottom = Vector2( 1, 0 )
cube_tiles/top = Vector2( 1, 0 )
cube_tiles/back = Vector2( 1, 0 )
cube_tiles/front = Vector2( 1, 0 )
_sections_unfolded = [ "cube_tiles" ]
[sub_resource type="VoxelLibrary" id=6]
atlas_size = 4
voxels/0 = SubResource( 3 )
voxels/1 = SubResource( 4 )
voxels/2 = SubResource( 5 )
_sections_unfolded = [ "voxels" ]
[sub_resource type="SpatialMaterial" id=7]
render_priority = 0
flags_transparent = false
flags_unshaded = false
flags_vertex_lighting = false
flags_no_depth_test = false
flags_use_point_size = false
flags_world_triplanar = false
flags_fixed_size = false
flags_albedo_tex_force_srgb = false
flags_do_not_receive_shadows = false
flags_disable_ambient_light = false
flags_ensure_correct_normals = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_specular_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
params_billboard_mode = 0
params_billboard_keep_scale = false
params_grow = false
params_use_alpha_scissor = false
albedo_color = Color( 0.7, 0.7, 0.7, 1 )
metallic = 0.0
metallic_specular = 0.5
metallic_texture_channel = 0
roughness = 0.0
roughness_texture_channel = 0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
depth_enabled = false
subsurf_scatter_enabled = false
transmission_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector3( 1, 1, 1 )
uv1_offset = Vector3( 0, 0, 0 )
uv1_triplanar = false
uv1_triplanar_sharpness = 1.0
uv2_scale = Vector3( 1, 1, 1 )
uv2_offset = Vector3( 0, 0, 0 )
uv2_triplanar = false
uv2_triplanar_sharpness = 1.0
proximity_fade_enable = false
distance_fade_mode = 0
[sub_resource type="SpatialMaterial" id=8]
render_priority = 0
flags_transparent = false
flags_unshaded = true
flags_vertex_lighting = false
flags_no_depth_test = false
flags_use_point_size = false
flags_world_triplanar = false
flags_fixed_size = false
flags_albedo_tex_force_srgb = false
flags_do_not_receive_shadows = false
flags_disable_ambient_light = false
flags_ensure_correct_normals = false
vertex_color_use_as_albedo = true
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_specular_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
params_billboard_mode = 0
params_billboard_keep_scale = false
params_grow = false
params_use_alpha_scissor = false
albedo_color = Color( 1, 1, 1, 1 )
metallic = 0.0
metallic_specular = 0.5
metallic_texture_channel = 0
roughness = 0.0
roughness_texture_channel = 0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
depth_enabled = false
subsurf_scatter_enabled = false
transmission_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector3( 1, 1, 1 )
uv1_offset = Vector3( 0, 0, 0 )
uv1_triplanar = false
uv1_triplanar_sharpness = 1.0
uv2_scale = Vector3( 1, 1, 1 )
uv2_offset = Vector3( 0, 0, 0 )
uv2_triplanar = false
uv2_triplanar_sharpness = 1.0
proximity_fade_enable = false
distance_fade_mode = 0
_sections_unfolded = [ "Emission", "Flags", "Vertex Color" ]
[sub_resource type="QuadMesh" id=9]
custom_aabb = AABB( 0, 0, 0, 0, 0, 0 )
flip_faces = false
size = Vector2( 1, 1 )
[node name="Node" type="Node"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource( 2 )
[node name="VoxelTerrain" type="VoxelTerrain" parent="."]
provider = ExtResource( 1 )
voxel_library = SubResource( 6 )
view_distance = 256
viewer_path = NodePath("../CharacterAvatar")
generate_collisions = true
material/0 = ExtResource( 2 )
material/1 = ExtResource( 3 )
material/2 = null
material/3 = null
material/4 = null
material/5 = null
material/6 = null
material/7 = null
script = ExtResource( 4 )
_sections_unfolded = [ "provider" ]
[node name="Grid" type="MeshInstance" parent="."]
visible = false
layers = 1
material_override = SubResource( 7 )
cast_shadow = 1
extra_cull_margin = 0.0
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
mesh = null
skeleton = NodePath("..")
script = ExtResource( 5 )
size = 8
step = 16
[node name="DirectionalLight" type="DirectionalLight" parent="."]
transform = Transform( -0.985468, 0.124099, -0.11598, 0.0154004, 0.745271, 0.666584, 0.169159, 0.655111, -0.736353, 1.51966, 19.7004, 14.0879 )
layers = 1
light_color = Color( 1, 1, 1, 1 )
light_energy = 1.0
light_indirect_energy = 1.0
light_negative = false
light_specular = 0.5
light_bake_mode = 1
light_cull_mask = -1
shadow_enabled = false
shadow_color = Color( 0, 0, 0, 1 )
shadow_bias = 0.1
shadow_contact = 0.0
shadow_reverse_cull_face = false
editor_only = false
directional_shadow_mode = 2
directional_shadow_split_1 = 0.1
directional_shadow_split_2 = 0.2
directional_shadow_split_3 = 0.5
directional_shadow_blend_splits = false
directional_shadow_normal_bias = 0.1
directional_shadow_bias_split_scale = 0.25
directional_shadow_depth_range = 0
directional_shadow_max_distance = 200.0
_sections_unfolded = [ "Directional Shadow", "Light", "Shadow" ]
[node name="CharacterAvatar" parent="." instance=ExtResource( 6 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 58.0914, 17 )
terrain = NodePath("../VoxelTerrain")
[node name="axes" parent="." instance=ExtResource( 7 )]
visible = false
[node name="ProfilingInfo" type="Label" parent="."]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_top = 20.0
margin_right = 104.0
margin_bottom = 34.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 0
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
script = ExtResource( 8 )
[node name="Debug3D" type="MeshInstance" parent="."]
layers = 1
material_override = SubResource( 8 )
cast_shadow = 1
extra_cull_margin = 0.0
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
mesh = null
skeleton = NodePath("..")
script = ExtResource( 9 )
_sections_unfolded = [ "Geometry" ]
[node name="MeshInstance2" type="MeshInstance" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 3.24619, 16.9203, 17.301 )
layers = 1
material_override = null
cast_shadow = 1
extra_cull_margin = 0.0
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
mesh = SubResource( 9 )
skeleton = NodePath("..")
material/0 = null

View File

@ -1,13 +0,0 @@
[remap]
importer="image"
type="Image"
path="res://.import/noise_distorted.png-a3823ac1452b83d7bf69c4608544df15.image"
[deps]
source_file="res://noise_distorted.png"
dest_files=[ "res://.import/noise_distorted.png-a3823ac1452b83d7bf69c4608544df15.image" ]
[params]

View File

@ -15,40 +15,18 @@ _global_script_class_icons={
[application]
run/main_scene="res://main.tscn"
name="Voxel Game"
main_scene="res://main.tscn"
icon="res://icon.png"
config/name="New Game Project"
run/main_scene="res://dmc_test/main.tscn"
config/icon="res://icon.png"
[gdnative]
[autoload]
singletons=[ ]
DDD="*res://ddd.gd"
[input]
[physics]
action1={
"deadzone": 0.5,
"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null)
]
}
action2={
"deadzone": 0.5,
"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null)
]
}
[layer_names]
3d_physics/layer_1="Default"
3d_physics/layer_2="Avatar"
[memory]
multithread/thread_rid_pool_prealloc=60
3d/physics_engine="Bullet"
[rendering]
viewport/default_clear_color=Color( 0.407806, 0.628906, 0.618542, 1 )
quality/use_nearest_mipmap_filter=true
shadows/directional_shadow_size=4096
quality/hdr=false
environment/default_environment="res://default_env.tres"

View File

@ -1,111 +0,0 @@
tool
extends VoxelProvider
# IMPORTANT: This can run in a thread.
# If you access it from outside, it's your job to make sure it's safe
class OsnNoise:
var iamaproxy = null
class OsnFractalNoise:
var iamaproxy = null
var _noise = OsnNoise.new()
var _noise2 = OsnNoise.new()
var _channel = Voxel.CHANNEL_TYPE
var _image = preload("res://noise_distorted.png")
func _init():
# _noise.set_seed(131183)
# _noise2.set_seed(_noise.get_seed() + 1)
_image = _image.get_data()
func emerge_block(out_buffer, origin_in_voxels):
emerge_block_im(out_buffer, origin_in_voxels)
func emerge_block_im(out_buffer, origin_in_voxels):
var ox = int(floor(origin_in_voxels.x))
var oy = int(floor(origin_in_voxels.y))
var oz = int(floor(origin_in_voxels.z))
_image.lock()
var im_w = _image.get_width()
var im_h = _image.get_height()
var im_wm = im_w - 1
var im_hm = im_h - 1
var x = 0
var z = 0
var bs = out_buffer.get_size_x()
var dirt = 1
while z < bs:
while x < bs:
var c = _image.get_pixel((ox+x) & im_wm, (oz+z) & im_hm)
var h = int(c.r * 200.0) - 50
h -= oy
if h > 0:
if h > bs:
h = bs
out_buffer.fill_area(dirt, Vector3(x,0,z), Vector3(x+1,h,z+1), _channel)
x += 1
z += 1
x = 0
_image.unlock()
#func emerge_block_noise(out_buffer, origin_in_voxels):
# var ox = origin_in_voxels.x
# var oy = origin_in_voxels.y
# var oz = origin_in_voxels.z
# var ns1 = 0.01
# var ns2 = 0.05
#
# var dirt = 1
# #if oy < 0:
# # dirt = 2
#
# var air = 0
# #if oy < 0:
# # air = 4
#
# var bs = voxels.get_size_x()
#
# var noise1 = OsnFractalNoise.new()
# noise1.set_source_noise(_noise)
# noise1.set_period(150)
# noise1.set_octaves(5)
#
# var noise2 = OsnFractalNoise.new()
# noise2.set_source_noise(_noise2)
# noise2.set_period(256)
# noise2.set_octaves(5)
#
# for z in range(0, bs):
# for x in range(0, bs):
#
# #var n2 = noise2.get_noise_2d(ox+x, oz+z)
# # n2 = (n2+0.5)*8 - 1
# # if n2 > 0.0:
# # n2 = 0.0
#
# var n1 = noise1.get_noise_2d(ox+x, oz+z)
#
# var h = floor(64.0 * n1 - oy)
#
# if h >= 0:
# if h < bs:
# 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), channel)
# else:
# voxels.fill_area(air, Vector3(x,0,z), Vector3(x+1,bs,z+1), channel)

View File

@ -1,8 +0,0 @@
[gd_resource type="VoxelProvider" load_steps=2 format=2]
[ext_resource path="res://provider_heightmap.gd" type="Script" id=1]
[resource]
script = ExtResource( 1 )

View File

@ -0,0 +1,42 @@
extends Spatial
export var speed = 10.0
func _physics_process(delta):
var head = get_node("Camera")
var forward = -head.transform.basis.z
var right = head.transform.basis.x
var up = Vector3(0, 1, 0)
var dir = Vector3()
if Input.is_key_pressed(KEY_Q) or Input.is_key_pressed(KEY_A):
dir -= right
elif Input.is_key_pressed(KEY_D):
dir += right
if Input.is_key_pressed(KEY_Z) or Input.is_key_pressed(KEY_W):
dir += forward
elif Input.is_key_pressed(KEY_S):
dir -= forward
if Input.is_key_pressed(KEY_SHIFT):
dir -= up
elif Input.is_key_pressed(KEY_SPACE):
dir += up
var dir_len = dir.length()
if dir_len > 0.01:
dir /= dir_len
var motor = dir * (speed * delta)
translate(motor)

View File

@ -1,25 +1,13 @@
[gd_scene load_steps=2 format=2]
[gd_scene load_steps=3 format=2]
[ext_resource path="res://debug_camera.gd" type="Script" id=1]
[ext_resource path="res://mouse_look.gd" type="Script" id=1]
[ext_resource path="res://spectator_avatar.gd" type="Script" id=2]
[node name="Camera" type="Camera"]
[node name="SpectatorAvatar" type="Spatial"]
script = ExtResource( 2 )
speed = 5.0
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
projection = 0
fov = 80.0
near = 0.1
far = 500.0
keep_aspect = 1
current = false
cull_mask = 1048575
environment = null
h_offset = 0.0
v_offset = 0.0
[node name="Camera" type="Camera" parent="."]
script = ExtResource( 1 )
sensitivity = 0.4
min_angle = -90
max_angle = 90
speed = 10.0
capture_mouse = true
sensitivity = 0.2
distance = 0.0

View File

@ -1,2 +0,0 @@
filter=false
gen_mipmaps=false

View File

@ -0,0 +1,88 @@
extends Node
var radius = 0
func _ready():
generate()
func _input(event):
if event.type == InputEvent.KEY and event.pressed:
if event.scancode == KEY_KP_ADD:
radius += 8
if radius > 255:
radius = 255
generate()
elif event.scancode == KEY_KP_SUBTRACT:
radius -= 8
if radius < 0:
radius = 0
generate()
func generate():
print("iso: ", radius)
var voxels = VoxelBuffer.new()
var size = 32
voxels.create(size,size,size)
voxels.fill(255, 0)
if false:
voxels.set_voxel(0, 4,4,4, 0)
var v = 0
voxels.set_voxel(120, 5,4,4, 0)
voxels.set_voxel(v, 4,5,4, 0)
voxels.set_voxel(v, 4,4,5, 0)
voxels.set_voxel(v, 3,4,4, 0)
voxels.set_voxel(v, 4,3,4, 0)
voxels.set_voxel(v, 4,4,3, 0)
if false:
var s = 3
var e = 5
for z in range(s, e):
for x in range(s, e):
for y in range(s, e):
voxels.set_voxel(int(radius), x, y, z, 0)
if false:
var r = 15
for z in range(0, voxels.get_size_z()):
for x in range(0, voxels.get_size_x()):
for y in range(0, voxels.get_size_y()):
var d = Vector3(16,16,16).distance_to(Vector3(x,y,z))
var v = 0
if d < r:
v = 255
voxels.set_voxel(v, x, y, z, 0)
if true:
var noise = OsnNoise.new()
var fractal_noise = OsnFractalNoise.new()
fractal_noise.set_source_noise(noise)
fractal_noise.set_octaves(3)
fractal_noise.set_period(16)
fractal_noise.set_persistance(0.5)
for z in range(0, voxels.get_size_z()):
for x in range(0, voxels.get_size_x()):
for y in range(0, voxels.get_size_y()):
var v = fractal_noise.get_noise_3d(x,y,z)
if true:
voxels.set_voxel_iso(v, x,y,z, 0)
else:
if v > 0:
v = 0
else:
v = 255
voxels.set_voxel(v, x, y, z, 0)
var tvm = VoxelMesherTransvoxel.new()
var mesh = tvm.build(voxels, 0)
if mesh == null:
print("The mesh is empty")
get_node("MeshInstance").set_mesh(mesh)

View File

@ -0,0 +1,207 @@
[gd_scene load_steps=7 format=2]
[ext_resource path="res://transvoxel_test/transvoxel_test.gd" type="Script" id=1]
[ext_resource path="res://transvoxel_test/debug_camera.gd" type="Script" id=2]
[ext_resource path="res://axes.tscn" type="PackedScene" id=3]
[ext_resource path="res://grid.gd" type="Script" id=4]
[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.7, 0.7, 0.7, 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="Environment" id=2]
background_mode = 0
background_skybox_scale = 1.0
background_color = Color( 0, 0, 0, 1 )
background_energy = 1.0
background_canvas_max_layer = 0
ambient_light_color = Color( 0, 0, 0, 1 )
ambient_light_energy = 1.0
ambient_light_skybox_contribution = 0.0
ss_reflections_enabled = false
ss_reflections_max_steps = 64
ss_reflections_accel = 0.04
ss_reflections_fade = 2.0
ss_reflections_depth_tolerance = 0.2
ss_reflections_accel_smooth = true
ss_reflections_roughness = true
ssao_enabled = false
ssao_radius = 1.0
ssao_intensity = 1.0
ssao_radius2 = 0.0
ssao_intensity2 = 1.0
ssao_bias = 0.01
ssao_light_affect = 1.0
ssao_color = Color( 0, 0, 0, 1 )
ssao_blur = true
dof_blur_far_enabled = false
dof_blur_far_distance = 10.0
dof_blur_far_transition = 5.0
dof_blur_far_amount = 0.1
dof_blur_far_quality = 1
dof_blur_near_enabled = false
dof_blur_near_distance = 2.0
dof_blur_near_transition = 1.0
dof_blur_near_amount = 0.1
dof_blur_near_quality = 1
glow_enabled = false
glow_levels/1 = false
glow_levels/2 = false
glow_levels/3 = true
glow_levels/4 = false
glow_levels/5 = true
glow_levels/6 = false
glow_levels/7 = false
glow_intensity = 0.8
glow_strength = 1.0
glow_bloom = 0.0
glow_blend_mode = 2
glow_hdr_treshold = 1.0
glow_hdr_scale = 2.0
glow_bicubic_upscale = false
tonemap_mode = 0
tonemap_exposure = 1.0
tonemap_white = 1.0
auto_expoure_enabled = false
auto_expoure_scale = 0.4
auto_expoure_min_luma = 0.05
auto_expoure_max_luma = 8.0
auto_expoure_speed = 0.5
adjustment_enabled = false
adjustment_brightness = 1.0
adjustment_contrast = 1.0
adjustment_saturation = 1.0
[node name="Node" type="Node"]
script = ExtResource( 1 )
[node name="MeshInstance" type="MeshInstance" parent="."]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 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
mesh = null
skeleton = NodePath("..")
[node name="Camera" type="Camera" parent="."]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 1, 0, 0, 0, 0.943118, 0.332458, 0, -0.332458, 0.943118, 0, 3.06759, 8.94332 )
projection = 0
fov = 60.0
near = 0.1
far = 200.0
keep_aspect = 1
current = false
cull_mask = 1048575
environment = null
h_offset = 0.0
v_offset = 0.0
script = ExtResource( 2 )
sensitivity = 0.3
min_angle = -90
max_angle = 90
speed = 5.0
capture_mouse = true
[node name="axes" parent="." instance=ExtResource( 3 )]
transform = Transform( 20, 0, 0, 0, 20, 0, 0, 0, 20, -20, 0, -20 )
[node name="DirectionalLight" type="DirectionalLight" parent="."]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
transform = Transform( 0.230139, -0.950812, 0.207346, 0.479203, 0.296166, 0.826226, -0.846995, -0.0907862, 0.523791, 14.2262, 0, 0 )
layers = 1
light_color = Color( 1, 1, 1, 1 )
light_energy = 1.0
light_negative = false
light_specular = 0.5
light_cull_mask = -1
shadow_enabled = false
shadow_color = Color( 0, 0, 0, 1 )
shadow_bias = 0.2
shadow_contact = 0.0
shadow_max_distance = 0.0
editor_only = false
directional_shadow_mode = 2
directional_shadow_split_1 = 0.1
directional_shadow_split_2 = 0.2
directional_shadow_split_3 = 0.5
directional_shadow_blend_splits = false
directional_shadow_normal_bias = 0.2
directional_shadow_bias_split_scale = 0.1
[node name="grid" type="MeshInstance" parent="."]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
layers = 1
material_override = null
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
mesh = null
skeleton = NodePath("..")
script = ExtResource( 4 )
size = 4
step = 1
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
environment = SubResource( 2 )

View File

@ -1,10 +0,0 @@
extends VoxelTerrain
func _ready():
pass
# TODO Should be in editor
#var mesher = get_mesher()
#mesher.set_occlusion_enabled(true)
#mesher.set_occlusion_darkness(1.0)