Added terrain and robot prototypes

This commit is contained in:
douwe
2025-08-29 17:04:57 +02:00
parent 7c24dd92b0
commit 4e77198656
21 changed files with 342 additions and 73 deletions

View File

@@ -0,0 +1,70 @@
extends Camera3D
@export var base_move_speed := 5.0
@export var min_move_speed := 1.0
@export var max_move_speed := 20.0
@export var rotation_speed := 0.002
var input_delay_over := false
var current_move_speed := base_move_speed
var mouse_delta := Vector2.ZERO
var mouse_pos := Vector2.ZERO
func _process(delta):
if Input.is_action_just_pressed("camera_control"):
mouse_pos = get_viewport().get_mouse_position()
input_delay_over = false
get_tree().create_timer(0.15).timeout.connect(
func():
if Input.is_action_pressed("camera_control"):
input_delay_over = true
)
if Input.is_action_pressed("camera_control") and input_delay_over:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
handle_movement(delta)
handle_rotation()
else:
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
if Input.is_action_just_released("camera_control") and input_delay_over:
Input.warp_mouse(mouse_pos)
func _unhandled_input(event):
if event is InputEventMouseButton and event.is_pressed():
handle_scroll_wheel(event)
if event is InputEventMouseMotion:
mouse_delta = event.relative
func handle_movement(delta: float) -> void:
var input_dir = Vector3.ZERO
if Input.is_key_pressed(KEY_W):
input_dir.z -= 1
if Input.is_key_pressed(KEY_S):
input_dir.z += 1
if Input.is_key_pressed(KEY_A):
input_dir.x -= 1
if Input.is_key_pressed(KEY_D):
input_dir.x += 1
if Input.is_key_pressed(KEY_E):
input_dir.y += 1
if Input.is_key_pressed(KEY_Q):
input_dir.y -= 1
if input_dir.length() > 0:
input_dir = input_dir.normalized()
translate(input_dir * current_move_speed * delta)
func handle_rotation() -> void:
var current_rotation_x = rotation.x - mouse_delta.y * rotation_speed
current_rotation_x = clamp(current_rotation_x, -1.5, 1.5)
var current_rotation_y = rotation.y - mouse_delta.x * rotation_speed
rotation = Vector3(current_rotation_x, current_rotation_y, 0)
mouse_delta = Vector2.ZERO
func handle_scroll_wheel(event: InputEventMouseButton ) -> void:
if event.button_index == MOUSE_BUTTON_WHEEL_UP:
adjust_move_speed(1.0)
elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
adjust_move_speed(-1.0)
func adjust_move_speed(delta: float) -> void:
current_move_speed = clamp(current_move_speed + delta, min_move_speed, max_move_speed)

View File

@@ -0,0 +1 @@
uid://le0spo0q018k

View File

