From bbb66ba6ab014c48f1c140e550e04fd1d9a2daa6 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 28 Feb 2022 11:50:56 -0600 Subject: [PATCH] flushing out component system --- run_tree/lib/onyx_openal.so | Bin 0 -> 86464 bytes run_tree/scenes/default.items | 2 + run_tree/scenes/quick_save_new.scene | 39 +++++++++++++-- src/build.onyx | 30 +++--------- src/entity/components/dispenser.onyx | 70 +++++++++++++++++++++++++++ src/entity/items.onyx | 8 ++- src/entity/manager.onyx | 41 ++++++++++++++-- src/entity/player.onyx | 1 + src/entity/schematics/tap.onyx | 35 ++++++++++++++ src/game.onyx | 1 + src/gfx/texture.onyx | 15 +++++- src/main.onyx | 2 +- src/utils/any_utils.onyx | 2 +- src/utils/asset_loader.onyx | 5 ++ src/utils/vecmath.onyx | 16 ++++++ 15 files changed, 233 insertions(+), 34 deletions(-) create mode 100755 run_tree/lib/onyx_openal.so create mode 100644 src/entity/components/dispenser.onyx create mode 100644 src/entity/schematics/tap.onyx diff --git a/run_tree/lib/onyx_openal.so b/run_tree/lib/onyx_openal.so new file mode 100755 index 0000000000000000000000000000000000000000..77bd206581031ccb2a6666bc0c8390c82b41958a GIT binary patch literal 86464 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 { + debug_log(.Error, "DispenserComponent expected entity to not have an InteractableComponent"); + } + + scene->create_and_add(entity, InteractableComponent) { + comp.interact = interact; + } + } + + update :: (use this: ^DispenserComponent, entity: ^Entity, dt: f32) { + timeout -= dt; + if timeout < 0 do timeout = 0; + } + + interact :: (this: ^Entity, entity: ^Entity) { + if entity->has(PlayerComponent) { + player_comp := entity->get(PlayerComponent); + if player_comp.holding != Entity_Nothing do return; + + dispenser_comp := this->get(DispenserComponent); + if dispenser_comp.timeout != 0 do return; + + item := scene->create_from_schematic("Item_Entity"); + if item == null { + debug_log(.Error, "Bad schematic type."); + return; + } + + // This should dynamic... + item.size = .{16, 16}; + (item->get(ItemComponent)).item = dispenser_comp.item; + + scene->add(item); + player_comp.holding = item.id; + dispenser_comp.timeout = dispenser_comp.max_timeout; + } + } + + post_render :: (use this: ^DispenserComponent, entity: ^Entity) { + if timeout != 0 { + rect := entity->get_rect(); + + percent := (max_timeout - timeout) / max_timeout; + rect.y += (1 - percent) * rect.h; + rect.h *= percent; + + immediate_set_color(.{0.4, 1, 0.4, 0.8}); + immediate_rectangle(rect.x, rect.y, rect.w, rect.h); + } + } +} + diff --git a/src/entity/items.onyx b/src/entity/items.onyx index 5229cca..a96a1da 100644 --- a/src/entity/items.onyx +++ b/src/entity/items.onyx @@ -7,6 +7,8 @@ Item :: struct { color := Color.{ 1, 1, 1 }; texture_path : str; + texture_pos := Vector2.{0, 0}; + texture_size := Vector2.{1, 1}; } Item_Store :: struct { @@ -116,7 +118,11 @@ item_store_get_item :: (use this: ^Item_Store, id: str) -> ^Item { if !loaded { immediate_rectangle(r.x, r.y, r.w, r.h); } else { - immediate_image(^texture, r.x, r.y, r.w, r.h); + tp := item_data.texture_pos; + ts := item_data.texture_size; + // immediate_image(^texture, r.x, r.y, r.w, r.h); + immediate_subimage(^texture, r.x, r.y, r.w, r.h, + tp.x, tp.y, ts.x, ts.y); } } } diff --git a/src/entity/manager.onyx b/src/entity/manager.onyx index 5b18c1f..bf4d5fc 100644 --- a/src/entity/manager.onyx +++ b/src/entity/manager.onyx @@ -16,8 +16,30 @@ Entity_ID :: #distinct u32 } #local Component_Vtable :: struct { - init : (rawptr) -> void = null_proc; - update: (rawptr, ^Entity, f32) -> void = null_proc; + // + // 'init' is called when the component is first created, before it + // has been added to any entity. + init : (rawptr) -> void = null_proc; + + // + // 'added' is called when the component is added to an entity. + // In theory, it could be called multiple times, if the component + // is shared between multiple entities. + added : (rawptr, ^Entity) -> void = null_proc; + + // + // 'update' is called every update cycle. Currently, there is no + // specified as to the order in which components get updated. + // I think by circumstance, it is the order that you add them + // to the entity, but could break in the future. + update : (rawptr, ^Entity, f32) -> void = null_proc; + + // + // 'post_render' is called after the entity has been rendered + // normally. Entities must have a 'RenderComponent' in order + // to have 'post_render' called on their components. This + // can be used to add overlays or popups to an entity. + post_render: (rawptr, ^Entity) -> void = null_proc; } Component :: struct { @@ -38,7 +60,8 @@ RenderComponent :: struct { #tag Editor_Hidden, Entity_Store.Skip func : (e: ^Entity) -> void; - color := Color.{1,1,1}; + layer := 0; + color := Color.{1, 1, 1}; } SizeComponent :: struct { @@ -80,6 +103,9 @@ Entity :: struct { add :: (use this: ^Entity, component: ^Component) => { if components->has(component.type) do return; components[component.type] = component; + if component.added != null_proc { + component->added(this); + } } } @@ -253,11 +279,20 @@ entity_manager_update :: (use this: ^Entity_Manager, dt: f32) { entity_manager_draw :: (use this: ^Entity_Manager) { // Entities should be sorted by z-order. + + for entities { render_comp := it->get(RenderComponent); if render_comp != null { immediate_set_color(render_comp.color); render_comp.func(it); + + for^ entry: it.components.entries { + comp := entry.value; + if comp.post_render != null_proc { + comp->post_render(it); + } + } } } } diff --git a/src/entity/player.onyx b/src/entity/player.onyx index cf207d8..fdb2185 100644 --- a/src/entity/player.onyx +++ b/src/entity/player.onyx @@ -216,6 +216,7 @@ wall_create :: (scene: ^Entity_Manager, pos, size: Vector2) -> ^Entity { player_assets: struct { #tag "assets/images/player.png" + #tag Texture_Wrap.Clamp texture: Texture; } diff --git a/src/entity/schematics/tap.onyx b/src/entity/schematics/tap.onyx new file mode 100644 index 0000000..98a9907 --- /dev/null +++ b/src/entity/schematics/tap.onyx @@ -0,0 +1,35 @@ + +Tap :: struct { + #struct_tag Entity_Schematic.{ + (scene) => Tap.create(scene, .{0,0}, .{0,0}) + } + + create :: (scene: ^Entity_Manager, pos: Vector2, size: Vector2) -> ^Entity { + this := scene->make(); + this.pos = pos; + this.size = size; + this.flags |= .Solid; + this.flags |= .Interactable; + + scene->create_and_add(this, RenderComponent) { + comp.func = render; + } + + scene->create_and_add(this, DispenserComponent) { + comp.item = "beer"; + } + + return this; + } + + render :: (use this: ^Entity) { + rect := this->get_rect(); + + immediate_rectangle(rect.x, rect.y, rect.w, rect.h); + } +} + +tap_assets: struct { + #tag "./assets/" + texture: Texture; +} \ No newline at end of file diff --git a/src/game.onyx b/src/game.onyx index 8a218bd..5f55149 100644 --- a/src/game.onyx +++ b/src/game.onyx @@ -58,6 +58,7 @@ game_draw :: () { canvas_use(null); immediate_clear(.{1, 1, 1}); + immediate_set_color(.{1, 1, 1}); texture := canvas_to_texture(^scene_canvas); view_rect: Rect; diff --git a/src/gfx/texture.onyx b/src/gfx/texture.onyx index 2ceb980..0df03b8 100644 --- a/src/gfx/texture.onyx +++ b/src/gfx/texture.onyx @@ -46,7 +46,7 @@ texture_lookup :: #match {} glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); @@ -65,3 +65,16 @@ texture_use :: (use tex: ^Texture, texture_binding := 0) { glActiveTexture(GL_TEXTURE0 + texture_binding); glBindTexture(GL_TEXTURE_2D, texture); } + + +Texture_Wrap :: enum { + Clamp :: GL_CLAMP_TO_EDGE | 0; + Repeat :: GL_REPEAT | 0; + Mirrored_Repeat :: GL_MIRRORED_REPEAT | 0; +} + +texture_wrap :: (use tex: ^Texture, wrap: Texture_Wrap) { + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, ~~ wrap); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, ~~ wrap); +} \ No newline at end of file diff --git a/src/main.onyx b/src/main.onyx index 42138c5..fa1abb9 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -141,7 +141,7 @@ create_window :: () => { } main :: (args) => { - debug_set_level(.Info); + debug_set_level(.Debug); if !glfwInit() { debug_log(.Critical, "Failed to initialize GLFW!"); os.exit(1); diff --git a/src/utils/any_utils.onyx b/src/utils/any_utils.onyx index ab06c1d..803615d 100644 --- a/src/utils/any_utils.onyx +++ b/src/utils/any_utils.onyx @@ -30,7 +30,7 @@ get_any_for_member :: (base: any, member_name: str) -> any { for info.members { if it.name == part_name { member_info := get_type_info(it.type); - if member_info.kind == .Struct { + if member_info.kind == .Struct && name != "" { return get_any_for_member(any.{cast(^u8) base.data + it.offset, it.type}, name); } else { return any.{cast(^u8) base.data + it.offset, it.type}; diff --git a/src/utils/asset_loader.onyx b/src/utils/asset_loader.onyx index c4ecea6..ccf5f73 100644 --- a/src/utils/asset_loader.onyx +++ b/src/utils/asset_loader.onyx @@ -44,6 +44,11 @@ load_assets :: () { if path_tag != null { path := *cast(^str) path_tag.data; if texture, success := texture_lookup(path); success { + if wrap_tag := array.first(tags, (x) => x.type == Texture_Wrap); wrap_tag != null { + wrap := *cast(^Texture_Wrap) wrap_tag.data; + texture_wrap(^texture, wrap); + } + *out_texture = texture; } else { debug_log(.Error, "Failed to load texture '{}' for asset queued here: {}:{},{}.\n", path, location.file, location.line, location.column); diff --git a/src/utils/vecmath.onyx b/src/utils/vecmath.onyx index 9dbf7c1..3bda373 100644 --- a/src/utils/vecmath.onyx +++ b/src/utils/vecmath.onyx @@ -5,6 +5,7 @@ Vector2 :: struct { Zero :: Vector2.{0, 0} #struct_tag conv.Custom_Format.{format_vector2} + #struct_tag conv.Custom_Parse.{parse_vector2} } Vector3i :: struct { @@ -79,6 +80,21 @@ Vector3 :: struct { format_vector3i :: (output: ^conv.Format_Output, format: ^conv.Format, v: ^Vector3i) { conv.format(output, "({}, {}, {})", v.x, v.y, v.z); } + + parse_vector2 :: (output: ^Vector2, line_: str, string_allocator: Allocator) -> bool { + string :: package core.string + + line := line_; + xs := string.read_until(^line, #char " "); + string.advance(^line, 1); + ys := string.read_until(^line, #char " "); + + if xs == "" || ys == "" do return false; + + output.x = ~~ conv.str_to_f64(xs); + output.y = ~~ conv.str_to_f64(ys); + return true; + } } -- 2.25.1