From 8e7f73d172d55dbdef11d737885b4667efe42d09 Mon Sep 17 00:00:00 2001 From: Guillaume Vern Date: Wed, 26 Nov 2025 19:07:10 +0100 Subject: [PATCH] idk what's in there good luck future me --- NoclipCamera.gd | 6 +- activation.gd | 27 +++++++ activation.gd.uid | 1 + chunk.gd | 2 +- csgtest.tscn | 3 + cube.mtl | 12 ++++ cube.obj | 40 +++++++++++ cube.obj.import | 25 +++++++ cubic_world.tscn | 14 ++++ player.tscn | 24 +++++++ sample_point.gd | 15 ++++ sample_point.gd.uid | 1 + sample_point.tscn | 6 ++ smooth_world.gd | 163 +++++++++++++++++++++++++++++++++++++++++++ smooth_world.gd.uid | 1 + smooth_world.tscn | 9 +++ surface_point.gd | 8 +++ surface_point.gd.uid | 1 + surface_point.tscn | 6 ++ world.gd | 2 +- world.tscn | 44 +++--------- 21 files changed, 369 insertions(+), 41 deletions(-) create mode 100644 activation.gd create mode 100644 activation.gd.uid create mode 100644 csgtest.tscn create mode 100644 cube.mtl create mode 100644 cube.obj create mode 100644 cube.obj.import create mode 100644 cubic_world.tscn create mode 100644 player.tscn create mode 100644 sample_point.gd create mode 100644 sample_point.gd.uid create mode 100644 sample_point.tscn create mode 100644 smooth_world.gd create mode 100644 smooth_world.gd.uid create mode 100644 smooth_world.tscn create mode 100644 surface_point.gd create mode 100644 surface_point.gd.uid create mode 100644 surface_point.tscn diff --git a/NoclipCamera.gd b/NoclipCamera.gd index 2950e3d..4589971 100644 --- a/NoclipCamera.gd +++ b/NoclipCamera.gd @@ -4,7 +4,7 @@ var rot_y = 0 @onready var world = $"../World/" -@export var PLAYER_SPEED = 20 +@export var PLAYER_SPEED = 1 @export var PLAYER_REACH = 1000 @export_range(0.00001, 0.01) var LOOK_SENSITIVITY = 0.002 var move_x = 0 @@ -48,8 +48,8 @@ func _input(event): camera.rotate_object_local(Vector3(-1, 0, 0), rot_y) # then rotate in X # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): - #process_noclip() - process_physics_movements() + process_noclip() + #process_physics_movements() #for hit_pos in ray_hit_positions: #DebugDraw3D.draw_sphere(hit_pos) diff --git a/activation.gd b/activation.gd new file mode 100644 index 0000000..67f0466 --- /dev/null +++ b/activation.gd @@ -0,0 +1,27 @@ +@tool +extends Node3D + +enum EnumWorld {CUBIC_WORLD, SMOOTH_WORLD} + +@export var wanted_world: EnumWorld + +var enabled_world: EnumWorld = EnumWorld.CUBIC_WORLD + +signal change_world + +func _process(_delta: float) -> void: + if enabled_world != wanted_world: + print("changing world") + emit_signal("change_world") + +func _on_change_world(): + match wanted_world: + EnumWorld.CUBIC_WORLD: + if $SmoothWorld: + $SmoothWorld.queue_free() + add_child(load("res://cubic_world.tscn").instantiate()) + EnumWorld.SMOOTH_WORLD: + if $CubicWorld: + $CubicWorld.queue_free() + add_child(load("res://smooth_world.tscn").instantiate()) + enabled_world = wanted_world diff --git a/activation.gd.uid b/activation.gd.uid new file mode 100644 index 0000000..a0e3e39 --- /dev/null +++ b/activation.gd.uid @@ -0,0 +1 @@ +uid://caefudn8tgqpr diff --git a/chunk.gd b/chunk.gd index 8e36e4f..3ac7b80 100644 --- a/chunk.gd +++ b/chunk.gd @@ -25,7 +25,7 @@ const AXIS := [ func _ready() -> void: pass -func _process(delta: float) -> void: +func _process(_delta: float) -> void: pass func init_blocks(_chunk_size: int, pos: Vector3i): diff --git a/csgtest.tscn b/csgtest.tscn new file mode 100644 index 0000000..b414d93 --- /dev/null +++ b/csgtest.tscn @@ -0,0 +1,3 @@ +[gd_scene format=3 uid="uid://cjkb2c3lhmdpr"] + +[node name="Csgtest" type="Node3D"] diff --git a/cube.mtl b/cube.mtl new file mode 100644 index 0000000..7b986ef --- /dev/null +++ b/cube.mtl @@ -0,0 +1,12 @@ +# Blender 4.3.2 MTL File: 'None' +# www.blender.org + +newmtl Material +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 diff --git a/cube.obj b/cube.obj new file mode 100644 index 0000000..c2da4cd --- /dev/null +++ b/cube.obj @@ -0,0 +1,40 @@ +# Blender 4.3.2 +# www.blender.org +mtllib cube.mtl +o Cube +v 1.238424 1.000000 -1.000000 +v 1.238424 -1.000000 -1.000000 +v 1.238424 1.000000 1.000000 +v 1.238424 -1.000000 1.000000 +v -1.238424 1.000000 -1.000000 +v -1.238424 -1.000000 -1.000000 +v -1.238424 1.000000 1.000000 +v -1.238424 -1.000000 1.000000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.125000 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.750000 +s 0 +usemtl Material +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/4/2 7/6/2 8/7/2 +f 8/8/3 7/9/3 5/10/3 6/11/3 +f 6/12/4 2/13/4 4/5/4 8/14/4 +f 2/13/5 1/1/5 3/4/5 4/5/5 +f 6/11/6 5/10/6 1/1/6 2/13/6 diff --git a/cube.obj.import b/cube.obj.import new file mode 100644 index 0000000..8573248 --- /dev/null +++ b/cube.obj.import @@ -0,0 +1,25 @@ +[remap] + +importer="wavefront_obj" +importer_version=1 +type="Mesh" +uid="uid://di45vy8c1e72o" +path="res://.godot/imported/cube.obj-ecd20c75680354919967c1f74dc43511.mesh" + +[deps] + +files=["res://.godot/imported/cube.obj-ecd20c75680354919967c1f74dc43511.mesh"] + +source_file="res://cube.obj" +dest_files=["res://.godot/imported/cube.obj-ecd20c75680354919967c1f74dc43511.mesh", "res://.godot/imported/cube.obj-ecd20c75680354919967c1f74dc43511.mesh"] + +[params] + +generate_tangents=true +generate_lods=true +generate_shadow_mesh=true +generate_lightmap_uv2=false +generate_lightmap_uv2_texel_size=0.2 +scale_mesh=Vector3(1, 1, 1) +offset_mesh=Vector3(0, 0, 0) +force_disable_mesh_compression=false diff --git a/cubic_world.tscn b/cubic_world.tscn new file mode 100644 index 0000000..5e850aa --- /dev/null +++ b/cubic_world.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=3 uid="uid://cpxo1on53gjyw"] + +[ext_resource type="Script" uid="uid://l6xn27nsln1m" path="res://world.gd" id="1_n1x6j"] + +[node name="CubicWorld" type="Node3D"] +transform = Transform3D(1, 1.49012e-08, -7.45058e-09, 0, 1, 0, -7.45058e-09, 0, 1, 0, 0, 0) +script = ExtResource("1_n1x6j") +chunk_size = 8 +world_size = Vector3i(8, 16, 8) +world_seed = 1 +noise_frequency = 0.011 +noise_threshold = -4.111 +cave_noise_frequency = 0.01 +cave_noise_threshold = -0.283 diff --git a/player.tscn b/player.tscn new file mode 100644 index 0000000..8f8bbbd --- /dev/null +++ b/player.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=5 format=3 uid="uid://chbs3naovk63w"] + +[ext_resource type="Script" uid="uid://c1jlypyykqvfl" path="res://NoclipCamera.gd" id="1_4flbx"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_fj7yv"] + +[sub_resource type="SphereMesh" id="SphereMesh_fj7yv"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_tlwt5"] + +[node name="Player" type="RigidBody3D"] +physics_material_override = SubResource("PhysicsMaterial_fj7yv") +gravity_scale = 0.0 +lock_rotation = true +linear_damp = 1.0 +script = ExtResource("1_4flbx") + +[node name="PlayerCamera" type="Camera3D" parent="."] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("SphereMesh_fj7yv") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_tlwt5") diff --git a/sample_point.gd b/sample_point.gd new file mode 100644 index 0000000..1e63add --- /dev/null +++ b/sample_point.gd @@ -0,0 +1,15 @@ +@tool +extends Node3D + +@export var distance = 0 + +var color = Color.SKY_BLUE + + +func _process(_delta: float) -> void: + if distance > 0: + color = Color.MEDIUM_PURPLE + else: + color = Color.SKY_BLUE + DebugDraw3D.draw_square(position, 0.2, color) + diff --git a/sample_point.gd.uid b/sample_point.gd.uid new file mode 100644 index 0000000..67ed99e --- /dev/null +++ b/sample_point.gd.uid @@ -0,0 +1 @@ +uid://likm24qx18tm diff --git a/sample_point.tscn b/sample_point.tscn new file mode 100644 index 0000000..e9c1ac1 --- /dev/null +++ b/sample_point.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://bm0qtcmn8rna5"] + +[ext_resource type="Script" uid="uid://likm24qx18tm" path="res://sample_point.gd" id="1_x8428"] + +[node name="SamplePoint" type="Node3D"] +script = ExtResource("1_x8428") diff --git a/smooth_world.gd b/smooth_world.gd new file mode 100644 index 0000000..e525637 --- /dev/null +++ b/smooth_world.gd @@ -0,0 +1,163 @@ +@tool +extends Node3D + +const CENTER := Vector3.ZERO +@export var RADIUS: float = 5.0 + +var sample_points = {} +var surface_points = {} + +@export var world_size = 16 + +@export var do_the_thing: bool = false +@export var clear_the_thing: bool = false + +var mesh +var surface_tool: SurfaceTool = SurfaceTool.new() +var SAMPLE_POINT = preload("res://sample_point.tscn") +var SURFACE_POINT = preload("res://surface_point.tscn") + +func _ready() -> void: + initialize_sample_points() + create_surface_points() + create_surface_mesh(world_size) + +func _process(_delta: float) -> void: + clear() + create_surface_points() + create_surface_mesh(world_size) + +func clear(): + sample_points = {} + for child in get_children(): + remove_child(child) + child.queue_free() + +func get_sample_value(index: Vector3i) -> float: + return CENTER.distance_to(index) - RADIUS + +func initialize_sample_points(): + for x in range(-world_size + 1, world_size): + for y in range(-world_size + 1, world_size): + for z in range(-world_size + 1, world_size): + var sample_point = SAMPLE_POINT.instantiate() + sample_point.distance = get_sample_value(Vector3i(x, y, z)) + sample_point.position = Vector3(float(x), float(y), float(z)) + sample_points[Vector3i(x, y, z)] = sample_point + #add_child(sample_point) + +func create_surface_points(): + for x in range(-world_size + 1, world_size): + for y in range(-world_size + 1, world_size): + for z in range(-world_size + 1, world_size): + create_surface_point(Vector3i(x, y, z)) + +func create_surface_point(voxel: Vector3i): + var average_distance_from_sample = 0 + for sample_point_to_check_index in range(SURFACE_AXIS.size()): + var sample_point_to_check = SURFACE_AXIS[sample_point_to_check_index] + average_distance_from_sample += get_sample_value(voxel + sample_point_to_check) + average_distance_from_sample /= 8 + if average_distance_from_sample <= 0: + var surface_point = SURFACE_POINT.instantiate() + surface_point.position = Vector3(voxel) + surface_points[voxel] = surface_point + add_child(surface_point) + +func create_surface_mesh(size: int = 6): + surface_tool = SurfaceTool.new() + surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES) + for x in range(-size, size): + for y in range(-size, size): + for z in range(-size, size): + create_surface_mesh_quad(Vector3i(x,y,z)); + mesh = surface_tool.commit() + var meshinstance = MeshInstance3D.new() + meshinstance.mesh = mesh + add_child(meshinstance) + +func create_surface_mesh_quad(index: Vector3i): + for axis_index in range(AXIS.size()): + var axis = AXIS[axis_index] + var sample_value1 = get_sample_value(index) + var sample_value2 = get_sample_value(index + axis) + + if sample_value1 < 0 and sample_value2 >= 0: + add_quad(index, axis_index) + elif sample_value1 >= 0 and sample_value2 < 0: + add_reversed_quad(index, axis_index) + +const AXIS := [ + Vector3i(1,0,0), + Vector3i(0,1,0), + Vector3i(0,0,1), +] + +const SURFACE_AXIS := [ + Vector3i(1,0,0), + Vector3i(0,1,0), + Vector3i(0,0,1), + Vector3i(1,0,1), + Vector3i(0,1,1), + Vector3i(1,1,0), + Vector3i(1,1,1), + Vector3i(0,0,0), +] + +func add_quad(index: Vector3i, axis_index: int): + var points = get_quad_points(index, axis_index) + + surface_tool.set_normal(AXIS[axis_index]) + + surface_tool.add_vertex(points[0]) + surface_tool.add_vertex(points[1]) + surface_tool.add_vertex(points[2]) + + surface_tool.add_vertex(points[0]) + surface_tool.add_vertex(points[2]) + surface_tool.add_vertex(points[3]) + +func add_reversed_quad(index: Vector3i, axis_index: int): + var points = get_quad_points(index, axis_index) + + surface_tool.set_normal(-AXIS[axis_index]) + + surface_tool.add_vertex(points[0]) + surface_tool.add_vertex(points[2]) + surface_tool.add_vertex(points[1]) + + surface_tool.add_vertex(points[0]) + surface_tool.add_vertex(points[3]) + surface_tool.add_vertex(points[2]) + +func get_quad_points(index: Vector3i, axis_index: int): + return [ + index + QUAD_POINTS[axis_index][0], + index + QUAD_POINTS[axis_index][1], + index + QUAD_POINTS[axis_index][2], + index + QUAD_POINTS[axis_index][3], + ] + +const QUAD_POINTS := [ + # x axis + [ + Vector3i(0,0,-1), + Vector3i(0,-1,-1), + Vector3i(0,-1,0), + Vector3i(0,0,0) + ], + # y axis + [ + Vector3i(0,0,-1), + Vector3i(0,0,0), + Vector3i(-1,0,0), + Vector3i(-1,0,-1) + ], + # z axis + [ + Vector3i(0,0,0), + Vector3i(0,-1,0), + Vector3i(-1,-1,0), + Vector3i(-1,0,0) + ], +] diff --git a/smooth_world.gd.uid b/smooth_world.gd.uid new file mode 100644 index 0000000..e7ad24c --- /dev/null +++ b/smooth_world.gd.uid @@ -0,0 +1 @@ +uid://bdfq22we54eul diff --git a/smooth_world.tscn b/smooth_world.tscn new file mode 100644 index 0000000..e5ebfbe --- /dev/null +++ b/smooth_world.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://llggsd0qmn4p"] + +[ext_resource type="Script" uid="uid://bdfq22we54eul" path="res://smooth_world.gd" id="1_4h467"] + +[node name="SmoothWorld" type="Node3D"] +script = ExtResource("1_4h467") +RADIUS = 4.182 +world_size = 8 +do_the_thing = true diff --git a/surface_point.gd b/surface_point.gd new file mode 100644 index 0000000..28499a5 --- /dev/null +++ b/surface_point.gd @@ -0,0 +1,8 @@ +@tool +extends Node3D + +var color = Color.DARK_GOLDENROD + + +func _process(_delta: float) -> void: + DebugDraw3D.draw_square(position, 0.2, color) diff --git a/surface_point.gd.uid b/surface_point.gd.uid new file mode 100644 index 0000000..762a6e4 --- /dev/null +++ b/surface_point.gd.uid @@ -0,0 +1 @@ +uid://dvsdeymqk67yh diff --git a/surface_point.tscn b/surface_point.tscn new file mode 100644 index 0000000..bb75d09 --- /dev/null +++ b/surface_point.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://ddm3uvrdtj725"] + +[ext_resource type="Script" uid="uid://dvsdeymqk67yh" path="res://surface_point.gd" id="1_8mvgj"] + +[node name="SurfacePoint" type="Node3D"] +script = ExtResource("1_8mvgj") diff --git a/world.gd b/world.gd index 7797d55..33a5fe7 100644 --- a/world.gd +++ b/world.gd @@ -24,7 +24,7 @@ var chunk_prototype = preload("res://chunk.tscn") func _ready() -> void: generate_chunks = true -func _process(delta: float) -> void: +func _process(_delta: float) -> void: if clear_chunks: clear_chunks = false clearChunks() diff --git a/world.tscn b/world.tscn index 2364869..d7414b3 100644 --- a/world.tscn +++ b/world.tscn @@ -1,7 +1,7 @@ -[gd_scene load_steps=9 format=3 uid="uid://dls7ggmf46ia0"] +[gd_scene load_steps=6 format=3 uid="uid://dls7ggmf46ia0"] -[ext_resource type="Script" uid="uid://l6xn27nsln1m" path="res://world.gd" id="1_tlwt5"] -[ext_resource type="Script" uid="uid://c1jlypyykqvfl" path="res://NoclipCamera.gd" id="3_036b0"] +[ext_resource type="Script" uid="uid://caefudn8tgqpr" path="res://activation.gd" id="1_tlwt5"] +[ext_resource type="PackedScene" uid="uid://chbs3naovk63w" path="res://player.tscn" id="3_036b0"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_fj7yv"] sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) @@ -16,13 +16,9 @@ sky = SubResource("Sky_tlwt5") tonemap_mode = 2 glow_enabled = true -[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_fj7yv"] - -[sub_resource type="SphereMesh" id="SphereMesh_fj7yv"] - -[sub_resource type="SphereShape3D" id="SphereShape3D_tlwt5"] - [node name="Root" type="Node3D"] +script = ExtResource("1_tlwt5") +wanted_world = 1 [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_aqk2v") @@ -31,31 +27,7 @@ environment = SubResource("Environment_aqk2v") transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0) shadow_enabled = true -[node name="World" type="Node3D" parent="."] -transform = Transform3D(1, 1.49012e-08, -7.45058e-09, 0, 1, 0, -7.45058e-09, 0, 1, 0, 0, 0) -script = ExtResource("1_tlwt5") -chunk_size = 8 -world_size = Vector3i(8, 16, 8) -world_seed = 1 -noise_frequency = 0.011 -noise_threshold = -4.111 -cave_noise_frequency = 0.01 -cave_noise_threshold = -0.283 +[node name="Player" parent="." instance=ExtResource("3_036b0")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.182447, 0.6673207, 0.0726881) -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -visible = false - -[node name="Player" type="RigidBody3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 50, 20) -physics_material_override = SubResource("PhysicsMaterial_fj7yv") -lock_rotation = true -linear_damp = 1.0 -script = ExtResource("3_036b0") - -[node name="PlayerCamera" type="Camera3D" parent="Player"] - -[node name="MeshInstance3D" type="MeshInstance3D" parent="Player"] -mesh = SubResource("SphereMesh_fj7yv") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="Player"] -shape = SubResource("SphereShape3D_tlwt5") +[connection signal="change_world" from="." to="." method="_on_change_world"]