Got projection and view matrices working

This commit is contained in:
Eric-Paul Ickhorn 2023-10-10 17:06:01 +02:00
parent 6f93d55f6c
commit e2b1d027d8
2 changed files with 150 additions and 23 deletions

View File

@ -7,6 +7,7 @@ SDL_Window *window = NULL;
SDL_GLContext gl_context;
int main_shader = 0;
mat4x4 projection_matrix;
mat4x4 view_matrix;
float triangle_vertices[9] = {
0.0f, 0.0f, -1.0f,
@ -22,6 +23,9 @@ typedef struct tc_vec3
} tc_vec3_s;
tc_vec3_s tc_camera_position = { 0.0f, 0.0f, 0.0f };
tc_vec3_s tc_camera_rotation = { 0.0f, 0.0f, 0.0f };
typedef struct tc_object
{
int vbo;
@ -149,16 +153,156 @@ void render()
float color[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, color);
mat4x4_perspective(projection_matrix, 120, 1200 / 800, 0.0001f, 1000.0f);
mat4x4_translate(view_matrix, -tc_camera_position.x, -tc_camera_position.y, tc_camera_position.z);
glUseProgram(main_shader);
int projection_uniform_location = glGetUniformLocation(main_shader, "projection_matrix");
printf("%d\n", projection_uniform_location);
glUniformMatrix4fv(projection_uniform_location, 1, GL_FALSE, &projection_matrix[0][0]);
int view_uniform_location = glGetUniformLocation(main_shader, "view_matrix");
glUniformMatrix4fv(view_uniform_location, 1, GL_FALSE, &view_matrix[0][0]);
// printf("%d\n", view_uniform_location);
// mat4x4_rotate_X(view_matrix, view_matrix, tc_camera_rotation.x);
// mat4x4_rotate_Y(view_matrix, view_matrix, tc_camera_rotation.y);
// mat4x4_rotate_Z(view_matrix, view_matrix, tc_camera_rotation.z);
render_block(block);
SDL_GL_SwapWindow(window);
}
bool shift_pressed = false;
bool go_up = false;
bool go_left = false;
bool go_right = false;
bool go_forward = false;
bool go_backwards = false;
bool update()
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
SDL_HideWindow(window);
return false;
break;
case SDL_WINDOWEVENT:
{
if(event.window.event == SDL_WINDOWEVENT_RESIZED)
{
puts("RESIZED");
}
} break;
case SDL_KEYDOWN:
if(event.key.keysym.scancode == SDL_SCANCODE_W)
{
go_forward = true;
}
if(event.key.keysym.scancode == SDL_SCANCODE_S)
{
go_backwards = true;
}
if(event.key.keysym.scancode == SDL_SCANCODE_A)
{
go_left = true;
}
if(event.key.keysym.scancode == SDL_SCANCODE_D)
{
go_right = true;;
}
if(event.key.keysym.scancode == SDL_SCANCODE_SPACE)
{
go_up = true;
}
if(event.key.keysym.scancode == SDL_SCANCODE_LSHIFT)
{
shift_pressed = true;
}
break;
case SDL_KEYUP:
if(event.key.keysym.scancode == SDL_SCANCODE_W)
{
go_forward = false;
}
if(event.key.keysym.scancode == SDL_SCANCODE_S)
{
go_backwards = false;
}
if(event.key.keysym.scancode == SDL_SCANCODE_A)
{
go_left = false;
}
if(event.key.keysym.scancode == SDL_SCANCODE_D)
{
go_right = false;;
}
if(event.key.keysym.scancode == SDL_SCANCODE_SPACE)
{
go_up = false;
}
if(event.key.keysym.scancode == SDL_SCANCODE_LSHIFT)
{
shift_pressed = false;
}
break;
}
}
if(shift_pressed)
{
tc_camera_position.y -= 0.25;
}
if(go_up)
{
tc_camera_position.y += 0.25;
}
if(go_left)
{
tc_camera_position.x -= 0.25;
}
if(go_right)
{
tc_camera_position.x += 0.25;
}
if(go_forward)
{
tc_camera_position.z += 0.25;
}
if(go_backwards)
{
tc_camera_position.z -= 0.25;
}
return true;
}
int main(int argc, char **argv)
{
SDL_Init(SDL_INIT_EVERYTHING);
@ -176,7 +320,6 @@ int main(int argc, char **argv)
gladLoadGLLoader(&SDL_GL_GetProcAddress);
gladLoadGL();
mat4x4_perspective(projection_matrix, 120, 1200 / 800, 0.0001f, 1000.0f);
main_shader = setup_shaders("vertex_shader.glsl", "fragment_shader.glsl");
block = tc_new_block_at_3f(0.0, 0.0, 0.0);
@ -184,27 +327,10 @@ int main(int argc, char **argv)
int64_t frame_index = 1;
while(frame_index > 0)
{
SDL_Event event;
while(SDL_PollEvent(&event))
if(!update())
{
switch(event.type)
{
case SDL_QUIT:
SDL_HideWindow(window);
frame_index = -1;
break;
break;
case SDL_WINDOWEVENT:
{
if(event.window.event == SDL_WINDOWEVENT_RESIZED)
{
puts("RESIZED");
}
} break;
}
}
render();
if(frame_index == 1)

View File

@ -3,9 +3,10 @@
layout(location=0) in vec3 pos;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
void main() {
gl_Position = vec4(pos, 1.0) * projection_matrix;
}
gl_Position = projection_matrix * view_matrix * vec4(pos, 1.0);