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);
}
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 };
}
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);
}
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);
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)
HEARTBREAK_FUNC(image_destroy)
HEARTBREAK_FUNC(image_draw)
HEARTBREAK_FUNC(image_param)
+ HEARTBREAK_FUNC(image_property)
{ NULL }
};
\ No newline at end of file
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);
}
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();
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();