detect angle between light and square
This commit is contained in:
parent
eb7e708e35
commit
b87a79148d
77
main.cpp
77
main.cpp
@ -189,6 +189,30 @@ struct state state = {
|
|||||||
.normal = { -1, 0, 0 },
|
.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_width = 1;
|
||||||
static int window_height = 1;
|
static int window_height = 1;
|
||||||
|
|
||||||
@ -276,6 +300,47 @@ void render_basis(SDL_Renderer * renderer)
|
|||||||
// cyan: X
|
// cyan: X
|
||||||
assert(SDL_SetRenderDrawColorFloat(renderer, 0, 1, 1, 1));
|
assert(SDL_SetRenderDrawColorFloat(renderer, 0, 1, 1, 1));
|
||||||
render_line(renderer, transform_line({{0, 0, 0}, {1, 0, 0}}, 1.0f));
|
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)
|
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)
|
void render_lines(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
render_basis(renderer);
|
|
||||||
|
|
||||||
// line
|
// line
|
||||||
assert(SDL_SetRenderDrawColorFloat(renderer, 1, 0.5, 0.5, 1));
|
assert(SDL_SetRenderDrawColorFloat(renderer, 1, 0.5, 0.5, 1));
|
||||||
for (int i = 0; i < num_lines; i++) {
|
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);
|
int len = snprintf(buf, 64, "%.03f", d);
|
||||||
x_advance = render_text(renderer, x_advance, y_advance, buf, len);
|
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;
|
static float theta = 0;
|
||||||
@ -465,7 +521,8 @@ int main()
|
|||||||
assert(success == true);
|
assert(success == true);
|
||||||
|
|
||||||
render_text_state(renderer);
|
render_text_state(renderer);
|
||||||
render_lines(renderer);
|
render_basis(renderer);
|
||||||
|
render_quad(renderer);
|
||||||
|
|
||||||
while (SDL_GetTicks() - ticks < (1000 / 60)) { SDL_Delay(1); }
|
while (SDL_GetTicks() - ticks < (1000 / 60)) { SDL_Delay(1); }
|
||||||
SDL_RenderPresent(renderer);
|
SDL_RenderPresent(renderer);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user