fake 3d
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
// "Squashes" two dimensional coordinates onto the one dimensional screen buffer
|
// "Squashes" two dimensional coordinates onto the one dimensional screen buffer
|
||||||
draw :: (using screen: *Screen, p: Vec2s64, char: u8 = DEFAULT_PIXEL_CHAR) {
|
draw :: (using screen: *Screen, p: Vec2s64, char: u8 = DEFAULT_PIXEL_CHAR) {
|
||||||
if p.x >= 0 && p.x < width && p.y >= 0 && p.y < height {
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,19 +16,4 @@ make_quad_from_rect :: (p1: Vec2s64, p2: Vec2s64) -> Quad {
|
|||||||
.{ p2.x, p2.y },
|
.{ p2.x, p2.y },
|
||||||
.{ p1.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);
|
|
||||||
}
|
}
|
||||||
@@ -106,6 +106,8 @@ maybe_resize_screen :: (screen: *Screen) {
|
|||||||
|
|
||||||
#load "draw.jai";
|
#load "draw.jai";
|
||||||
#load "rotate.jai";
|
#load "rotate.jai";
|
||||||
|
#load "scale.jai";
|
||||||
|
#load "translate.jai";
|
||||||
#load "file_operations.jai";
|
#load "file_operations.jai";
|
||||||
#load "console.jai";
|
#load "console.jai";
|
||||||
#load "math_extras.jai";
|
#load "math_extras.jai";
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// single point rotation
|
// single point rotation
|
||||||
rotate :: (p: *Vec2s64, center: Vec2s64, angle: s64) {
|
rotate :: (angle: s64, center: Vec2s64, p: *Vec2s64) {
|
||||||
rad := cast(float64)angle * (PI / 180.0);
|
rad := cast(float64)angle * (PI / 180.0);
|
||||||
|
|
||||||
// translate to center
|
// translate to center
|
||||||
@@ -16,18 +16,18 @@ rotate :: (p: *Vec2s64, center: Vec2s64, angle: s64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rotate n points
|
// rotate n points
|
||||||
rotate :: (pn: ..*Vec2s64, center: Vec2s64, angle: s64) {
|
rotate :: (angle: s64, center: Vec2s64, pn: ..*Vec2s64) {
|
||||||
for pn {
|
for pn {
|
||||||
rotate(it, center, angle);
|
rotate(angle, center, it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// rotate 3 points via triangle struct
|
// rotate 3 points via triangle struct
|
||||||
rotate :: (t: *Triangle, center: Vec2s64, angle: s64) {
|
rotate :: (angle: s64, center: Vec2s64, t: *Triangle) {
|
||||||
rotate(*t.p1, *t.p2, *t.p3, center = center, angle = angle);
|
rotate(angle, center, *t.p1, *t.p2, *t.p3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// rotate 4 points via quad struct
|
// rotate 4 points via quad struct
|
||||||
rotate :: (q: *Quad, center: Vec2s64, angle: s64) {
|
rotate :: (angle: s64, center: Vec2s64, q: *Quad) {
|
||||||
rotate(*q.p1, *q.p2, *q.p3, *q.p4, center = center, angle = angle);
|
rotate(angle, center, *q.p1, *q.p2, *q.p3, *q.p4);
|
||||||
}
|
}
|
||||||
14
modules/Console_Render/scale.jai
Normal file
14
modules/Console_Render/scale.jai
Normal file
@@ -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);
|
||||||
|
}
|
||||||
18
modules/Console_Render/translate.jai
Normal file
18
modules/Console_Render/translate.jai
Normal file
@@ -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);
|
||||||
|
}
|
||||||
107
src/main.jai
107
src/main.jai
@@ -4,73 +4,29 @@ main :: () {
|
|||||||
w, h := get_console_size();
|
w, h := get_console_size();
|
||||||
init_screen(screen, w, h);
|
init_screen(screen, w, h);
|
||||||
|
|
||||||
i := 0;
|
offset := 0;
|
||||||
j := 0;
|
theta := 0;
|
||||||
increase := true;
|
increase := true;
|
||||||
while true {
|
while true {
|
||||||
j += 1;
|
theta += 1;
|
||||||
|
|
||||||
if i == 0 {
|
if offset == 0 then increase = true;
|
||||||
increase = true;
|
if offset == 100 then increase = false;
|
||||||
}
|
|
||||||
|
|
||||||
if i == 100 {
|
|
||||||
increase = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if increase {
|
if increase {
|
||||||
i += 1;
|
offset += 1;
|
||||||
} else {
|
} else {
|
||||||
i -= 1;
|
offset -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fill_entire_screen(screen, BLANK_PIXEL);
|
fill_entire_screen(screen, BLANK_PIXEL);
|
||||||
|
|
||||||
t1 := Triangle.{
|
cool_demo_1(screen, offset, theta);
|
||||||
.{30 - i, 20},
|
|
||||||
.{95, 10 - (i / 2)},
|
|
||||||
.{90 + i, 40},
|
|
||||||
};
|
|
||||||
|
|
||||||
scale(0.01 * i, *t1);
|
annoying_color_effect(screen, offset);
|
||||||
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 "-");
|
|
||||||
|
|
||||||
draw_text(screen, .{10, 10}, "[ TEXT-BASED RENDERING DEMO ]");
|
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);
|
swap_buffer(screen);
|
||||||
sleep_milliseconds(20);
|
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 "Console_Render";
|
||||||
#import "Basic";
|
#import "Basic";
|
||||||
#import "Math";
|
#import "Math";
|
||||||
|
|||||||
Reference in New Issue
Block a user