From f448ca4259d7f76fc58bc3b5c12ea8d04ab49a87 Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Sat, 11 Jan 2025 12:31:00 +0100 Subject: next commit --- player.gd | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 18 deletions(-) (limited to 'player.gd') diff --git a/player.gd b/player.gd index d010294..b45d0a0 100644 --- a/player.gd +++ b/player.gd @@ -1,14 +1,28 @@ +class_name Player extends CharacterBody3D -const SPEED = 20.0 -const JUMP_VELOCITY = 20.0 +var selection_block: MeshInstance3D +var selection_block_data: Block +var previous_looked_at_block_position: Vector3 = Vector3.ZERO + +const SPEED = 5.0#10.0#20.0 +const JUMP_VELOCITY = 5.0#10.0#20.0 var acc = 0 func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + + selection_block = MeshInstance3D.new() + selection_block.visible = false + selection_block.top_level = true + selection_block.rotation = Vector3.ZERO + selection_block.scale = Vector3(1.001, 1.001, 1.001) + add_child(selection_block) + selection_block_data = Block.new() + selection_block_data.type = Block.Type.SELECTION func _input(event: InputEvent) -> void: @@ -20,36 +34,71 @@ func _input(event: InputEvent) -> void: if event is InputEventMouseMotion: $CameraAnchor.rotate_y(deg_to_rad(clamp(-event.relative.x * 0.25, -45, 45))) $CameraAnchor.rotate_object_local(Vector3(1,0,0), deg_to_rad(-event.relative.y * 0.25)) + + if event.is_action_pressed("right_click"): + if selection_block.visible: + var point = selection_block.global_position + $CameraAnchor/Camera/RayCast3D.get_collision_normal() + (get_tree().current_scene as World).add_block(point, $CanvasLayer/MarginContainer.active_type) + + if event.is_action_pressed("left_click"): + if selection_block.visible: + var point = selection_block.global_position + var chunk_idx := Chunk.global_to_chunk(point) + if Chunk.chunk_exists(chunk_idx.x, chunk_idx.y, chunk_idx.z): + var chunk: Chunk = Chunk.chunks[chunk_idx.x][chunk_idx.y][chunk_idx.z] + var block_chunk_idx := Chunk.global_to_chunk_block(point) + chunk.remove_block(block_chunk_idx) func _process(delta: float) -> void: if $CameraAnchor/Camera/RayCast3D.is_colliding(): var collider = $CameraAnchor/Camera/RayCast3D.get_collider() - var point = $CameraAnchor/Camera/RayCast3D.get_collision_point() + if collider is not StaticBody3D: + return - var block_idx = floor(point / 2) - var block_chunk_idx = Vector3( - int(floor(point.x / 2)) % 16, - int(floor(point.y / 2)) % 16, - int(floor(point.z / 2)) % 16 + var p = $CameraAnchor/Camera/RayCast3D.get_collision_point() + var n = $CameraAnchor/Camera/RayCast3D.get_collision_normal() + #var point = $CameraAnchor/Camera/RayCast3D.get_collision_point() - Vector3(1, 1, 1) - $CameraAnchor/Camera/RayCast3D.get_collision_normal() + #point = $CameraAnchor/Camera/RayCast3D.get_collision_point() - Vector3(0.5, 0.5, 0.5) - $CameraAnchor/Camera/RayCast3D.get_collision_normal() + var point = $CameraAnchor/Camera/RayCast3D.get_collision_point() - ( + $CameraAnchor/Camera/RayCast3D.get_collision_normal() if $CameraAnchor/Camera/RayCast3D.get_collision_normal() > Vector3.ZERO else Vector3.ZERO ) - var chunk_idx = floor(point / (16*2)) + #point = $CameraAnchor/Camera/RayCast3D.get_collision_point().snapped(Vector3(0.5, 0.5, 0.5)) + + #var block_idx = floor(point)#floor(point / 2) + #var chunk_idx = floor(point / 16)#floor(point / (16*2)) + #var block_chunk_idx = Vector3( + #int(floor(point.x / 2)) % 16, + #int(floor(point.y / 2)) % 16, + #int(floor(point.z / 2)) % 16 + #) + #var block_chunk_idx = block_idx - 16 * chunk_idx + + var chunk_idx := Chunk.global_to_chunk(point) + var block_chunk_idx := Chunk.global_to_chunk_block(point) - acc += delta - if acc / 5 > 1.0: - acc = 0 - print(block_chunk_idx) - print(chunk_idx) - var chunk: Chunk = get_tree().current_scene.chunks[chunk_idx.x][chunk_idx.y][chunk_idx.z] + #acc += delta + #if acc / 5 > 1.0: + #acc = 0 + #print(block_chunk_idx) + #print(chunk_idx) + if Chunk.chunk_exists(chunk_idx.x, chunk_idx.y, chunk_idx.z): + var chunk: Chunk = Chunk.chunks[chunk_idx.x][chunk_idx.y][chunk_idx.z] var block: Block = chunk.blocks[block_chunk_idx.x][block_chunk_idx.y][block_chunk_idx.z] - print(point, "==", block.position) #?? - print(Block.Type.keys()[block.type]) + selection_block.visible = true + if previous_looked_at_block_position != block.position: + update_selection_block(block.position) + previous_looked_at_block_position = block.position + #print(point, "==", block.position) #?? + #print(Block.Type.keys()[block.type]) + else: + selection_block.visible = false func _physics_process(delta: float) -> void: # Add the gravity. if not is_on_floor(): - velocity += get_gravity() * delta + velocity += get_gravity() * delta * 1.5 # Handle jump. if Input.is_action_just_pressed("ui_accept") and is_on_floor(): @@ -72,3 +121,16 @@ func _physics_process(delta: float) -> void: velocity.z = move_toward(velocity.z, 0, SPEED) move_and_slide() + + +func update_selection_block(new_position: Vector3): + var material := preload("res://new_shader_material_selection.tres") + var st = SurfaceTool.new() + st.begin(Mesh.PRIMITIVE_TRIANGLES) + st.set_material(material) + + for face in Block.Face.values(): + selection_block_data.add_face(st, face) + + selection_block.global_position = new_position + selection_block.mesh = st.commit() -- cgit v1.2.3