more "permanent" player placeholder
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 6 Apr 2022 01:52:03 +0000 (20:52 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 6 Apr 2022 01:52:03 +0000 (20:52 -0500)
run_tree/assets/shaders/basic.glsl
src/client/game.onyx
src/client/gfx/mesh.onyx
src/client/gfx/shader.onyx
src/client/net.onyx
src/server/server.onyx
src/shared/packets.onyx

index 5b537ebaa8d71d29129967c8c1dc1879b21795c7..1cbb7556eec529bc736cef0243e27319c72ad3cb 100644 (file)
@@ -22,10 +22,11 @@ void main() {
 
 #ifdef FRAGMENT_SHADER
 
+uniform vec4 color;
 out vec4 fragColor;
 
 void main() {
-    fragColor = vec4(v_col.xyz, 1);
+    fragColor = vec4(v_col.xyz, 1) * color;
 }
 
 #endif
index c15be824e63f6955b523ef5d9a5f9a9cd7f86227..1907f92c6572b3cf473e61c080b1af01f418b3e9 100644 (file)
@@ -17,11 +17,6 @@ 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 {
@@ -47,28 +42,7 @@ game_init :: (_: rawptr) {
     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}, },
-    ], .[]);
+    Meshes.init();
 }
 
 game_update :: (_: rawptr, dt: f32) {
@@ -144,9 +118,10 @@ draw_scene :: () {
     chunk_highlight_block(~~selected_block.x, ~~selected_block.y, ~~selected_block.z);
 
     shader_use(player_shader);
+    shader_set_uniform(player_shader, #cstr "color", Color.{1,0,0});
     for^ other_players.entries {
-        update_model_matrix(it.value.position);
-        mesh_draw(player_mesh);
+        update_model_matrix(it.value.position - .{0,0.8,0}, .{0.5, 1, 0.5});
+        mesh_draw(Meshes.white_box);
     }
 }
 
index db769a997cf1b8341f389872f2d84b61129ae5da..f97f32ea00475974b4c482e89173e8066e6946a2 100644 (file)
@@ -84,4 +84,34 @@ mesh_free :: (mesh: ^Mesh) {
 }
 
 
+//
+// Common meshes
+//
+Basic_Vertex :: struct {
+    position: Vector3;
+    color: Color;
+}
 
+Meshes :: struct {
+    #persist white_box: ^Mesh(Basic_Vertex);
+
+    init :: () {
+        white_box = mesh_make(Basic_Vertex.[
+            .{ .{-1, -1, -1}, .{1, 1, 1, 1}, },
+            .{ .{-1,  1, -1}, .{1, 1, 1, 1}, },
+            .{ .{ 1,  1, -1}, .{1, 1, 1, 1}, },
+            .{ .{ 1, -1, -1}, .{1, 1, 1, 1}, },
+            .{ .{-1, -1,  1}, .{1, 1, 1, 1}, },
+            .{ .{-1,  1,  1}, .{1, 1, 1, 1}, },
+            .{ .{ 1,  1,  1}, .{1, 1, 1, 1}, },
+            .{ .{ 1, -1,  1}, .{1, 1, 1, 1}, },
+        ], .[
+            0, 2, 1, 0, 3, 2,
+            3, 6, 2, 3, 7, 6,
+            5, 0, 1, 5, 4, 0,
+            4, 5, 6, 4, 6, 7,
+            5, 1, 2, 5, 2, 6,
+            0, 4, 7, 0, 7, 3,
+        ]);
+    }
+}
index 2ba5f767640632876015a4755f189ae1cd6304e8..cdc2615e68623e8290bf44cff9c14f80a6ca27a5 100644 (file)
@@ -101,11 +101,11 @@ update_window_matrix :: () {
     glBindBuffer(GL_UNIFORM_BUFFER, -1);
 }
 
-update_model_matrix :: (v: Vector3) {
+update_model_matrix :: (v: Vector3, scale := Vector3.{1,1,1}) {
     model_mat: [16] f32;
-    model_mat[0]  = 1;
-    model_mat[5]  = 1;
-    model_mat[10] = 1;
+    model_mat[0]  = scale.x;
+    model_mat[5]  = scale.y;
+    model_mat[10] = scale.z;
     model_mat[12] = v.x;
     model_mat[13] = v.y;
     model_mat[14] = v.z;
index 13fafa0701ede854a9209d7f2dc44decc0b4862a..1afa509f10e72e956c5bb26645fb72dab1db1413 100644 (file)
@@ -43,20 +43,21 @@ net_handle_packet :: (packet_data: [] u8) {
 
         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()
-            );
+            name := string.alloc_copy(.{
+                ~~ ^joined_packet.name_data,
+                ~~ joined_packet.name_length
+            });
 
             other_players[~~ joined_packet.player_id] = .{
+                name,
                 .{0, 0, 0}, .{0, 0, 0}, .{0, 0, 0}
             };
+
+            if joined_packet.player_id != player_id {
+                buf: [1024] u8;
+                chat_messages << (conv.format(buf, "{} joined the server!", name) |> string.alloc_copy());
+            }
         }
 
         case .Connection_Rejected {
@@ -69,20 +70,34 @@ net_handle_packet :: (packet_data: [] u8) {
 
         case .Chat_Message {
             chat_packet := cast(^packets.Chat_Message) packet;
-            chat_messages << string.alloc_copy(.{
-                ~~ ^chat_packet.message_data,
-                ~~ chat_packet.message_length,
-            });
+
+            buf: [1024] u8;
+            msg: str;
+
+            sender := ^other_players[~~ chat_packet.sender_id];
+            if sender != null {
+                msg = conv.format(buf, "[{}] {}\n", sender.name, str.{
+                    ~~ ^chat_packet.message_data,
+                    ~~ chat_packet.message_length,
+                });
+            } else {
+                msg = .{
+                    ~~ ^chat_packet.message_data,
+                    ~~ chat_packet.message_length,
+                };
+            }
+
+            chat_messages << string.alloc_copy(msg);
         }
 
         case .Player_Moved {
             moved := cast(^packets.Player_Moved) packet;
+            if moved.player_id == player_id do return;
 
-            other_players[~~ moved.player_id] = .{
-                position = moved.position,
-                velocity = moved.velocity,
-                facing   = moved.facing,
-            };
+            player := ^other_players[~~ moved.player_id];
+            player.position = moved.position;
+            player.velocity = moved.velocity;
+            player.facing   = moved.facing;
         }
     }
 }
@@ -101,6 +116,11 @@ net_send_connect :: (name: str) {
     onet.peer_send(peer, 0, p);
 }
 
+net_send_disconnect :: () {
+    disconnect := new(packets.Disconnect);
+    disconnect.player_id = player_id;
+}
+
 net_send_chat_message :: (message: str) {
     msg := cast(^packets.Chat_Message) calloc(sizeof packets.Chat_Message + message.count);
     msg.type = .Chat_Message;
@@ -117,7 +137,6 @@ net_send_chat_message :: (message: str) {
 
 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;
@@ -131,6 +150,8 @@ net_send_movement_update :: (position: Vector3, velocity: Vector3, facing: Vecto
 
 
 Remote_Player :: struct {
+    name: str;
+
     position: Vector3;
     velocity: Vector3;
     facing:   Vector3;
@@ -139,7 +160,6 @@ Remote_Player :: struct {
 @TEMPORARY
 other_players: Map(u32, Remote_Player);
 
-
 #local {
     use package core
     onet    :: package onyx_net
index f6babd92adc677c8a522c0a296780cb5f860b5d6..fcbccc24e4593742d88e15d464ae23825c0b7ae3 100644 (file)
@@ -52,7 +52,6 @@ handle_packet :: (peer: ^onet.Peer, packet_data: [] u8) {
             // Send a verify connect packet
             {
                 msg := new(packets.Verify_Connect);
-                msg.type = .Verify_Connect;
                 msg.player_id = ~~next_player_id;
 
                 p := new(onet.Packet);
@@ -82,7 +81,6 @@ handle_packet :: (peer: ^onet.Peer, packet_data: [] u8) {
 
             respond_with_error :: macro (reason: packets.Connection_Rejected.Reason) {
                 msg := new(packets.Connection_Rejected);
-                msg.type = .Connection_Rejected;
                 msg.reason = reason;
 
                 p := new(onet.Packet);
@@ -121,7 +119,6 @@ handle_packet :: (peer: ^onet.Peer, packet_data: [] u8) {
 
 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);
@@ -140,7 +137,6 @@ send_player_joined :: (player_id: u16, player_name: str, dest: ^onet.Peer) {
 
 send_chat_message :: (from: u16, msg: [] u8) {
     chat_packet, packet_size := new_with_extra(packets.Chat_Message, msg.count);
-    chat_packet.type = .Chat_Message;
     chat_packet.sender_id = from;
     chat_packet.message_length = ~~ msg.count;
     memory.copy(~~ ^chat_packet.message_data, msg.data, msg.count);
@@ -163,7 +159,7 @@ new_with_extra :: macro ($T: type_expr, extra: u32) -> (^T, u32) {
 
 loop :: () {
     while true {
-        for host->get_events(timeout=1000) {
+        for host->get_events(timeout=4000) {
             if it.type == .Connection {
                 printf("Connection from {}:{}\n", net.ipv4_to_str(it.peer.addr.addr), it.peer.addr.port);
             }
index a75e64c1b4096be958b8e2d6af5917ff7982e8bf..569b16cec5a84206d62911fef2dfb415b0d857da 100644 (file)
@@ -20,19 +20,19 @@ Packet_Base :: struct #pack {
 }
 
 Connect :: struct #pack {
-    use base: Packet_Base;
+    use base := Packet_Base.{ .Connect };
     client_version: u32;
     name_length: u16;
     name_data: void;
 }
 
 Verify_Connect :: struct #pack {
-    use base: Packet_Base;
+    use base := Packet_Base.{ .Verify_Connect };
     player_id: u16;
 }
 
 Connection_Rejected :: struct #pack {
-    use base: Packet_Base;
+    use base := Packet_Base.{ .Connection_Rejected };
 
     Reason :: enum {
         Server_Full          :: 1;
@@ -41,20 +41,25 @@ Connection_Rejected :: struct #pack {
     reason: Reason;
 }
 
+Disconnect :: struct #pack {
+    use base := Packet_Base.{ .Disconnect };
+    player_id: u16;
+}
+
 Player_Joined :: struct #pack {
-    use base: Packet_Base;
+    use base := Packet_Base.{ .Player_Joined };
     player_id: u16;
     name_length: u16;
     name_data: void;
 }
 
 Player_Left :: struct #pack {
-    use base: Packet_Base;
+    use base := Packet_Base.{ .Player_Left };
     player_id: u16;
 }
 
 Player_Moved :: struct #pack {
-    use base: Packet_Base;
+    use base := Packet_Base.{ .Player_Moved };
     player_id: u16;
     position: Vector3; 
     velocity: Vector3;
@@ -62,7 +67,7 @@ Player_Moved :: struct #pack {
 }
 
 Chat_Message :: struct #pack {
-    use base: Packet_Base;
+    use base := Packet_Base.{ .Chat_Message };
     sender_id: u16; // Should this be a Player ID?
     message_length: u16;
     message_data:   void;