From b87a79148d6041cc8ff217d0b6751363218813dc Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sat, 8 Feb 2025 16:28:43 -0600 Subject: [PATCH] detect angle between light and square --- main.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 10 deletions(-) diff --git a/main.cpp b/main.cpp index 2dcea64..445a2b7 100644 --- a/main.cpp +++ b/main.cpp @@ -189,6 +189,30 @@ struct state state = { .normal = { -1, 0, 0 }, }; +struct edge_normal { + struct line edge; + vec3 normal; +}; + +struct edge_normal quad[4] = { + { + .edge = {{-1, -1, 0}, { 1, -1, 0}}, + .normal = {0, -1, 0}, + }, + { + .edge = {{ 1, -1, 0}, { 1, 1, 0}}, + .normal = {1, 0, 0}, + }, + { + .edge = {{ 1, 1, 0}, {-1, 1, 0}}, + .normal = {0, 1, 0}, + }, + { + .edge = {{-1, 1, 0}, {-1, -1, 0}}, + .normal = {-1, 0, 0}, + }, +}; + static int window_width = 1; static int window_height = 1; @@ -276,6 +300,47 @@ void render_basis(SDL_Renderer * renderer) // cyan: X assert(SDL_SetRenderDrawColorFloat(renderer, 0, 1, 1, 1)); render_line(renderer, transform_line({{0, 0, 0}, {1, 0, 0}}, 1.0f)); + + vec3 z = transform_vertex({0, 0, 1}, 1.1); + vec3 y = transform_vertex({0, 1, 0}, 1.1); + vec3 x = transform_vertex({1, 0, 0}, 1.1); + + render_text(renderer, ((z.x - 30) * 64), ((z.y + 10) * 64), "+z", 2); + render_text(renderer, ((y.x - 30) * 64), ((y.y + 10) * 64), "+y", 2); + render_text(renderer, ((x.x - 30) * 64), ((x.y + 10) * 64), "+x", 2); +} + +static float ltheta = 0; + +void render_quad(SDL_Renderer * renderer) +{ + vec3 light_origin = {0, 0, 0}; + vec3 light_pos = {1, 1, 1}; + mat3x3 rot = { + cos(ltheta), -sin(ltheta), 0, + sin(ltheta), cos(ltheta), 0, + 0, 0, 1, + }; + light_pos = rot * light_pos; + ltheta += deg / 4; + vec3 light_vec = light_origin - light_pos; + + for (int i = 0; i < 4; i++) { + float d = dot(light_vec, quad[i].normal); + + if (d > 0) + assert(SDL_SetRenderDrawColorFloat(renderer, 1, 1, 1, 1)); + else + assert(SDL_SetRenderDrawColorFloat(renderer, 0, 0, 1, 1)); + render_line(renderer, transform_line(quad[i].edge, 0.25f)); + + vec3 origin = (quad[i].edge.a + quad[i].edge.b) / 2.0f; + assert(SDL_SetRenderDrawColorFloat(renderer, 1, 0, 0, 1)); + render_line(renderer, transform_line({origin, origin + quad[i].normal}, 0.25f)); + } + + assert(SDL_SetRenderDrawColorFloat(renderer, 0, 1, 0, 1)); + render_line(renderer, transform_line({light_origin, light_pos}, 0.5f)); } mat3x3 rotate_to(vec3 old_normal, vec3 new_normal) @@ -332,8 +397,6 @@ mat4x4 look_at(vec3 eye, vec3 center, vec3 up) void render_lines(SDL_Renderer * renderer) { - render_basis(renderer); - // line assert(SDL_SetRenderDrawColorFloat(renderer, 1, 0.5, 0.5, 1)); for (int i = 0; i < num_lines; i++) { @@ -393,13 +456,6 @@ void render_text_state(SDL_Renderer * renderer) int len = snprintf(buf, 64, "%.03f", d); x_advance = render_text(renderer, x_advance, y_advance, buf, len); */ - vec3 z = transform_vertex({0, 0, 1}, 1.1); - vec3 y = transform_vertex({0, 1, 0}, 1.1); - vec3 x = transform_vertex({1, 0, 0}, 1.1); - - render_text(renderer, ((z.x - 30) * 64), ((z.y + 10) * 64), "+z", 2); - render_text(renderer, ((y.x - 30) * 64), ((y.y + 10) * 64), "+y", 2); - render_text(renderer, ((x.x - 30) * 64), ((x.y + 10) * 64), "+x", 2); } static float theta = 0; @@ -465,7 +521,8 @@ int main() assert(success == true); render_text_state(renderer); - render_lines(renderer); + render_basis(renderer); + render_quad(renderer); while (SDL_GetTicks() - ticks < (1000 / 60)) { SDL_Delay(1); } SDL_RenderPresent(renderer);