diff --git a/modules/Console_Render/draw.jai b/modules/Console_Render/draw.jai index 129b639..9264ca1 100644 --- a/modules/Console_Render/draw.jai +++ b/modules/Console_Render/draw.jai @@ -1,7 +1,7 @@ // "Squashes" two dimensional coordinates onto the one dimensional screen buffer draw :: (using screen: *Screen, p: Vec2s64, char: u8 = DEFAULT_PIXEL_CHAR) { if p.x >= 0 && p.x < width && p.y >= 0 && p.y < height { - buffer[p.y * width + p.x] = cast(u8)char; + buffer[p.y * width + p.x] = char; } } diff --git a/modules/Console_Render/math_extras.jai b/modules/Console_Render/math_extras.jai index 42e518a..351105f 100644 --- a/modules/Console_Render/math_extras.jai +++ b/modules/Console_Render/math_extras.jai @@ -16,19 +16,4 @@ make_quad_from_rect :: (p1: Vec2s64, p2: Vec2s64) -> Quad { .{ p2.x, p2.y }, .{ p1.x, p2.y }, }; -} - -scale :: (factor: float, pn: ..*Vec2s64) { - for pn { - it.x = cast(s64)(it.x * factor); - it.y = cast(s64)(it.y * factor); - } -} - -scale :: (factor: float, t: *Triangle) { - scale(factor, *t.p1, *t.p2, *t.p3); -} - -scale :: (factor: float, q: *Quad) { - scale(factor, *q.p1, *q.p2, *q.p3, *q.p4); } \ No newline at end of file diff --git a/modules/Console_Render/module.jai b/modules/Console_Render/module.jai index 2ff6b51..9ad70c4 100644 --- a/modules/Console_Render/module.jai +++ b/modules/Console_Render/module.jai @@ -106,6 +106,8 @@ maybe_resize_screen :: (screen: *Screen) { #load "draw.jai"; #load "rotate.jai"; +#load "scale.jai"; +#load "translate.jai"; #load "file_operations.jai"; #load "console.jai"; #load "math_extras.jai"; diff --git a/modules/Console_Render/rotate.jai b/modules/Console_Render/rotate.jai index d39b834..0293a31 100644 --- a/modules/Console_Render/rotate.jai +++ b/modules/Console_Render/rotate.jai @@ -1,5 +1,5 @@ // single point rotation -rotate :: (p: *Vec2s64, center: Vec2s64, angle: s64) { +rotate :: (angle: s64, center: Vec2s64, p: *Vec2s64) { rad := cast(float64)angle * (PI / 180.0); // translate to center @@ -16,18 +16,18 @@ rotate :: (p: *Vec2s64, center: Vec2s64, angle: s64) { } // rotate n points -rotate :: (pn: ..*Vec2s64, center: Vec2s64, angle: s64) { +rotate :: (angle: s64, center: Vec2s64, pn: ..*Vec2s64) { for pn { - rotate(it, center, angle); + rotate(angle, center, it); } } // rotate 3 points via triangle struct -rotate :: (t: *Triangle, center: Vec2s64, angle: s64) { - rotate(*t.p1, *t.p2, *t.p3, center = center, angle = angle); +rotate :: (angle: s64, center: Vec2s64, t: *Triangle) { + rotate(angle, center, *t.p1, *t.p2, *t.p3); } // rotate 4 points via quad struct -rotate :: (q: *Quad, center: Vec2s64, angle: s64) { - rotate(*q.p1, *q.p2, *q.p3, *q.p4, center = center, angle = angle); +rotate :: (angle: s64, center: Vec2s64, q: *Quad) { + rotate(angle, center, *q.p1, *q.p2, *q.p3, *q.p4); } \ No newline at end of file diff --git a/modules/Console_Render/scale.jai b/modules/Console_Render/scale.jai new file mode 100644 index 0000000..d38e745 --- /dev/null +++ b/modules/Console_Render/scale.jai @@ -0,0 +1,14 @@ +scale :: (factor: Vector2, pn: ..*Vec2s64) { + for pn { + it.x = cast(s64)(it.x * factor.x); + it.y = cast(s64)(it.y * factor.y); + } +} + +scale :: (factor: Vector2, t: *Triangle) { + scale(factor, *t.p1, *t.p2, *t.p3); +} + +scale :: (factor: Vector2, q: *Quad) { + scale(factor, *q.p1, *q.p2, *q.p3, *q.p4); +} \ No newline at end of file diff --git a/modules/Console_Render/translate.jai b/modules/Console_Render/translate.jai new file mode 100644 index 0000000..4de296d --- /dev/null +++ b/modules/Console_Render/translate.jai @@ -0,0 +1,18 @@ +// for n points +translate :: (amount: Vec2s64, pn: ..*Vec2s64) { + for pn { + it.x += amount.x; + it.y += amount.y; + } +} + +// for a triangle +translate :: (amount: Vec2s64, t: *Triangle) { + translate(amount, *t.p1, *t.p2, *t.p3); +} + + +// for a quad +translate :: (amount: Vec2s64, q: *Quad) { + translate(amount, *q.p1, *q.p2, *q.p3, *q.p4); +} diff --git a/src/main.jai b/src/main.jai index d3d81f6..e2f28e2 100644 --- a/src/main.jai +++ b/src/main.jai @@ -4,73 +4,29 @@ main :: () { w, h := get_console_size(); init_screen(screen, w, h); - i := 0; - j := 0; + offset := 0; + theta := 0; increase := true; while true { - j += 1; + theta += 1; - if i == 0 { - increase = true; - } - - if i == 100 { - increase = false; - } + if offset == 0 then increase = true; + if offset == 100 then increase = false; if increase { - i += 1; + offset += 1; } else { - i -= 1; + offset -= 1; } fill_entire_screen(screen, BLANK_PIXEL); - t1 := Triangle.{ - .{30 - i, 20}, - .{95, 10 - (i / 2)}, - .{90 + i, 40}, - }; + cool_demo_1(screen, offset, theta); - scale(0.01 * i, *t1); - draw_triangle(screen, t1, #char "%"); - - scale(0.02 * i, *t1); - draw_triangle(screen, t1, #char "%"); - - scale(0.03 * i, *t1); - draw_triangle(screen, t1, #char "%"); - - t2 := Triangle.{ - .{100, 30}, - .{140, 30}, - .{120, 20}, - }; - - rotate(*t2, get_triangle_centroid(t2), -j); - - draw_triangle(screen, t2); - - q1 := make_quad_from_rect( - .{100, 10}, - .{110, 20} - ); - - rotate(*q1, .{100, 10}, j); - - draw_quad(screen, q1, #char "-"); + annoying_color_effect(screen, offset); draw_text(screen, .{10, 10}, "[ TEXT-BASED RENDERING DEMO ]"); - - if i % 3 == 0 { - set_console_color(.RED); - } else if i % 5 == 0 { - set_console_color(.GREEN); - } else { - set_console_color(.BLUE, .BOLD); - } - swap_buffer(screen); sleep_milliseconds(20); @@ -78,6 +34,51 @@ main :: () { } } +annoying_color_effect :: (screen: *Screen, modifier: s64) { + if modifier % 3 == 0 { + set_console_color(.RED); + } else if modifier % 5 == 0 { + set_console_color(.GREEN); + } else { + set_console_color(.BLUE, .BOLD); + } +} + +cool_demo_1 :: (screen: *Screen, offset: s64, theta: s64) { + t1 := Triangle.{ + .{30 - offset, 20}, + .{95, 10 - (offset / 2)}, + .{90 + offset, 40}, + }; + + scale(.{0.5, 0.8}, *t1); + translate(.{0, 20}, *t1); + translate(.{50, 5}, *t1); + rotate(theta, get_triangle_centroid(t1), *t1); + + draw_triangle(screen, t1, #char "%"); + + t2 := t1; + + scale(.{0.5, 0.5}, *t1); + draw_triangle(screen, t1, #char "%"); + + draw_line(screen, t1.p1, t2.p1, #char "%"); + draw_line(screen, t1.p2, t2.p2, #char "%"); + draw_line(screen, t1.p3, t2.p3, #char "%"); +} + +cool_demo_2 :: (screen: *Screen, offset: s64, theta: s64) { + q1 := make_quad_from_rect( + .{100, 10}, + .{110, 20} + ); + + rotate(-theta, .{100, 10}, *q1); + + draw_quad(screen, q1, #char "-"); +} + #import "Console_Render"; #import "Basic"; #import "Math";