bugfixes and adding image property lookup
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 4 Nov 2021 03:10:14 +0000 (22:10 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 4 Nov 2021 03:10:14 +0000 (22:10 -0500)
misc/onyx/heartbreak_graphics.onyx
src/gfx.c
src/heartbreak_graphics.c
tests/simp.onyx

index 6d1f8421be8850ce4944050a94221b848b3f5e0d..40a431e3d0423a76d4fa118ebd3dca9be8a21abc 100644 (file)
@@ -38,9 +38,33 @@ Image :: #type i64
 newImage  :: (path: str) -> Image #foreign "heartbreak" "graphics_image_load" ---
 drawImage :: (img: Image, x, y: f32, w: f32 = -1, h: f32 = -1) -> void #foreign "heartbreak" "graphics_image_draw" ---
 
-setImageFilters :: (img: Image, min: i32, max: i32) {
-    imageParam :: (img: Image, param: i32, value: i32) -> bool #foreign "heartbreak" "graphics_image_param" ---
+#private_file imageParam :: (img: Image, param: i32, value: i32) -> bool #foreign "heartbreak" "graphics_image_param" ---
 
-    imageParam(img, 1, min);
-    imageParam(img, 2, max);
-}
\ No newline at end of file
+ImageFilter :: enum {
+    Nearest :: 0x01;
+    Linear  :: 0x02;
+}
+
+setImageFilters :: (img: Image, min: ImageFilter, max: ImageFilter) {
+    imageParam(img, 1, ~~ min);
+    imageParam(img, 2, ~~ max);
+}
+
+ImageWrapping :: enum {
+    Clamp          :: 0x01;
+    Mirroed_Repeat :: 0x02;
+    Repeat         :: 0x03;
+}
+
+setImageWrapping :: (img: Image, wrap_x: ImageWrapping, wrap_y: ImageWrapping) {
+    imageParam(img, 3, ~~ wrap_x);
+    imageParam(img, 4, ~~ wrap_y);
+}
+
+ImageProperty :: enum {
+    Width  :: 0x01;
+    Height :: 0x02;
+}
+
+getImageProperty :: (img: Image, prop: ImageProperty) -> i32 #foreign "heartbreak" "graphics_image_property" ---
+getImageDimensions :: (img: Image) => getImageProperty(img, .Width), getImageProperty(img, .Height);
index 6745cf8ced675aaa8e65be7a3212b6564acb4519..414f5613a918ba71c247e800b758b560b9839211 100644 (file)
--- a/src/gfx.c
+++ b/src/gfx.c
@@ -171,6 +171,10 @@ void gfx_immediate_renderer_set_color(ImmediateRenderer *ir, ImmediateColor colo
 }
 
 void gfx_immediate_renderer_push_vertex(ImmediateRenderer *ir, f32 x, f32 y, f32 u, f32 v) {
+    if (ir->vertex_count >= VERTEX_DATA_MAX_COUNT) {
+        gfx_immediate_renderer_flush(ir);
+    }
+
     ir->vertex_data[ir->vertex_count++] = (ImmediateVertex) { x, y, u, v, ir->current_color };
 }
 
@@ -179,7 +183,7 @@ void gfx_immediate_renderer_push_triangle(ImmediateRenderer *ir,
     f32 x2, f32 y2, f32 u2, f32 v2,
     f32 x3, f32 y3, f32 u3, f32 v3) {
 
-    if (ir->vertex_count - 3 >= VERTEX_DATA_MAX_COUNT) {
+    if (ir->vertex_count + 3 > VERTEX_DATA_MAX_COUNT) {
         gfx_immediate_renderer_flush(ir);
     }
 
index e89b4dee5c99de531abb6fbc0dbb984953269dbe..920f9ff6a335f354f2a9375f593e13dd21550571 100644 (file)
@@ -224,6 +224,20 @@ HEARTBREAK_DEF(image_param, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
             if (value == 2) filter = GL_LINEAR;
             if (filter > 0) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
             break;
+        case 3: 
+            filter = -1;
+            if (value == 1) filter = GL_CLAMP_TO_EDGE;
+            if (value == 2) filter = GL_MIRRORED_REPEAT;
+            if (value == 3) filter = GL_REPEAT;
+            if (filter > 0) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, filter);
+            break;
+        case 4:
+            filter = -1;
+            if (value == 1) filter = GL_CLAMP_TO_EDGE;
+            if (value == 2) filter = GL_MIRRORED_REPEAT;
+            if (value == 3) filter = GL_REPEAT;
+            if (filter > 0) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, filter);
+            break;
     }
 
     glBindTexture(GL_TEXTURE_2D, -1);
@@ -232,6 +246,21 @@ HEARTBREAK_DEF(image_param, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
     return NULL;
 }
 
+HEARTBREAK_DEF(image_property, (WASM_I64, WASM_I32), (WASM_I32)) {
+    Image* img = (Image *) params->data[0].of.i64;
+    assert(img->magic_number == 0xdeadbeefdeadbeef);
+
+    i32 prop = params->data[1].of.i32;
+
+    switch (prop) {
+        /* width  */ case 1: results->data[0] = WASM_I32_VAL(img->width);  break;
+        /* height */ case 2: results->data[0] = WASM_I32_VAL(img->height); break;
+        default: results->data[0] = WASM_I32_VAL(-1);
+    }
+
+    return NULL;
+}
+
 HEARTBREAK_MODULE {
     HEARTBREAK_FUNC(set_clear_color)
     HEARTBREAK_FUNC(clear)
@@ -252,6 +281,7 @@ HEARTBREAK_MODULE {
     HEARTBREAK_FUNC(image_destroy)
     HEARTBREAK_FUNC(image_draw)
     HEARTBREAK_FUNC(image_param)
+    HEARTBREAK_FUNC(image_property)
 
     { NULL }
 };
\ No newline at end of file
index 632ee98aab988bef1af1655e671b07849f1ba291..2499e4c2543d5211926d98c60c8c9dc877e037b0 100644 (file)
@@ -10,7 +10,10 @@ init :: () {
     printf("The window is {}x{}\n", w, h);
 
     dummy = hb.graphics.newImage("./tests/player.png");
-    hb.graphics.setImageFilters(dummy, 1, 1);
+    hb.graphics.setImageFilters(dummy, .Nearest, .Nearest);
+
+    w, h = hb.graphics.getImageDimensions(dummy);
+    printf("{} by {}\n", w, h);
 
     // hb.window.setDimensions(1200, 900);
 }
@@ -33,6 +36,11 @@ draw :: () {
     hb.graphics.setColor(1, 1, 0);
     hb.graphics.rectangle(.Fill, 100, 100, 200, 100);
 
+    for i: 100 {
+        hb.graphics.setColor(random.float(0, 1), random.float(0, 1), random.float(0, 1), 1);
+        hb.graphics.rectangle(.Fill, random.float(0, 800), random.float(0, 600), random.float(0, 100), random.float(0, 100));
+    }
+
     mx, my := hb.input.mouseGetPos();
     hb.graphics.push();
     hb.graphics.origin();
@@ -42,7 +50,7 @@ draw :: () {
     hb.graphics.ellipse(.Fill, 0, 0, 25, 15 + 10 * math.sin(t));
     hb.graphics.pop();
 
-    hb.graphics.setColor(0,1,1,1);
+    hb.graphics.setColor(1, 1, 1, 1);
     hb.graphics.drawImage(dummy, 100, 100, 100, 100);
 
     w := cast(f32) hb.window.getWidth();