working on asset loader
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 26 Nov 2021 00:46:00 +0000 (18:46 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 26 Nov 2021 00:46:00 +0000 (18:46 -0600)
tests/snake.onyx

index f16e05ca7e67e9e4418a772d8979be46d0411c04..1ca8c7bed61502e1d9a22395420a52b030b4fba4 100644 (file)
@@ -4,6 +4,7 @@ use package core
 
 assets : struct {
     ["./tests/player.png"]
+    [hb.graphics.ImageFilter.Nearest]
     player: hb.graphics.Image;
 
     ["./assets/fonts/mononoki-Regular Nerd Font Complete Mono.ttf", 72]
@@ -16,7 +17,9 @@ load_assets :: (assets: any) {
     asset_info := cast(^type_info.Type_Info_Struct) type_info.get_type_info(ptr_asset_info.to);
     assert(asset_info.kind == .Struct, "Loading assets only works for pointers to strucutres.");
 
-    asset_store := cast(^u8) *cast(^rawptr) assets.data;
+    set_member :: macro (a, T, m, v) => {
+        *cast(^T) ((cast(^u8) *cast(^rawptr) a.data) + m.offset) = v;
+    }
 
     for ^asset: asset_info.members {
         switch asset.type {
@@ -30,14 +33,24 @@ load_assets :: (assets: any) {
                 }
 
                 @TODO // Add settings like scaling, filters, etc.
+                filter_ptr := array.first(asset.tags, (t) => t.type == hb.graphics.ImageFilter);
+                if filter_ptr != null {
+                    filter := *cast(^hb.graphics.ImageFilter) filter_ptr.data;
+                    hb.graphics.setImageFilters(img, filter, filter);
+                }
+
+                wrapping_ptr := array.first(asset.tags, (t) => t.type == hb.graphics.ImageWrapping);
+                if wrapping_ptr != null {
+                    wrapping := *cast(^hb.graphics.ImageWrapping) wrapping_ptr.data;
+                    hb.graphics.setImageWrapping(img, wrapping, wrapping);
+                }
 
-                *cast(^hb.graphics.Image) (asset_store + asset.offset) = img;
+                set_member(assets, hb.graphics.Image, asset, img);
             }
 
             case hb.graphics.Font {
                 path := *(cast(^str) array.first(asset.tags, (t) => t.type == str).data);
                 size := *(cast(^i32) array.first(asset.tags, (t) => t.type == i32).data);
-
                 font := hb.graphics.newFont(path, ~~size);
 
                 if font == 0 {
@@ -45,7 +58,11 @@ load_assets :: (assets: any) {
                     continue;
                 }
 
-                *cast(^hb.graphics.Font) (asset_store + asset.offset) = font;
+                set_member(assets, hb.graphics.Font, asset, font);
+            }
+
+            case #default {
+                printf("Cannot load something of type '{}'.\n", asset.type);
             }
         }
     }