added quads and partial image drawing
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 22 Nov 2021 03:28:20 +0000 (21:28 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 22 Nov 2021 03:28:20 +0000 (21:28 -0600)
misc/onyx/heartbreak_graphics.onyx
src/heartbreak_graphics.c
tests/simp.onyx

index 724dde15938951fa9935f4469a5985434b0cef78..f8c97bba304a38a5ddae87342bb5a6113cb10b30 100644 (file)
@@ -40,6 +40,7 @@ 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" ---
+drawImagePartial :: (img: Image, x, y, w, h, sx, sy, sw, sh: f32) -> void #foreign "heartbreak" "graphics_image_draw_partial" ---
 
 #local imageParam :: (img: Image, param: i32, value: i32) -> bool #foreign "heartbreak" "graphics_image_param" ---
 
@@ -72,6 +73,31 @@ ImageProperty :: enum {
 getImageProperty :: (img: Image, prop: ImageProperty) -> i32 #foreign "heartbreak" "graphics_image_property" ---
 getImageDimensions :: (img: Image) => getImageProperty(img, .Width), getImageProperty(img, .Height);
 
+//
+// Spritesheets (texture atlas support)
+//
+Quad :: struct {
+    img: Image;
+    sx, sy: f32;
+    sw, sh: f32;
+}
+
+newQuad :: macro (x, y, w, h: f32, img: Image) -> Quad {
+    getImageDimensions :: getImageDimensions
+
+    iw, ih := getImageDimensions(img);
+    return .{
+        img,
+        x / ~~iw, y / ~~ih,
+        w / ~~iw, h / ~~ih,
+    };
+}
+
+drawQuad :: macro (quad: Quad, x, y: f32, w: f32 = -1, h: f32 = -1) {
+    drawImagePartial :: drawImagePartial
+    drawImagePartial(quad.img, x, y, w, h, quad.sx, quad.sy, quad.sw, quad.sh);
+}
+
 //
 // Fonts
 //
index db2a48ae2d82d50b5e2c55e9b9e89f89d49b661e..101dd91d7c7de2949af5f0ea599890a2aee38670 100644 (file)
@@ -356,6 +356,38 @@ HEARTBREAK_DEF(image_draw, (WASM_I64, WASM_F32, WASM_F32, WASM_F32, WASM_F32), (
     return NULL;
 }
 
+HEARTBREAK_DEF(image_draw_partial, (WASM_I64, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_F32), ()) {
+    Image* img = (Image *) params->data[0].of.i64;
+    assert(img->magic_number == 0xdeadbeefdeadbeef);
+
+    f32 x = params->data[1].of.f32;
+    f32 y = params->data[2].of.f32;
+    f32 w = params->data[3].of.f32;
+    f32 h = params->data[4].of.f32;
+    f32 sx = params->data[5].of.f32;
+    f32 sy = params->data[6].of.f32;
+    f32 sw = params->data[7].of.f32;
+    f32 sh = params->data[8].of.f32;
+
+    if (w < 0) w = img->width * sw;
+    if (h < 0) h = img->height * sh;
+
+    gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_TRIANGLES);
+    gfx_image_bind(&renderer, img, 0);
+
+    gfx_immediate_renderer_push_triangle(&renderer,
+        x, y, sx, sy,
+        x + w, y, sx + sw, sy,
+        x + w, y + h, sx + sw, sy + sh);
+
+    gfx_immediate_renderer_push_triangle(&renderer,
+        x, y, sx, sy,
+        x + w, y + h, sx + sw, sy + sh,
+        x, y + h, sx, sy + sh);
+
+    return NULL;
+}
+
 HEARTBREAK_DEF(image_param, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
     Image* img = (Image *) params->data[0].of.i64;
     assert(img->magic_number == 0xdeadbeefdeadbeef);
@@ -468,6 +500,7 @@ HEARTBREAK_MODULE {
     HEARTBREAK_FUNC(image_load)
     HEARTBREAK_FUNC(image_destroy)
     HEARTBREAK_FUNC(image_draw)
+    HEARTBREAK_FUNC(image_draw_partial)
     HEARTBREAK_FUNC(image_param)
     HEARTBREAK_FUNC(image_property)
 
index d27339c61d5d238c524186c5c97b1b3934a6972c..674a246890883acb48d2cdb23ceec454b5e05c47 100644 (file)
@@ -99,6 +99,7 @@ draw :: () {
 
     hb.graphics.setColor(1, 1, 1, 1);
     hb.graphics.drawImage(dummy, 100, 100, 100, 100);
+    hb.graphics.newQuad(4, 4, 8, 8, dummy) |> hb.graphics.drawQuad(200, 100);
 
     for it: squares {
         hb.graphics.setColor(it.r, it.g, it.b, it.a);