handle input correctly
This commit is contained in:
parent
59937f3cd5
commit
a539bf2b8f
48
main.c
48
main.c
|
@ -28,9 +28,9 @@ die(char *msg)
|
|||
|
||||
const rgb WHITE = {255, 255, 255, 255};
|
||||
const rgb BLACK = {0, 0, 0, 255};
|
||||
const rgb RED = {255, 0, 0, 255};
|
||||
const rgb GREEN = {0, 255, 0, 255};
|
||||
const rgb BLUE = {0, 0, 255, 255};
|
||||
const rgb RED = {255, 60, 40, 255};
|
||||
const rgb GREEN = {40, 255, 70, 255};
|
||||
const rgb BLUE = {50, 70, 255, 255};
|
||||
|
||||
const vec3 UP = {0, 1, 0};
|
||||
|
||||
|
@ -572,12 +572,12 @@ draw_mesh(rgb canvas[], rgb col, camera c, mesh mesh)
|
|||
}
|
||||
else {
|
||||
if (x < 0) {
|
||||
double col_mod = clamp(vec3_dot(norm, (vec3){200, 200, 200}) * 0.8, 0.0, 255.0);
|
||||
double col_mod = clamp(vec3_dot(norm, vec3_normalize(c.pos)), 0.0, 1.0);
|
||||
fill_triangle(canvas,
|
||||
(rgb) {
|
||||
.r = col_mod,
|
||||
.g = col_mod,
|
||||
.b = col_mod
|
||||
.r = col.r * col_mod,
|
||||
.g = col.g * col_mod,
|
||||
.b = col.b * col_mod
|
||||
},
|
||||
project_triangle(c, (triangle3) {
|
||||
v0, v1, v2
|
||||
|
@ -654,6 +654,7 @@ main(void)
|
|||
{
|
||||
sdl_state state = init_sdl();
|
||||
camera cam = new_camera(180, (vec3){0, 0, 200}, (vec3){0, 0, 0}, UP);
|
||||
|
||||
/* print_camera(cam); */
|
||||
|
||||
SDL_Event event;
|
||||
|
@ -663,7 +664,7 @@ main(void)
|
|||
|
||||
uint64_t t = 0;
|
||||
|
||||
double rot_speed = 0.5;
|
||||
double rot_speed = 0.6;
|
||||
for (;;) {
|
||||
double elapsed, start = SDL_GetPerformanceCounter();
|
||||
|
||||
|
@ -676,12 +677,7 @@ main(void)
|
|||
int x, y;
|
||||
uint32_t buttons = SDL_GetMouseState(&x, &y);
|
||||
|
||||
if (buttons & SDL_BUTTON(2))
|
||||
screenshot(state.canvas);
|
||||
else if (buttons & (SDL_BUTTON(1)))
|
||||
wireframe = !wireframe;
|
||||
|
||||
clear_canvas(state.canvas, BLACK);
|
||||
clear_canvas(state.canvas, (rgb){7, 7, 7, 255});
|
||||
|
||||
for (size_t i = 0; i < obj.vertex_num; i++) {
|
||||
obj_copy.vertices[i] = vec3_matrix3x3_multiply(obj.vertices[i], rotation);
|
||||
|
@ -690,8 +686,27 @@ main(void)
|
|||
draw_mesh(state.canvas, WHITE, cam, obj_copy);
|
||||
|
||||
render(state);
|
||||
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
|
||||
break;
|
||||
while (SDL_PollEvent(&event)) {
|
||||
switch (event.type) {
|
||||
case SDL_KEYDOWN: {
|
||||
switch (event.key.keysym.scancode) {
|
||||
case SDL_SCANCODE_F3: {
|
||||
if (!event.key.repeat) wireframe = !wireframe;
|
||||
break;
|
||||
}
|
||||
case SDL_SCANCODE_F6: {
|
||||
if (!event.key.repeat) screenshot(state.canvas);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SDL_QUIT:
|
||||
goto quit;
|
||||
}
|
||||
}
|
||||
|
||||
elapsed = (SDL_GetPerformanceCounter() - start) / (double)SDL_GetPerformanceFrequency() * 1000.0;
|
||||
SDL_Delay(clamp(16.666f - elapsed, 0, 1000));
|
||||
|
@ -699,6 +714,7 @@ main(void)
|
|||
t++;
|
||||
}
|
||||
|
||||
quit:
|
||||
free_mesh(obj);
|
||||
free_mesh(obj_copy);
|
||||
free_sdl(state);
|
||||
|
|
Loading…
Reference in New Issue