bugfixes and added entity member checking
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 30 Jan 2022 23:21:15 +0000 (17:21 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 30 Jan 2022 23:21:15 +0000 (17:21 -0600)
.gitignore
run_tree/run.sh
src/entity/manager.onyx
src/entity/player.onyx
src/gfx/canvas.onyx [new file with mode: 0644]
src/main.onyx

index 1bb46147d7feb65673794f3a0c412fb42fdff549..6f518b27a4ae93cea2a4faa003660c5abe440c0f 100644 (file)
@@ -1 +1,3 @@
-*.code-workspace
\ No newline at end of file
+*.code-workspace
+*.sublime-project
+*.sublime-workspace
\ No newline at end of file
index 19d377aee6ad98fba6894312719da4322ddcf4ea..a2db0837ff0be6a518baa61d14d0d8168e8631cd 100755 (executable)
@@ -1 +1 @@
-onyx run -V -I ../src build
+onyx run -V -I ../src build $@
index 29da0c066c6296f7a10b7b60a329663ac068e221..02753c158384d7fe500cfc90313d790d32b51137 100644 (file)
@@ -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;
index 0ad52809583417745bc39c6cbd9b7f033760429b..a71fa459ffca480cfbc6221dc3d89efcf6bb5d66 100644 (file)
@@ -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 (file)
index 0000000..d2f08e4
--- /dev/null
@@ -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);
+    }
+}
+
+
index e4b272356bf8ffabf6b43f775c7d3a3f8440bf2b..96510c0e5ec94771a38a16330ee183ea91bfe1b5 100644 (file)
@@ -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) {