diff --git a/extensions/cobor_vm_extension/.sconsign.dblite b/extensions/cobor_vm_extension/.sconsign.dblite index 59c1f60..396af05 100644 Binary files a/extensions/cobor_vm_extension/.sconsign.dblite and b/extensions/cobor_vm_extension/.sconsign.dblite differ diff --git a/extensions/cobor_vm_extension/__pycache__/methods.cpython-312.pyc b/extensions/cobor_vm_extension/__pycache__/methods.cpython-312.pyc index 339bf08..5101272 100644 Binary files a/extensions/cobor_vm_extension/__pycache__/methods.cpython-312.pyc and b/extensions/cobor_vm_extension/__pycache__/methods.cpython-312.pyc differ diff --git a/extensions/cobor_vm_extension/bin/linux/libcobor_vm_extension.linux.template_debug.x86_64.so b/extensions/cobor_vm_extension/bin/linux/libcobor_vm_extension.linux.template_debug.x86_64.so index 7762e13..e83df4a 100755 Binary files a/extensions/cobor_vm_extension/bin/linux/libcobor_vm_extension.linux.template_debug.x86_64.so and b/extensions/cobor_vm_extension/bin/linux/libcobor_vm_extension.linux.template_debug.x86_64.so differ diff --git a/extensions/cobor_vm_extension/cobor_vm/include/cobor_virtual_machine.hpp b/extensions/cobor_vm_extension/cobor_vm/include/cobor_virtual_machine.hpp index fa2caef..87b3a17 100644 --- a/extensions/cobor_vm_extension/cobor_vm/include/cobor_virtual_machine.hpp +++ b/extensions/cobor_vm_extension/cobor_vm/include/cobor_virtual_machine.hpp @@ -1,7 +1,7 @@ #pragma once +#include #include "constants.hpp" -#include "godot_cpp/classes/ref_counted.hpp" namespace CoborVM { diff --git a/extensions/cobor_vm_extension/cobor_vm/include/constants.hpp b/extensions/cobor_vm_extension/cobor_vm/include/constants.hpp index 8f1ecf5..a90b19f 100644 --- a/extensions/cobor_vm_extension/cobor_vm/include/constants.hpp +++ b/extensions/cobor_vm_extension/cobor_vm/include/constants.hpp @@ -10,7 +10,7 @@ namespace CoborVM SET, CLR, - CPY, + MOV, SWP, ADD, @@ -42,7 +42,7 @@ namespace CoborVM const std::unordered_map stringToInstructionMap = { {"SET", SET}, {"CLR", CLR}, - {"CPY", CPY}, + {"MOV", MOV}, {"SWP", SWP}, {"ADD", ADD}, {"SUB", SUB}, @@ -60,7 +60,7 @@ namespace CoborVM const std::unordered_map InstructionToStringMap = { {SET, "SET"}, {CLR, "CLR"}, - {CPY, "CPY"}, + {MOV, "MOV"}, {SWP, "SWP"}, {ADD, "ADD"}, {SUB, "SUB"}, @@ -83,7 +83,7 @@ namespace CoborVM {Instruction::CLR, {true}}, // One pointer argument {Instruction::ZERO, {true}}, {Instruction::SET, {false, true}}, // One literal and one pointer argument - {Instruction::CPY, {true, true}}, // Two pointer arguments + {Instruction::MOV, {true, true}}, // Two pointer arguments {Instruction::SWP, {true, true}}, {Instruction::EQL, {true, true}}, {Instruction::BIGR, {true, true}}, diff --git a/extensions/cobor_vm_extension/cobor_vm/src/cobor_virtual_machine.cpp b/extensions/cobor_vm_extension/cobor_vm/src/cobor_virtual_machine.cpp index a8fa59c..fb85a24 100644 --- a/extensions/cobor_vm_extension/cobor_vm/src/cobor_virtual_machine.cpp +++ b/extensions/cobor_vm_extension/cobor_vm/src/cobor_virtual_machine.cpp @@ -1,3 +1,5 @@ +// #include + #include "cobor_virtual_machine.hpp" using namespace CoborVM; @@ -61,9 +63,11 @@ godot::String CoborVM::CoborVirtualMachine::set_registers(int size, godot::Packe return godot::String("Size must be one or higher"); register_memory = std::vector(size); preloaded_values.resize(size); + int i = 0; for (int value : preloaded_values) { register_memory[i] = value; + i++; } return godot::String(); } @@ -163,7 +167,7 @@ godot::String CoborVM::CoborVirtualMachine::run_executable_step(ExecutableStep s break; } - case CPY: + case MOV: { if (!check_register(step.arg1) || !check_register(step.arg2)) return error_message; diff --git a/extensions/cobor_vm_extension/cobor_vm/src/cobor_virtual_machine.os b/extensions/cobor_vm_extension/cobor_vm/src/cobor_virtual_machine.os new file mode 100644 index 0000000..d58f038 Binary files /dev/null and b/extensions/cobor_vm_extension/cobor_vm/src/cobor_virtual_machine.os differ diff --git a/extensions/cobor_vm_extension/cobor_vm/src/register_types.os b/extensions/cobor_vm_extension/cobor_vm/src/register_types.os index 279beaf..1789fb2 100644 Binary files a/extensions/cobor_vm_extension/cobor_vm/src/register_types.os and b/extensions/cobor_vm_extension/cobor_vm/src/register_types.os differ diff --git a/nodes/robots/coding/cpu.gd b/nodes/robots/coding/cpu.gd index b24c131..4f32be7 100644 --- a/nodes/robots/coding/cpu.gd +++ b/nodes/robots/coding/cpu.gd @@ -5,17 +5,25 @@ signal cpu_tick var cobor_vm := CoborVirtualMachine.new() var running := false -var register_size := 8 +var register_size := 16 var modules : Array[Module] -func _ready() -> void: +func _init() -> void: cobor_vm.set_registers(register_size,[]) + +func _ready() -> void: var register_index := 1 for child in get_children(): if child is Module: var module := child as Module modules.push_back(module) - register_size += module.set_registers(register_index) + module.set_reserved_registers(register_index) + register_index += module.get_register_reservation_size() + if $ProgrammingUI != null: + $ProgrammingUI.memory_setup() + +func show_ui(show:bool)->void: + $ProgrammingUI.visible = show func run_step() -> void: if not running: diff --git a/nodes/robots/coding/cpu.tscn b/nodes/robots/coding/cpu.tscn index 6d7dfd4..a95c121 100644 --- a/nodes/robots/coding/cpu.tscn +++ b/nodes/robots/coding/cpu.tscn @@ -1,10 +1,13 @@ -[gd_scene load_steps=2 format=3 uid="uid://crtis0eyywl61"] +[gd_scene load_steps=3 format=3 uid="uid://crtis0eyywl61"] [ext_resource type="Script" uid="uid://b87ksbp5mjn2a" path="res://nodes/robots/coding/cpu.gd" id="1_mh3k1"] +[ext_resource type="PackedScene" uid="uid://c2es6v8lb8tug" path="res://nodes/robots/coding/programming_ui.tscn" id="2_pm1m8"] [node name="CPU" type="Node"] script = ExtResource("1_mh3k1") [node name="CPUClock" type="Timer" parent="."] +[node name="ProgrammingUI" parent="." instance=ExtResource("2_pm1m8")] + [connection signal="timeout" from="CPUClock" to="." method="_tick"] diff --git a/nodes/robots/coding/memory_entry.tscn b/nodes/robots/coding/memory_entry.tscn index 08cd6c3..f69780e 100644 --- a/nodes/robots/coding/memory_entry.tscn +++ b/nodes/robots/coding/memory_entry.tscn @@ -15,6 +15,6 @@ allow_lesser = true alignment = 1 editable = false -[node name="name" type="Label" parent="."] +[node name="type" type="Label" parent="."] layout_mode = 2 text = "[X] Click" diff --git a/nodes/robots/coding/programming_ui.gd b/nodes/robots/coding/programming_ui.gd index 73429db..2ee3ced 100644 --- a/nodes/robots/coding/programming_ui.gd +++ b/nodes/robots/coding/programming_ui.gd @@ -4,20 +4,26 @@ extends PanelContainer @onready var memory := $%Memory as VBoxContainer @onready var memory_entry := load("uid://dqwi5rekytyds") as PackedScene -@export var cpu : CPU +@onready var cpu := get_parent() as CPU -func _ready() -> void: +func memory_setup() -> void: + var register_types : Dictionary[int, String] + for module in cpu.modules: + register_types.assign(module.get_register_types()) + for i in range(cpu.register_size): var entry := memory_entry.instantiate() as Control - (entry.get_node("address") as Label).text = "[/" + str(i) + "]" + (entry.get_node("address") as Label).text = "[ /" + str(i).pad_zeros(2) + " ]" (entry.get_node("value") as SpinBox).value = 0 + (entry.get_node("type") as Label).text = register_types[i] if register_types.has(i) else "Free" memory.add_child(entry) func _process(_delta: float) -> void: # Set execution indicator for line in code_editor.get_executing_lines(): code_editor.set_line_as_executing(line, false) - code_editor.set_line_as_executing(cpu.cobor_vm.get_program_counter(), true) + if cpu.cobor_vm.get_program_size() < cpu.cobor_vm.get_program_counter(): + code_editor.set_line_as_executing(cpu.cobor_vm.get_program_counter(), true) # Show register values var registers := cpu.cobor_vm.get_registers() for i in range(registers.size()): diff --git a/nodes/robots/coding/programming_ui.tscn b/nodes/robots/coding/programming_ui.tscn index 8c4ff4c..4a72b55 100644 --- a/nodes/robots/coding/programming_ui.tscn +++ b/nodes/robots/coding/programming_ui.tscn @@ -41,7 +41,12 @@ gutters_draw_line_numbers = true gutters_zero_pad_line_numbers = true indent_automatic = true -[node name="Memory" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +horizontal_scroll_mode = 0 + +[node name="Memory" type="VBoxContainer" parent="VBoxContainer/HBoxContainer/ScrollContainer"] unique_name_in_owner = true layout_mode = 2 diff --git a/nodes/robots/modules/module.gd b/nodes/robots/modules/module.gd index 28f3503..d08c1e1 100644 --- a/nodes/robots/modules/module.gd +++ b/nodes/robots/modules/module.gd @@ -2,11 +2,14 @@ class_name Module extends Node @onready var cpu := get_parent() as CPU -func set_registers(index:int)->int: +func get_register_reservation_size()->int: return 0 -func early_tick()->void: +func set_reserved_registers(index:int)->void: pass +func get_register_types()->Dictionary[int, String]: + return {} + func late_tick()->void: pass diff --git a/nodes/robots/modules/path_finder_module.gd b/nodes/robots/modules/path_finder_module.gd new file mode 100644 index 0000000..ee37ef8 --- /dev/null +++ b/nodes/robots/modules/path_finder_module.gd @@ -0,0 +1,75 @@ +extends Module + +var enabled := true + +var pos_x_register_index:int +var pos_y_register_index:int +var pos_z_register_index:int +var index_register_index:int + +var prev_index := 0 +var target := Vector3i.ZERO +var path : Array[Vector3i] + +func _ready() -> void: + if Terrain.instance == null: + print("No terrain to plan path on") + if cpu.get_parent() is not Robot: + print("Module not part of Robot") + +func get_register_reservation_size()->int: + return 4 + +func set_reserved_registers(index:int)->void: + pos_x_register_index = index + pos_y_register_index = index+1 + pos_z_register_index = index+2 + index_register_index = index+3 + +func get_register_types()->Dictionary[int, String]: + return { + pos_x_register_index: "[X] Path", + pos_y_register_index: "[Y] Path", + pos_z_register_index: "[Z] Path", + index_register_index: "Idx Path" + } + +func early_tick()->void: + var registers := cpu.cobor_vm.get_registers() + prev_index = registers[index_register_index] + +func late_tick()->void: + var registers := cpu.cobor_vm.get_registers() + var index := registers[index_register_index] + if index < 0: + target = Vector3i( + registers[pos_x_register_index], + registers[pos_y_register_index], + registers[pos_z_register_index] + ) + print("Target set: ", target) + else: + if index == prev_index: + print("index stays same") + return + if prev_index < 0: + var path_finder := VoxelAStarGrid3D.new() + path_finder.set_terrain(Terrain.instance) + path_finder.set_region(AABB(cpu.get_parent().global_position + Vector3.ONE * -100, Vector3.ONE * 200)) + path = path_finder.find_path(cpu.get_parent().global_position, target) + if not path.is_empty(): + path.append(target) + print("Recalculating path of size:", path.size(), " towards: ", target) + if index >= path.size(): + index = path.size()-1 + var step:Vector3i + if path.size() == 0: + step = Vector3i.ZERO + else: + step = path[index] + print("next step: ", step) + registers[pos_x_register_index] = step.x + registers[pos_y_register_index] = step.y + registers[pos_z_register_index] = step.z + registers[index_register_index] = index + cpu.cobor_vm.set_registers(cpu.register_size, registers) diff --git a/nodes/robots/modules/path_finder_module.gd.uid b/nodes/robots/modules/path_finder_module.gd.uid new file mode 100644 index 0000000..da9ae20 --- /dev/null +++ b/nodes/robots/modules/path_finder_module.gd.uid @@ -0,0 +1 @@ +uid://wsrudejqfo5e diff --git a/nodes/robots/modules/player_click_module.gd b/nodes/robots/modules/player_click_module.gd index e59696f..b0e0996 100644 --- a/nodes/robots/modules/player_click_module.gd +++ b/nodes/robots/modules/player_click_module.gd @@ -1,21 +1,31 @@ extends Module - var enabled := true var pos_x_register_index:int var pos_y_register_index:int var pos_z_register_index:int +var pos := Vector3i.ZERO + func _ready() -> void: if Terrain.instance == null: print("No terrain to get clicks from") -func set_registers(index:int)->int: +func get_register_reservation_size()->int: + return 3 + +func set_reserved_registers(index:int)->void: pos_x_register_index = index pos_y_register_index = index+1 pos_z_register_index = index+2 - return 3 + +func get_register_types()->Dictionary[int, String]: + return { + pos_x_register_index: "[X] Click", + pos_y_register_index: "[Y] Click", + pos_z_register_index: "[Z] Click" + } func _unhandled_input(event: InputEvent) -> void: if not enabled: return @@ -32,8 +42,11 @@ func set_click_registers()->void: var origin := current_camera.project_ray_origin(mouse_pos_2d) var dir := current_camera.project_ray_normal(mouse_pos_2d) var res := Terrain.instance.get_voxel_tool().raycast(origin, dir, 100) + pos = res.previous_position + +func early_tick()->void: var registers := cpu.cobor_vm.get_registers() - registers[pos_x_register_index] = res.previous_position.x - registers[pos_y_register_index] = res.previous_position.y - registers[pos_z_register_index] = res.previous_position.z + registers[pos_x_register_index] = pos.x + registers[pos_y_register_index] = pos.y + registers[pos_z_register_index] = pos.z cpu.cobor_vm.set_registers(cpu.register_size, registers) diff --git a/nodes/robots/modules/player_click_module.tscn b/nodes/robots/modules/player_click_module.tscn deleted file mode 100644 index 878bfa6..0000000 --- a/nodes/robots/modules/player_click_module.tscn +++ /dev/null @@ -1,6 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://d22umiybuk0xf"] - -[ext_resource type="Script" uid="uid://dii2n2xcatyuh" path="res://nodes/robots/modules/player_click_module.gd" id="1_few5k"] - -[node name="PlayerClickModule" type="Node"] -script = ExtResource("1_few5k") diff --git a/nodes/robots/robot.gd b/nodes/robots/robot.gd index 8466ef7..e6cb2dd 100644 --- a/nodes/robots/robot.gd +++ b/nodes/robots/robot.gd @@ -1,4 +1,4 @@ -extends CharacterBody3D +class_name Robot extends CharacterBody3D @onready var terrain := get_node("../VoxelTerrain") as VoxelTerrain @@ -9,20 +9,20 @@ func _on_input_event(camera: Node, event: InputEvent, event_position: Vector3, n if event is InputEventMouseButton and event.is_pressed(): var button_event = event as InputEventMouseButton if button_event.button_index == MOUSE_BUTTON_LEFT: - $ProgrammingUI.visible = true + $CPU.show_ui(true) selected = true elif button_event.button_index == MOUSE_BUTTON_RIGHT: - $ProgrammingUI.visible = false + $CPU.show_ui(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 _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() diff --git a/nodes/robots/robot.tscn b/nodes/robots/robot.tscn index b3e9b5c..dfb954d 100644 --- a/nodes/robots/robot.tscn +++ b/nodes/robots/robot.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=10 format=3 uid="uid://chem70rrdwjpg"] [ext_resource type="Script" uid="uid://bnw0h8cuyf3g5" path="res://nodes/robots/robot.gd" id="1_suikl"] -[ext_resource type="PackedScene" uid="uid://c2es6v8lb8tug" path="res://nodes/robots/coding/programming_ui.tscn" id="3_tmdoi"] -[ext_resource type="PackedScene" uid="uid://d22umiybuk0xf" path="res://nodes/robots/modules/player_click_module.tscn" id="4_hm8dm"] +[ext_resource type="Script" uid="uid://dii2n2xcatyuh" path="res://nodes/robots/modules/player_click_module.gd" id="3_tmdoi"] +[ext_resource type="Script" uid="uid://wsrudejqfo5e" path="res://nodes/robots/modules/path_finder_module.gd" id="4_hm8dm"] [ext_resource type="PackedScene" uid="uid://crtis0eyywl61" path="res://nodes/robots/coding/cpu.tscn" id="5_r4wpy"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hm8dm"] @@ -26,23 +26,23 @@ height = 0.8 [node name="Robot" type="CharacterBody3D"] script = ExtResource("1_suikl") +[node name="CPU" parent="." instance=ExtResource("5_r4wpy")] + +[node name="PlayerClickModule" type="Node" parent="CPU"] +script = ExtResource("3_tmdoi") + +[node name="PathFinderModule" type="Node" parent="CPU"] +script = ExtResource("4_hm8dm") + [node name="MeshInstance3D" type="MeshInstance3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.1, 0) mesh = SubResource("BoxMesh_hm8dm") [node name="MeshInstance3D2" type="MeshInstance3D" parent="MeshInstance3D"] -transform = Transform3D(1.91069e-15, -1, -4.37114e-08, -4.37114e-08, -4.37114e-08, 1, -1, 0, -4.37114e-08, 0, 0.5, 0) +transform = Transform3D(1, -1.31134e-07, 4.37114e-08, -4.37114e-08, -4.37114e-08, 1, -1.31134e-07, -1, -4.37114e-08, 0, 0.5, 0) mesh = SubResource("PrismMesh_hm8dm") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] shape = SubResource("CapsuleShape3D_llm6e") -[node name="ProgrammingUI" parent="." node_paths=PackedStringArray("cpu") instance=ExtResource("3_tmdoi")] -cpu = NodePath("../CPU") - -[node name="CPU" parent="." instance=ExtResource("5_r4wpy")] - -[node name="PlayerClickModule" parent="CPU" instance=ExtResource("4_hm8dm")] - [connection signal="input_event" from="." to="." method="_on_input_event"] -[connection signal="cpu_tick" from="CPU" to="ProgrammingUI" method="_on_cpu_tick"] diff --git a/nodes/world/terrain_editor.tscn b/nodes/world/terrain_editor.tscn index 791bf34..5d896f7 100644 --- a/nodes/world/terrain_editor.tscn +++ b/nodes/world/terrain_editor.tscn @@ -5,18 +5,14 @@ [node name="TerrainEditor" type="Node"] script = ExtResource("1_6evft") -[node name="Control" type="HBoxContainer" parent="."] -anchors_preset = 12 -anchor_top = 1.0 +[node name="Button" type="Button" parent="."] +anchors_preset = 1 +anchor_left = 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 +offset_left = -84.0 +offset_bottom = 31.0 +grow_horizontal = 0 toggle_mode = true text = "Block Edit" -[connection signal="toggled" from="Control/Button" to="." method="_on_button_toggled"] +[connection signal="toggled" from="Button" to="." method="_on_button_toggled"] diff --git a/project.godot b/project.godot index cc12efe..c9924bb 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="uid://d0b7m4vykcfy2" config/features=PackedStringArray("4.4") config/icon="res://icon.svg" +[filesystem] + +import/blender/enabled=false + [importer_defaults] scene={ diff --git a/resources/cobor_script/prog1.txt b/resources/cobor_script/prog1.txt new file mode 100644 index 0000000..9d88d73 --- /dev/null +++ b/resources/cobor_script/prog1.txt @@ -0,0 +1,8 @@ +set -1 /7 +mov /1 /4 +mov /2 /5 +mov /3 /6 +set 0 /7 +set 1 /7 +set 2 /7 +set 3 /7