diff --git a/src/model/render.c b/src/model/render.c index 1325e73..8b019c1 100644 --- a/src/model/render.c +++ b/src/model/render.c @@ -6,6 +6,7 @@ #include "typed_list.h" #include "utils.h" #include "vec.h" +#include #include typedef struct triangle_bbox TriangleBBox; @@ -51,7 +52,7 @@ void render_model(const Model *model, Render *render, ShaderID shader, } internal void render_triangle(const Triangle *triangle, const Model *model, ShaderID shader, - Render *render, RenderType render_type, Colour colour) { + Render *render, RenderType render_type, Colour colour) { Image *img = &(render->img); VertexData vertices[TRIANGLE_VERTICES]; for (u64 i = 0; i < TRIANGLE_VERTICES; ++i) { @@ -92,6 +93,8 @@ internal void fill_triangle(Render *render, ShaderID shader, VertexData vertices V3f coords; f32 z; f32 zbuf; + V4f shader_colour; + Colour output_colour; FragmentResult result; f32 intensity = 1.0f; @@ -114,13 +117,21 @@ internal void fill_triangle(Render *render, ShaderID shader, VertexData vertices continue; } - result = run_fragment_shader(shader, &coords, &colour, model); + shader_colour = (V4f){.r = colour.r, .g = colour.g, .b = colour.b, .a = colour.a}; + result = run_fragment_shader(shader, &coords, &shader_colour, model); if (DISCARD_FRAGMENT(result)) { continue; } + output_colour = (Colour){ + .r = clamp(result.colour.r, 0, UINT8_MAX), + .g = clamp(result.colour.g, 0, UINT8_MAX), + .b = clamp(result.colour.b, 0, UINT8_MAX), + .a = clamp(result.colour.a, 0, UINT8_MAX), + }; + set_pixel(depth, x, y, &z); - set_pixel(img, x, y, &result.colour); + set_pixel(img, x, y, &output_colour); } } } diff --git a/src/shader/depth_shader.c b/src/shader/depth_shader.c index 5277364..18afdbc 100644 --- a/src/shader/depth_shader.c +++ b/src/shader/depth_shader.c @@ -1,8 +1,5 @@ #include "depth_shader.h" -#include "constants.h" -#include "img.h" #include "shader.h" -#include "utils.h" VertexData depth_shader_vertex(void *shader, const VertexData *vert, u8 index, const Model *model) { DepthShader *shdr = (DepthShader *)shader; @@ -15,16 +12,15 @@ VertexData depth_shader_vertex(void *shader, const VertexData *vert, u8 index, c return shdr->vertices[index]; } -FragmentResult depth_shader_fragment(void *shader, const V3f *barycentric, const Colour *colour, +FragmentResult depth_shader_fragment(void *shader, const V3f *barycentric, const V4f *colour, const Model *model) { DepthShader *shdr = (DepthShader *)shader; M3x3f pos_mat = {.rows = {shdr->vertices[0].position, shdr->vertices[1].position, shdr->vertices[2].position}}; pos_mat = mat3x3_transpose(pos_mat); - V3f position = mat3x3_mul_vec3(pos_mat, (*barycentric)); - f32 channel = clamp(position.z + DEPTH_MAX, 0.0f, DEPTH_MAX); - Colour output = {.r = (u8)(channel), .g = (u8)(channel), .b = (u8)(channel), .a = 255}; + V3f position = mat3x3_mul_vec3(pos_mat, (*barycentric)); + V4f output = {.r = position.z, .g = position.z, .b = position.z, .a = 255}; return (FragmentResult){.colour = output}; } diff --git a/src/shader/depth_shader.h b/src/shader/depth_shader.h index 208b970..afc5fac 100644 --- a/src/shader/depth_shader.h +++ b/src/shader/depth_shader.h @@ -11,7 +11,7 @@ struct depth_shader { }; VertexData depth_shader_vertex(void *shader, const VertexData *vert, u8 index, const Model *model); -FragmentResult depth_shader_fragment(void *shader, const V3f *barycentric, const Colour *colour, +FragmentResult depth_shader_fragment(void *shader, const V3f *barycentric, const V4f *colour, const Model *model); #endif // !DEPTH_SHADER_H diff --git a/src/shader/main_shader.c b/src/shader/main_shader.c index e21a2e6..9575056 100644 --- a/src/shader/main_shader.c +++ b/src/shader/main_shader.c @@ -1,4 +1,5 @@ #include "main_shader.h" +#include "img.h" #include "obj.h" #include "shader.h" #include "utils.h" @@ -23,7 +24,7 @@ VertexData general_shader_vertex(void *shader, const VertexData *vert, u8 index, return shdr->vertices[index]; } -FragmentResult diffuse_shader_fragment(void *shader, const V3f *barycentric, const Colour *colour, +FragmentResult diffuse_shader_fragment(void *shader, const V3f *barycentric, const V4f *colour, const Model *model) { Shader *shdr = (Shader *)shader; @@ -81,11 +82,12 @@ FragmentResult diffuse_shader_fragment(void *shader, const V3f *barycentric, con } #pragma endregion darboux_frame_tangent_normals - Colour output; + V4f output; if (model->texture) { - u64 tx_x = uv.u * model->texture->width; - u64 tx_y = uv.v * model->texture->height; - output = get_pixel(Colour, model->texture, tx_x, tx_y); + u64 tx_x = uv.u * model->texture->width; + u64 tx_y = uv.v * model->texture->height; + Colour tx = get_pixel(Colour, model->texture, tx_x, tx_y); + output = (V4f){.r = tx.r, .g = tx.g, .b = tx.b, .a = tx.a}; } else { output = *colour; } @@ -102,7 +104,7 @@ FragmentResult diffuse_shader_fragment(void *shader, const V3f *barycentric, con return (FragmentResult){.colour = output}; } -FragmentResult albedo_shader_fragment(void *shader, const V3f *barycentric, const Colour *colour, +FragmentResult albedo_shader_fragment(void *shader, const V3f *barycentric, const V4f *colour, const Model *model) { Shader *shdr = (Shader *)shader; @@ -110,11 +112,12 @@ FragmentResult albedo_shader_fragment(void *shader, const V3f *barycentric, cons M2x3f uv_mat = mat3x2_transpose(uvs); V2f uv = mat2x3_mul_vec3(uv_mat, (*barycentric)); - Colour output; + V4f output; if (model->texture) { - u64 tx_x = uv.u * model->texture->width; - u64 tx_y = uv.v * model->texture->height; - output = get_pixel(Colour, model->texture, tx_x, tx_y); + u64 tx_x = uv.u * model->texture->width; + u64 tx_y = uv.v * model->texture->height; + Colour tx = get_pixel(Colour, model->texture, tx_x, tx_y); + output = (V4f){.r = tx.r, .g = tx.g, .b = tx.b, .a = tx.a}; } else { output = *colour; } diff --git a/src/shader/main_shader.h b/src/shader/main_shader.h index 3a37563..7f374e0 100644 --- a/src/shader/main_shader.h +++ b/src/shader/main_shader.h @@ -10,8 +10,8 @@ struct shader { }; VertexData general_shader_vertex(void *shader, const VertexData *vert, u8 index, const Model *model); -FragmentResult diffuse_shader_fragment(void *shader, const V3f *barycentric, const Colour *colour, +FragmentResult diffuse_shader_fragment(void *shader, const V3f *barycentric, const V4f *colour, const Model *model); -FragmentResult albedo_shader_fragment(void *shader, const V3f *barycentric, const Colour *colour, +FragmentResult albedo_shader_fragment(void *shader, const V3f *barycentric, const V4f *colour, const Model *model); #endif // !MAIN_SHADER_H diff --git a/src/shader/shader.c b/src/shader/shader.c index d6c0b3b..fa946a9 100644 --- a/src/shader/shader.c +++ b/src/shader/shader.c @@ -41,7 +41,7 @@ VertexData run_vertex_shader(ShaderID shader, const VertexData *vert, u8 index, return vertex_func(shader_obj, vert, index, model); } -FragmentResult run_fragment_shader(ShaderID shader, const V3f *barycentric, const Colour *colour, +FragmentResult run_fragment_shader(ShaderID shader, const V3f *barycentric, const V4f *colour, const Model *model) { if (IS_INVALID_SHADER(shader) || shader.id > g_repository.count || !colour) { return DISCARDED_FRAGMENT; diff --git a/src/shader/shader.h b/src/shader/shader.h index 381e5aa..6d31419 100644 --- a/src/shader/shader.h +++ b/src/shader/shader.h @@ -2,7 +2,6 @@ #define SHADER_H #include "aliases.h" -#include "img.h" #include "obj.h" #include "vec.h" @@ -20,8 +19,8 @@ struct vertex_data { typedef struct fragment_result FragmentResult; struct fragment_result { - Colour colour; - bool discard; + V4f colour; + bool discard; }; #define INVALID_SHADER ((ShaderID){0}) @@ -30,11 +29,11 @@ struct fragment_result { #define DISCARD_FRAGMENT(RESULT) (RESULT.discard) typedef VertexData(VertexShader)(void *shader, const VertexData *vert, u8 index, const Model *model); -typedef FragmentResult(FragmentShader)(void *shader, const V3f *barycentric, const Colour *colour, +typedef FragmentResult(FragmentShader)(void *shader, const V3f *barycentric, const V4f *colour, const Model *model); ShaderID register_shader(void *shader, VertexShader *vertex, FragmentShader *fragment); VertexData run_vertex_shader(ShaderID shader, const VertexData *vert, u8 index, const Model *model); -FragmentResult run_fragment_shader(ShaderID shader, const V3f *barycentric, const Colour *colour, const Model *model); +FragmentResult run_fragment_shader(ShaderID shader, const V3f *barycentric, const V4f *colour, const Model *model); #endif // SHADER_H diff --git a/src/vec/vec.h b/src/vec/vec.h index 1cce546..6a25fdb 100644 --- a/src/vec/vec.h +++ b/src/vec/vec.h @@ -55,10 +55,22 @@ typedef union f32x4 V4f; union f32x4 { f32 elements[4]; struct { - f32 x; - f32 y; - f32 z; - f32 w; + union { + f32 x; + f32 r; + }; + union { + f32 y; + f32 g; + }; + union { + f32 z; + f32 b; + }; + union { + f32 w; + f32 a; + }; }; };