HEARTBREAK_DEF(rectangle, (WASM_I32,WASM_F32,WASM_F32,WASM_F32,WASM_F32), ()) {
gfx_image_unbind(&renderer);
- // @TODO: Use fill mode
+
+ i32 mode = params->data[0].of.i32;
+ if (mode == 1) gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_TRIANGLES);
+ if (mode == 2) gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_LINES);
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;
- gfx_immediate_renderer_push_triangle(&renderer,
- x, y, 0, 0,
- x + w, y, 0, 0,
- x + w, y + h, 0, 0);
+ if (mode == 1) {
+ gfx_immediate_renderer_push_triangle(&renderer,
+ x, y, 0, 0,
+ x + w, y, 0, 0,
+ x + w, y + h, 0, 0);
- gfx_immediate_renderer_push_triangle(&renderer,
- x, y, 0, 0,
- x + w, y + h, 0, 0,
- x, y + h, 0, 0);
+ gfx_immediate_renderer_push_triangle(&renderer,
+ x, y, 0, 0,
+ x + w, y + h, 0, 0,
+ x, y + h, 0, 0);
+
+ } else if (mode == 2) {
+ gfx_immediate_renderer_push_vertex(&renderer, x, y, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, x + w, y, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, x + w, y, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, x + w, y + h, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, x + w, y + h, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, x, y + h, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, x, y + h, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, x, y, 0, 0);
+ }
return NULL;
}
HEARTBREAK_DEF(circle, (WASM_I32, WASM_F32, WASM_F32, WASM_F32, WASM_I32), ()) {
gfx_image_unbind(&renderer);
- // @TODO: Use fill mode
- f32 x = params->data[1].of.f32;
- f32 y = params->data[2].of.f32;
- f32 r = params->data[3].of.f32;
- i32 segments = params->data[4].of.i32;
+ i32 mode = params->data[0].of.i32;
+ if (mode == 1) {
+ gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_TRIANGLES);
- f32 cx1 = x + r;
- f32 cy1 = y;
- f32 cx2 = x + cos(PI * 2 / segments) * r;
- f32 cy2 = y + sin(PI * 2 / segments) * r;
- f32 cx3, cy3;
+ f32 x = params->data[1].of.f32;
+ f32 y = params->data[2].of.f32;
+ f32 r = params->data[3].of.f32;
+ i32 segments = params->data[4].of.i32;
- fori (i, 2, segments) {
- cx3 = x + cos(i * PI * 2 / segments) * r;
- cy3 = y + sin(i * PI * 2 / segments) * r;
+ f32 cx1 = x + r;
+ f32 cy1 = y;
+ f32 cx2 = x + cos(PI * 2 / segments) * r;
+ f32 cy2 = y + sin(PI * 2 / segments) * r;
+ f32 cx3, cy3;
- gfx_immediate_renderer_push_triangle(&renderer,
- cx1, cy1, 0, 0,
- cx2, cy2, 0, 0,
- cx3, cy3, 0, 0);
+ fori (i, 2, segments) {
+ cx3 = x + cos(i * PI * 2 / segments) * r;
+ cy3 = y + sin(i * PI * 2 / segments) * r;
- cx2 = cx3;
- cy2 = cy3;
- }
+ gfx_immediate_renderer_push_triangle(&renderer,
+ cx1, cy1, 0, 0,
+ cx2, cy2, 0, 0,
+ cx3, cy3, 0, 0);
- return NULL;
-}
+ cx2 = cx3;
+ cy2 = cy3;
+ }
-HEARTBREAK_DEF(ellipse, (WASM_I32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_I32), ()) {
- gfx_image_unbind(&renderer);
- // @TODO: Use fill mode
+ } else if (mode == 2) {
+ gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_LINES);
- f32 x = params->data[1].of.f32;
- f32 y = params->data[2].of.f32;
- f32 r1 = params->data[3].of.f32;
- f32 r2 = params->data[4].of.f32;
- i32 segments = params->data[5].of.i32;
+ f32 x = params->data[1].of.f32;
+ f32 y = params->data[2].of.f32;
+ f32 r = params->data[3].of.f32;
+ i32 segments = params->data[4].of.i32;
- f32 cx1 = x + r1;
- f32 cy1 = y;
- f32 cx2 = x + cos(PI * 2 / segments) * r1;
- f32 cy2 = y + sin(PI * 2 / segments) * r2;
- f32 cx3, cy3;
+ f32 cx1 = x + r;
+ f32 cy1 = y;
+ f32 cx2, cy2;
- fori (i, 2, segments) {
- cx3 = x + cos(i * PI * 2 / segments) * r1;
- cy3 = y + sin(i * PI * 2 / segments) * r2;
+ fori (i, 1, segments + 1) {
+ cx2 = x + cos(i * PI * 2 / segments) * r;
+ cy2 = y + sin(i * PI * 2 / segments) * r;
- gfx_immediate_renderer_push_triangle(&renderer,
- cx1, cy1, 0, 0,
- cx2, cy2, 0, 0,
- cx3, cy3, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, cx1, cy1, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, cx2, cy2, 0, 0);
- cx2 = cx3;
- cy2 = cy3;
+ cx1 = cx2;
+ cy1 = cy2;
+ }
}
return NULL;
}
-HEARTBREAK_DEF(arc, (WASM_I32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_I32), ()) {
+HEARTBREAK_DEF(ellipse, (WASM_I32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_I32), ()) {
gfx_image_unbind(&renderer);
- // @TODO: Use fill mode
- f32 x = params->data[1].of.f32;
- f32 y = params->data[2].of.f32;
- f32 r = params->data[3].of.f32;
- f32 a1 = params->data[4].of.f32;
- f32 a2 = params->data[5].of.f32;
- f32 segments = params->data[6].of.i32;
-
- f32 cx1 = x;
- f32 cy1 = y;
- f32 cx2 = x + cos(a1 + 0 * (a2 - a1) / segments) * r;
- f32 cy2 = y + sin(a1 + 0 * (a2 - a1) / segments) * r;
- f32 cx3, cy3;
+ i32 mode = params->data[0].of.i32;
+ if (mode == 1) {
+ gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_TRIANGLES);
+ f32 x = params->data[1].of.f32;
+ f32 y = params->data[2].of.f32;
+ f32 r1 = params->data[3].of.f32;
+ f32 r2 = params->data[4].of.f32;
+ i32 segments = params->data[5].of.i32;
+
+ f32 cx1 = x + r1;
+ f32 cy1 = y;
+ f32 cx2 = x + cos(PI * 2 / segments) * r1;
+ f32 cy2 = y + sin(PI * 2 / segments) * r2;
+ f32 cx3, cy3;
+
+ fori (i, 2, segments) {
+ cx3 = x + cos(i * PI * 2 / segments) * r1;
+ cy3 = y + sin(i * PI * 2 / segments) * r2;
+
+ gfx_immediate_renderer_push_triangle(&renderer,
+ cx1, cy1, 0, 0,
+ cx2, cy2, 0, 0,
+ cx3, cy3, 0, 0);
+
+ cx2 = cx3;
+ cy2 = cy3;
+ }
+
+ } else if (mode == 2) {
+ gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_LINES);
+ f32 x = params->data[1].of.f32;
+ f32 y = params->data[2].of.f32;
+ f32 r1 = params->data[3].of.f32;
+ f32 r2 = params->data[4].of.f32;
+ i32 segments = params->data[5].of.i32;
+
+ f32 cx1 = x + r1;
+ f32 cy1 = y;
+ f32 cx2, cy2;
+
+ fori (i, 1, segments + 1) {
+ cx2 = x + cos(i * PI * 2 / segments) * r1;
+ cy2 = y + sin(i * PI * 2 / segments) * r2;
+
+ gfx_immediate_renderer_push_vertex(&renderer, cx1, cy1, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, cx2, cy2, 0, 0);
+
+ cx1 = cx2;
+ cy1 = cy2;
+ }
+ }
- fori (i, 1, segments + 1) {
- cx3 = x + cos(a1 + i * (a2 - a1) / segments) * r;
- cy3 = y + sin(a1 + i * (a2 - a1) / segments) * r;
+ return NULL;
+}
- gfx_immediate_renderer_push_triangle(&renderer,
- cx1, cy1, 0, 0,
- cx2, cy2, 0, 0,
- cx3, cy3, 0, 0);
+HEARTBREAK_DEF(arc, (WASM_I32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_F32, WASM_I32), ()) {
+ gfx_image_unbind(&renderer);
- cx2 = cx3;
- cy2 = cy3;
+ i32 mode = params->data[0].of.i32;
+ if (mode == 1) {
+ gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_TRIANGLES);
+ f32 x = params->data[1].of.f32;
+ f32 y = params->data[2].of.f32;
+ f32 r = params->data[3].of.f32;
+ f32 a1 = params->data[4].of.f32;
+ f32 a2 = params->data[5].of.f32;
+ f32 segments = params->data[6].of.i32;
+
+ f32 cx1 = x;
+ f32 cy1 = y;
+ f32 cx2 = x + cos(a1 + 0 * (a2 - a1) / segments) * r;
+ f32 cy2 = y + sin(a1 + 0 * (a2 - a1) / segments) * r;
+ f32 cx3, cy3;
+
+ fori (i, 1, segments + 1) {
+ cx3 = x + cos(a1 + i * (a2 - a1) / segments) * r;
+ cy3 = y + sin(a1 + i * (a2 - a1) / segments) * r;
+
+ gfx_immediate_renderer_push_triangle(&renderer,
+ cx1, cy1, 0, 0,
+ cx2, cy2, 0, 0,
+ cx3, cy3, 0, 0);
+
+ cx2 = cx3;
+ cy2 = cy3;
+ }
+
+ } else if (mode == 2) {
+ gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_LINES);
+
+ f32 x = params->data[1].of.f32;
+ f32 y = params->data[2].of.f32;
+ f32 r = params->data[3].of.f32;
+ f32 a1 = params->data[4].of.f32;
+ f32 a2 = params->data[5].of.f32;
+ f32 segments = params->data[6].of.i32;
+
+ f32 cx1 = x + cos(a1 + 0 * (a2 - a1) / segments) * r;
+ f32 cy1 = y + sin(a1 + 0 * (a2 - a1) / segments) * r;
+ f32 cx2, cy2;
+
+ gfx_immediate_renderer_push_vertex(&renderer, x, y, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, cx1, cy1, 0, 0);
+
+ fori (i, 1, segments + 1) {
+ cx2 = x + cos(a1 + i * (a2 - a1) / segments) * r;
+ cy2 = y + sin(a1 + i * (a2 - a1) / segments) * r;
+
+ gfx_immediate_renderer_push_vertex(&renderer, cx1, cy1, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, cx2, cy2, 0, 0);
+
+ cx1 = cx2;
+ cy1 = cy2;
+ }
+
+ gfx_immediate_renderer_push_vertex(&renderer, x, y, 0, 0);
+ gfx_immediate_renderer_push_vertex(&renderer, cx1, cy1, 0, 0);
}
return NULL;
if (w < 0) w = img->width;
if (h < 0) h = img->height;
+ gfx_immediate_renderer_set_primitive_mode(&renderer, IMMEDIATE_MODE_TRIANGLES);
gfx_image_bind(&renderer, img, 0);
gfx_immediate_renderer_push_triangle(&renderer,
hb.graphics.setColor(0, 1, 0);
hb.graphics.rectangle(.Fill, 0, 0, 100, 100);
hb.graphics.setColor(1, 1, 0);
- hb.graphics.rectangle(.Fill, 100, 100, 200, 100);
+ hb.graphics.rectangle(.Line, 100, 100, 200, 100);
mx, my := hb.input.mouseGetPos();
hb.graphics.push();
hb.graphics.rotate(t);
hb.graphics.translate(~~ mx, ~~ my);
hb.graphics.setColor(1, 0, 0);
- hb.graphics.ellipse(.Fill, 0, 0, 25, 15 + 10 * math.sin(t));
+ hb.graphics.ellipse(.Line, 0, 0, 25, 15 + 10 * math.sin(t));
hb.graphics.pop();
hb.graphics.setColor(1, 1, 1, 1);
hb.graphics.rectangle(.Fill, w - 100, h - 100, 100, 100);
hb.graphics.setColor(0, 0, 1);
- hb.graphics.arc(.Fill, 300, 300, 100, math.PI / 4, math.PI * 7 / 4);
+ hb.graphics.arc(.Line, 300, 300, 100, math.PI / 4, math.PI * 7 / 4);
hb.graphics.setColor(0, 1, 1);
- hb.graphics.print("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+`~[{}]\|<,>./?'\";:", 100, 100, 200 + math.sin(t) * 100);
+ hb.graphics.print("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+`~[{}]\|<,>./?'\";:", 400, 100, 200 + math.sin(t) * 100);
+
+ hb.graphics.setColor(1, 1, 1);
+ hb.graphics.circle(.Line, 200, 500, 100, 100);
}