From 9416626cc911746b589df09536b1a9b9d65a4b3c Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 30 Jan 2022 17:21:15 -0600 Subject: [PATCH] bugfixes and added entity member checking --- .gitignore | 4 +++- run_tree/run.sh | 2 +- src/entity/manager.onyx | 31 +++++++++++++++++++++++++++---- src/entity/player.onyx | 16 ++++++++++++---- src/gfx/canvas.onyx | 24 ++++++++++++++++++++++++ src/main.onyx | 13 ++++++++++++- 6 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 src/gfx/canvas.onyx diff --git a/.gitignore b/.gitignore index 1bb4614..6f518b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -*.code-workspace \ No newline at end of file +*.code-workspace +*.sublime-project +*.sublime-workspace \ No newline at end of file diff --git a/run_tree/run.sh b/run_tree/run.sh index 19d377a..a2db083 100755 --- a/run_tree/run.sh +++ b/run_tree/run.sh @@ -1 +1 @@ -onyx run -V -I ../src build +onyx run -V -I ../src build $@ diff --git a/src/entity/manager.onyx b/src/entity/manager.onyx index 29da0c0..02753c1 100644 --- a/src/entity/manager.onyx +++ b/src/entity/manager.onyx @@ -14,9 +14,11 @@ Entity :: struct { } Entity_Flags :: enum #flags { - Interactable; - Solid; - Carryable; + // These have defined values for stable serialization. + + Interactable :: 0x01; + Solid :: 0x02; + Carryable :: 0x04; } IsEntity :: interface (e: $E) { @@ -69,6 +71,27 @@ entity_manager_create :: () -> Entity_Manager { entity_manager_register :: (use this: ^Entity_Manager, $entity_type: type_expr) where IsEntity(^entity_type) { if !entity_types->has(entity_type) { + + { // Validate that the entity_type does not have any pointers. + use type_info; + + info := cast (^Type_Info_Struct) get_type_info(entity_type); + for info.members { + member_info := get_type_info(it.type); + is_pointer := member_info.kind == .Pointer; + if member_info.kind == .Basic { + if (cast(^Type_Info_Basic) member_info).basic_kind == .Rawptr { + is_pointer = is_pointer; + } + } + + message_buf: [1024] u8; + message := conv.format(message_buf, "Cannot have a pointer member on an Entity! '{}' is a pointer!", it.name); + assert(!is_pointer, message); + } + } + + handles := Entity_Handles.{}; @CompilerFeatures // Maybe there should be data stored in the Type_Info_Struct about @@ -146,7 +169,7 @@ entity_manager_query_by_type :: (use this: ^Entity_Manager, area: Rect, type: ty ents: [..] ^Entity; for entities { - if type != void && it.type != type do continue; + if it.type != type do continue; get_rect := entity_types[it.type].get_rect; if get_rect == null_proc do continue; diff --git a/src/entity/player.onyx b/src/entity/player.onyx index 0ad5280..a71fa45 100644 --- a/src/entity/player.onyx +++ b/src/entity/player.onyx @@ -79,6 +79,7 @@ Player :: struct { if is_key_just_up(controls.pick_up) { if holding != Entity_Nothing { holding_object := entity_manager->get(holding); + holding_object.flags |= .Carryable; vtable := ^entity_manager.entity_types[holding_object.type]; if vtable.get_rect != null_proc { r := vtable.get_rect(holding_object); @@ -97,6 +98,7 @@ Player :: struct { if objects[i] == this do continue; target_object := objects[i]; + target_object.flags ^= .Carryable; // This only works because we assume that it is Carryable, otherwise this would make it carryable. this.holding = target_object.id; break; } @@ -129,11 +131,12 @@ Player :: struct { vtable := ^entity_manager.entity_types[holding_object.type]; if vtable.get_rect != null_proc { r := vtable.get_rect(holding_object); - holding_object.pos = pos - .{0, Size + r.h}; + holding_object.pos = pos - .{0, Size + r.h / 2}; } } } + // This should be made generic and work for all kinds of entities try_move :: (use this: ^Player, delta: Vector2, obsticles: [] ^Entity) { pos += delta; ent_rect := get_rect(this); @@ -179,11 +182,13 @@ Wall :: struct { flags |= .Solid; } - get_rect :: (use this: ^Wall) => Rect.{ pos.x, pos.y, size.x, size.y }; + get_rect :: (use this: ^Wall) => Rect.{ pos.x - size.x / 2, pos.y - size.y / 2, size.x, size.y }; draw :: (use this: ^Wall) { immediate_set_color(.{1,1,1}); - immediate_rectangle(pos.x, pos.y, size.x, size.y); + + r := Wall.get_rect(this); + immediate_rectangle(r.x, r.y, r.w, r.h); } } @@ -208,7 +213,10 @@ Door :: struct { this.flags |= .Carryable; } - get_rect :: (use this: ^Door) => Rect.{ pos.x, pos.y, size.x * (1 - openness), size.y }; + get_rect :: (use this: ^Door) => { + size_x := size.x * (1 - openness); + return Rect.{ pos.x - size_x / 2, pos.y - size.y / 2, size_x, size.y }; + } update :: (use this: ^Door, dt: f32) { if openness != target_openness { diff --git a/src/gfx/canvas.onyx b/src/gfx/canvas.onyx new file mode 100644 index 0000000..d2f08e4 --- /dev/null +++ b/src/gfx/canvas.onyx @@ -0,0 +1,24 @@ + +use package core +use package opengles + + +Canvas :: struct { + framebuffer: GLint; + depth_stencil_buffer: GLint; + color_texture: GLint; +} + +canvas_make :: () -> Canvas { + canvas: Canvas; +} + +canvas_use :: (use canvas: ^Canvas) { + if canvas == null { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } else { + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + } +} + + diff --git a/src/main.onyx b/src/main.onyx index e4b2723..96510c0 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -55,7 +55,18 @@ init :: () { entity_manager->make(Door, .{ .{400, 400}, .{50, 50} }); entity_manager->make(Door, .{ .{150, 400}, .{50, 50} }); - entity_manager->make(Item, .{ pos=.{ 250, 250 } }); + entity_manager->make(Item, .{ pos=.{ 250, 250 }, color=.{1,0,0} }); + entity_manager->make(Item, .{ pos=.{ 275, 250 }, color=.{0,1,0} }); + entity_manager->make(Item, .{ pos=.{ 300, 250 }, color=.{0,0,1} }); + + + #if DEBUG { + println("Registered Entity types:"); + for entity_manager.entity_types.entries { + info := cast(^type_info.Type_Info_Struct) type_info.get_type_info(it.key); + printf(" {}\n", info.name); + } + } } update :: (dt: f32) { -- 2.25.1