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" ---
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
//
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);
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)
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);