From f9ad6fa902c1167d7622ee7af2617d14b62bee21 Mon Sep 17 00:00:00 2001 From: pryazha Date: Wed, 19 Feb 2025 22:26:48 +0500 Subject: quite a lot of changes that I, of course, are not going to describe;) --- advanced_opengl/9.instancing/instancing | Bin 1065104 -> 1065224 bytes advanced_opengl/9.instancing/instancing.c | 672 +++++++++------------ advanced_opengl/9.instancing/shaders/default.frag | 12 + advanced_opengl/9.instancing/shaders/default.fs | 13 - advanced_opengl/9.instancing/shaders/default.vert | 17 + advanced_opengl/9.instancing/shaders/default.vs | 18 - .../9.instancing/shaders/instanced_arrays.frag | 10 + .../9.instancing/shaders/instanced_arrays.fs | 11 - .../9.instancing/shaders/instanced_arrays.vert | 13 + .../9.instancing/shaders/instanced_arrays.vs | 14 - .../9.instancing/shaders/instanced_mat4.frag | 13 + .../9.instancing/shaders/instanced_mat4.fs | 14 - .../9.instancing/shaders/instanced_mat4.vert | 15 + .../9.instancing/shaders/instanced_mat4.vs | 16 - .../shaders/instancing_uniform_array.frag | 10 + .../shaders/instancing_uniform_array.fs | 11 - .../shaders/instancing_uniform_array.vert | 13 + .../shaders/instancing_uniform_array.vs | 14 - 18 files changed, 384 insertions(+), 502 deletions(-) create mode 100644 advanced_opengl/9.instancing/shaders/default.frag delete mode 100644 advanced_opengl/9.instancing/shaders/default.fs create mode 100644 advanced_opengl/9.instancing/shaders/default.vert delete mode 100644 advanced_opengl/9.instancing/shaders/default.vs create mode 100644 advanced_opengl/9.instancing/shaders/instanced_arrays.frag delete mode 100644 advanced_opengl/9.instancing/shaders/instanced_arrays.fs create mode 100644 advanced_opengl/9.instancing/shaders/instanced_arrays.vert delete mode 100644 advanced_opengl/9.instancing/shaders/instanced_arrays.vs create mode 100644 advanced_opengl/9.instancing/shaders/instanced_mat4.frag delete mode 100644 advanced_opengl/9.instancing/shaders/instanced_mat4.fs create mode 100644 advanced_opengl/9.instancing/shaders/instanced_mat4.vert delete mode 100644 advanced_opengl/9.instancing/shaders/instanced_mat4.vs create mode 100644 advanced_opengl/9.instancing/shaders/instancing_uniform_array.frag delete mode 100644 advanced_opengl/9.instancing/shaders/instancing_uniform_array.fs create mode 100644 advanced_opengl/9.instancing/shaders/instancing_uniform_array.vert delete mode 100644 advanced_opengl/9.instancing/shaders/instancing_uniform_array.vs (limited to 'advanced_opengl/9.instancing') diff --git a/advanced_opengl/9.instancing/instancing b/advanced_opengl/9.instancing/instancing index c722860..c1a31f8 100755 Binary files a/advanced_opengl/9.instancing/instancing and b/advanced_opengl/9.instancing/instancing differ diff --git a/advanced_opengl/9.instancing/instancing.c b/advanced_opengl/9.instancing/instancing.c index f24a258..e77c693 100644 --- a/advanced_opengl/9.instancing/instancing.c +++ b/advanced_opengl/9.instancing/instancing.c @@ -2,403 +2,293 @@ #include "GLFW/glfw3.h" #include "pwyazh.h" - #include "pwyazh_GL.h" #include "common.h" -#include +int main(void) +{ + GLFWwindow *window; + State state; + S32 width, height; + Input input; + Arena *arena = 0; + B32 move_camera; -static S32 global_width = 1024, global_height = 768; -static Input global_input; + if (glfwInit() == GLFW_FALSE) { + fprintf(stderr, "[ERROR] Failed to initialize glfw.\n"); + return(1); + } -void -key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) -{ - switch (action) - { - case GLFW_PRESS: { - switch (key) - { - case GLFW_KEY_D: { - global_input.move_right.state = KeyState_PRESS; - } break; - case GLFW_KEY_W: { - global_input.move_forward.state = KeyState_PRESS; - } break; - case GLFW_KEY_A: { - global_input.move_left.state = KeyState_PRESS; - } break; - case GLFW_KEY_S: { - global_input.move_backward.state = KeyState_PRESS; - } break; - case GLFW_KEY_E: { - global_input.move_up.state = KeyState_PRESS; - } break; - case GLFW_KEY_Q: { - global_input.move_down.state = KeyState_PRESS; - } break; - case GLFW_KEY_SPACE: { - global_input.jump.state = KeyState_PRESS; - } break; - case GLFW_KEY_RIGHT: { - global_input.action_right.state = KeyState_PRESS; - } break; - case GLFW_KEY_LEFT: { - global_input.action_left.state = KeyState_PRESS; - } break; - case GLFW_KEY_ESCAPE: { - global_input.exit.state = KeyState_PRESS; - } break; - } - } break; - - case GLFW_RELEASE: { - switch (key) - { - case GLFW_KEY_D: { - global_input.move_right.state = KeyState_RELEASE; - } break; - case GLFW_KEY_W: { - global_input.move_forward.state = KeyState_RELEASE; - } break; - case GLFW_KEY_A: { - global_input.move_left.state = KeyState_RELEASE; - } break; - case GLFW_KEY_S: { - global_input.move_backward.state = KeyState_RELEASE; - } break; - case GLFW_KEY_E: { - global_input.move_up.state = KeyState_RELEASE; - } break; - case GLFW_KEY_Q: { - global_input.move_down.state = KeyState_RELEASE; - } break; - case GLFW_KEY_SPACE: { - global_input.jump.state = KeyState_RELEASE; - } break; - case GLFW_KEY_RIGHT: { - global_input.action_right.state = KeyState_RELEASE; - } break; - case GLFW_KEY_LEFT: { - global_input.action_left.state = KeyState_RELEASE; - } break; - case GLFW_KEY_ESCAPE: { - global_input.exit.state = KeyState_RELEASE; - } break; - } - } break; - } -} + width = 1024; + height = 768; -void -window_resize_callback(GLFWwindow* window, int width, int height) -{ - global_width = width; - global_height = height; - glViewport(0, 0, global_width, global_height); -} + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + window = glfwCreateWindow(width, height, "Instancing", 0, 0); + if (!window) { + fprintf(stderr, "[ERROR] Failed to create window.\n"); + glfwTerminate(); + return(1); + } -int -main(void) -{ - GLFWwindow *window; - Arena *arena = 0; - - if (glfwInit() == GLFW_FALSE) - { - fprintf(stderr, "[ERROR] Failed to initialize glfw.\n"); - return(1); - } - - /* glfwWindowHint(GLFW_RESIZABLE, 0); */ - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - window = glfwCreateWindow(global_width, global_height, "Instancing", 0, 0); - if (!window) - { - fprintf(stderr, "[ERROR] Failed to create window.\n"); - glfwTerminate(); - return(1); - } - - glfwMakeContextCurrent(window); - - glfwSetKeyCallback(window, key_callback); - glfwSetWindowSizeCallback(window, window_resize_callback); - - if (glewInit() != GLEW_OK) - { - fprintf(stderr, "[ERROR] Failed to initialize glew.\n"); - glfwTerminate(); - return(1); - } - - glEnable(GL_DEPTH_TEST); - - U32 instancing_uniform_array_shader = - create_shader_program("shaders/instancing_uniform_array.vs", - "shaders/instancing_uniform_array.fs"); - U32 instanced_arrays_shader = - create_shader_program("shaders/instanced_arrays.vs", - "shaders/instanced_arrays.fs"); - - F32 quad_vertices[] = { - -0.05f, 0.05f, 1.0f, 0.0f, 0.0f, - 0.05f, -0.05f, 0.0f, 1.0f, 0.0f, - -0.05f, -0.05f, 0.0f, 0.0f, 1.0f, - - -0.05f, 0.05f, 1.0f, 0.0f, 0.0f, - 0.05f, -0.05f, 0.0f, 1.0f, 0.0f, - 0.05f, 0.05f, 0.0f, 1.0f, 1.0f, - }; - - GLuint quad_vao, vbo; - glGenVertexArrays(1, &quad_vao); - glBindVertexArray(quad_vao); - glGenBuffers(1, &vbo); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - glBufferData(GL_ARRAY_BUFFER, sizeof(quad_vertices), quad_vertices, GL_STATIC_DRAW); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(2*sizeof(F32))); - glBindVertexArray(0); - - V2F translations[100]; - S32 index = 0; - F32 offset = 0.1f; - for (S32 y = -10; - y < 10; - y += 2) - { - for (S32 x = -10; - x < 10; - x += 2) - { - V2F translation = v2f((F32)x, (F32)y); - translation = v2f_scalef(translation, 1.0f/10.0f); - translation = v2f_add(translation, v2f(offset, offset)); - translations[index++] = translation; - } - } - - U32 instance_vbo; - glBindVertexArray(quad_vao); - glGenBuffers(1, &instance_vbo); - glBindBuffer(GL_ARRAY_BUFFER, instance_vbo); - glBufferData(GL_ARRAY_BUFFER, sizeof(translations), translations, GL_STATIC_DRAW); - glEnableVertexAttribArray(2); - glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(V2F), (void *)0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glVertexAttribDivisor(2, 1); - glBindVertexArray(0); - - arena = arena_alloc(Megabytes(64)); - - U32 default_shader = create_shader_program("shaders/default.vs", "shaders/default.fs"); - U32 instanced_shader = create_shader_program("shaders/instanced_mat4.vs", - "shaders/instanced_mat4.fs"); - Mesh *planet_mesh = mesh_load_obj(arena, "../../data/models/planet/planet.obj"); - U32 planet_texture = load_texture("../../data/models/planet/mars.png"); - Mesh *rock_mesh = mesh_load_obj(arena, "../../data/models/rock/rock.obj"); - U32 rock_texture = load_texture("../../data/models/rock/rock.png"); - - S32 amount = 80000; - F32 radius = 150.0f; - offset = 25.0f; - MAT4 trns[amount]; - for (S32 i = 0; i < amount; ++i) - { - F32 angle, displacement, x, y, z, scale; - MAT4 model = mat4_identity(); - - angle = rand()%360; - model = mat4_rotate_angles(model, v3f(angle, angle, angle)); - - scale = (rand()%20)/100.0f+0.05f; - model = mat4_scale(model, v3f(scale, scale, scale)); - - angle = ((F32)i/(F32)amount)*360.0f; - displacement = (rand()%(S32)(2.0f*offset))-offset; - x = f32_sin(DEG2RAD*angle)*radius+displacement; - displacement = (rand()%(S32)(2.0f*offset))-offset; - y = 0.4f*displacement; - displacement = (rand()%(S32)(2.0f*offset))-offset; - z = f32_cos(DEG2RAD*angle)*radius; - model = mat4_translate(model, v3f(x, y, z)); - - trns[i] = model; - } - - U32 buffer; - glGenBuffers(1, &buffer); - glBindBuffer(GL_ARRAY_BUFFER, buffer); - glBufferData(GL_ARRAY_BUFFER, amount*sizeof(MAT4), &trns[0], GL_STATIC_DRAW); - glBindVertexArray(rock_mesh->vao); - glEnableVertexAttribArray(3); - glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 4*sizeof(V4F), (void *)0); - glEnableVertexAttribArray(4); - glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 4*sizeof(V4F), (void *)(1*sizeof(V4F))); - glEnableVertexAttribArray(5); - glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 4*sizeof(V4F), (void *)(2*sizeof(V4F))); - glEnableVertexAttribArray(6); - glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, 4*sizeof(V4F), (void *)(3*sizeof(V4F))); - - glVertexAttribDivisor(3, 1); - glVertexAttribDivisor(4, 1); - glVertexAttribDivisor(5, 1); - glVertexAttribDivisor(6, 1); - glBindVertexArray(0); - - F32 target_fps = 60.0f; - F32 target_spf = 1.0f/target_fps; - - F32 last_time = glfwGetTime(); - F32 time = last_time; - F32 dt; - - S32 scene = 0; - S32 number_scene = 4; - - MAT4 projection, view, model; - - V3F camera_pos = v3f(0.0f, 50.0f, 220.0f); - F32 camera_speed = 10.0f; - F32 fovx = 90.0f; - F32 near = 0.1f; - F32 far = 1000.0f; - - while (!glfwWindowShouldClose(window)) - { - glfwPollEvents(); - - /* NOTE(pryazha): Update */ - if (key_is_pressed(global_input.exit)) - { - glfwSetWindowShouldClose(window, GLFW_TRUE); - } - if (key_first_press(global_input.jump) || - key_first_press(global_input.action_right)) - { - scene++; - } - else if (key_first_press(global_input.action_left)) - { - scene--; - if (scene < 0) - scene = number_scene-1; - } - scene %= number_scene; - - /* NOTE(pryazha): Render */ - glClearColor(0.15f, 0.15f, 0.15f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - switch (scene) - { - case 0: { - glUseProgram(instancing_uniform_array_shader); - for (S32 translation_index = 0; - translation_index < 100; - ++translation_index) - { - char temp[256]; - snprintf(temp, 256, "offsets[%d]", translation_index); - shader_set_2fv(instancing_uniform_array_shader, - temp, translations[translation_index]); - } - glBindVertexArray(quad_vao); - glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100); - glBindVertexArray(0); - } break; - - case 1: { - glUseProgram(instanced_arrays_shader); - glBindVertexArray(quad_vao); - glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100); - glBindVertexArray(0); - } break; - - case 2: { - V3F camera_dv = get_dv_camera_orbital(&global_input, - camera_pos, v3f_zero(), - dt, camera_speed); - camera_pos = v3f_add(camera_pos, camera_dv); - - projection = perspective(fovx, (F32)global_width/(F32)global_height, near, far); - V3F world_up = v3f(0.0f, 1.0f, 0.0f); - view = look_at(camera_pos, v3f_zero(), world_up); - - glUseProgram(default_shader); - shader_set_mat4fv(default_shader, "projection", projection); - shader_set_mat4fv(default_shader, "view", view); - - F32 scale = 5.0f; - model = mat4_make_scale(v3f(scale, scale, scale)); - shader_set_mat4fv(default_shader, "model", model); - glBindTexture(GL_TEXTURE_2D, planet_texture); - mesh_draw(planet_mesh); - - glBindTexture(GL_TEXTURE_2D, rock_texture); - for (S32 i = 0; i < amount; ++i) - { - model = trns[i]; - shader_set_mat4fv(default_shader, "model", model); - mesh_draw(rock_mesh); - } - } break; - - case 3: { - V3F camera_dv = get_dv_camera_orbital(&global_input, - camera_pos, v3f_zero(), - dt, camera_speed); - camera_pos = v3f_add(camera_pos, camera_dv); - - projection = perspective(fovx, (F32)global_width/(F32)global_height, near, far); - V3F world_up = v3f(0.0f, 1.0f, 0.0f); - view = look_at(camera_pos, v3f_zero(), world_up); - - glUseProgram(default_shader); - shader_set_mat4fv(default_shader, "projection", projection); - shader_set_mat4fv(default_shader, "view", view); - F32 scale = 5.0f; - model = mat4_make_scale(v3f(scale, scale, scale)); - shader_set_mat4fv(default_shader, "model", model); - glBindTexture(GL_TEXTURE_2D, planet_texture); - mesh_draw(planet_mesh); - glBindTexture(GL_TEXTURE_2D, 0); - - glUseProgram(instanced_shader); - shader_set_mat4fv(default_shader, "projection", projection); - shader_set_mat4fv(default_shader, "view", view); - glBindTexture(GL_TEXTURE_2D, rock_texture); - glBindVertexArray(rock_mesh->vao); - glDrawElementsInstanced(GL_TRIANGLES, rock_mesh->index_count, - GL_UNSIGNED_INT, 0, amount); - glBindVertexArray(0); - glBindTexture(GL_TEXTURE_2D, 0); - } break; - } - - input_update_last_state(&global_input); - - glfwSwapBuffers(window); - - F32 elapsed = glfwGetTime()-last_time; - if (elapsed < target_spf) - { - U32 sleep_time = (U32)(target_spf-elapsed); - if (sleep_time > 0) - sleep(sleep_time); - } - F32 current_time = glfwGetTime(); - dt = current_time-last_time; - time += dt; - last_time = current_time; - } - - glfwTerminate(); - return(0); + glfwMakeContextCurrent(window); + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + + if (glewInit() != GLEW_OK) { + fprintf(stderr, "[ERROR] Failed to initialize glew.\n"); + glfwTerminate(); + return(1); + } + + glEnable(GL_DEPTH_TEST); + + U32 instancing_uniform_array_shader = create_shader_program("shaders/instancing_uniform_array.vert", + "shaders/instancing_uniform_array.frag"); + U32 instanced_arrays_shader = create_shader_program("shaders/instanced_arrays.vert", + "shaders/instanced_arrays.frag"); + U32 default_shader = create_shader_program("shaders/default.vert", + "shaders/default.frag"); + U32 instanced_shader = create_shader_program("shaders/instanced_mat4.vert", + "shaders/instanced_mat4.frag"); + + F32 quad_vertices[] = { + -0.05f, 0.05f, 1.0f, 0.0f, 0.0f, + 0.05f, -0.05f, 0.0f, 1.0f, 0.0f, + -0.05f, -0.05f, 0.0f, 0.0f, 1.0f, + + -0.05f, 0.05f, 1.0f, 0.0f, 0.0f, + 0.05f, -0.05f, 0.0f, 1.0f, 0.0f, + 0.05f, 0.05f, 0.0f, 1.0f, 1.0f, + }; + + GLuint quad_vao, vbo; + glGenVertexArrays(1, &quad_vao); + glBindVertexArray(quad_vao); + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(quad_vertices), quad_vertices, GL_STATIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(2*sizeof(F32))); + glBindVertexArray(0); + + V2F translations[100]; + S32 index = 0; + F32 offset = 0.1f; + for (S32 y = -10; y < 10; y += 2) { + for (S32 x = -10; x < 10; x += 2) { + V2F translation = v2f((F32)x, (F32)y); + translation = v2f_scalef(translation, 1.0f/10.0f); + translation = v2f_add(translation, v2f(offset, offset)); + translations[index++] = translation; + } + } + + U32 instance_vbo; + glBindVertexArray(quad_vao); + glGenBuffers(1, &instance_vbo); + glBindBuffer(GL_ARRAY_BUFFER, instance_vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(translations), translations, GL_STATIC_DRAW); + glEnableVertexAttribArray(2); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(V2F), (void *)0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glVertexAttribDivisor(2, 1); + glBindVertexArray(0); + + arena = arena_alloc(Megabytes(64)); + + Mesh *planet_mesh = mesh_load_obj(arena, "../../data/models/planet/planet.obj"); + Mesh *rock_mesh = mesh_load_obj(arena, "../../data/models/rock/rock.obj"); + + U32 planet_texture = load_texture("../../data/models/planet/mars.png"); + U32 rock_texture = load_texture("../../data/models/rock/rock.png"); + + S32 amount = 80000; + F32 radius = 150.0f; + offset = 25.0f; + MAT4 trns[amount]; + for (S32 i = 0; i < amount; ++i) { + F32 angle, displacement, x, y, z, scale; + MAT4 model = mat4_identity(); + + angle = rand()%360; + model = mat4_rotate_angles(model, v3f(angle, angle, angle)); + + scale = (rand()%20)/100.0f+0.05f; + model = mat4_scale(model, v3f(scale, scale, scale)); + + angle = ((F32)i/(F32)amount)*360.0f; + displacement = (rand()%(S32)(2.0f*offset))-offset; + x = f32_sin(DEG2RAD*angle)*radius+displacement; + displacement = (rand()%(S32)(2.0f*offset))-offset; + y = 0.4f*displacement; + displacement = (rand()%(S32)(2.0f*offset))-offset; + z = f32_cos(DEG2RAD*angle)*radius; + model = mat4_translate(model, v3f(x, y, z)); + + trns[i] = model; + } + + U32 buffer; + glGenBuffers(1, &buffer); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + glBufferData(GL_ARRAY_BUFFER, amount*sizeof(MAT4), &trns[0], GL_STATIC_DRAW); + glBindVertexArray(rock_mesh->vao); + glEnableVertexAttribArray(3); + glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 4*sizeof(V4F), (void *)0); + glEnableVertexAttribArray(4); + glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 4*sizeof(V4F), (void *)(1*sizeof(V4F))); + glEnableVertexAttribArray(5); + glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 4*sizeof(V4F), (void *)(2*sizeof(V4F))); + glEnableVertexAttribArray(6); + glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, 4*sizeof(V4F), (void *)(3*sizeof(V4F))); + + glVertexAttribDivisor(3, 1); + glVertexAttribDivisor(4, 1); + glVertexAttribDivisor(5, 1); + glVertexAttribDivisor(6, 1); + glBindVertexArray(0); + + state.camera = (Camera) { + v3f(0.0f, 50.0f, 220.0f), + 90.0f, 0.1f, 1000.0f, + 0.0f, 0.0f + }; + F32 camera_speed = 10.0f; + + F32 target_fps = 60.0f; + F32 target_spf = 1.0f/target_fps; + F32 last_time = glfwGetTime(); + F32 time = last_time; + + S32 scene = 0; + S32 number_scene = 4; + + while (!glfwWindowShouldClose(window)) { + glfwPollEvents(); + + /* NOTE(pryazha): Update */ + glfwGetFramebufferSize(window, &width, &height); + process_glfw_keyboard(window, &input); + process_glfw_mouse_pos(window, &input); + + if (key_is_pressed(input.exit)) + glfwSetWindowShouldClose(window, GLFW_TRUE); + + if (key_first_press(input.jump) || + key_first_press(input.action_right)) { + scene++; + } else if (key_first_press(input.action_left)) { + scene--; + if (scene < 0) + scene = number_scene-1; + } + scene %= number_scene; + + move_camera = (scene > 1) ? 1 : 0; + + if (move_camera) { + V3F dv = get_dv_camera_first_person(&input, &state.camera, + 4.0f, state.dt); + state.camera.pos = v3f_add(state.camera.pos, dv); + F32 sensitivity = 0.1f; + input.mouse_offset = v2f_scalef(input.mouse_offset, sensitivity); + state.camera.yaw += input.mouse_offset.x; + state.camera.pitch += input.mouse_offset.y; + if (state.camera.pitch > 89.0f) + state.camera.pitch = 89.0f; + if (state.camera.pitch < -89.0f) + state.camera.pitch = -89.0f; + } + + input_update_last_state(&input); + + /* NOTE(pryazha): Render */ + MAT4 proj, view, model; + F32 scale = 5.0f; + + view = get_view_matrix(&state.camera); + proj = perspective(state.camera.fovx, (F32)width/(F32)height, + state.camera.near, state.camera.far); + + glClearColor(0.15f, 0.15f, 0.15f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + switch (scene) { + case 0: + glUseProgram(instancing_uniform_array_shader); + for (S32 i = 0; i < 100; ++i) { + char temp[256]; + snprintf(temp, 256, "offsets[%d]", i); + shader_set_2fv(instancing_uniform_array_shader, + temp, translations[i]); + } + glBindVertexArray(quad_vao); + glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100); + glBindVertexArray(0); + break; + case 1: + glUseProgram(instanced_arrays_shader); + glBindVertexArray(quad_vao); + glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100); + glBindVertexArray(0); + break; + case 2: + glUseProgram(default_shader); + shader_set_mat4fv(default_shader, "proj", proj); + shader_set_mat4fv(default_shader, "view", view); + + model = mat4_make_scale(v3f(scale, scale, scale)); + shader_set_mat4fv(default_shader, "model", model); + glBindTexture(GL_TEXTURE_2D, planet_texture); + mesh_draw(planet_mesh); + + glBindTexture(GL_TEXTURE_2D, rock_texture); + for (S32 i = 0; i < amount; ++i) { + model = trns[i]; + shader_set_mat4fv(default_shader, "model", model); + mesh_draw(rock_mesh); + } + break; + case 3: + glUseProgram(default_shader); + shader_set_mat4fv(default_shader, "proj", proj); + shader_set_mat4fv(default_shader, "view", view); + model = mat4_make_scale(v3f(scale, scale, scale)); + shader_set_mat4fv(default_shader, "model", model); + glBindTexture(GL_TEXTURE_2D, planet_texture); + mesh_draw(planet_mesh); + glBindTexture(GL_TEXTURE_2D, 0); + + glUseProgram(instanced_shader); + shader_set_mat4fv(default_shader, "proj", proj); + shader_set_mat4fv(default_shader, "view", view); + glBindTexture(GL_TEXTURE_2D, rock_texture); + glBindVertexArray(rock_mesh->vao); + glDrawElementsInstanced(GL_TRIANGLES, rock_mesh->index_count, + GL_UNSIGNED_INT, 0, amount); + glBindVertexArray(0); + glBindTexture(GL_TEXTURE_2D, 0); + break; + } + + glfwSwapBuffers(window); + + F32 elapsed = glfwGetTime()-last_time; + if (elapsed < target_spf) { + U32 sleep_time = (U32)(target_spf-elapsed); + if (sleep_time > 0) + sleep(sleep_time); + } + F32 current_time = glfwGetTime(); + state.dt = current_time-last_time; + time += state.dt; + last_time = current_time; + } + + glfwTerminate(); + return(0); } diff --git a/advanced_opengl/9.instancing/shaders/default.frag b/advanced_opengl/9.instancing/shaders/default.frag new file mode 100644 index 0000000..8ae5c3b --- /dev/null +++ b/advanced_opengl/9.instancing/shaders/default.frag @@ -0,0 +1,12 @@ +#version 330 core + +in vec2 tex_coords; + +out vec4 frag_color; + +uniform sampler2D texture0; + +void main(void) +{ + frag_color = texture(texture0, tex_coords); +} diff --git a/advanced_opengl/9.instancing/shaders/default.fs b/advanced_opengl/9.instancing/shaders/default.fs deleted file mode 100644 index c655ac8..0000000 --- a/advanced_opengl/9.instancing/shaders/default.fs +++ /dev/null @@ -1,13 +0,0 @@ -#version 330 core - -in vec2 tex_coords; - -out vec4 frag_color; - -uniform sampler2D texture0; - -void -main(void) -{ - frag_color = texture(texture0, tex_coords); -} \ No newline at end of file diff --git a/advanced_opengl/9.instancing/shaders/default.vert b/advanced_opengl/9.instancing/shaders/default.vert new file mode 100644 index 0000000..87cb538 --- /dev/null +++ b/advanced_opengl/9.instancing/shaders/default.vert @@ -0,0 +1,17 @@ +#version 330 core +layout(location = 0) in vec3 apos; +layout(location = 1) in vec3 anormal; +layout(location = 2) in vec2 atex_coords; + +out vec3 normal; +out vec2 tex_coords; + +uniform mat4 proj; +uniform mat4 view; +uniform mat4 model; + +void main(void) +{ + tex_coords = atex_coords; + gl_Position = proj*view*model*vec4(apos, 1.0); +} diff --git a/advanced_opengl/9.instancing/shaders/default.vs b/advanced_opengl/9.instancing/shaders/default.vs deleted file mode 100644 index 85d3c19..0000000 --- a/advanced_opengl/9.instancing/shaders/default.vs +++ /dev/null @@ -1,18 +0,0 @@ -#version 330 core -layout(location = 0) in vec3 apos; -layout(location = 1) in vec3 anormal; -layout(location = 2) in vec2 atex_coords; - -out vec3 normal; -out vec2 tex_coords; - -uniform mat4 projection; -uniform mat4 view; -uniform mat4 model; - -void -main(void) -{ - tex_coords = atex_coords; - gl_Position = projection*view*model*vec4(apos, 1.0); -} diff --git a/advanced_opengl/9.instancing/shaders/instanced_arrays.frag b/advanced_opengl/9.instancing/shaders/instanced_arrays.frag new file mode 100644 index 0000000..4865933 --- /dev/null +++ b/advanced_opengl/9.instancing/shaders/instanced_arrays.frag @@ -0,0 +1,10 @@ +#version 330 core + +in vec3 color; + +out vec4 frag_color; + +void main(void) +{ + frag_color = vec4(color, 1.0); +} diff --git a/advanced_opengl/9.instancing/shaders/instanced_arrays.fs b/advanced_opengl/9.instancing/shaders/instanced_arrays.fs deleted file mode 100644 index a32e52e..0000000 --- a/advanced_opengl/9.instancing/shaders/instanced_arrays.fs +++ /dev/null @@ -1,11 +0,0 @@ -#version 330 core - -in vec3 color; - -out vec4 frag_color; - -void -main(void) -{ - frag_color = vec4(color, 1.0); -} diff --git a/advanced_opengl/9.instancing/shaders/instanced_arrays.vert b/advanced_opengl/9.instancing/shaders/instanced_arrays.vert new file mode 100644 index 0000000..ce3ea7d --- /dev/null +++ b/advanced_opengl/9.instancing/shaders/instanced_arrays.vert @@ -0,0 +1,13 @@ +#version 330 core +layout(location = 0) in vec2 apos; +layout(location = 1) in vec3 acolor; +layout(location = 2) in vec2 aoffset; + +out vec3 color; + +void main(void) +{ + color = acolor; + vec2 pos = apos*(gl_InstanceID/100.0); + gl_Position = vec4(pos+aoffset, 0.0, 1.0); +} diff --git a/advanced_opengl/9.instancing/shaders/instanced_arrays.vs b/advanced_opengl/9.instancing/shaders/instanced_arrays.vs deleted file mode 100644 index 4ea0fe4..0000000 --- a/advanced_opengl/9.instancing/shaders/instanced_arrays.vs +++ /dev/null @@ -1,14 +0,0 @@ -#version 330 core -layout(location = 0) in vec2 apos; -layout(location = 1) in vec3 acolor; -layout(location = 2) in vec2 aoffset; - -out vec3 color; - -void -main(void) -{ - color = acolor; - vec2 pos = apos*(gl_InstanceID/100.0); - gl_Position = vec4(pos+aoffset, 0.0, 1.0); -} diff --git a/advanced_opengl/9.instancing/shaders/instanced_mat4.frag b/advanced_opengl/9.instancing/shaders/instanced_mat4.frag new file mode 100644 index 0000000..3b96d36 --- /dev/null +++ b/advanced_opengl/9.instancing/shaders/instanced_mat4.frag @@ -0,0 +1,13 @@ +#version 330 core + +in vec2 tex_coords; + +out vec4 frag_color; + +uniform sampler2D texture1; + +void main(void) +{ + frag_color = texture(texture1, tex_coords); +} + diff --git a/advanced_opengl/9.instancing/shaders/instanced_mat4.fs b/advanced_opengl/9.instancing/shaders/instanced_mat4.fs deleted file mode 100644 index ae625b2..0000000 --- a/advanced_opengl/9.instancing/shaders/instanced_mat4.fs +++ /dev/null @@ -1,14 +0,0 @@ -#version 330 core - -in vec2 tex_coords; - -out vec4 frag_color; - -uniform sampler2D texture1; - -void -main(void) -{ - frag_color = texture(texture1, tex_coords); -} - diff --git a/advanced_opengl/9.instancing/shaders/instanced_mat4.vert b/advanced_opengl/9.instancing/shaders/instanced_mat4.vert new file mode 100644 index 0000000..835cc5d --- /dev/null +++ b/advanced_opengl/9.instancing/shaders/instanced_mat4.vert @@ -0,0 +1,15 @@ +#version 330 core +layout(location = 0) in vec3 apos; +layout(location = 2) in vec2 atex_coords; +layout(location = 3) in mat4 instance_matrix; + +out vec2 tex_coords; + +uniform mat4 proj; +uniform mat4 view; + +void main(void) +{ + tex_coords = atex_coords; + gl_Position = proj*view*instance_matrix*vec4(apos, 1.0); +} diff --git a/advanced_opengl/9.instancing/shaders/instanced_mat4.vs b/advanced_opengl/9.instancing/shaders/instanced_mat4.vs deleted file mode 100644 index c65be90..0000000 --- a/advanced_opengl/9.instancing/shaders/instanced_mat4.vs +++ /dev/null @@ -1,16 +0,0 @@ -#version 330 core -layout(location = 0) in vec3 apos; -layout(location = 2) in vec2 atex_coords; -layout(location = 3) in mat4 instance_matrix; - -out vec2 tex_coords; - -uniform mat4 projection; -uniform mat4 view; - -void -main(void) -{ - tex_coords = atex_coords; - gl_Position = projection*view*instance_matrix*vec4(apos, 1.0); -} diff --git a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.frag b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.frag new file mode 100644 index 0000000..4865933 --- /dev/null +++ b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.frag @@ -0,0 +1,10 @@ +#version 330 core + +in vec3 color; + +out vec4 frag_color; + +void main(void) +{ + frag_color = vec4(color, 1.0); +} diff --git a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.fs b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.fs deleted file mode 100644 index a32e52e..0000000 --- a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.fs +++ /dev/null @@ -1,11 +0,0 @@ -#version 330 core - -in vec3 color; - -out vec4 frag_color; - -void -main(void) -{ - frag_color = vec4(color, 1.0); -} diff --git a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vert b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vert new file mode 100644 index 0000000..61b07a0 --- /dev/null +++ b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vert @@ -0,0 +1,13 @@ +#version 330 core +layout(location = 0) in vec2 apos; +layout(location = 1) in vec3 acolor; + +out vec3 color; + +uniform vec2 offsets[100]; + +void main(void) +{ + color = acolor; + gl_Position = vec4(apos+offsets[gl_InstanceID], 0.0, 1.0); +} diff --git a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vs b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vs deleted file mode 100644 index a77be31..0000000 --- a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vs +++ /dev/null @@ -1,14 +0,0 @@ -#version 330 core -layout(location = 0) in vec2 apos; -layout(location = 1) in vec3 acolor; - -out vec3 color; - -uniform vec2 offsets[100]; - -void -main(void) -{ - color = acolor; - gl_Position = vec4(apos+offsets[gl_InstanceID], 0.0, 1.0); -} -- cgit v1.2.3