Use list in rasteriser
This commit is contained in:
parent
058dba9276
commit
ab469b8f37
1
compile
1
compile
@ -14,6 +14,7 @@ RAYTRACER_SRC="src/window/*.c \
|
|||||||
RASTERISER_SRC="src/window/*.c \
|
RASTERISER_SRC="src/window/*.c \
|
||||||
src/vector/*.c \
|
src/vector/*.c \
|
||||||
src/scene/*.c \
|
src/scene/*.c \
|
||||||
|
src/list/*.c \
|
||||||
src/rasteriser/*.c \
|
src/rasteriser/*.c \
|
||||||
src/math/*.c \
|
src/math/*.c \
|
||||||
"
|
"
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
#ifndef RASTERISER_H
|
#ifndef RASTERISER_H
|
||||||
#define RASTERISER_H
|
#define RASTERISER_H
|
||||||
|
|
||||||
|
#include "c_cpp_aliases/aliases.h"
|
||||||
|
#include "list/typed_list.h"
|
||||||
#include "vector/vec.h"
|
#include "vector/vec.h"
|
||||||
#include "window/window.h"
|
#include "window/window.h"
|
||||||
|
|
||||||
|
MAKE_LIST_TYPE(f32);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
vec2i_t p0;
|
vec2i_t p0;
|
||||||
vec2i_t p1;
|
vec2i_t p1;
|
||||||
|
@ -1,23 +1,76 @@
|
|||||||
#include "rasteriser/rasteriser.h"
|
#include "rasteriser/rasteriser.h"
|
||||||
#include "c_cpp_aliases/aliases.h"
|
#include "c_cpp_aliases/aliases.h"
|
||||||
|
#include "list/typed_list.h"
|
||||||
#include "vector/vec.h"
|
#include "vector/vec.h"
|
||||||
#include "window/window.h"
|
#include "window/window.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
internal list_float_t *interpolate(i32 i0, f32 d0, i32 i1, f32 d1);
|
||||||
|
|
||||||
void draw_line(window_t *wnd, line_t line, colour_t colour) {
|
void draw_line(window_t *wnd, line_t line, colour_t colour) {
|
||||||
if (line.p1.x < line.p0.x) {
|
|
||||||
vec_swap(vec2i_t, line.p0, line.p1);
|
|
||||||
}
|
|
||||||
|
|
||||||
i32 x0 = line.p0.x;
|
i32 x0 = line.p0.x;
|
||||||
i32 y0 = line.p0.y;
|
i32 y0 = line.p0.y;
|
||||||
i32 x1 = line.p1.x;
|
i32 x1 = line.p1.x;
|
||||||
i32 y1 = line.p1.y;
|
i32 y1 = line.p1.y;
|
||||||
|
|
||||||
f32 a = ((f32)y1 - y0) / ((f32)x1 - x0);
|
list_float_t *values = NULL;
|
||||||
f32 y = y0;
|
|
||||||
|
if (abs(x1 - x0) > abs(y1 - y0)) {
|
||||||
|
if (line.p1.x < line.p0.x) {
|
||||||
|
vec_swap(vec2i_t, line.p0, line.p1);
|
||||||
|
}
|
||||||
|
|
||||||
|
values = interpolate(x0, y0, x1, y1);
|
||||||
|
if (!values) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i32 x = x0; x <= x1; ++x) {
|
for (i32 x = x0; x <= x1; ++x) {
|
||||||
set_pixel(wnd, x, (i32)y, colour);
|
set_pixel(wnd, x, (i32)(get(values, x - x0)), colour);
|
||||||
y += a;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (line.p1.y < line.p0.y) {
|
||||||
|
vec_swap(vec2i_t, line.p0, line.p1);
|
||||||
|
}
|
||||||
|
|
||||||
|
values = interpolate(y0, x0, y1, x1);
|
||||||
|
if (!values) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i32 y = y0; y <= y1; ++y) {
|
||||||
|
set_pixel(wnd, (i32)(get(values, y - y0)), y, colour);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destroy_list(f32, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal list_float_t *interpolate(i32 i0, f32 d0, i32 i1, f32 d1) {
|
||||||
|
list_float_t *values;
|
||||||
|
if (i0 == i1) {
|
||||||
|
values = create_list_with_capacity(f32, 20);
|
||||||
|
if (values) {
|
||||||
|
append(f32, values, d0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
values = create_list(f32);
|
||||||
|
if (!values) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
f32 a = (d1 - d0) / ((f32)i1 - i0);
|
||||||
|
f32 d = d0;
|
||||||
|
|
||||||
|
for (i32 i = i0; i <= i1; ++i) {
|
||||||
|
append(f32, values, d);
|
||||||
|
d += a;
|
||||||
|
}
|
||||||
|
|
||||||
|
return values;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user