@@ -0,0 +1,9 @@
[gd_scene load_steps=2 format=3 uid="uid://cy0nvmw51bwof"]
[ext_resource type="Script" uid="uid://le0spo0q018k" path="res://nodes/camera/controllable_camera.gd" id="1_fgom1"]
[node name="ControllableCamera" type="Camera3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
script = ExtResource("1_fgom1")
[node name="VoxelViewer" type="VoxelViewer" parent="."]

View File

@@ -2,7 +2,7 @@ extends Node
@onready var code_editor := $%Code as CodeEdit @onready var code_editor := $%Code as CodeEdit
@onready var memory := $%Memory as VBoxContainer @onready var memory := $%Memory as VBoxContainer
@onready var memory_entry := load("res://memory_entry.tscn") as PackedScene @onready var memory_entry := load("uid://dqwi5rekytyds") as PackedScene
var cobor_vm := CoborVirtualMachine.new() var cobor_vm := CoborVirtualMachine.new()
func _ready() -> void: func _ready() -> void:

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://7q00x01xdsal"] [gd_scene load_steps=2 format=3 uid="uid://7q00x01xdsal"]
[ext_resource type="Script" uid="uid://brnfd6h7eh0n7" path="res://scenes/coding/code_runner.gd" id="1_mphwn"] [ext_resource type="Script" uid="uid://brnfd6h7eh0n7" path="res://nodes/coding/code_runner.gd" id="1_mphwn"]
[node name="CodeRunner" type="Node"] [node name="CodeRunner" type="Node"]
script = ExtResource("1_mphwn") script = ExtResource("1_mphwn")

3
nodes/game.tscn Normal file
View File

@@ -0,0 +1,3 @@
[gd_scene format=3 uid="uid://d0b7m4vykcfy2"]
[node name="Game" type="Node"]

109
nodes/robots/Robots.tscn Normal file
View File

@@ -0,0 +1,109 @@
[gd_scene load_steps=18 format=3 uid="uid://b84ihb5xw37pm"]
[ext_resource type="PackedScene" uid="uid://cy0nvmw51bwof" path="res://nodes/camera/controllable_camera.tscn" id="1_ecqtg"]
[ext_resource type="Script" uid="uid://bnw0h8cuyf3g5" path="res://nodes/robots/robot.gd" id="1_nnl6p"]
[ext_resource type="VoxelBlockyLibrary" uid="uid://bsue4rd3wdfsl" path="res://nodes/word/BlockLibrary.tres" id="1_r886l"]
[ext_resource type="Material" uid="uid://de6s8en5fcyyw" path="res://nodes/word/BlockMaterial.tres" id="2_nnl6p"]
[ext_resource type="PackedScene" uid="uid://ddyulj4dsrkms" path="res://nodes/word/terrain_editor.tscn" id="4_llm6e"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_e1sxe"]
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
[sub_resource type="Sky" id="Sky_0wfyh"]
sky_material = SubResource("ProceduralSkyMaterial_e1sxe")
[sub_resource type="Environment" id="Environment_5yot8"]
background_mode = 2
sky = SubResource("Sky_0wfyh")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_o5qli"]
albedo_color = Color(0.313808, 0.455394, 0.721014, 1)
[sub_resource type="BoxMesh" id="BoxMesh_oo1c2"]
material = SubResource("StandardMaterial3D_o5qli")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r886l"]
albedo_color = Color(0.999686, 0.38438, 0, 1)
[sub_resource type="PrismMesh" id="PrismMesh_nnl6p"]
material = SubResource("StandardMaterial3D_r886l")
size = Vector3(0.5, 0.5, 0.25)
[sub_resource type="TorusMesh" id="TorusMesh_llm6e"]
inner_radius = 0.75
outer_radius = 0.8
rings = 20
ring_segments = 6
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_jq1ic"]
emission_enabled = true
emission = Color(0, 1, 1, 1)
emission_energy_multiplier = 3.0
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_llm6e"]
height = 1.0
[sub_resource type="VoxelGeneratorFlat" id="VoxelGeneratorFlat_llm6e"]
channel = 0
[sub_resource type="VoxelMesherBlocky" id="VoxelMesherBlocky_ofs8c"]
library = ExtResource("1_r886l")
[node name="Robots" type="Node"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_5yot8")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.866024, -0.433016, 0.250001, 0, 0.499998, 0.866026, -0.500003, 0.749999, -0.43301, 0, 0, 0)
shadow_enabled = true
[node name="Robot" type="CharacterBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.5, 0.5)
script = ExtResource("1_nnl6p")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Robot"]
mesh = SubResource("BoxMesh_oo1c2")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Robot"]
transform = Transform3D(-1, 1.50996e-07, -6.60024e-15, 0, -4.37114e-08, -1, -1.50996e-07, -1, 4.37114e-08, 0, 0.50484, -0.3)
mesh = SubResource("PrismMesh_nnl6p")
[node name="indicator" type="Node3D" parent="Robot"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
visible = false
[node name="MeshInstance3D3" type="MeshInstance3D" parent="Robot/indicator"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
mesh = SubResource("TorusMesh_llm6e")
skeleton = NodePath("../..")
surface_material_override/0 = SubResource("StandardMaterial3D_jq1ic")
[node name="MeshInstance3D4" type="MeshInstance3D" parent="Robot/indicator"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.8, 0)
mesh = SubResource("TorusMesh_llm6e")
skeleton = NodePath("../..")
surface_material_override/0 = SubResource("StandardMaterial3D_jq1ic")
[node name="MeshInstance3D5" type="MeshInstance3D" parent="Robot/indicator"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0)
mesh = SubResource("TorusMesh_llm6e")
skeleton = NodePath("../..")
surface_material_override/0 = SubResource("StandardMaterial3D_jq1ic")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Robot"]
shape = SubResource("CapsuleShape3D_llm6e")
[node name="VoxelTerrain" type="VoxelTerrain" parent="."]
generator = SubResource("VoxelGeneratorFlat_llm6e")
mesher = SubResource("VoxelMesherBlocky_ofs8c")
bounds = AABB(-1040, -32, -1040, 2080, 96, 2080)
material_override = ExtResource("2_nnl6p")
[node name="TerrainEditor" parent="VoxelTerrain" instance=ExtResource("4_llm6e")]
[node name="ControllableCamera" parent="." instance=ExtResource("1_ecqtg")]
transform = Transform3D(0.97668, -0.143377, 0.159808, 0, 0.744336, 0.667805, -0.214699, -0.652232, 0.726979, 1.39679, 4.07542, 4.92893)
[connection signal="input_event" from="Robot" to="Robot" method="_on_input_event"]

56
nodes/robots/robot.gd Normal file
View File

@@ -0,0 +1,56 @@
extends CharacterBody3D
@onready var terrain := get_node("../VoxelTerrain") as VoxelTerrain
var selected := false
var path : Array[Vector3i]
func _on_input_event(camera: Node, event: InputEvent, event_position: Vector3, normal: Vector3, shape_idx: int) -> void:
if event is InputEventMouseButton and event.is_pressed():
var button_event = event as InputEventMouseButton
if button_event.button_index == MOUSE_BUTTON_LEFT:
$indicator.visible = true
selected = true
elif button_event.button_index == MOUSE_BUTTON_RIGHT:
$indicator.visible = false
selected = false
func _unhandled_input(event: InputEvent) -> void:
if selected:
if event is InputEventMouseButton and event.is_pressed():
var button_event = event as InputEventMouseButton
if button_event.button_index == MOUSE_BUTTON_LEFT:
move_to_mouse_click()
elif button_event.button_index == MOUSE_BUTTON_RIGHT:
pass
func move_to_mouse_click():
var mouse_pos_2d := get_viewport().get_mouse_position()
var current_camera := get_viewport().get_camera_3d()
var origin := current_camera.project_ray_origin(mouse_pos_2d)
var dir := current_camera.project_ray_normal(mouse_pos_2d)
var res := terrain.get_voxel_tool().raycast(origin, dir, 100)
var path_finder := VoxelAStarGrid3D.new()
path_finder.set_terrain(terrain)
path_finder.set_region(AABB(Vector3.ONE * -100, Vector3.ONE * 200))
path = path_finder.find_path(Vector3i(global_position), res.previous_position)
path.append(res.previous_position)
for step in path:
print(step)
func _process(delta: float) -> void:
if not path.is_empty():
var next_position := Vector3(path[0]) + Vector3.ONE * 0.5;
if path.size() == 1:
if next_position.distance_to(global_position) < 0.1:
rotation.x = 0
rotation.y = round(rotation.y/(PI/2))*PI/2
rotation.z = 0
print("arrived")
if next_position.distance_to(global_position) < 0.1:
global_position = next_position
path.remove_at(0)
else:
look_at(next_position)
velocity = (next_position - global_position).normalized() * 5
move_and_slide()

View File

@@ -0,0 +1 @@
uid://bnw0h8cuyf3g5

View File

@@ -1,6 +1,6 @@
[gd_resource type="VoxelBlockyLibrary" load_steps=4 format=3 uid="uid://bsue4rd3wdfsl"] [gd_resource type="VoxelBlockyLibrary" load_steps=4 format=3 uid="uid://bsue4rd3wdfsl"]
[ext_resource type="Material" uid="uid://de6s8en5fcyyw" path="res://scenes/word/BlockMaterial.tres" id="1_evy8o"] [ext_resource type="Material" uid="uid://de6s8en5fcyyw" path="res://nodes/word/BlockMaterial.tres" id="1_evy8o"]
[sub_resource type="VoxelBlockyModelEmpty" id="VoxelBlockyModelEmpty_o5qli"] [sub_resource type="VoxelBlockyModelEmpty" id="VoxelBlockyModelEmpty_o5qli"]

View File

@@ -1,6 +1,6 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://de6s8en5fcyyw"] [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://de6s8en5fcyyw"]
[ext_resource type="Texture2D" uid="uid://bcctuptks33yd" path="res://scenes/word/blocky_game_atlas.webp" id="1_nmlo6"] [ext_resource type="Texture2D" uid="uid://bcctuptks33yd" path="res://nodes/word/blocky_game_atlas.webp" id="1_nmlo6"]
[resource] [resource]
albedo_texture = ExtResource("1_nmlo6") albedo_texture = ExtResource("1_nmlo6")

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://bcctuptks33yd" uid="uid://bcctuptks33yd"
path.s3tc="res://.godot/imported/blocky_game_atlas.webp-6bd280431e13b10c6f5b7a80949a8f67.s3tc.ctex" path.s3tc="res://.godot/imported/blocky_game_atlas.webp-87ad14449ec94b96fe28d0038a51ce08.s3tc.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "imported_formats": ["s3tc_bptc"],
"vram_texture": true "vram_texture": true
@@ -11,8 +11,8 @@ metadata={
[deps] [deps]
source_file="res://scenes/word/blocky_game_atlas.webp" source_file="res://nodes/word/blocky_game_atlas.webp"
dest_files=["res://.godot/imported/blocky_game_atlas.webp-6bd280431e13b10c6f5b7a80949a8f67.s3tc.ctex"] dest_files=["res://.godot/imported/blocky_game_atlas.webp-87ad14449ec94b96fe28d0038a51ce08.s3tc.ctex"]
[params] [params]

View File

@@ -0,0 +1,32 @@
extends Node
@onready var voxelTool := (get_parent() as VoxelTerrain).get_voxel_tool()
var block_edit := false
func _unhandled_input(event):
if event is InputEventMouseButton and event.is_pressed():
if block_edit:
if event.button_index == MOUSE_BUTTON_LEFT:
perform_block_action(true)
elif event.button_index == MOUSE_BUTTON_RIGHT:
get_tree().create_timer(0.15).timeout.connect(
func():
if not Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
perform_block_action(false)
)
func perform_block_action(add_block:bool)->void:
var mouse_pos_2d := get_viewport().get_mouse_position()
var current_camera := get_viewport().get_camera_3d()
var origin := current_camera.project_ray_origin(mouse_pos_2d)
var dir := current_camera.project_ray_normal(mouse_pos_2d)
var res := voxelTool.raycast(origin, dir, 50)
if res != null:
if add_block:
voxelTool.set_voxel(res.previous_position, 1)
else:
voxelTool.set_voxel(res.position, 0)
func _on_button_toggled(toggled_on: bool) -> void:
block_edit = toggled_on

View File

@@ -0,0 +1 @@
uid://vnjdiql72brq

View File

@@ -0,0 +1,22 @@
[gd_scene load_steps=2 format=3 uid="uid://ddyulj4dsrkms"]
[ext_resource type="Script" uid="uid://vnjdiql72brq" path="res://nodes/word/terrain_editor.gd" id="1_6evft"]
[node name="TerrainEditor" type="Node"]
script = ExtResource("1_6evft")
[node name="Control" type="HBoxContainer" parent="."]
anchors_preset = 12
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 0
alignment = 1
[node name="Button" type="Button" parent="Control"]
layout_mode = 2
toggle_mode = true
text = "Block Edit"
[connection signal="toggled" from="Control/Button" to="." method="_on_button_toggled"]

View File

@@ -1,7 +1,9 @@
[gd_scene load_steps=9 format=3 uid="uid://bp6ewa3urgac8"] [gd_scene load_steps=11 format=3 uid="uid://bp6ewa3urgac8"]
[ext_resource type="VoxelBlockyLibrary" uid="uid://bsue4rd3wdfsl" path="res://scenes/word/BlockLibrary.tres" id="1_yf87h"] [ext_resource type="VoxelBlockyLibrary" uid="uid://bsue4rd3wdfsl" path="res://nodes/word/BlockLibrary.tres" id="1_yf87h"]
[ext_resource type="Material" uid="uid://de6s8en5fcyyw" path="res://scenes/word/BlockMaterial.tres" id="2_j4yt8"] [ext_resource type="Material" uid="uid://de6s8en5fcyyw" path="res://nodes/word/BlockMaterial.tres" id="2_j4yt8"]
[ext_resource type="PackedScene" uid="uid://cy0nvmw51bwof" path="res://nodes/camera/controllable_camera.tscn" id="3_tcius"]
[ext_resource type="PackedScene" uid="uid://ddyulj4dsrkms" path="res://nodes/word/terrain_editor.tscn" id="3_v3kfg"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_gadlc"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_gadlc"]
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
@@ -14,13 +16,13 @@ sky_material = SubResource("ProceduralSkyMaterial_gadlc")
background_mode = 2 background_mode = 2
sky = SubResource("Sky_t8uwy") sky = SubResource("Sky_t8uwy")
[sub_resource type="FastNoiseLite" id="FastNoiseLite_3juxb"] [sub_resource type="FastNoiseLite" id="FastNoiseLite_v3kfg"]
[sub_resource type="VoxelGeneratorNoise2D" id="VoxelGeneratorNoise2D_mko3u"] [sub_resource type="VoxelGeneratorNoise2D" id="VoxelGeneratorNoise2D_mko3u"]
channel = 0 channel = 0
height_start = 0.0 height_start = 0.0
height_range = 20.0 height_range = 20.0
noise = SubResource("FastNoiseLite_3juxb") noise = SubResource("FastNoiseLite_v3kfg")
[sub_resource type="VoxelMesherBlocky" id="VoxelMesherBlocky_3tbtj"] [sub_resource type="VoxelMesherBlocky" id="VoxelMesherBlocky_3tbtj"]
library = ExtResource("1_yf87h") library = ExtResource("1_yf87h")
@@ -34,14 +36,14 @@ environment = SubResource("Environment_5g68j")
transform = Transform3D(-0.866024, -0.433016, 0.250001, 0, 0.499998, 0.866026, -0.500003, 0.749999, -0.43301, 0, 0, 0) transform = Transform3D(-0.866024, -0.433016, 0.250001, 0, 0.499998, 0.866026, -0.500003, 0.749999, -0.43301, 0, 0, 0)
shadow_enabled = true shadow_enabled = true
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(-0.237189, -0.550881, 0.80017, 0, 0.823674, 0.567063, -0.971464, 0.134501, -0.195367, -10.8207, 13.7772, -16.0504)
[node name="VoxelViewer" type="VoxelViewer" parent="Camera3D"]
[node name="VoxelTerrain" type="VoxelTerrain" parent="."] [node name="VoxelTerrain" type="VoxelTerrain" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0)
generator = SubResource("VoxelGeneratorNoise2D_mko3u") generator = SubResource("VoxelGeneratorNoise2D_mko3u")
mesher = SubResource("VoxelMesherBlocky_3tbtj") mesher = SubResource("VoxelMesherBlocky_3tbtj")
bounds = AABB(-1040, -32, -1040, 2080, 96, 2080) bounds = AABB(-1040, -32, -1040, 2080, 96, 2080)
material_override = ExtResource("2_j4yt8") material_override = ExtResource("2_j4yt8")
[node name="TerrainEditor" parent="VoxelTerrain" instance=ExtResource("3_v3kfg")]
[node name="ControllableCamera" parent="." instance=ExtResource("3_tcius")]
transform = Transform3D(-0.61081, -0.620921, 0.491291, 0, 0.620492, 0.784213, -0.791777, 0.479005, -0.379003, 34.4662, 28.9798, -20.4)

View File

@@ -11,6 +11,24 @@ config_version=5
[application] [application]
config/name="Cobor" config/name="Cobor"
run/main_scene="uid://7q00x01xdsal" run/main_scene="uid://d0b7m4vykcfy2"
config/features=PackedStringArray("4.4") config/features=PackedStringArray("4.4")
config/icon="res://icon.svg" config/icon="res://icon.svg"
[input]
camera_control={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(127, 25),"global_position":Vector2(136, 73),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
left_click={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(229, 14),"global_position":Vector2(238, 62),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
right_click={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(61, 10),"global_position":Vector2(70, 58),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}

View File

@@ -1,55 +0,0 @@
[gd_scene load_steps=10 format=3 uid="uid://b84ihb5xw37pm"]
[ext_resource type="VoxelBlockyLibrary" uid="uid://bsue4rd3wdfsl" path="res://scenes/word/BlockLibrary.tres" id="1_r886l"]
[ext_resource type="Material" uid="uid://de6s8en5fcyyw" path="res://scenes/word/BlockMaterial.tres" id="2_nnl6p"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_e1sxe"]
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
[sub_resource type="Sky" id="Sky_0wfyh"]
sky_material = SubResource("ProceduralSkyMaterial_e1sxe")
[sub_resource type="Environment" id="Environment_5yot8"]
background_mode = 2
sky = SubResource("Sky_0wfyh")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_o5qli"]
albedo_color = Color(0.313808, 0.455394, 0.721014, 1)
[sub_resource type="BoxMesh" id="BoxMesh_oo1c2"]
material = SubResource("StandardMaterial3D_o5qli")
[sub_resource type="VoxelGeneratorFlat" id="VoxelGeneratorFlat_r886l"]
channel = 0
[sub_resource type="VoxelMesherBlocky" id="VoxelMesherBlocky_na0f1"]
library = ExtResource("1_r886l")
[node name="Robots" type="Node"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_5yot8")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.866024, -0.433016, 0.250001, 0, 0.499998, 0.866026, -0.500003, 0.749999, -0.43301, 0, 0, 0)
shadow_enabled = true
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(0.0323208, -0.600077, 0.799289, 0, 0.799707, 0.600391, -0.999478, -0.0194051, 0.0258472, 5.78515, 9.22018, 0.62065)
[node name="VoxelViewer" type="VoxelViewer" parent="Camera3D"]
[node name="Robot" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0)
[node name="MeshInstance3D" type="MeshInstance3D" parent="Robot"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
mesh = SubResource("BoxMesh_oo1c2")
[node name="VoxelTerrain" type="VoxelTerrain" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0)
generator = SubResource("VoxelGeneratorFlat_r886l")
mesher = SubResource("VoxelMesherBlocky_na0f1")
bounds = AABB(-1040, -32, -1040, 2080, 96, 2080)
material_override = ExtResource("2_nnl6p")