Reorganized project, added dual marching cubes test
|
@ -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))
|
||||
|
|
@ -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]
|
||||
|
|
@ -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))
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 240 B |
|
@ -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]
|
||||
|
|
@ -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()
|
||||
|
|
@ -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
|
Before Width: | Height: | Size: 654 KiB After Width: | Height: | Size: 654 KiB |
|
@ -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]
|
||||
|
|
@ -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]
|
||||
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
@ -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]
|
||||
|
|
@ -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]
|
||||
|
|
@ -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]
|
||||
|
|
@ -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)
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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"
|
||||
|
|
@ -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 )
|
|
@ -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)
|
||||
|
||||
|
|
@ -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 )
|
|
@ -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=""
|
BIN
project/icon.png
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.4 KiB |
|
@ -1 +0,0 @@
|
|||
gen_mipmaps=false
|
|
@ -3,6 +3,9 @@
|
|||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
|
|
|
@ -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")
|
|
@ -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"]
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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]
|
||||
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
|
@ -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 )
|
||||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
filter=false
|
||||
gen_mipmaps=false
|
|
@ -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)
|
||||
|
|
@ -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 )
|
||||
|
||||
|
|
@ -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)
|
||||
|