starting to work on player movement
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 5 Apr 2022 20:41:59 +0000 (15:41 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 5 Apr 2022 20:41:59 +0000 (15:41 -0500)
run_tree/assets/shaders/basic.glsl
src/client/game.onyx
src/client/net.onyx
src/server/build.onyx
src/server/server.onyx
src/shared/packets.onyx

index e6522e5b3db98699b9fa220ba4d02be53876e9b6..5b537ebaa8d71d29129967c8c1dc1879b21795c7 100644 (file)
@@ -4,20 +4,17 @@ COMM vec4 v_col;
 
 #ifdef VERTEX_SHADER
 
-layout(location = 0) in vec2 a_pos;
+layout(location = 0) in vec3 a_pos;
 layout(location = 1) in vec4 a_col;
 
-layout(std140) uniform u_window_matrix_block {
-    mat4 u_view;
-};
-
 layout(std140) uniform u_world_matrix_block {
+    mat4 u_view;
     mat4 u_world;
     mat4 u_model;
 };
 
 void main() {
-    gl_Position = u_view * u_world * u_model * vec4(a_pos, 0, 1);
+    gl_Position = u_view * u_world * u_model * vec4(a_pos, 1);
     v_col = a_col;
 }
 
index e3236ec9ba88de1e142232c88f241fe8275efb02..c15be824e63f6955b523ef5d9a5f9a9cd7f86227 100644 (file)
@@ -17,6 +17,13 @@ player: Player;
 world: ^World;
 selected_block: Vector3i;
 
+Player_Vertex :: struct {
+    pos: Vector3;
+    col: Color;
+}
+player_mesh: ^Mesh(Player_Vertex);
+player_shader: Shader;
+
 Game_State :: struct {
     init :: game_init;
     update :: game_update;
@@ -25,8 +32,10 @@ Game_State :: struct {
 
 game_init :: (_: rawptr) {
     world_shader = shader_make("assets/shaders/world.glsl");
+    player_shader = shader_make("assets/shaders/basic.glsl");
 
     shader_link_world_matrix_block(world_shader);
+    shader_link_world_matrix_block(player_shader);
     shader_set_uniform(world_shader, #cstr "u_fog_start", 50.0f);
     shader_set_uniform(world_shader, #cstr "u_fog_range", 10.0f);
 
@@ -37,6 +46,29 @@ game_init :: (_: rawptr) {
     world = world_make();
     player = player_make();
     player.camera = ^camera;
+
+    player_mesh = mesh_make(Player_Vertex.[
+        .{ .{-1, -1, -1}, .{1, 0, 0, 1}, },
+        .{ .{ 1, -1, -1}, .{1, 0, 0, 1}, },
+        .{ .{ 1,  1, -1}, .{1, 0, 0, 1}, },
+        .{ .{-1, -1, -1}, .{1, 0, 0, 1}, },
+        .{ .{ 1,  1, -1}, .{1, 0, 0, 1}, },
+        .{ .{-1,  1, -1}, .{1, 0, 0, 1}, },
+
+        .{ .{-1, -1, -1}, .{1, 0, 0, 1}, },
+        .{ .{-1,  1, -1}, .{1, 0, 0, 1}, },
+        .{ .{-1,  1,  1}, .{1, 0, 0, 1}, },
+        .{ .{-1, -1, -1}, .{1, 0, 0, 1}, },
+        .{ .{-1,  1,  1}, .{1, 0, 0, 1}, },
+        .{ .{-1, -1,  1}, .{1, 0, 0, 1}, },
+
+        .{ .{-1, -1, -1}, .{1, 0, 0, 1}, },
+        .{ .{-1, -1,  1}, .{1, 0, 0, 1}, },
+        .{ .{ 1, -1,  1}, .{1, 0, 0, 1}, },
+        .{ .{-1, -1, -1}, .{1, 0, 0, 1}, },
+        .{ .{ 1, -1,  1}, .{1, 0, 0, 1}, },
+        .{ .{ 1, -1, -1}, .{1, 0, 0, 1}, },
+    ], .[]);
 }
 
 game_update :: (_: rawptr, dt: f32) {
@@ -60,6 +92,12 @@ game_update :: (_: rawptr, dt: f32) {
     world_move_center(world, player_chunk);
     world_update(world, dt);
 
+    send_movement_timeout -= dt;
+    if send_movement_timeout < 0 {
+        send_movement_timeout = 0.05f;
+        net_send_movement_update(player.body.pos, player.body.vel, .{1,0,0});
+    }
+
     if is_key_just_down(GLFW_KEY_F7) {
         debug_screen = !debug_screen;
     }
@@ -67,6 +105,11 @@ game_update :: (_: rawptr, dt: f32) {
     update_world_matrix();
 }
 
+#local {
+    send_movement_timeout := 0.0f;    
+}
+
+
 game_draw :: (_: rawptr) {
     draw_scene();
 
@@ -96,9 +139,15 @@ draw_scene :: () {
     shader_set_uniform(world_shader, #cstr "u_texture", 0);
     glEnable(GL_DEPTH_TEST);
     world_draw(world);
-    
+
     glLineWidth(2);
     chunk_highlight_block(~~selected_block.x, ~~selected_block.y, ~~selected_block.z);
+
+    shader_use(player_shader);
+    for^ other_players.entries {
+        update_model_matrix(it.value.position);
+        mesh_draw(player_mesh);
+    }
 }
 
 @Temporary
index 4040ff511a87070c1185fd3743839ed50c2c8b6f..13fafa0701ede854a9209d7f2dc44decc0b4862a 100644 (file)
@@ -41,6 +41,24 @@ net_handle_packet :: (packet_data: [] u8) {
             push_game_state(Game_State, null);
         }
 
+        case .Player_Joined {
+            joined_packet := cast(^packets.Player_Joined) packet;
+            if joined_packet.player_id == player_id do return;
+
+            buf: [1024] u8;
+            chat_messages << (
+                conv.format(buf, "{} joined the server!", str.{
+                    ~~ ^joined_packet.name_data,
+                    ~~ joined_packet.name_length
+                })
+                |> string.alloc_copy()
+            );
+
+            other_players[~~ joined_packet.player_id] = .{
+                .{0, 0, 0}, .{0, 0, 0}, .{0, 0, 0}
+            };
+        }
+
         case .Connection_Rejected {
             cr_packet := cast(^packets.Connection_Rejected) packet;
             printf("Connection refused: {}\n", cr_packet.reason);
@@ -56,6 +74,16 @@ net_handle_packet :: (packet_data: [] u8) {
                 ~~ chat_packet.message_length,
             });
         }
+
+        case .Player_Moved {
+            moved := cast(^packets.Player_Moved) packet;
+
+            other_players[~~ moved.player_id] = .{
+                position = moved.position,
+                velocity = moved.velocity,
+                facing   = moved.facing,
+            };
+        }
     }
 }
 
@@ -69,6 +97,7 @@ net_send_connect :: (name: str) {
     p := new(onet.Packet);
     p.flags |= .Reliable;
     p.data = .{ ~~msg, sizeof packets.Connect + name.count };
+    p.free_data = true;
     onet.peer_send(peer, 0, p);
 }
 
@@ -82,10 +111,35 @@ net_send_chat_message :: (message: str) {
     p := new(onet.Packet);
     p.flags |= .Reliable;
     p.data = .{ ~~msg, sizeof packets.Chat_Message + message.count };
+    p.free_data = true;
+    onet.peer_send(peer, 0, p);
+}
+
+net_send_movement_update :: (position: Vector3, velocity: Vector3, facing: Vector3) {
+    movement := new(packets.Player_Moved);
+    movement.type = .Player_Moved;
+    movement.player_id = player_id;
+    movement.position = position;
+    movement.velocity = velocity;
+    movement.facing = facing;
+
+    p := new(onet.Packet);
+    p.data = .{ ~~movement, sizeof typeof *movement };
+    p.free_data = true;
     onet.peer_send(peer, 0, p);
 }
 
 
+Remote_Player :: struct {
+    position: Vector3;
+    velocity: Vector3;
+    facing:   Vector3;
+}
+
+@TEMPORARY
+other_players: Map(u32, Remote_Player);
+
+
 #local {
     use package core
     onet    :: package onyx_net
index de3b1a29abf3c6c1a0d640ed43f543bb74d3b58d..ec6af84c02b7a1348eaf79afe4a5f5810d2f388a 100644 (file)
@@ -10,6 +10,7 @@ package runtime.vars
 #load "./../src/config"
 #load "server"
 
+#load "./../client/utils/vecmath"
 #load "./../shared/packets"
 
 #load "onyx-net/src/module"
index 7d429ce93c661b092796e77479c5a2fe051022ed..f6babd92adc677c8a522c0a296780cb5f860b5d6 100644 (file)
@@ -11,6 +11,10 @@ Player_Data :: struct {
     id: u16;
     name: str;
     peer: ^onet.Peer;
+
+    position: Vector3 = .{0,0,0};
+    velocity: Vector3 = .{0,0,0};
+    facing:   Vector3 = .{0,0,0};
 }
 
 max_connected_players := 8;
@@ -44,6 +48,20 @@ handle_packet :: (peer: ^onet.Peer, packet_data: [] u8) {
                 respond_with_error(.Server_Full);
             }
 
+
+            // Send a verify connect packet
+            {
+                msg := new(packets.Verify_Connect);
+                msg.type = .Verify_Connect;
+                msg.player_id = ~~next_player_id;
+
+                p := new(onet.Packet);
+                p.flags |= .Reliable;
+                p.data = any_to_buffer(msg);
+                p.free_data = true;
+                onet.peer_send(peer, 0, p);
+            }
+
             name := str.{
                 ~~ ^connect_packet.name_data,
                 ~~connect_packet.name_length
@@ -56,23 +74,11 @@ handle_packet :: (peer: ^onet.Peer, packet_data: [] u8) {
                 peer = peer,
             };
 
-            {
-                msg_buffer: [128] u8;
-                msg := conv.format(msg_buffer, "{} joined the server.\n", connected_players[next_player_id].name);
-                print(msg);
-                send_chat_message(0, msg);
-            }
-
-            // Send a verify connect packet
-            msg := new(packets.Verify_Connect);
-            msg.type = .Verify_Connect;
-            msg.player_id = ~~next_player_id;
+            send_player_joined(~~next_player_id, connected_players[next_player_id].name, null);
 
-            p := new(onet.Packet);
-            p.flags |= .Reliable;
-            p.data = any_to_buffer(msg);
-            p.free_data = true;
-            onet.peer_send(peer, 0, p);
+            for^ connected_players.entries {
+                send_player_joined(it.value.id, it.value.name, peer);
+            }
 
             respond_with_error :: macro (reason: packets.Connection_Rejected.Reason) {
                 msg := new(packets.Connection_Rejected);
@@ -95,6 +101,40 @@ handle_packet :: (peer: ^onet.Peer, packet_data: [] u8) {
             packet.free_data = true;
             onet.host_broadcast(host, 0, packet);
         }
+
+        case .Player_Moved {
+            moved := cast(^packets.Player_Moved) packet;
+            player := ^connected_players[~~ moved.player_id];
+            if player == null do return;
+
+            player.position = moved.position;
+            player.velocity = moved.velocity;
+            player.facing = moved.facing;
+
+            packet := new(onet.Packet);
+            packet.data = memory.copy_slice(packet_data);
+            packet.free_data = true;
+            onet.host_broadcast(host, 0, packet);
+        }
+    }
+}
+
+send_player_joined :: (player_id: u16, player_name: str, dest: ^onet.Peer) {
+    joined, packet_size := new_with_extra(packets.Player_Joined, player_name.count);
+    joined.type = .Player_Joined;
+    joined.player_id = player_id;
+    joined.name_length = ~~ player_name.count;
+    memory.copy(~~ ^joined.name_data, player_name.data, player_name.count);
+
+    packet := new(onet.Packet);
+    packet.flags |= .Reliable;
+    packet.data = .{ ~~joined, packet_size };
+    packet.free_data = true;
+
+    if dest == null {
+        onet.host_broadcast(host, 0, packet);
+    } else {
+        onet.peer_send(dest, 0, packet);
     }
 }
 
index 4421cc2a22ecccb0a50e00a895b9c6599c96c192..a75e64c1b4096be958b8e2d6af5917ff7982e8bf 100644 (file)
@@ -1,5 +1,6 @@
 
 package packets
+use package main { Vector3 }
 
 Type :: enum (u8) {
     Connect;
@@ -40,7 +41,25 @@ Connection_Rejected :: struct #pack {
     reason: Reason;
 }
 
+Player_Joined :: struct #pack {
+    use base: Packet_Base;
+    player_id: u16;
+    name_length: u16;
+    name_data: void;
+}
+
+Player_Left :: struct #pack {
+    use base: Packet_Base;
+    player_id: u16;
+}
 
+Player_Moved :: struct #pack {
+    use base: Packet_Base;
+    player_id: u16;
+    position: Vector3; 
+    velocity: Vector3;
+    facing:   Vector3;
+}
 
 Chat_Message :: struct #pack {
     use base: Packet_Base;