Moved VoxelType to its own file and renamed block.gd => block_node.gd
parent
3d97573449
commit
8c3d6e4c4e
51
block.gd
51
block.gd
|
@ -1,53 +1,2 @@
|
|||
|
||||
extends MeshInstance
|
||||
|
||||
|
||||
var voxel_map = null
|
||||
|
||||
var _normal_material = null
|
||||
var _spawn_material = null
|
||||
var _normal_pos = Vector3(0,0,0)
|
||||
var _anim_time = 0
|
||||
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
|
||||
|
||||
func spawn():
|
||||
# _spawn_material = FixedMaterial.new()
|
||||
# _spawn_material.set_texture(FixedMaterial.PARAM_DIFFUSE, voxel_map.material.get_texture(FixedMaterial.PARAM_DIFFUSE))
|
||||
# _spawn_material.set_parameter(FixedMaterial.PARAM_DIFFUSE, Color(1,1,1,0.5))
|
||||
# _spawn_material.set_flag(FixedMaterial.FLAG_USE_ALPHA, true)
|
||||
#_spawn_material.set_blend_mode(Material.BLEND_MODE_MIX)
|
||||
#set_material_override(_spawn_material)
|
||||
#set_material_override(voxel_map.material)
|
||||
_normal_pos = get_translation()
|
||||
set_process(true)
|
||||
|
||||
|
||||
func _process(delta):
|
||||
_anim_time += delta
|
||||
var k = _anim_time
|
||||
if k < 1.0:
|
||||
var pos = _normal_pos
|
||||
pos.y -= (1-k)*(1-k) * 64.0
|
||||
set_translation(pos)
|
||||
else:
|
||||
set_translation(_normal_pos)
|
||||
set_process(false)
|
||||
|
||||
# var color = _spawn_material.get_parameter(FixedMaterial.PARAM_DIFFUSE)
|
||||
# if color.a < 1.0:
|
||||
# color.a += (0.1*delta)
|
||||
# if color.a >= 1.0:
|
||||
# set_material_override(voxel_map.material)
|
||||
# set_process(false)
|
||||
# _spawn_material = null
|
||||
# else:
|
||||
# color.r = color.a
|
||||
# color.g = color.a
|
||||
# color.b = color.a
|
||||
# _spawn_material.set_parameter(FixedMaterial.PARAM_DIFFUSE, color)
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
[gd_scene load_steps=2 format=1]
|
||||
|
||||
[ext_resource path="res://block.gd" type="Script" id=1]
|
||||
[ext_resource path="res://block_node.gd" type="Script" id=1]
|
||||
|
||||
|
||||
[node name="Block" type="MeshInstance"]
|
||||
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
|
||||
extends MeshInstance
|
||||
|
||||
|
||||
var voxel_map = null
|
||||
|
||||
var _normal_material = null
|
||||
var _spawn_material = null
|
||||
var _normal_pos = Vector3(0,0,0)
|
||||
var _anim_time = 0
|
||||
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
|
||||
|
||||
func spawn():
|
||||
# _spawn_material = FixedMaterial.new()
|
||||
# _spawn_material.set_texture(FixedMaterial.PARAM_DIFFUSE, voxel_map.material.get_texture(FixedMaterial.PARAM_DIFFUSE))
|
||||
# _spawn_material.set_parameter(FixedMaterial.PARAM_DIFFUSE, Color(1,1,1,0.5))
|
||||
# _spawn_material.set_flag(FixedMaterial.FLAG_USE_ALPHA, true)
|
||||
#_spawn_material.set_blend_mode(Material.BLEND_MODE_MIX)
|
||||
#set_material_override(_spawn_material)
|
||||
#set_material_override(voxel_map.material)
|
||||
_normal_pos = get_translation()
|
||||
set_process(true)
|
||||
|
||||
|
||||
func _process(delta):
|
||||
_anim_time += delta
|
||||
var k = _anim_time
|
||||
if k < 1.0:
|
||||
var pos = _normal_pos
|
||||
pos.y -= (1-k)*(1-k) * 64.0
|
||||
set_translation(pos)
|
||||
else:
|
||||
set_translation(_normal_pos)
|
||||
set_process(false)
|
||||
|
||||
# var color = _spawn_material.get_parameter(FixedMaterial.PARAM_DIFFUSE)
|
||||
# if color.a < 1.0:
|
||||
# color.a += (0.1*delta)
|
||||
# if color.a >= 1.0:
|
||||
# set_material_override(voxel_map.material)
|
||||
# set_process(false)
|
||||
# _spawn_material = null
|
||||
# else:
|
||||
# color.r = color.a
|
||||
# color.g = color.a
|
||||
# color.b = color.a
|
||||
# _spawn_material.set_parameter(FixedMaterial.PARAM_DIFFUSE, color)
|
||||
|
||||
|
271
generator.gd
271
generator.gd
|
@ -2,14 +2,6 @@
|
|||
extends Node
|
||||
|
||||
const BLOCK_SIZE = 16
|
||||
|
||||
const SIDE_LEFT = 0
|
||||
const SIDE_RIGHT = 1
|
||||
const SIDE_BOTTOM = 2
|
||||
const SIDE_TOP = 3
|
||||
const SIDE_BACK = 4
|
||||
const SIDE_FRONT = 5
|
||||
|
||||
const SORT_TIME = 1
|
||||
const TILE_SIZE = 16
|
||||
|
||||
|
@ -19,6 +11,8 @@ var min_y = -2
|
|||
var max_y = 2
|
||||
var view_radius = 8
|
||||
|
||||
var VoxelType = preload("voxel_type.gd")
|
||||
|
||||
var _side_normals = [
|
||||
Vector3(-1,0,0),
|
||||
Vector3(1,0,0),
|
||||
|
@ -120,242 +114,6 @@ class BlockRequest:
|
|||
# line[x] = 0
|
||||
|
||||
|
||||
class VoxelType:
|
||||
const GEOM_EMPTY = 0
|
||||
const GEOM_CUBE = 1
|
||||
const GEOM_XQUAD = 2
|
||||
const GEOM_MODEL = 3
|
||||
const GEOM_LIQUID = 4
|
||||
|
||||
var id = 0
|
||||
var name = "default"
|
||||
var cube_side_uv4 = []
|
||||
var is_transparent = false
|
||||
var geom_type = GEOM_CUBE
|
||||
|
||||
# Mesh that will always be included in the voxel
|
||||
var model_vertices = []
|
||||
var model_uv = []
|
||||
# Parts of the mesh that will appear only if connected sides are transparent
|
||||
var model_side_vertices = []
|
||||
var model_side_uv = []
|
||||
var model_normals = []
|
||||
|
||||
func _init(id, name):
|
||||
self.id = id
|
||||
self.name = name
|
||||
cube_side_uv4.resize(6)
|
||||
set_all_atlas_pos(Vector2(0,0))
|
||||
|
||||
func set_side_atlas_pos(side, pos):
|
||||
var s = 1.0 / 4.0
|
||||
# Apply a tiny padding to avoid tiling artefacts
|
||||
var e = 0.001
|
||||
cube_side_uv4[side] = [
|
||||
s * (pos + Vector2(e,e)),
|
||||
s * (pos + Vector2(1-e,e)),
|
||||
s * (pos + Vector2(e,1-e)),
|
||||
s * (pos + Vector2(1-e,1-e))
|
||||
]
|
||||
return self
|
||||
|
||||
func set_all_atlas_pos(pos):
|
||||
for i in range(0, 6):
|
||||
set_side_atlas_pos(i, pos)
|
||||
return self
|
||||
|
||||
func set_tbs_atlas_pos(top_pos, bottom_pos, sides_pos):
|
||||
set_side_atlas_pos(SIDE_LEFT, sides_pos)
|
||||
set_side_atlas_pos(SIDE_RIGHT, sides_pos)
|
||||
set_side_atlas_pos(SIDE_FRONT, sides_pos)
|
||||
set_side_atlas_pos(SIDE_BACK, sides_pos)
|
||||
set_side_atlas_pos(SIDE_TOP, top_pos)
|
||||
set_side_atlas_pos(SIDE_BOTTOM, bottom_pos)
|
||||
return self
|
||||
|
||||
func set_geom(g):
|
||||
geom_type = g
|
||||
return self
|
||||
|
||||
func set_transparent(trans):
|
||||
is_transparent = trans
|
||||
return self
|
||||
|
||||
func compile():
|
||||
if geom_type == GEOM_CUBE:
|
||||
model_side_vertices = _make_cube_vertex_offsets()
|
||||
model_side_uv = _make_cube_side_uv6(cube_side_uv4)
|
||||
|
||||
elif geom_type == GEOM_LIQUID:
|
||||
model_side_vertices = _make_cube_vertex_offsets(15.0 / 16.0)
|
||||
model_side_uv = _make_cube_side_uv6(cube_side_uv4)
|
||||
|
||||
elif geom_type == GEOM_XQUAD:
|
||||
var uv = cube_side_uv4
|
||||
model_uv = [
|
||||
uv[0][2],
|
||||
uv[0][0],
|
||||
uv[0][1],
|
||||
uv[0][2],
|
||||
uv[0][1],
|
||||
uv[0][3],
|
||||
|
||||
uv[0][3],
|
||||
uv[0][2],
|
||||
uv[0][1],
|
||||
uv[0][2],
|
||||
uv[0][0],
|
||||
uv[0][1]
|
||||
]
|
||||
model_vertices = [
|
||||
Vector3(0,0,0),
|
||||
Vector3(0,1,0),
|
||||
Vector3(1,1,1),
|
||||
Vector3(0,0,0),
|
||||
Vector3(1,1,1),
|
||||
Vector3(1,0,1),
|
||||
|
||||
Vector3(1,0,0),
|
||||
Vector3(0,0,1),
|
||||
Vector3(1,1,0),
|
||||
Vector3(0,0,1),
|
||||
Vector3(0,1,1),
|
||||
Vector3(1,1,0)
|
||||
]
|
||||
model_normals = [
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7)
|
||||
]
|
||||
|
||||
else:
|
||||
print("Unknown voxel geometry type")
|
||||
|
||||
|
||||
static func _make_cube_vertex_offsets(sy=1):
|
||||
var a = [
|
||||
[
|
||||
# LEFT
|
||||
Vector3(0,0,0),
|
||||
Vector3(0,sy,0),
|
||||
Vector3(0,sy,1),
|
||||
Vector3(0,0,0),
|
||||
Vector3(0,sy,1),
|
||||
Vector3(0,0,1),
|
||||
],
|
||||
[
|
||||
# RIGHT
|
||||
Vector3(1,0,0),
|
||||
Vector3(1,sy,1),
|
||||
Vector3(1,sy,0),
|
||||
Vector3(1,0,0),
|
||||
Vector3(1,0,1),
|
||||
Vector3(1,sy,1)
|
||||
],
|
||||
[
|
||||
# BOTTOM
|
||||
Vector3(0,0,0),
|
||||
Vector3(1,0,1),
|
||||
Vector3(1,0,0),
|
||||
Vector3(0,0,0),
|
||||
Vector3(0,0,1),
|
||||
Vector3(1,0,1)
|
||||
],
|
||||
[
|
||||
# TOP
|
||||
Vector3(0,sy,0),
|
||||
Vector3(1,sy,0),
|
||||
Vector3(1,sy,1),
|
||||
Vector3(0,sy,0),
|
||||
Vector3(1,sy,1),
|
||||
Vector3(0,sy,1)
|
||||
],
|
||||
[
|
||||
# BACK
|
||||
Vector3(0,0,0),
|
||||
Vector3(1,0,0),
|
||||
Vector3(1,sy,0),
|
||||
Vector3(0,0,0),
|
||||
Vector3(1,sy,0),
|
||||
Vector3(0,sy,0),
|
||||
],
|
||||
[
|
||||
# FRONT
|
||||
Vector3(1,0,1),
|
||||
Vector3(0,0,1),
|
||||
Vector3(1,sy,1),
|
||||
Vector3(0,0,1),
|
||||
Vector3(0,sy,1),
|
||||
Vector3(1,sy,1)
|
||||
]
|
||||
]
|
||||
return a
|
||||
|
||||
static func _make_cube_side_uv6(sides_uv4):
|
||||
var uvs = sides_uv4
|
||||
var uv6 = [
|
||||
[
|
||||
uvs[SIDE_LEFT][2],
|
||||
uvs[SIDE_LEFT][0],
|
||||
uvs[SIDE_LEFT][1],
|
||||
uvs[SIDE_LEFT][2],
|
||||
uvs[SIDE_LEFT][1],
|
||||
uvs[SIDE_LEFT][3]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_RIGHT][2],
|
||||
uvs[SIDE_RIGHT][1],
|
||||
uvs[SIDE_RIGHT][0],
|
||||
uvs[SIDE_RIGHT][2],
|
||||
uvs[SIDE_RIGHT][3],
|
||||
uvs[SIDE_RIGHT][1]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_BOTTOM][0],
|
||||
uvs[SIDE_BOTTOM][3],
|
||||
uvs[SIDE_BOTTOM][1],
|
||||
uvs[SIDE_BOTTOM][0],
|
||||
uvs[SIDE_BOTTOM][2],
|
||||
uvs[SIDE_BOTTOM][3]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_TOP][0],
|
||||
uvs[SIDE_TOP][1],
|
||||
uvs[SIDE_TOP][3],
|
||||
uvs[SIDE_TOP][0],
|
||||
uvs[SIDE_TOP][3],
|
||||
uvs[SIDE_TOP][2]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_BACK][2],
|
||||
uvs[SIDE_BACK][3],
|
||||
uvs[SIDE_BACK][1],
|
||||
uvs[SIDE_BACK][2],
|
||||
uvs[SIDE_BACK][1],
|
||||
uvs[SIDE_BACK][0]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_FRONT][3],
|
||||
uvs[SIDE_FRONT][2],
|
||||
uvs[SIDE_FRONT][1],
|
||||
uvs[SIDE_FRONT][2],
|
||||
uvs[SIDE_FRONT][0],
|
||||
uvs[SIDE_FRONT][1]
|
||||
],
|
||||
]
|
||||
return uv6
|
||||
|
||||
|
||||
func _ready():
|
||||
_camera = get_parent().get_node("Camera")
|
||||
|
||||
|
@ -638,7 +396,7 @@ func generate_random(cubes, offset):
|
|||
cubes[z][y][x] = air
|
||||
|
||||
return empty
|
||||
|
||||
|
||||
|
||||
func _is_face_visible(vt, other_vt):
|
||||
return other_vt.id == 0 or (other_vt.is_transparent and other_vt != vt)
|
||||
|
@ -687,28 +445,7 @@ func make_mesh(cubes, st_solid, st_transparent):
|
|||
st.add_uv(uvs[vi])
|
||||
st.add_normal(normals[vi])
|
||||
st.add_vertex(pos + vertices[vi])
|
||||
|
||||
# elif voxel_type.geom_type == VoxelType.GEOM_XQUAD:
|
||||
# var pos = Vector3(x,y,z)-Vector3(1,1,1)
|
||||
# pos.x += rand_range(-0.15, 0.15)
|
||||
# pos.z += rand_range(-0.15, 0.15)
|
||||
# var uvs = voxel_type.cube_side_uv4[0]
|
||||
#
|
||||
# st.add_normal(Vector3(-0.7,0,0.7))
|
||||
# st.add_uv(uvs[2]); st.add_vertex(pos)
|
||||
# st.add_uv(uvs[0]); st.add_vertex(pos+Vector3(0,1,0))
|
||||
# st.add_uv(uvs[1]); st.add_vertex(pos+Vector3(1,1,1))
|
||||
# st.add_uv(uvs[2]); st.add_vertex(pos)
|
||||
# st.add_uv(uvs[1]); st.add_vertex(pos+Vector3(1,1,1))
|
||||
# st.add_uv(uvs[3]); st.add_vertex(pos+Vector3(1,0,1))
|
||||
#
|
||||
# st.add_normal(Vector3(0.7,0,0.7))
|
||||
# st.add_uv(uvs[3]); st.add_vertex(pos+Vector3(1,0,0))
|
||||
# st.add_uv(uvs[2]); st.add_vertex(pos+Vector3(0,0,1))
|
||||
# st.add_uv(uvs[1]); st.add_vertex(pos+Vector3(1,1,0))
|
||||
# st.add_uv(uvs[2]); st.add_vertex(pos+Vector3(0,0,1))
|
||||
# st.add_uv(uvs[0]); st.add_vertex(pos+Vector3(0,1,1))
|
||||
# st.add_uv(uvs[1]); st.add_vertex(pos+Vector3(1,1,0))
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
166
new_scene.tscn
166
new_scene.tscn
|
@ -1,9 +1,8 @@
|
|||
[gd_scene load_steps=10 format=1]
|
||||
[gd_scene load_steps=7 format=1]
|
||||
|
||||
[ext_resource path="res://debug_camera.gd" type="Script" id=1]
|
||||
[ext_resource path="res://generator.gd" type="Script" id=2]
|
||||
[ext_resource path="res://terrain.png" type="Texture" id=3]
|
||||
[ext_resource path="res://block.gd" type="Script" id=4]
|
||||
|
||||
[sub_resource type="FixedMaterial" id=1]
|
||||
|
||||
|
@ -81,44 +80,7 @@ textures/glow_tc = 0
|
|||
textures/normal_tc = 0
|
||||
textures/shade_param_tc = 0
|
||||
|
||||
[sub_resource type="FixedMaterial" id=3]
|
||||
|
||||
flags/visible = true
|
||||
flags/double_sided = false
|
||||
flags/invert_faces = false
|
||||
flags/unshaded = false
|
||||
flags/on_top = false
|
||||
flags/lightmap_on_uv2 = true
|
||||
flags/colarray_is_srgb = true
|
||||
params/blend_mode = 0
|
||||
params/depth_draw = 1
|
||||
params/line_width = 1.0
|
||||
fixed_flags/use_alpha = false
|
||||
fixed_flags/use_color_array = false
|
||||
fixed_flags/use_point_size = false
|
||||
fixed_flags/discard_alpha = false
|
||||
fixed_flags/use_xy_normalmap = false
|
||||
params/diffuse = Color( 1, 1, 1, 1 )
|
||||
params/specular = Color( 0, 0, 0, 1 )
|
||||
params/emission = Color( 0, 0, 0, 1 )
|
||||
params/specular_exp = 40
|
||||
params/detail_mix = 1.0
|
||||
params/normal_depth = 1
|
||||
params/shader = 0
|
||||
params/shader_param = 0.5
|
||||
params/glow = 0
|
||||
params/point_size = 1.0
|
||||
uv_xform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
textures/diffuse_tc = 0
|
||||
textures/detail_tc = 0
|
||||
textures/specular_tc = 0
|
||||
textures/emission_tc = 0
|
||||
textures/specular_exp_tc = 0
|
||||
textures/glow_tc = 0
|
||||
textures/normal_tc = 0
|
||||
textures/shade_param_tc = 0
|
||||
|
||||
[sub_resource type="Environment" id=4]
|
||||
[sub_resource type="Environment" id=3]
|
||||
|
||||
ambient_light/enabled = true
|
||||
ambient_light/color = Color( 0.378906, 0.378906, 0.378906, 1 )
|
||||
|
@ -162,22 +124,12 @@ bcs/contrast = 1.0
|
|||
bcs/saturation = 1.0
|
||||
srgb/enabled = false
|
||||
|
||||
[sub_resource type="Animation" id=5]
|
||||
|
||||
length = 1.0
|
||||
loop = false
|
||||
step = 0.1
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/keys = { "cont":true, "times":FloatArray( ), "transitions":FloatArray( ), "values":[ ] }
|
||||
|
||||
[node name="Node" type="Node"]
|
||||
|
||||
[node name="Camera" type="Camera" parent="."]
|
||||
|
||||
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
transform/local = Transform( 0.815509, -0.351713, 0.459612, 0, 0.794154, 0.607717, -0.578744, -0.495599, 0.64764, 18.1809, 22.9505, 25.3826 )
|
||||
transform/local = Transform( 0.815509, -0.351713, 0.459612, 0, 0.794154, 0.607717, -0.578744, -0.495599, 0.64764, 18.1809, 4.88061, 25.3826 )
|
||||
projection = 0
|
||||
fov = 80.0
|
||||
near = 0.1
|
||||
|
@ -189,6 +141,7 @@ environment = null
|
|||
h_offset = 0.0
|
||||
v_offset = 0.0
|
||||
script/script = ExtResource( 1 )
|
||||
__meta__ = { "_editor_collapsed":true }
|
||||
sensitivity = 0.4
|
||||
min_angle = -90
|
||||
max_angle = 90
|
||||
|
@ -261,125 +214,16 @@ phase_2/color = Color( 0, 0, 0, 1 )
|
|||
phase_3/pos = 1.0
|
||||
phase_3/color = Color( 0, 0, 0, 1 )
|
||||
|
||||
[node name="TestCube" type="TestCube" parent="."]
|
||||
|
||||
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
transform/local = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -3.63175, 0, 0 )
|
||||
layers = 1
|
||||
geometry/visible = true
|
||||
geometry/material_override = null
|
||||
geometry/cast_shadow = true
|
||||
geometry/receive_shadows = true
|
||||
geometry/range_begin = 0.0
|
||||
geometry/range_end = 0.0
|
||||
geometry/extra_cull_margin = 0.0
|
||||
geometry/billboard = false
|
||||
geometry/billboard_y = false
|
||||
geometry/depth_scale = false
|
||||
geometry/visible_in_all_rooms = false
|
||||
geometry/use_baked_light = false
|
||||
geometry/baked_light_tex_id = 0
|
||||
|
||||
[node name="TestCube1" type="TestCube" parent="."]
|
||||
|
||||
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
transform/local = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -3.63175, 0, 2.12836 )
|
||||
layers = 1
|
||||
geometry/visible = true
|
||||
geometry/material_override = null
|
||||
geometry/cast_shadow = true
|
||||
geometry/receive_shadows = true
|
||||
geometry/range_begin = 0.0
|
||||
geometry/range_end = 0.0
|
||||
geometry/extra_cull_margin = 0.0
|
||||
geometry/billboard = false
|
||||
geometry/billboard_y = false
|
||||
geometry/depth_scale = false
|
||||
geometry/visible_in_all_rooms = false
|
||||
geometry/use_baked_light = false
|
||||
geometry/baked_light_tex_id = 0
|
||||
|
||||
[node name="TestCube2" type="TestCube" parent="."]
|
||||
|
||||
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
transform/local = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -1.39143, 0, 0 )
|
||||
layers = 1
|
||||
geometry/visible = true
|
||||
geometry/material_override = null
|
||||
geometry/cast_shadow = true
|
||||
geometry/receive_shadows = true
|
||||
geometry/range_begin = 0.0
|
||||
geometry/range_end = 0.0
|
||||
geometry/extra_cull_margin = 0.0
|
||||
geometry/billboard = false
|
||||
geometry/billboard_y = false
|
||||
geometry/depth_scale = false
|
||||
geometry/visible_in_all_rooms = false
|
||||
geometry/use_baked_light = false
|
||||
geometry/baked_light_tex_id = 0
|
||||
|
||||
[node name="TestCube3" type="TestCube" parent="."]
|
||||
|
||||
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
transform/local = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -3.63175, 2.18131, 0 )
|
||||
layers = 1
|
||||
geometry/visible = true
|
||||
geometry/material_override = null
|
||||
geometry/cast_shadow = true
|
||||
geometry/receive_shadows = true
|
||||
geometry/range_begin = 0.0
|
||||
geometry/range_end = 0.0
|
||||
geometry/extra_cull_margin = 0.0
|
||||
geometry/billboard = false
|
||||
geometry/billboard_y = false
|
||||
geometry/depth_scale = false
|
||||
geometry/visible_in_all_rooms = false
|
||||
geometry/use_baked_light = false
|
||||
geometry/baked_light_tex_id = 0
|
||||
|
||||
[node name="VoxelMap" type="Node" parent="."]
|
||||
|
||||
script/script = ExtResource( 2 )
|
||||
material = SubResource( 1 )
|
||||
transparent_material = SubResource( 2 )
|
||||
|
||||
[node name="Block" type="MeshInstance" parent="."]
|
||||
|
||||
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
visibility/visible = false
|
||||
layers = 1
|
||||
geometry/visible = true
|
||||
geometry/material_override = SubResource( 3 )
|
||||
geometry/cast_shadow = true
|
||||
geometry/receive_shadows = true
|
||||
geometry/range_begin = 0.0
|
||||
geometry/range_end = 0.0
|
||||
geometry/extra_cull_margin = 0.0
|
||||
geometry/billboard = false
|
||||
geometry/billboard_y = false
|
||||
geometry/depth_scale = false
|
||||
geometry/visible_in_all_rooms = false
|
||||
geometry/use_baked_light = false
|
||||
geometry/baked_light_tex_id = 0
|
||||
mesh/mesh = null
|
||||
mesh/skeleton = NodePath("..")
|
||||
script/script = ExtResource( 4 )
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
|
||||
_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
|
||||
environment = SubResource( 4 )
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||
|
||||
playback/process_mode = 1
|
||||
playback/default_blend_time = 0.0
|
||||
root/root = NodePath("..")
|
||||
anims/NewAnim = SubResource( 5 )
|
||||
playback/active = true
|
||||
playback/speed = 1.0
|
||||
blend_times = [ ]
|
||||
autoplay = ""
|
||||
environment = SubResource( 3 )
|
||||
|
||||
[node name="DirectionalLight" type="DirectionalLight" parent="."]
|
||||
|
||||
|
|
|
@ -0,0 +1,247 @@
|
|||
|
||||
# TODO Move this to VoxelMap
|
||||
# Still here, because accessing constants from another script don't work... (issue 4457)
|
||||
const ATLAS_SIZE = 4
|
||||
|
||||
const SIDE_LEFT = 0
|
||||
const SIDE_RIGHT = 1
|
||||
const SIDE_BOTTOM = 2
|
||||
const SIDE_TOP = 3
|
||||
const SIDE_BACK = 4
|
||||
const SIDE_FRONT = 5
|
||||
|
||||
const GEOM_EMPTY = 0
|
||||
const GEOM_CUBE = 1
|
||||
const GEOM_XQUAD = 2
|
||||
const GEOM_MODEL = 3
|
||||
const GEOM_LIQUID = 4
|
||||
|
||||
var id = 0
|
||||
var name = "default"
|
||||
var cube_side_uv4 = []
|
||||
var is_transparent = false
|
||||
var geom_type = GEOM_CUBE
|
||||
|
||||
# Mesh that will always be included in the voxel
|
||||
var model_vertices = []
|
||||
var model_uv = []
|
||||
# Parts of the mesh that will appear only if connected sides are transparent
|
||||
var model_side_vertices = []
|
||||
var model_side_uv = []
|
||||
var model_normals = []
|
||||
|
||||
func _init(id, name):
|
||||
self.id = id
|
||||
self.name = name
|
||||
cube_side_uv4.resize(6)
|
||||
set_all_atlas_pos(Vector2(0,0))
|
||||
|
||||
func set_side_atlas_pos(side, pos):
|
||||
var s = 1.0 / float(ATLAS_SIZE)
|
||||
# Apply a tiny padding to avoid tiling artefacts
|
||||
var e = 0.001
|
||||
cube_side_uv4[side] = [
|
||||
s * (pos + Vector2(e,e)),
|
||||
s * (pos + Vector2(1-e,e)),
|
||||
s * (pos + Vector2(e,1-e)),
|
||||
s * (pos + Vector2(1-e,1-e))
|
||||
]
|
||||
return self
|
||||
|
||||
func set_all_atlas_pos(pos):
|
||||
for i in range(0, 6):
|
||||
set_side_atlas_pos(i, pos)
|
||||
return self
|
||||
|
||||
func set_tbs_atlas_pos(top_pos, bottom_pos, sides_pos):
|
||||
set_side_atlas_pos(SIDE_LEFT, sides_pos)
|
||||
set_side_atlas_pos(SIDE_RIGHT, sides_pos)
|
||||
set_side_atlas_pos(SIDE_FRONT, sides_pos)
|
||||
set_side_atlas_pos(SIDE_BACK, sides_pos)
|
||||
set_side_atlas_pos(SIDE_TOP, top_pos)
|
||||
set_side_atlas_pos(SIDE_BOTTOM, bottom_pos)
|
||||
return self
|
||||
|
||||
func set_geom(g):
|
||||
geom_type = g
|
||||
return self
|
||||
|
||||
func set_transparent(trans):
|
||||
is_transparent = trans
|
||||
return self
|
||||
|
||||
func compile():
|
||||
if geom_type == GEOM_CUBE:
|
||||
model_side_vertices = _make_cube_vertex_offsets()
|
||||
model_side_uv = _make_cube_side_uv6(cube_side_uv4)
|
||||
|
||||
elif geom_type == GEOM_LIQUID:
|
||||
model_side_vertices = _make_cube_vertex_offsets(15.0 / 16.0)
|
||||
model_side_uv = _make_cube_side_uv6(cube_side_uv4)
|
||||
|
||||
elif geom_type == GEOM_XQUAD:
|
||||
var uv = cube_side_uv4
|
||||
model_uv = [
|
||||
uv[0][2],
|
||||
uv[0][0],
|
||||
uv[0][1],
|
||||
uv[0][2],
|
||||
uv[0][1],
|
||||
uv[0][3],
|
||||
|
||||
uv[0][3],
|
||||
uv[0][2],
|
||||
uv[0][1],
|
||||
uv[0][2],
|
||||
uv[0][0],
|
||||
uv[0][1]
|
||||
]
|
||||
model_vertices = [
|
||||
Vector3(0,0,0),
|
||||
Vector3(0,1,0),
|
||||
Vector3(1,1,1),
|
||||
Vector3(0,0,0),
|
||||
Vector3(1,1,1),
|
||||
Vector3(1,0,1),
|
||||
|
||||
Vector3(1,0,0),
|
||||
Vector3(0,0,1),
|
||||
Vector3(1,1,0),
|
||||
Vector3(0,0,1),
|
||||
Vector3(0,1,1),
|
||||
Vector3(1,1,0)
|
||||
]
|
||||
model_normals = [
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
Vector3(-0.7, 0.0, 0.7),
|
||||
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7),
|
||||
Vector3(0.7, 0.0, 0.7)
|
||||
]
|
||||
|
||||
else:
|
||||
print("Unknown voxel geometry type")
|
||||
|
||||
|
||||
static func _make_cube_vertex_offsets(sy=1):
|
||||
var a = [
|
||||
[
|
||||
# LEFT
|
||||
Vector3(0,0,0),
|
||||
Vector3(0,sy,0),
|
||||
Vector3(0,sy,1),
|
||||
Vector3(0,0,0),
|
||||
Vector3(0,sy,1),
|
||||
Vector3(0,0,1),
|
||||
],
|
||||
[
|
||||
# RIGHT
|
||||
Vector3(1,0,0),
|
||||
Vector3(1,sy,1),
|
||||
Vector3(1,sy,0),
|
||||
Vector3(1,0,0),
|
||||
Vector3(1,0,1),
|
||||
Vector3(1,sy,1)
|
||||
],
|
||||
[
|
||||
# BOTTOM
|
||||
Vector3(0,0,0),
|
||||
Vector3(1,0,1),
|
||||
Vector3(1,0,0),
|
||||
Vector3(0,0,0),
|
||||
Vector3(0,0,1),
|
||||
Vector3(1,0,1)
|
||||
],
|
||||
[
|
||||
# TOP
|
||||
Vector3(0,sy,0),
|
||||
Vector3(1,sy,0),
|
||||
Vector3(1,sy,1),
|
||||
Vector3(0,sy,0),
|
||||
Vector3(1,sy,1),
|
||||
Vector3(0,sy,1)
|
||||
],
|
||||
[
|
||||
# BACK
|
||||
Vector3(0,0,0),
|
||||
Vector3(1,0,0),
|
||||
Vector3(1,sy,0),
|
||||
Vector3(0,0,0),
|
||||
Vector3(1,sy,0),
|
||||
Vector3(0,sy,0),
|
||||
],
|
||||
[
|
||||
# FRONT
|
||||
Vector3(1,0,1),
|
||||
Vector3(0,0,1),
|
||||
Vector3(1,sy,1),
|
||||
Vector3(0,0,1),
|
||||
Vector3(0,sy,1),
|
||||
Vector3(1,sy,1)
|
||||
]
|
||||
]
|
||||
return a
|
||||
|
||||
static func _make_cube_side_uv6(sides_uv4):
|
||||
var uvs = sides_uv4
|
||||
var uv6 = [
|
||||
[
|
||||
uvs[SIDE_LEFT][2],
|
||||
uvs[SIDE_LEFT][0],
|
||||
uvs[SIDE_LEFT][1],
|
||||
uvs[SIDE_LEFT][2],
|
||||
uvs[SIDE_LEFT][1],
|
||||
uvs[SIDE_LEFT][3]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_RIGHT][2],
|
||||
uvs[SIDE_RIGHT][1],
|
||||
uvs[SIDE_RIGHT][0],
|
||||
uvs[SIDE_RIGHT][2],
|
||||
uvs[SIDE_RIGHT][3],
|
||||
uvs[SIDE_RIGHT][1]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_BOTTOM][0],
|
||||
uvs[SIDE_BOTTOM][3],
|
||||
uvs[SIDE_BOTTOM][1],
|
||||
uvs[SIDE_BOTTOM][0],
|
||||
uvs[SIDE_BOTTOM][2],
|
||||
uvs[SIDE_BOTTOM][3]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_TOP][0],
|
||||
uvs[SIDE_TOP][1],
|
||||
uvs[SIDE_TOP][3],
|
||||
uvs[SIDE_TOP][0],
|
||||
uvs[SIDE_TOP][3],
|
||||
uvs[SIDE_TOP][2]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_BACK][2],
|
||||
uvs[SIDE_BACK][3],
|
||||
uvs[SIDE_BACK][1],
|
||||
uvs[SIDE_BACK][2],
|
||||
uvs[SIDE_BACK][1],
|
||||
uvs[SIDE_BACK][0]
|
||||
],
|
||||
[
|
||||
uvs[SIDE_FRONT][3],
|
||||
uvs[SIDE_FRONT][2],
|
||||
uvs[SIDE_FRONT][1],
|
||||
uvs[SIDE_FRONT][2],
|
||||
uvs[SIDE_FRONT][0],
|
||||
uvs[SIDE_FRONT][1]
|
||||
],
|
||||
]
|
||||
return uv6
|
||||
|
||||
|
Loading…
Reference in New Issue