entity manager updates
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 25 Jan 2022 14:35:12 +0000 (08:35 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 25 Jan 2022 14:35:12 +0000 (08:35 -0600)
.vscode/tasks.json
docs/engine.md [new file with mode: 0644]
run_tree/run.sh [new file with mode: 0755]
src/entity/manager.onyx
src/entity/player.onyx
src/gfx/font.onyx
src/main.onyx

index 2242be8ae32cef52316902ab4160d2378ec3130d..29e03a42d219e301b174385e30269a7abb58e7e4 100644 (file)
@@ -10,7 +10,7 @@
                 "cwd": "${workspaceFolder}/run_tree"
             },
             "problemMatcher": "$onyx",
-            "command": "onyx run -V -I ../src build",
+            "command": "./run.sh",
             "group": {
                 "kind": "build",
                 "isDefault": true
diff --git a/docs/engine.md b/docs/engine.md
new file mode 100644 (file)
index 0000000..3c90892
--- /dev/null
@@ -0,0 +1,35 @@
+Relevant game-engine functionality
+----------------------------------
+
+## Immediate Mode Rendering
+Render simple shapes and images using the following functions.
+
+### Drawing
+- immediate_flush()
+    All draw operations are batched together.
+    Call this to flush the batch and render everything.
+    This should be called at least once per frame, in practice much more often.
+
+- immediate_clear(color: Color)
+    Clears the screen with `color`
+
+- immediate_rectangle(x, y, w, h: f32)
+    Render a rectangle at `(x, y)` with size `w` by `h`.
+    `(x, y)` is the top-left of the rectangle.
+
+- immediate_image(image: ^Texture, x, y, w, h: f32)
+    Render the `image` at `(x, y)` with size `w` by `h`.
+    `w` and `h` are given in destination pixels, not a scale factor of the image size.
+    Use image.width, image.height to get the size of the image.
+
+- immediate_triangle(x1, x2, x3: Vector2)
+    Render a triangle with verticies `x1`, `x2`, `x3`.
+
+### Stateful operations
+- immediate_set_color(color: Color)
+    Set the color to be used by other drawing primitivies.
+
+### Structures
+- Color :: struct { r, g, b, a: f32; }
+
+
diff --git a/run_tree/run.sh b/run_tree/run.sh
new file mode 100755 (executable)
index 0000000..19d377a
--- /dev/null
@@ -0,0 +1 @@
+onyx run -V -I ../src build
index 454dc55e83cf5a2be8a37dced09bd2f71f22b64a..1de9e4c8ccf781ffd25044fab01d5ca645714886 100644 (file)
@@ -3,13 +3,21 @@ use package core
 use package glfw3
 
 Entity_Vtable :: struct {
-    draw   : (entity: ^Entity) -> void;
-    update : (entity: ^Entity, dt: f32) -> void;
+    update : (entity: ^Entity, dt: f32) -> void = null_proc;
+    draw   : (entity: ^Entity) -> void          = null_proc;
 }
 
 Entity :: struct {
     use vtable: ^Entity_Vtable;
+
     id: u32;
+    type: type_expr;
+
+    pos: Vector2;
+}
+
+IsEntity :: interface (e: $E) {
+    { e } -> ^Entity;
 }
 
 Entity_Manager :: struct {
@@ -35,13 +43,13 @@ entity_manager_make :: () -> Entity_Manager {
     return em;
 }
 
-entity_manager_register :: (use this: ^Entity_Manager, entity: ^Entity) -> u32 {
-    id := next_entity_id;
+entity_manager_register :: (use this: ^Entity_Manager, entity: ^$T) -> u32 where IsEntity(^T) {
+    entity.type = T;
+    entity.id = next_entity_id;
     next_entity_id += 1;
 
-    entity.id = id;
     entities << entity;
-    return id;
+    return entity.id;
 }
 
 entity_manager_update :: (use this: ^Entity_Manager, dt: f32) {
index bb77b0cc79f1a452ac665c222e0f69688f96186b..8135d8d14d3e3081286a03a7f9369915d8f574bc 100644 (file)
@@ -4,8 +4,6 @@ use package glfw3
 
 Player :: struct {
     use entity: Entity;
-
-    pos: Vector2;
 }
 
 player_make :: () -> ^Player {
@@ -17,15 +15,17 @@ player_make :: () -> ^Player {
 }
 
 player_update :: (use this: ^Player, dt: f32) {
-    if is_key_down(GLFW_KEY_W) do pos.y -= 100 * dt; 
-    if is_key_down(GLFW_KEY_S) do pos.y += 100 * dt; 
-    if is_key_down(GLFW_KEY_A) do pos.x -= 100 * dt; 
-    if is_key_down(GLFW_KEY_D) do pos.x += 100 * dt; 
+    if is_key_down(GLFW_KEY_W) do pos.y -= 200 * dt; 
+    if is_key_down(GLFW_KEY_S) do pos.y += 200 * dt; 
+    if is_key_down(GLFW_KEY_A) do pos.x -= 200 * dt; 
+    if is_key_down(GLFW_KEY_D) do pos.x += 200 * dt; 
 }
 
 player_draw :: (use this: ^Player) {
-    immediate_set_color(.{0.4,0.4,1});
-    immediate_rectangle(pos.x, pos.y, 50, 50);
+    immediate_set_color(.{1,1,1});
+    immediate_image(^player_texture, pos.x, pos.y, 64, 64);
 }
 
 #local player_vtable := Entity_Vtable.{ update=player_update, draw=player_draw };
+
+player_texture: Texture;
index 4d82fc345d288a86d3815349f40a5cc93ba2fe18..cb5d30753dedc5644ae354846299fb5ebc6d9d7d 100644 (file)
@@ -105,6 +105,8 @@ font_make :: (fd: FontDescriptor) -> Font {
         chars = char_data
     };
 
+    font_registry[fd] = font;
+
     return font;
 }
 
index 00c2b6fdc5c679e0cfc73c2fa6a6c89bcbb91e49..f82f9cf10a9bb12b692e71798a26835cfbe84448 100644 (file)
@@ -11,7 +11,6 @@ window: GLFWwindow_p
 window_width: u32
 window_height: u32
 
-player_texture: Texture;
 main_font: Font;
 
 entity_manager: Entity_Manager;
@@ -36,7 +35,7 @@ init :: () {
     update_view_matrix();
 
     player_texture = texture_make(#cstr "./assets/images/player.png");
-    main_font = font_make(.{"./assets/fonts/calibri.ttf", 32});
+    main_font = font_lookup(.{"./assets/fonts/calibri.ttf", 32});
 
     entity_manager = entity_manager_make();
     player := player_make();
@@ -59,11 +58,6 @@ draw :: () {
     immediate_set_color(.{0,0,1});
     immediate_rectangle(0, 0, 100, 100);
 
-    immediate_set_color(.{1,0,0});
-    for i: 100 {
-        immediate_image(^player_texture, ~~(100 + 64 * i), 50, 64, 64);
-    }
-
     entity_manager->draw();
 
     mx, my := mouse_get_position();