From: Brendan Hansen Date: Thu, 4 Nov 2021 03:10:14 +0000 (-0500) Subject: bugfixes and adding image property lookup X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=89a2dba2c153f4252193ecb490562bbffeb9676f;p=heartbreak.git bugfixes and adding image property lookup --- diff --git a/misc/onyx/heartbreak_graphics.onyx b/misc/onyx/heartbreak_graphics.onyx index 6d1f842..40a431e 100644 --- a/misc/onyx/heartbreak_graphics.onyx +++ b/misc/onyx/heartbreak_graphics.onyx @@ -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); diff --git a/src/gfx.c b/src/gfx.c index 6745cf8..414f561 100644 --- 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); } diff --git a/src/heartbreak_graphics.c b/src/heartbreak_graphics.c index e89b4de..920f9ff 100644 --- a/src/heartbreak_graphics.c +++ b/src/heartbreak_graphics.c @@ -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 diff --git a/tests/simp.onyx b/tests/simp.onyx index 632ee98..2499e4c 100644 --- a/tests/simp.onyx +++ b/tests/simp.onyx @@ -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();