From 8c704038ead3a6bec75d62687b456a6df2496d04 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 21 Nov 2021 21:28:20 -0600 Subject: [PATCH] added quads and partial image drawing --- misc/onyx/heartbreak_graphics.onyx | 26 +++++++++++++++++++++++ src/heartbreak_graphics.c | 33 ++++++++++++++++++++++++++++++ tests/simp.onyx | 1 + 3 files changed, 60 insertions(+) diff --git a/misc/onyx/heartbreak_graphics.onyx b/misc/onyx/heartbreak_graphics.onyx index 724dde1..f8c97bb 100644 --- a/misc/onyx/heartbreak_graphics.onyx +++ b/misc/onyx/heartbreak_graphics.onyx @@ -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 // diff --git a/src/heartbreak_graphics.c b/src/heartbreak_graphics.c index db2a48a..101dd91 100644 --- a/src/heartbreak_graphics.c +++ b/src/heartbreak_graphics.c @@ -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) diff --git a/tests/simp.onyx b/tests/simp.onyx index d27339c..674a246 100644 --- a/tests/simp.onyx +++ b/tests/simp.onyx @@ -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); -- 2.25.1