From 7c6e5ca6c956dfb3dfeffd16df31fdfb0e8ef5ab Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 25 Jan 2022 08:35:12 -0600 Subject: [PATCH] entity manager updates --- .vscode/tasks.json | 2 +- docs/engine.md | 35 +++++++++++++++++++++++++++++++++++ run_tree/run.sh | 1 + src/entity/manager.onyx | 20 ++++++++++++++------ src/entity/player.onyx | 16 ++++++++-------- src/gfx/font.onyx | 2 ++ src/main.onyx | 8 +------- 7 files changed, 62 insertions(+), 22 deletions(-) create mode 100644 docs/engine.md create mode 100755 run_tree/run.sh diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 2242be8..29e03a4 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -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 index 0000000..3c90892 --- /dev/null +++ b/docs/engine.md @@ -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 index 0000000..19d377a --- /dev/null +++ b/run_tree/run.sh @@ -0,0 +1 @@ +onyx run -V -I ../src build diff --git a/src/entity/manager.onyx b/src/entity/manager.onyx index 454dc55..1de9e4c 100644 --- a/src/entity/manager.onyx +++ b/src/entity/manager.onyx @@ -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) { diff --git a/src/entity/player.onyx b/src/entity/player.onyx index bb77b0c..8135d8d 100644 --- a/src/entity/player.onyx +++ b/src/entity/player.onyx @@ -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; diff --git a/src/gfx/font.onyx b/src/gfx/font.onyx index 4d82fc3..cb5d307 100644 --- a/src/gfx/font.onyx +++ b/src/gfx/font.onyx @@ -105,6 +105,8 @@ font_make :: (fd: FontDescriptor) -> Font { chars = char_data }; + font_registry[fd] = font; + return font; } diff --git a/src/main.onyx b/src/main.onyx index 00c2b6f..f82f9cf 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -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(); -- 2.25.1