summaryrefslogtreecommitdiff
path: root/advanced_opengl
diff options
context:
space:
mode:
Diffstat (limited to 'advanced_opengl')
-rwxr-xr-xadvanced_opengl/1.depth/depthbin1282544 -> 1283928 bytes
-rw-r--r--advanced_opengl/1.depth/depth.c433
-rw-r--r--advanced_opengl/1.depth/shaders/depth.frag (renamed from advanced_opengl/1.depth/shaders/depth.fs)10
-rw-r--r--advanced_opengl/1.depth/shaders/depth.vert (renamed from advanced_opengl/2.stencil/shaders/stencil.vs)7
-rwxr-xr-xadvanced_opengl/10.antialiasing/anti_aliasing_msaabin1277808 -> 1279192 bytes
-rw-r--r--advanced_opengl/10.antialiasing/anti_aliasing_msaa.c309
-rwxr-xr-xadvanced_opengl/10.antialiasing/anti_aliasing_offscreenbin1278840 -> 1284864 bytes
-rw-r--r--advanced_opengl/10.antialiasing/anti_aliasing_offscreen.c453
-rw-r--r--advanced_opengl/10.antialiasing/shaders/color.frag (renamed from advanced_opengl/2.stencil/shaders/outline.fs)3
-rw-r--r--advanced_opengl/10.antialiasing/shaders/color.vert (renamed from advanced_opengl/10.antialiasing/shaders/color.vs)7
-rw-r--r--advanced_opengl/10.antialiasing/shaders/screen.frag (renamed from advanced_opengl/10.antialiasing/shaders/screen.fs)21
-rw-r--r--advanced_opengl/10.antialiasing/shaders/screen.vert (renamed from advanced_opengl/10.antialiasing/shaders/screen.vs)3
-rw-r--r--advanced_opengl/2.stencil/shaders/outline.frag (renamed from advanced_opengl/10.antialiasing/shaders/color.fs)3
-rw-r--r--advanced_opengl/2.stencil/shaders/stencil.frag (renamed from advanced_opengl/2.stencil/shaders/stencil.fs)0
-rw-r--r--advanced_opengl/2.stencil/shaders/stencil.vert (renamed from advanced_opengl/1.depth/shaders/depth.vs)7
-rwxr-xr-xadvanced_opengl/2.stencil/stencilbin1282928 -> 1284368 bytes
-rw-r--r--advanced_opengl/2.stencil/stencil.c486
-rwxr-xr-xadvanced_opengl/3.blending/blendingbin1287936 -> 1289368 bytes
-rw-r--r--advanced_opengl/3.blending/blending.c625
-rw-r--r--advanced_opengl/3.blending/shaders/blending.frag (renamed from advanced_opengl/6.cubemaps/shaders/cube.fs)3
-rw-r--r--advanced_opengl/3.blending/shaders/blending.vert (renamed from advanced_opengl/4.face_culling/shaders/face_culling.vs)7
-rw-r--r--advanced_opengl/3.blending/shaders/grass.frag (renamed from advanced_opengl/3.blending/shaders/grass.fs)6
-rwxr-xr-xadvanced_opengl/4.face_culling/face_cullingbin1283016 -> 1288616 bytes
-rw-r--r--advanced_opengl/4.face_culling/face_culling.c515
-rw-r--r--advanced_opengl/4.face_culling/shaders/face_culling.frag (renamed from advanced_opengl/5.framebuffers/shaders/cube.fs)3
-rw-r--r--advanced_opengl/4.face_culling/shaders/face_culling.vert (renamed from advanced_opengl/3.blending/shaders/blending.vs)7
-rwxr-xr-xadvanced_opengl/5.framebuffers/framebuffersbin1288768 -> 1294320 bytes
-rw-r--r--advanced_opengl/5.framebuffers/framebuffers.c735
-rw-r--r--advanced_opengl/5.framebuffers/shaders/cube.frag (renamed from advanced_opengl/4.face_culling/shaders/face_culling.fs)3
-rw-r--r--advanced_opengl/5.framebuffers/shaders/cube.vert (renamed from advanced_opengl/5.framebuffers/shaders/cube.vs)7
-rw-r--r--advanced_opengl/5.framebuffers/shaders/screen.frag (renamed from advanced_opengl/5.framebuffers/shaders/screen.fs)24
-rw-r--r--advanced_opengl/5.framebuffers/shaders/screen.vert (renamed from advanced_opengl/5.framebuffers/shaders/screen.vs)3
-rwxr-xr-xadvanced_opengl/6.cubemaps/cubemapsbin1288160 -> 1293704 bytes
-rw-r--r--advanced_opengl/6.cubemaps/cubemaps.c774
-rw-r--r--advanced_opengl/6.cubemaps/shaders/cube.frag (renamed from advanced_opengl/3.blending/shaders/blending.fs)3
-rw-r--r--advanced_opengl/6.cubemaps/shaders/cube.vert (renamed from advanced_opengl/6.cubemaps/shaders/cube.vs)7
-rw-r--r--advanced_opengl/6.cubemaps/shaders/reflection.frag (renamed from advanced_opengl/6.cubemaps/shaders/reflection.fs)3
-rw-r--r--advanced_opengl/6.cubemaps/shaders/reflection.vert (renamed from advanced_opengl/6.cubemaps/shaders/reflection.vs)7
-rw-r--r--advanced_opengl/6.cubemaps/shaders/refraction.frag (renamed from advanced_opengl/6.cubemaps/shaders/refraction.fs)3
-rw-r--r--advanced_opengl/6.cubemaps/shaders/refraction.vert (renamed from advanced_opengl/6.cubemaps/shaders/refraction.vs)7
-rw-r--r--advanced_opengl/6.cubemaps/shaders/skybox.frag (renamed from advanced_opengl/6.cubemaps/shaders/skybox.fs)3
-rw-r--r--advanced_opengl/6.cubemaps/shaders/skybox.vert (renamed from advanced_opengl/6.cubemaps/shaders/skybox.vs)7
-rw-r--r--advanced_opengl/7.uniform_buffer/shaders/color_cube.frag (renamed from advanced_opengl/8.geometry_shader/shaders/normals.fs)3
-rw-r--r--advanced_opengl/7.uniform_buffer/shaders/color_cube.vert (renamed from advanced_opengl/7.uniform_buffer/shaders/color_cube.vs)7
-rw-r--r--advanced_opengl/7.uniform_buffer/shaders/cube.frag12
-rw-r--r--advanced_opengl/7.uniform_buffer/shaders/cube.fs13
-rw-r--r--advanced_opengl/7.uniform_buffer/shaders/cube.vert (renamed from advanced_opengl/7.uniform_buffer/shaders/cube.vs)7
-rw-r--r--advanced_opengl/7.uniform_buffer/shaders/skybox.frag (renamed from advanced_opengl/7.uniform_buffer/shaders/skybox.fs)3
-rw-r--r--advanced_opengl/7.uniform_buffer/shaders/skybox.vert (renamed from advanced_opengl/7.uniform_buffer/shaders/skybox.vs)7
-rwxr-xr-xadvanced_opengl/7.uniform_buffer/uniform_bufferbin1288448 -> 1289904 bytes
-rw-r--r--advanced_opengl/7.uniform_buffer/uniform_buffer.c667
-rwxr-xr-xadvanced_opengl/8.geometry_shader/geometry_shaderbin1282768 -> 1288776 bytes
-rw-r--r--advanced_opengl/8.geometry_shader/geometry_shader.c611
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/base.frag (renamed from advanced_opengl/8.geometry_shader/shaders/base.fs)3
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/base.geom (renamed from advanced_opengl/8.geometry_shader/shaders/base.gs)3
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/base.vert (renamed from advanced_opengl/8.geometry_shader/shaders/base.vs)3
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/basic.frag12
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/basic.fs13
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/basic.vert (renamed from advanced_opengl/8.geometry_shader/shaders/basic.vs)7
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/explosion.frag (renamed from advanced_opengl/8.geometry_shader/shaders/explosion.fs)3
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/explosion.geom (renamed from advanced_opengl/8.geometry_shader/shaders/explosion.gs)9
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/explosion.vert (renamed from advanced_opengl/8.geometry_shader/shaders/explosion.vs)7
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/normals.frag (renamed from advanced_opengl/7.uniform_buffer/shaders/color_cube.fs)3
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/normals.geom (renamed from advanced_opengl/8.geometry_shader/shaders/normals.gs)16
-rw-r--r--advanced_opengl/8.geometry_shader/shaders/normals.vert (renamed from advanced_opengl/8.geometry_shader/shaders/normals.vs)3
-rwxr-xr-xadvanced_opengl/9.instancing/instancingbin1065104 -> 1065224 bytes
-rw-r--r--advanced_opengl/9.instancing/instancing.c672
-rw-r--r--advanced_opengl/9.instancing/shaders/default.frag (renamed from advanced_opengl/9.instancing/shaders/default.fs)5
-rw-r--r--advanced_opengl/9.instancing/shaders/default.vert (renamed from advanced_opengl/9.instancing/shaders/default.vs)7
-rw-r--r--advanced_opengl/9.instancing/shaders/instanced_arrays.frag (renamed from advanced_opengl/9.instancing/shaders/instanced_arrays.fs)3
-rw-r--r--advanced_opengl/9.instancing/shaders/instanced_arrays.vert (renamed from advanced_opengl/9.instancing/shaders/instanced_arrays.vs)3
-rw-r--r--advanced_opengl/9.instancing/shaders/instanced_mat4.frag (renamed from advanced_opengl/9.instancing/shaders/instanced_mat4.fs)3
-rw-r--r--advanced_opengl/9.instancing/shaders/instanced_mat4.vert (renamed from advanced_opengl/9.instancing/shaders/instanced_mat4.vs)7
-rw-r--r--advanced_opengl/9.instancing/shaders/instancing_uniform_array.frag (renamed from advanced_opengl/9.instancing/shaders/instancing_uniform_array.fs)3
-rw-r--r--advanced_opengl/9.instancing/shaders/instancing_uniform_array.vert (renamed from advanced_opengl/9.instancing/shaders/instancing_uniform_array.vs)3
75 files changed, 2808 insertions, 3804 deletions
diff --git a/advanced_opengl/1.depth/depth b/advanced_opengl/1.depth/depth
index 68f04d6..80da145 100755
--- a/advanced_opengl/1.depth/depth
+++ b/advanced_opengl/1.depth/depth
Binary files differ
diff --git a/advanced_opengl/1.depth/depth.c b/advanced_opengl/1.depth/depth.c
index eb79c1c..03092df 100644
--- a/advanced_opengl/1.depth/depth.c
+++ b/advanced_opengl/1.depth/depth.c
@@ -2,273 +2,184 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ State state;
+ S32 width, height;
+ Input input;
-#define WIDTH 1280
-#define HEIGHT 720
+ if (glfwInit() == GLFW_FALSE) {
+ fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
+ return(1);
+ }
-static V3F camera_pos;
-static F32 dt;
-static Input input;
+ width = 1024;
+ height = 768;
-void
-key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- switch (action)
- {
- case GLFW_PRESS: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_PRESS;
- } break;
- }
- } break;
-
- case GLFW_RELEASE: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_RELEASE;
- } break;
- }
- } break;
- }
-}
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "Depth testing.", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
-int
-main(void)
-{
- GLFWwindow *window;
-
- 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(WIDTH, HEIGHT, "depth testing", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetKeyCallback(window, key_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
-
- U32 shader = create_shader_program("shaders/depth.vs", "shaders/depth.fs");
- U32 marble_texture = load_texture("../../data/textures/marble.jpg");
- U32 metal_texture = load_texture("../../data/textures/metal.png");
-
- F32 a = 0.5f;
- F32 vertices[] = {
- -a, -a, -a, 0.0f, 0.0f,
- a, -a, -a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- -a, a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 0.0f,
-
- -a, -a, a, 0.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 1.0f,
- a, a, a, 1.0f, 1.0f,
- -a, a, a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
-
- -a, a, a, 1.0f, 0.0f,
- -a, a, -a, 1.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, a, a, 1.0f, 0.0f,
-
- a, a, a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, a, 0.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
-
- -a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 1.0f, 1.0f,
- a, -a, a, 1.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, -a, -a, 0.0f, 1.0f,
-
- -a, a, -a, 0.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
- -a, a, a, 0.0f, 0.0f,
- -a, a, -a, 0.0f, 1.0f
- };
-
- Transform cube_positions[] = {
- transform_default(),
- transform_make_translate(v3f(a, 0.0f, -4*a))
- };
-
- Transform platform_position =
- transform_make_scale_translate(v3f(10.0f, 0.2f, 10.0f),
- v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f));
-
- U32 VAO, VBO;
- glGenVertexArrays(1, &VAO);
- glBindVertexArray(VAO);
-
- glGenBuffers(1, &VBO);
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
-
- glBindVertexArray(0);
-
- F32 target_fps = 60.0f;
- F32 target_spf = 1.0f/target_fps;
- camera_pos = v3f(0.0f, 0.0f, 3.0f);
-
- /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */
-
- F32 last_time = glfwGetTime();
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* INFO(pryazha): update */
- V3F left, up, forward;
- V3F world_up = v3f(0.0f, 1.0f, 0.0f);
-
- forward = v3f_norm(v3f_sub(v3f(0.0f, 0.0f, 0.0f), camera_pos));
- left = v3f_norm(v3f_cross(world_up, forward));
- up = v3f_cross(forward, left);
-
- V3F dp = v3f_zero();
-
- F32 speed = 2.0f;
- if (key_is_pressed(input.move_right))
- dp = v3f_add(dp, v3f_scalef(left, -speed*dt));
- if (key_is_pressed(input.move_forward))
- dp = v3f_add(dp, v3f_scalef(forward, speed*dt));
- if (key_is_pressed(input.move_left))
- dp = v3f_add(dp, v3f_scalef(left, speed*dt));
- if (key_is_pressed(input.move_backward))
- dp = v3f_add(dp, v3f_scalef(forward, -speed*dt));
- if (key_is_pressed(input.move_up))
- dp = v3f_add(dp, v3f_scalef(up, speed*dt));
- if (key_is_pressed(input.move_down))
- dp = v3f_add(dp, v3f_scalef(up, -speed*dt));
-
- input_update_last_state(&input);
-
- camera_pos = v3f_add(camera_pos, dp);
-
- /* INFO(pryazha): render */
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glUseProgram(shader);
- MAT4 model, view, projection;
-
- view = look_at(camera_pos, v3f(0.0f, 0.0f, 0.0f), v3f(0.0f, 1.0f, 0.0f));
- shader_set_mat4fv(shader, "view", view);
-
- /* projection = ortho(-5.0f, 5.0f, -5.0f, 5.0f, 0.1f, 100.0f); */
- F32 fovx = 90.0f;
- F32 near = 0.1f;
- F32 far = 100.0f;
- projection = perspective(fovx, (F32)WIDTH/(F32)HEIGHT, near, far);
-
- shader_set_mat4fv(shader, "projection", projection);
-
- glBindTexture(GL_TEXTURE_2D, marble_texture);
- glBindVertexArray(VAO);
- for (S32 transform_index = 0;
- transform_index < (S32)ArrayCount(cube_positions);
- ++transform_index)
- {
- model = transform_apply(cube_positions[transform_index]);
- shader_set_mat4fv(shader, "model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- glBindTexture(GL_TEXTURE_2D, metal_texture);
- model = transform_apply(platform_position);
- shader_set_mat4fv(shader, "model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
-
- 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;
- last_time = current_time;
- }
-
- glfwTerminate();
- return(0);
+ glfwMakeContextCurrent(window);
+
+ if (glewInit() != GLEW_OK) {
+ fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+
+ U32 shader = create_shader_program("shaders/depth.vert", "shaders/depth.frag");
+ U32 marble_texture = load_texture("../../data/textures/marble.jpg");
+ U32 metal_texture = load_texture("../../data/textures/metal.png");
+
+ F32 a = 0.5f;
+ F32 vertices[] = {
+ -a, -a, -a, 0.0f, 0.0f,
+ a, -a, -a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ -a, a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 0.0f,
+
+ -a, -a, a, 0.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 1.0f,
+ -a, a, a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+
+ -a, a, a, 1.0f, 0.0f,
+ -a, a, -a, 1.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, a, a, 1.0f, 0.0f,
+
+ a, a, a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, a, 0.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+
+ -a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 1.0f, 1.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+
+ -a, a, -a, 0.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+ -a, a, a, 0.0f, 0.0f,
+ -a, a, -a, 0.0f, 1.0f
+ };
+
+ Transform cube_positions[] = {
+ transform_default(),
+ transform_make_translate(v3f(a, 0.0f, -4*a))
+ };
+
+ V3F platform_pos = v3f(10.0f, 0.2f, 10.0f);
+ V3F platform_scale = v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f);
+ Transform platform_transform = transform_make_scale_translate(platform_pos, platform_scale);
+
+ U32 VAO, VBO;
+ glGenVertexArrays(1, &VAO);
+ glBindVertexArray(VAO);
+ glGenBuffers(1, &VBO);
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ state.camera = (Camera) {
+ v3f(0.0f, 0.0f, 3.0f),
+ 90.0f, 0.1f, 100.0f,
+ 0.0f, 0.0f
+ };
+
+ F32 target_fps = 60.0f;
+ F32 target_spf = 1.0f/target_fps;
+ F32 last_time = glfwGetTime();
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ process_glfw_keyboard(window, &input);
+ glfwGetFramebufferSize(window, &width, &height);
+
+ /* INFO(pryazha): Update */
+ V3F target = v3f_zero();
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ V3F dv = get_dv_camera_orbital(&input, state.camera.pos,
+ target, state.dt, 3.0f);
+ state.camera.pos = v3f_add(state.camera.pos, dv);
+
+ input_update_last_state(&input);
+
+ /* INFO(pryazha): Render */
+ MAT4 model, view, proj;
+ view = look_at(state.camera.pos, target, v3f(0.0f, 1.0f, 0.0f));
+ /* proj = ortho(-5.0f, 5.0f, -5.0f, 5.0f, 0.1f, 100.0f); */
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+
+ glViewport(0, 0, width, height);
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glUseProgram(shader);
+ shader_set_mat4fv(shader, "view", view);
+ shader_set_mat4fv(shader, "proj", proj);
+ glBindTexture(GL_TEXTURE_2D, marble_texture);
+ glBindVertexArray(VAO);
+ for (S32 i = 0; i < (S32)ArrayCount(cube_positions); ++i) {
+ model = transform_apply(cube_positions[i]);
+ shader_set_mat4fv(shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ }
+ glBindTexture(GL_TEXTURE_2D, metal_texture);
+ model = transform_apply(platform_transform);
+ shader_set_mat4fv(shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ 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;
+ last_time = current_time;
+ }
+
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/1.depth/shaders/depth.fs b/advanced_opengl/1.depth/shaders/depth.frag
index a515c15..710b0d2 100644
--- a/advanced_opengl/1.depth/shaders/depth.fs
+++ b/advanced_opengl/1.depth/shaders/depth.frag
@@ -9,19 +9,15 @@ uniform sampler2D our_texture;
float near = 0.1;
float far = 100.0;
-float
-linearize_depth(float depth)
+float linearize_depth(float depth)
{
float ndc_z = 2.0*depth-1.0;
return((2.0*near*far)/(far+near-ndc_z*(far-near)));
}
-void
-main(void)
+void main(void)
{
- /*
- frag_color = texture(our_texture, tex_coords);
- */
+ /* frag_color = texture(our_texture, tex_coords); */
float depth = linearize_depth(gl_FragCoord.z)/far;
frag_color = vec4(vec3(depth), 1.0);
}
diff --git a/advanced_opengl/2.stencil/shaders/stencil.vs b/advanced_opengl/1.depth/shaders/depth.vert
index 62e71a2..68b8fe2 100644
--- a/advanced_opengl/2.stencil/shaders/stencil.vs
+++ b/advanced_opengl/1.depth/shaders/depth.vert
@@ -4,13 +4,12 @@ layout(location = 1) in vec2 atex_coords;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
out vec2 tex_coords;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
tex_coords = atex_coords;
}
diff --git a/advanced_opengl/10.antialiasing/anti_aliasing_msaa b/advanced_opengl/10.antialiasing/anti_aliasing_msaa
index 36811f7..694aa7d 100755
--- a/advanced_opengl/10.antialiasing/anti_aliasing_msaa
+++ b/advanced_opengl/10.antialiasing/anti_aliasing_msaa
Binary files differ
diff --git a/advanced_opengl/10.antialiasing/anti_aliasing_msaa.c b/advanced_opengl/10.antialiasing/anti_aliasing_msaa.c
index 65a5b01..250ab97 100644
--- a/advanced_opengl/10.antialiasing/anti_aliasing_msaa.c
+++ b/advanced_opengl/10.antialiasing/anti_aliasing_msaa.c
@@ -2,207 +2,126 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ Arena *arena = 0;
+ Mesh *cube;
+ Input input;
+ F32 target_fps, target_spf, last_time;
+ MAT4 proj, view, model;
+ State state;
+ S32 width, height;
+ U32 color_shader;
-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);
+ glfwWindowHint(GLFW_SAMPLES, 4);
+ window = glfwCreateWindow(width, height, "Anti Aliasing (MSAA)", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
-int
-main(void)
-{
- GLFWwindow *window;
- Arena *arena = 0;
- F32 target_fps, target_spf,
- last_time, dt;
- MAT4 projection, view, model;
- V3F camera_pos;
- F32 camera_speed, fovx, near, far;
- U32 color_shader;
-
- if (glfwInit() == GLFW_FALSE)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
- return(1);
- }
-
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
- glfwWindowHint(GLFW_SAMPLES, 4);
- window = glfwCreateWindow(global_width, global_height, "Anti Aliasing (MSAA)", 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);
- glEnable(GL_MULTISAMPLE);
-
- arena = arena_alloc(Megabytes(64));
-
- Mesh *cube_mesh = mesh_load_obj(arena, "../../data/models/cube.obj");
- color_shader = create_shader_program("shaders/color.vs",
- "shaders/color.fs");
-
- target_fps = 60.0f;
- target_spf = 1.0f/target_fps;
-
- camera_pos = v3f(0.0f, 0.0f, 3.0f);
- camera_speed = 2.0f;
- fovx = 90.0f;
- near = 0.1f;
- far = 1000.0f;
-
- last_time = glfwGetTime();
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* NOTE(pryazha): Update */
- if (key_is_pressed(global_input.exit))
- glfwSetWindowShouldClose(window, GLFW_TRUE);
-
- 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);
- view = look_at(camera_pos, v3f_zero(), v3f(0.0f, 1.0f, 0.0f));
- model = mat4_identity();
-
- input_update_last_state(&global_input);
-
- /* NOTE(pryazha): Render */
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glUseProgram(color_shader);
- shader_set_mat4fv(color_shader, "projection", projection);
- shader_set_mat4fv(color_shader, "view", view);
- shader_set_mat4fv(color_shader, "model", model);
- mesh_draw(cube_mesh);
-
- 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;
- last_time = current_time;
- }
-
- arena_release(arena);
- 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);
+ glEnable(GL_MULTISAMPLE);
+
+ arena = arena_alloc(Kilobytes(4));
+
+ cube = mesh_load_obj(arena, "../../data/models/cube.obj");
+ color_shader = create_shader_program("shaders/color.vert",
+ "shaders/color.frag");
+
+ state.camera = (Camera) {
+ v3f(0.0f, 0.0f, 3.0f),
+ 90.0f, 0.1f, 1000.0f,
+ 0.0f, 0.0f
+ };
+ input = input_init();
+
+ target_fps = 60.0f;
+ target_spf = 1.0f/target_fps;
+ last_time = glfwGetTime();
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ /* NOTE(pryazha): Update */
+ glfwGetFramebufferSize(window, &width, &height);
+ process_glfw_keyboard(window, &input);
+ process_glfw_mouse_pos(window, &input);
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ 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);
+
+ view = get_view_matrix(&state.camera);
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+ model = mat4_identity();
+
+ /* NOTE(pryazha): Render */
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glUseProgram(color_shader);
+ shader_set_mat4fv(color_shader, "proj", proj);
+ shader_set_mat4fv(color_shader, "view", view);
+ shader_set_mat4fv(color_shader, "model", model);
+ mesh_draw(cube);
+
+ 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;
+ last_time = current_time;
+ }
+
+ arena_release(arena);
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/10.antialiasing/anti_aliasing_offscreen b/advanced_opengl/10.antialiasing/anti_aliasing_offscreen
index c8a241c..db7f6ec 100755
--- a/advanced_opengl/10.antialiasing/anti_aliasing_offscreen
+++ b/advanced_opengl/10.antialiasing/anti_aliasing_offscreen
Binary files differ
diff --git a/advanced_opengl/10.antialiasing/anti_aliasing_offscreen.c b/advanced_opengl/10.antialiasing/anti_aliasing_offscreen.c
index 5c6debb..31f3cae 100644
--- a/advanced_opengl/10.antialiasing/anti_aliasing_offscreen.c
+++ b/advanced_opengl/10.antialiasing/anti_aliasing_offscreen.c
@@ -2,275 +2,200 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ Arena *arena = 0;
+ Mesh *cube;
+ F32 target_fps, target_spf, last_time;
+ MAT4 proj, view, model;
+ U32 fbo, intermediate_fbo, color_tex,
+ screen_texture, rbo,
+ quad_vao, vbo, color_shader,
+ screen_shader;
+ S32 width, height;
+ State state;
+ Input input;
-#define WIDTH 1024
-#define 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;
-int
-main(void)
-{
- GLFWwindow *window;
- Arena *arena = 0;
- F32 target_fps, target_spf,
- last_time, dt;
- MAT4 projection, view, model;
- V3F camera_pos;
- F32 camera_speed, fovx, near, far;
- U32 fbo, intermediate_fbo, color_tex,
- screen_texture, rbo,
- quad_vao, vbo,
- color_shader, screen_shader;
-
- if (glfwInit() == GLFW_FALSE)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
- return(1);
- }
-
- glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
- window = glfwCreateWindow(WIDTH, HEIGHT, "Anti Aliasing (Off-screen)", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetKeyCallback(window, key_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- arena = arena_alloc(Megabytes(64));
-
- Mesh *cube_mesh = mesh_load_obj(arena, "../../data/models/cube.obj");
- color_shader = create_shader_program("shaders/color.vs",
- "shaders/color.fs");
- screen_shader = create_shader_program("shaders/screen.vs",
- "shaders/screen.fs");
- glGenFramebuffers(1, &fbo);
- glBindFramebuffer(GL_FRAMEBUFFER, fbo);
- glGenTextures(1, &color_tex);
- glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, color_tex);
- glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB,
- WIDTH, HEIGHT, GL_TRUE);
- glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D_MULTISAMPLE, color_tex, 0);
- glGenRenderbuffers(1, &rbo);
- glBindRenderbuffer(GL_RENDERBUFFER, rbo);
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8,
- WIDTH, HEIGHT);
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, rbo);
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
- fprintf(stderr, "[ERROR]: Framebuffer is not complete.\n");
- fprintf(stdout, "[INFO]: Multisample fbo complete.\n");
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- glGenFramebuffers(1, &intermediate_fbo);
- glBindFramebuffer(GL_FRAMEBUFFER, intermediate_fbo);
- glGenTextures(1, &screen_texture);
- glBindTexture(GL_TEXTURE_2D, screen_texture);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT,
- 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, screen_texture, 0);
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
- fprintf(stderr, "[ERROR]: Framebuffer is not complete.\n");
- fprintf(stdout, "[INFO]: Intermediate fbo complete.\n");
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- F32 quad_vertices[] = {
- -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- -1.0f, 1.0f, 0.0f, 0.0f, 1.0f
- };
-
- 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, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- target_fps = 60.0f;
- target_spf = 1.0f/target_fps;
-
- camera_pos = v3f(0.0f, 0.0f, 3.0f);
- camera_speed = 2.0f;
- fovx = 90.0f;
- near = 0.1f;
- far = 1000.0f;
-
- last_time = glfwGetTime();
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* NOTE(pryazha): Update */
- if (key_is_pressed(global_input.exit))
- glfwSetWindowShouldClose(window, GLFW_TRUE);
-
- 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)WIDTH/(F32)HEIGHT, near, far);
- view = look_at(camera_pos, v3f_zero(), v3f(0.0f, 1.0f, 0.0f));
- model = mat4_identity();
-
- input_update_last_state(&global_input);
-
- /* NOTE(pryazha): Render */
- glBindFramebuffer(GL_FRAMEBUFFER, fbo);
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glEnable(GL_DEPTH_TEST);
- glUseProgram(color_shader);
- shader_set_mat4fv(color_shader, "projection", projection);
- shader_set_mat4fv(color_shader, "view", view);
- shader_set_mat4fv(color_shader, "model", model);
- mesh_draw(cube_mesh);
-
- glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, intermediate_fbo);
- /* TODO(pryazha): Update width and height */
- glBlitFramebuffer(0, 0, WIDTH, HEIGHT,
- 0, 0, WIDTH, HEIGHT,
- GL_COLOR_BUFFER_BIT, GL_NEAREST);
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- glUseProgram(screen_shader);
- glDisable(GL_DEPTH_TEST);
- glBindTexture(GL_TEXTURE_2D, screen_texture);
- glBindVertexArray(quad_vao);
- glDrawArrays(GL_TRIANGLES, 0, 6);
- glBindVertexArray(0);
-
- 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;
- last_time = current_time;
- }
-
- arena_release(arena);
- glfwTerminate();
- return(0);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "Anti Aliasing (Off-screen)", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ glfwMakeContextCurrent(window);
+
+ glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
+
+ if (glewInit() != GLEW_OK) {
+ fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ arena = arena_alloc(Kilobytes(4));
+
+ cube = mesh_load_obj(arena, "../../data/models/cube.obj");
+ color_shader = create_shader_program("shaders/color.vert",
+ "shaders/color.frag");
+ screen_shader = create_shader_program("shaders/screen.vert",
+ "shaders/screen.frag");
+ glGenFramebuffers(1, &fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ glGenTextures(1, &color_tex);
+ glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, color_tex);
+ glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB,
+ width, height, GL_TRUE);
+ glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D_MULTISAMPLE, color_tex, 0);
+ glGenRenderbuffers(1, &rbo);
+ glBindRenderbuffer(GL_RENDERBUFFER, rbo);
+ glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8,
+ width, height);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
+ GL_RENDERBUFFER, rbo);
+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
+ fprintf(stderr, "[ERROR]: Framebuffer is not complete.\n");
+ fprintf(stdout, "[INFO]: Multisample fbo complete.\n");
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+ glGenFramebuffers(1, &intermediate_fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, intermediate_fbo);
+ glGenTextures(1, &screen_texture);
+ glBindTexture(GL_TEXTURE_2D, screen_texture);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height,
+ 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D, screen_texture, 0);
+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
+ fprintf(stderr, "[ERROR]: Framebuffer is not complete.\n");
+ fprintf(stdout, "[INFO]: Intermediate fbo complete.\n");
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+ F32 quad_vertices[] = {
+ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
+ 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 0.0f, 0.0f, 1.0f
+ };
+
+ 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, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ state.camera = (Camera) {
+ v3f(0.0f, 0.0f, 3.0f),
+ 90.0f, 0.1f, 1000.0f,
+ 0.0f, 0.0f
+ };
+ input = input_init();
+
+ target_fps = 60.0f;
+ target_spf = 1.0f/target_fps;
+ last_time = glfwGetTime();
+
+ while (!glfwWindowShouldClose(window))
+ {
+ glfwPollEvents();
+
+ /* NOTE(pryazha): Update */
+ glfwGetFramebufferSize(window, &width, &height);
+ process_glfw_keyboard(window, &input);
+ process_glfw_mouse_pos(window, &input);
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ 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);
+
+ view = get_view_matrix(&state.camera);
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+ model = mat4_identity();
+
+ /* NOTE(pryazha): Render */
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_DEPTH_TEST);
+ glUseProgram(color_shader);
+ shader_set_mat4fv(color_shader, "proj", proj);
+ shader_set_mat4fv(color_shader, "view", view);
+ shader_set_mat4fv(color_shader, "model", model);
+ mesh_draw(cube);
+
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, intermediate_fbo);
+ glBlitFramebuffer(0, 0, width, height,
+ 0, 0, width, height,
+ GL_COLOR_BUFFER_BIT, GL_NEAREST);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glUseProgram(screen_shader);
+ glDisable(GL_DEPTH_TEST);
+ glBindTexture(GL_TEXTURE_2D, screen_texture);
+ glBindVertexArray(quad_vao);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ glBindVertexArray(0);
+
+ 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;
+ last_time = current_time;
+ }
+
+ arena_release(arena);
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/2.stencil/shaders/outline.fs b/advanced_opengl/10.antialiasing/shaders/color.frag
index 542143e..b4a31df 100644
--- a/advanced_opengl/2.stencil/shaders/outline.fs
+++ b/advanced_opengl/10.antialiasing/shaders/color.frag
@@ -2,8 +2,7 @@
out vec4 frag_color;
-void
-main(void)
+void main(void)
{
frag_color = vec4(0.76, 0.47, 0.84, 1.0);
}
diff --git a/advanced_opengl/10.antialiasing/shaders/color.vs b/advanced_opengl/10.antialiasing/shaders/color.vert
index ade669b..a8b1247 100644
--- a/advanced_opengl/10.antialiasing/shaders/color.vs
+++ b/advanced_opengl/10.antialiasing/shaders/color.vert
@@ -1,12 +1,11 @@
#version 330 core
layout(location = 0) in vec3 apos;
-uniform mat4 projection;
+uniform mat4 proj;
uniform mat4 view;
uniform mat4 model;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
}
diff --git a/advanced_opengl/10.antialiasing/shaders/screen.fs b/advanced_opengl/10.antialiasing/shaders/screen.frag
index 183d490..5ccc843 100644
--- a/advanced_opengl/10.antialiasing/shaders/screen.fs
+++ b/advanced_opengl/10.antialiasing/shaders/screen.frag
@@ -6,15 +6,13 @@ in vec2 tex_coords;
uniform sampler2D texture1;
-vec4
-inversion()
+vec4 inversion()
{
vec4 result = vec4(1.0-vec3(texture(texture1, tex_coords)), 1.0);
return(result);
}
-vec4
-grayscale_average()
+vec4 grayscale_average()
{
vec4 tex_color = texture(texture1, tex_coords);
float average = (tex_color.r+tex_color.g+tex_color.b)/3.0;
@@ -22,8 +20,7 @@ grayscale_average()
return(result);
}
-vec4
-grayscale_weights()
+vec4 grayscale_weights()
{
vec4 tex_color = texture(texture1, tex_coords);
float average = 0.2126*tex_color.r+0.7152*tex_color.g+0.0722*tex_color.b;
@@ -33,8 +30,7 @@ grayscale_weights()
const float offset = 1.0/300.0;
-vec4
-kernel_effect(float[9] kernel)
+vec4 kernel_effect(float[9] kernel)
{
vec2 offsets[9] = vec2[](
vec2(-offset, offset), /* top-left */
@@ -49,13 +45,8 @@ kernel_effect(float[9] kernel)
);
vec3 sample_texture[9];
- for (int offset_index = 0;
- offset_index < 9;
- ++offset_index)
- {
- sample_texture[offset_index] =
- vec3(texture(texture1, tex_coords+offsets[offset_index]));
- }
+ for (int i = 0; i < 9; ++i)
+ sample_texture[i] = vec3(texture(texture1, tex_coords+offsets[i]));
vec3 color = vec3(0.0);
for (int i = 0; i < 9; ++i)
diff --git a/advanced_opengl/10.antialiasing/shaders/screen.vs b/advanced_opengl/10.antialiasing/shaders/screen.vert
index 1f233ee..e473ddd 100644
--- a/advanced_opengl/10.antialiasing/shaders/screen.vs
+++ b/advanced_opengl/10.antialiasing/shaders/screen.vert
@@ -4,8 +4,7 @@ layout(location = 1) in vec2 atex_coords;
out vec2 tex_coords;
-void
-main(void)
+void main(void)
{
gl_Position = vec4(apos, 1.0);
tex_coords = atex_coords;
diff --git a/advanced_opengl/10.antialiasing/shaders/color.fs b/advanced_opengl/2.stencil/shaders/outline.frag
index 542143e..b4a31df 100644
--- a/advanced_opengl/10.antialiasing/shaders/color.fs
+++ b/advanced_opengl/2.stencil/shaders/outline.frag
@@ -2,8 +2,7 @@
out vec4 frag_color;
-void
-main(void)
+void main(void)
{
frag_color = vec4(0.76, 0.47, 0.84, 1.0);
}
diff --git a/advanced_opengl/2.stencil/shaders/stencil.fs b/advanced_opengl/2.stencil/shaders/stencil.frag
index ff7dd9b..ff7dd9b 100644
--- a/advanced_opengl/2.stencil/shaders/stencil.fs
+++ b/advanced_opengl/2.stencil/shaders/stencil.frag
diff --git a/advanced_opengl/1.depth/shaders/depth.vs b/advanced_opengl/2.stencil/shaders/stencil.vert
index 62e71a2..68b8fe2 100644
--- a/advanced_opengl/1.depth/shaders/depth.vs
+++ b/advanced_opengl/2.stencil/shaders/stencil.vert
@@ -4,13 +4,12 @@ layout(location = 1) in vec2 atex_coords;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
out vec2 tex_coords;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
tex_coords = atex_coords;
}
diff --git a/advanced_opengl/2.stencil/stencil b/advanced_opengl/2.stencil/stencil
index eb4eac5..a20d0bb 100755
--- a/advanced_opengl/2.stencil/stencil
+++ b/advanced_opengl/2.stencil/stencil
Binary files differ
diff --git a/advanced_opengl/2.stencil/stencil.c b/advanced_opengl/2.stencil/stencil.c
index 9f45048..3b01f5b 100644
--- a/advanced_opengl/2.stencil/stencil.c
+++ b/advanced_opengl/2.stencil/stencil.c
@@ -2,298 +2,212 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ State state;
+ S32 width, height;
+ Input input;
-#define WIDTH 1280
-#define HEIGHT 720
+ if (glfwInit() == GLFW_FALSE) {
+ fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
+ return(1);
+ }
-static V3F camera_pos;
-static F32 dt;
-static Input input;
+ width = 1024;
+ height = 768;
-void
-key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- switch (action)
- {
- case GLFW_PRESS: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_PRESS;
- } break;
- }
- } break;
-
- case GLFW_RELEASE: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_RELEASE;
- } break;
- }
- } break;
- }
-}
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "Stencil testing", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
-int
-main(void)
-{
- GLFWwindow *window;
-
- 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(WIDTH, HEIGHT, "Stencil testing", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetKeyCallback(window, key_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- glEnable(GL_DEPTH_TEST);
-
- glEnable(GL_STENCIL_TEST);
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
-
- U32 shader = create_shader_program("shaders/stencil.vs", "shaders/stencil.fs");
- U32 outline_shader = create_shader_program("shaders/stencil.vs", "shaders/outline.fs");
- U32 marble_texture = load_texture("../../data/textures/marble.jpg");
- U32 metal_texture = load_texture("../../data/textures/metal.png");
-
- F32 a = 0.5f;
- F32 vertices[] = {
- -a, -a, -a, 0.0f, 0.0f,
- a, -a, -a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- -a, a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 0.0f,
-
- -a, -a, a, 0.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 1.0f,
- a, a, a, 1.0f, 1.0f,
- -a, a, a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
-
- -a, a, a, 1.0f, 0.0f,
- -a, a, -a, 1.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, a, a, 1.0f, 0.0f,
-
- a, a, a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, a, 0.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
-
- -a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 1.0f, 1.0f,
- a, -a, a, 1.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, -a, -a, 0.0f, 1.0f,
-
- -a, a, -a, 0.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
- -a, a, a, 0.0f, 0.0f,
- -a, a, -a, 0.0f, 1.0f
- };
-
- Transform cube_positions[] = {
- transform_default(),
- transform_make_translate(v3f(a, 0.0f, -4*a))
- };
-
- Transform platform_position =
- transform_make_scale_translate(v3f(10.0f, 0.2f, 10.0f),
- v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f));
-
- U32 VAO, VBO;
- glGenVertexArrays(1, &VAO);
- glBindVertexArray(VAO);
-
- glGenBuffers(1, &VBO);
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
-
- glBindVertexArray(0);
-
- F32 target_fps = 60.0f;
- F32 target_spf = 1.0f/target_fps;
- camera_pos = v3f(0.0f, 0.0f, 3.0f);
-
- /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */
-
- F32 last_time = glfwGetTime();
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* INFO(pryazha): update */
- V3F left, up, forward;
- V3F world_up = v3f(0.0f, 1.0f, 0.0f);
-
- forward = v3f_norm(v3f_sub(v3f(0.0f, 0.0f, 0.0f), camera_pos));
- left = v3f_norm(v3f_cross(world_up, forward));
- up = v3f_cross(forward, left);
-
- V3F dp = v3f_zero();
-
- F32 speed = 2.0f;
- if (key_is_pressed(input.move_right))
- dp = v3f_add(dp, v3f_scalef(left, -speed*dt));
- if (key_is_pressed(input.move_forward))
- dp = v3f_add(dp, v3f_scalef(forward, speed*dt));
- if (key_is_pressed(input.move_left))
- dp = v3f_add(dp, v3f_scalef(left, speed*dt));
- if (key_is_pressed(input.move_backward))
- dp = v3f_add(dp, v3f_scalef(forward, -speed*dt));
- if (key_is_pressed(input.move_up))
- dp = v3f_add(dp, v3f_scalef(up, speed*dt));
- if (key_is_pressed(input.move_down))
- dp = v3f_add(dp, v3f_scalef(up, -speed*dt));
- input_update_last_state(&input);
-
- camera_pos = v3f_add(camera_pos, dp);
-
- /* INFO(pryazha): Render */
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
-
- /* NOTE(pryazha): Update stencil buffer with ones while drawing the cubes */
- glStencilFunc(GL_ALWAYS, 1, 0xFF);
- glStencilMask(0xFF);
-
- MAT4 model, view, projection;
- view = look_at(camera_pos, v3f(0.0f, 0.0f, 0.0f), v3f(0.0f, 1.0f, 0.0f));
- projection = perspective(90.0f, (F32)WIDTH/(F32)HEIGHT, 0.1f, 100.0f);
-
- glUseProgram(shader);
- shader_set_mat4fv(shader, "view", view);
- shader_set_mat4fv(shader, "projection", projection);
-
- glBindTexture(GL_TEXTURE_2D, marble_texture);
- glBindVertexArray(VAO);
- for (S32 transform_index = 0;
- transform_index < (S32)ArrayCount(cube_positions);
- ++transform_index)
- {
- model = transform_apply(cube_positions[transform_index]);
- shader_set_mat4fv(shader, "model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- /* NOTE(pryazha): Don't update stencil buffer while drawing the floor */
- glStencilMask(0x00);
-
- glBindTexture(GL_TEXTURE_2D, metal_texture);
- model = transform_apply(platform_position);
- shader_set_mat4fv(shader, "model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
-
- glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
- glStencilMask(0x00);
- glDisable(GL_DEPTH_TEST);
-
- glUseProgram(outline_shader);
- shader_set_mat4fv(outline_shader, "view", view);
- shader_set_mat4fv(outline_shader, "projection", projection);
-
- for (S32 transform_index = 0;
- transform_index < (S32)ArrayCount(cube_positions);
- ++transform_index)
- {
- Transform transform = cube_positions[transform_index];
- transform = transform_scale(transform, v3f(1.1f, 1.1f, 1.1f));
- shader_set_mat4fv(outline_shader, "model", transform_apply(transform));
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- glStencilMask(0xFF);
- glStencilFunc(GL_ALWAYS, 1, 0xFF);
- glEnable(GL_DEPTH_TEST);
-
- 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;
- last_time = current_time;
- }
-
- glfwTerminate();
- return(0);
+ glfwMakeContextCurrent(window);
+
+ if (glewInit() != GLEW_OK) {
+ fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_STENCIL_TEST);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+
+ U32 shader = create_shader_program("shaders/stencil.vert", "shaders/stencil.frag");
+ U32 outline_shader = create_shader_program("shaders/stencil.vert", "shaders/outline.frag");
+ U32 marble_texture = load_texture("../../data/textures/marble.jpg");
+ U32 metal_texture = load_texture("../../data/textures/metal.png");
+
+ F32 a = 0.5f;
+ F32 vertices[] = {
+ -a, -a, -a, 0.0f, 0.0f,
+ a, -a, -a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ -a, a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 0.0f,
+
+ -a, -a, a, 0.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 1.0f,
+ -a, a, a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+
+ -a, a, a, 1.0f, 0.0f,
+ -a, a, -a, 1.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, a, a, 1.0f, 0.0f,
+
+ a, a, a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, a, 0.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+
+ -a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 1.0f, 1.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+
+ -a, a, -a, 0.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+ -a, a, a, 0.0f, 0.0f,
+ -a, a, -a, 0.0f, 1.0f
+ };
+
+ Transform cube_positions[] = {
+ transform_default(),
+ transform_make_translate(v3f(a, 0.0f, -4*a))
+ };
+
+ V3F platform_pos = v3f(10.0f, 0.2f, 10.0f);
+ V3F platform_scale = v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f);
+ Transform platform_transform = transform_make_scale_translate(platform_pos,
+ platform_scale);
+
+ U32 VAO, VBO;
+ glGenVertexArrays(1, &VAO);
+ glBindVertexArray(VAO);
+ glGenBuffers(1, &VBO);
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ state.camera = (Camera) {
+ v3f(0.0f, 0.0f, 3.0f),
+ 90.0f, 0.1f, 100.0f,
+ 0.0f, 0.0f
+ };
+
+ F32 target_fps = 60.0f;
+ F32 target_spf = 1.0f/target_fps;
+ F32 last_time = glfwGetTime();
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ process_glfw_keyboard(window, &input);
+ glfwGetFramebufferSize(window, &width, &height);
+
+ /* INFO(pryazha): Update */
+ V3F target = v3f_zero();
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ V3F dv = get_dv_camera_orbital(&input, state.camera.pos,
+ target, state.dt, 3.0f);
+ state.camera.pos = v3f_add(state.camera.pos, dv);
+
+ input_update_last_state(&input);
+
+ /* INFO(pryazha): Render */
+ MAT4 model, view, proj;
+ view = look_at(state.camera.pos, target, v3f(0.0f, 1.0f, 0.0f));
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+
+ glViewport(0, 0, width, height);
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+
+ /* NOTE(pryazha): Update stencil buffer with ones while drawing the cubes */
+ glStencilFunc(GL_ALWAYS, 1, 0xFF);
+ glStencilMask(0xFF);
+
+ glUseProgram(shader);
+ shader_set_mat4fv(shader, "view", view);
+ shader_set_mat4fv(shader, "proj", proj);
+ glBindTexture(GL_TEXTURE_2D, marble_texture);
+ glBindVertexArray(VAO);
+ for (S32 i = 0; i < (S32)ArrayCount(cube_positions); ++i) {
+ model = transform_apply(cube_positions[i]);
+ shader_set_mat4fv(shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ }
+
+ /* NOTE(pryazha): Don't update stencil buffer while drawing the floor */
+ glStencilMask(0x00);
+
+ glBindTexture(GL_TEXTURE_2D, metal_texture);
+ model = transform_apply(platform_transform);
+ shader_set_mat4fv(shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+
+ glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
+ glStencilMask(0x00);
+ glDisable(GL_DEPTH_TEST);
+
+ glUseProgram(outline_shader);
+ shader_set_mat4fv(outline_shader, "view", view);
+ shader_set_mat4fv(outline_shader, "proj", proj);
+ for (S32 i = 0; i < (S32)ArrayCount(cube_positions); ++i) {
+ Transform transform = cube_positions[i];
+ transform = transform_scale(transform, v3f(1.1f, 1.1f, 1.1f));
+ model = transform_apply(transform);
+ shader_set_mat4fv(outline_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ }
+
+ glStencilMask(0xFF);
+ glStencilFunc(GL_ALWAYS, 1, 0xFF);
+ glEnable(GL_DEPTH_TEST);
+
+ 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;
+ last_time = current_time;
+ }
+
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/3.blending/blending b/advanced_opengl/3.blending/blending
index 40fe12a..c7a5ea0 100755
--- a/advanced_opengl/3.blending/blending
+++ b/advanced_opengl/3.blending/blending
Binary files differ
diff --git a/advanced_opengl/3.blending/blending.c b/advanced_opengl/3.blending/blending.c
index 9ac92ea..8142ab3 100644
--- a/advanced_opengl/3.blending/blending.c
+++ b/advanced_opengl/3.blending/blending.c
@@ -2,372 +2,277 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ State state;
+ S32 width, height;
+ Input input;
-#define WIDTH 1280
-#define HEIGHT 720
+ if (glfwInit() == GLFW_FALSE) {
+ fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
+ return(1);
+ }
-static V3F camera_pos;
-static F32 dt;
-static Input input;
+ width = 1024;
+ height = 768;
-void
-key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- switch (action)
- {
- case GLFW_PRESS: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_PRESS;
- } break;
- }
- } break;
-
- case GLFW_RELEASE: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_RELEASE;
- } break;
- }
- } break;
- }
-}
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "Stencil testing", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
-int
-main(void)
-{
- GLFWwindow *window;
-
- 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(WIDTH, HEIGHT, "Blending", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetKeyCallback(window, key_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- U32 shader = create_shader_program("shaders/blending.vs", "shaders/blending.fs");
- U32 grass_shader = create_shader_program("shaders/blending.vs", "shaders/grass.fs");
- U32 marble_texture = load_texture("../../data/textures/marble.jpg");
- U32 metal_texture = load_texture("../../data/textures/metal.png");
- U32 grass_texture = load_texture("../../data/textures/grass.png");
- U32 window_texture = load_texture("../../data/textures/window.png");
-
- F32 a = 0.5f;
- F32 vertices[] = {
- -a, -a, -a, 0.0f, 0.0f,
- a, -a, -a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- -a, a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 0.0f,
-
- -a, -a, a, 0.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 1.0f,
- a, a, a, 1.0f, 1.0f,
- -a, a, a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
-
- -a, a, a, 1.0f, 0.0f,
- -a, a, -a, 1.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, a, a, 1.0f, 0.0f,
-
- a, a, a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, a, 0.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
-
- -a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 1.0f, 1.0f,
- a, -a, a, 1.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, -a, -a, 0.0f, 1.0f,
-
- -a, a, -a, 0.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
- -a, a, a, 0.0f, 0.0f,
- -a, a, -a, 0.0f, 1.0f
- };
-
- Transform cube_positions[] = {
- transform_default(),
- transform_make_translate(v3f(a, 0.0f, -4.0f*a))
- };
-
- Transform platform_position =
- transform_make_scale_translate(v3f(10.0f, 0.2f, 10.0f),
- v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f));
-
- U32 cube_vao, quad_vao, vbo;
-
- glGenVertexArrays(1, &cube_vao);
- glBindVertexArray(cube_vao);
-
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- F32 quad_side = 1.0f;
- F32 quad_vertices[] = {
- /* NOTE(pryazha): left top triangle */
- -quad_side/2.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- -quad_side/2.0f, quad_side, 0.0f, 0.0f, 1.0f,
- quad_side/2.0f, quad_side, 0.0f, 1.0f, 1.0f,
-
- /* NOTE(pryazha): right bottom triangle */
- -quad_side/2.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- quad_side/2.0f, quad_side, 0.0f, 1.0f, 1.0f,
- quad_side/2.0f, 0.0f, 0.0f, 1.0f, 0.0f
- };
-
- 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, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- Transform grass_positions[] = {
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(1.0f, -0.5f, 0.0f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(-1.5f, -0.5f, 2.0f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(0.0f, -0.5f, -1.0f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(3.0f, -0.5f, 1.0f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(-2.0f, -0.5f, -3.0f))
- };
-
- Transform window_transforms[] = {
- transform_make_translate(v3f(0.0f, -0.5f, a+0.1f)),
- transform_make_translate(v3f(0.0f, -0.5f, 2.0f)),
- transform_make_translate(v3f(1.0f, -0.5f, -1.0f)),
- transform_make_translate(v3f(-2.0f, -0.5f, 0.5f)),
- transform_make_translate(v3f(-3.0f, -0.5f, -3.0f)),
- transform_make_translate(v3f(3.0f, -0.5f, 0.2)),
- };
-
- F32 angle = 0.0f;
- for (S32 window_index = 0;
- window_index < (S32)ArrayCount(window_transforms);
- ++window_index)
- {
- Transform *transform = window_transforms+window_index;
- *transform = transform_rotate(*transform, v3f(0.0f, angle, 0.0f));
- angle += 30.0f;
- }
-
- F32 target_fps = 60.0f;
- F32 target_spf = 1.0f/target_fps;
- camera_pos = v3f(0.0f, 0.0f, 3.0f);
-
- /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */
-
- F32 last_time = glfwGetTime();
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* INFO(pryazha): update */
- V3F left, up, forward;
- V3F world_up = v3f(0.0f, 1.0f, 0.0f);
-
- forward = v3f_norm(v3f_sub(v3f(0.0f, 0.0f, 0.0f), camera_pos));
- left = v3f_norm(v3f_cross(world_up, forward));
- up = v3f_cross(forward, left);
-
- V3F dp = v3f_zero();
-
- F32 speed = 2.0f;
- if (key_is_pressed(input.move_right))
- dp = v3f_add(dp, v3f_scalef(left, -speed*dt));
- if (key_is_pressed(input.move_forward))
- dp = v3f_add(dp, v3f_scalef(forward, speed*dt));
- if (key_is_pressed(input.move_left))
- dp = v3f_add(dp, v3f_scalef(left, speed*dt));
- if (key_is_pressed(input.move_backward))
- dp = v3f_add(dp, v3f_scalef(forward, -speed*dt));
- if (key_is_pressed(input.move_up))
- dp = v3f_add(dp, v3f_scalef(up, speed*dt));
- if (key_is_pressed(input.move_down))
- dp = v3f_add(dp, v3f_scalef(up, -speed*dt));
-
- input_update_last_state(&input);
-
- camera_pos = v3f_add(camera_pos, dp);
-
- Transform sorted_window_transforms[ArrayCount(window_transforms)];
- MemoryCopyArray(sorted_window_transforms, window_transforms);
- for (S32 i = 0; i < (S32)ArrayCount(sorted_window_transforms); ++i) {
- for (S32 pos_index = 1;
- pos_index < (S32)ArrayCount(sorted_window_transforms);
- ++pos_index)
- {
- F32 distance_left = v3f_length(v3f_sub(sorted_window_transforms[pos_index-1].translate, camera_pos));
- F32 distance_right = v3f_length(v3f_sub(sorted_window_transforms[pos_index].translate, camera_pos));
- if (distance_left < distance_right) {
- Transform temp = sorted_window_transforms[pos_index];
- sorted_window_transforms[pos_index] = sorted_window_transforms[pos_index-1];
- sorted_window_transforms[pos_index-1] = temp;
- }
- }
- }
-
- /* INFO(pryazha): Render */
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- MAT4 model, view, projection;
- view = look_at(camera_pos, v3f(0.0f, 0.0f, 0.0f), v3f(0.0f, 1.0f, 0.0f));
- projection = perspective(90.0f, (F32)WIDTH/(F32)HEIGHT, 0.1f, 100.0f);
-
- glUseProgram(shader);
- shader_set_mat4fv(shader, "view", view);
- shader_set_mat4fv(shader, "projection", projection);
-
- glBindTexture(GL_TEXTURE_2D, marble_texture);
- glBindVertexArray(cube_vao);
- for (S32 transform_index = 0;
- transform_index < (S32)ArrayCount(cube_positions);
- ++transform_index)
- {
- model = transform_apply(cube_positions[transform_index]);
- shader_set_mat4fv(shader, "model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- glBindTexture(GL_TEXTURE_2D, metal_texture);
- model = transform_apply(platform_position);
- shader_set_mat4fv(shader, "model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
-
- glUseProgram(grass_shader);
- glBindTexture(GL_TEXTURE_2D, grass_texture);
- shader_set_mat4fv(shader, "view", view);
- shader_set_mat4fv(shader, "projection", projection);
- glBindVertexArray(quad_vao);
-
- F32 angle = 0.0f;
- for (S32 transform_index = 0;
- transform_index < (S32)ArrayCount(grass_positions);
- ++transform_index)
- {
- Transform *transform = grass_positions+transform_index;
- Transform new_transform = transform_rotate(*transform, v3f(0.0f, angle, 0.0f));
- shader_set_mat4fv(shader, "model", transform_apply(new_transform));
- glDrawArrays(GL_TRIANGLES, 0, 6);
- angle += 30.0f;
- }
-
- glUseProgram(shader);
- glBindTexture(GL_TEXTURE_2D, window_texture);
- shader_set_mat4fv(shader, "view", view);
- shader_set_mat4fv(shader, "projection", projection);
- for (S32 window_index = 0;
- window_index < (S32)ArrayCount(sorted_window_transforms);
- ++window_index)
- {
- MAT4 model = transform_apply(sorted_window_transforms[window_index]);
- shader_set_mat4fv(shader, "model", model);
- glDrawArrays(GL_TRIANGLES, 0, 6);
- }
-
- glBindVertexArray(0);
-
- 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;
- last_time = current_time;
- }
-
- glfwTerminate();
- return(0);
+ glfwMakeContextCurrent(window);
+
+ if (glewInit() != GLEW_OK) {
+ fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ U32 shader = create_shader_program("shaders/blending.vert", "shaders/blending.frag");
+ U32 grass_shader = create_shader_program("shaders/blending.vert", "shaders/grass.frag");
+ U32 marble_texture = load_texture("../../data/textures/marble.jpg");
+ U32 metal_texture = load_texture("../../data/textures/metal.png");
+ U32 grass_texture = load_texture("../../data/textures/grass.png");
+ U32 window_texture = load_texture("../../data/textures/window.png");
+
+ F32 a = 0.5f;
+ F32 vertices[] = {
+ -a, -a, -a, 0.0f, 0.0f,
+ a, -a, -a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ -a, a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 0.0f,
+
+ -a, -a, a, 0.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 1.0f,
+ -a, a, a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+
+ -a, a, a, 1.0f, 0.0f,
+ -a, a, -a, 1.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, a, a, 1.0f, 0.0f,
+
+ a, a, a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, a, 0.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+
+ -a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 1.0f, 1.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+
+ -a, a, -a, 0.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+ -a, a, a, 0.0f, 0.0f,
+ -a, a, -a, 0.0f, 1.0f
+ };
+
+ Transform cube_positions[] = {
+ transform_default(),
+ transform_make_translate(v3f(a, 0.0f, -4.0f*a))
+ };
+
+ V3F platform_pos = v3f(10.0f, 0.2f, 10.0f);
+ V3F platform_scale = v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f);
+ Transform platform_transform = transform_make_scale_translate(platform_pos,
+ platform_scale);
+
+ U32 cube_vao, quad_vao, vbo;
+ glGenVertexArrays(1, &cube_vao);
+ glBindVertexArray(cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ F32 quad_side = 1.0f;
+ F32 quad_vertices[] = {
+ /* NOTE(pryazha): left top triangle */
+ -quad_side/2.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ -quad_side/2.0f, quad_side, 0.0f, 0.0f, 1.0f,
+ quad_side/2.0f, quad_side, 0.0f, 1.0f, 1.0f,
+
+ /* NOTE(pryazha): right bottom triangle */
+ -quad_side/2.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ quad_side/2.0f, quad_side, 0.0f, 1.0f, 1.0f,
+ quad_side/2.0f, 0.0f, 0.0f, 1.0f, 0.0f
+ };
+
+ 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, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ Transform grass_positions[] = {
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(1.0f, -0.5f, 0.0f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(-1.5f, -0.5f, 2.0f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(0.0f, -0.5f, -1.0f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(3.0f, -0.5f, 1.0f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(-2.0f, -0.5f, -3.0f))
+ };
+
+ Transform window_transforms[] = {
+ transform_make_translate(v3f(0.0f, -0.5f, a+0.1f)),
+ transform_make_translate(v3f(0.0f, -0.5f, 2.0f)),
+ transform_make_translate(v3f(1.0f, -0.5f, -1.0f)),
+ transform_make_translate(v3f(-2.0f, -0.5f, 0.5f)),
+ transform_make_translate(v3f(-3.0f, -0.5f, -3.0f)),
+ transform_make_translate(v3f(3.0f, -0.5f, 0.2)),
+ };
+
+ F32 angle = 0.0f;
+ for (S32 i = 0; i < (S32)ArrayCount(window_transforms); ++i) {
+ Transform *transform = window_transforms+i;
+ *transform = transform_rotate(*transform, v3f(0.0f, angle, 0.0f));
+ angle += 30.0f;
+ }
+
+ state.camera = (Camera) {
+ v3f(0.0f, 0.0f, 3.0f),
+ 90.0f, 0.1f, 100.0f,
+ 0.0f, 0.0f
+ };
+
+ F32 target_fps = 60.0f;
+ F32 target_spf = 1.0f/target_fps;
+ F32 last_time = glfwGetTime();
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ process_glfw_keyboard(window, &input);
+ glfwGetFramebufferSize(window, &width, &height);
+
+ /* INFO(pryazha): Update */
+ V3F target = v3f_zero();
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ V3F dv = get_dv_camera_orbital(&input, state.camera.pos,
+ target, state.dt, 3.0f);
+ state.camera.pos = v3f_add(state.camera.pos, dv);
+
+ input_update_last_state(&input);
+
+ Transform sorted[ArrayCount(window_transforms)];
+ MemoryCopyArray(sorted, window_transforms);
+ for (S32 i = 0; i < (S32)ArrayCount(sorted); ++i) {
+ for (S32 j = 1; j < (S32)ArrayCount(sorted); ++j) {
+ F32 dist_left = v3f_length(v3f_sub(sorted[j-1].translate, state.camera.pos));
+ F32 dist_right = v3f_length(v3f_sub(sorted[j].translate, state.camera.pos));
+ if (dist_left < dist_right) {
+ Transform temp = sorted[j];
+ sorted[j] = sorted[j-1];
+ sorted[j-1] = temp;
+ }
+ }
+ }
+
+ /* INFO(pryazha): Render */
+ MAT4 model, view, proj;
+ view = look_at(state.camera.pos, target, v3f(0.0f, 1.0f, 0.0f));
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+
+ glViewport(0, 0, width, height);
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glUseProgram(shader);
+ shader_set_mat4fv(shader, "view", view);
+ shader_set_mat4fv(shader, "proj", proj);
+ glBindTexture(GL_TEXTURE_2D, marble_texture);
+ glBindVertexArray(cube_vao);
+ for (S32 i = 0; i < (S32)ArrayCount(cube_positions); ++i) {
+ model = transform_apply(cube_positions[i]);
+ shader_set_mat4fv(shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ }
+
+ glBindTexture(GL_TEXTURE_2D, metal_texture);
+ model = transform_apply(platform_transform);
+ shader_set_mat4fv(shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ glUseProgram(grass_shader);
+ glBindTexture(GL_TEXTURE_2D, grass_texture);
+ shader_set_mat4fv(shader, "view", view);
+ shader_set_mat4fv(shader, "proj", proj);
+ glBindVertexArray(quad_vao);
+ F32 angle = 0.0f;
+ for (S32 i = 0; i < (S32)ArrayCount(grass_positions); ++i) {
+ Transform *transform = grass_positions+i;
+ Transform new_transform = transform_rotate(*transform, v3f(0.0f, angle, 0.0f));
+ model = transform_apply(new_transform);
+ shader_set_mat4fv(shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ angle += 30.0f;
+ }
+
+ glUseProgram(shader);
+ glBindTexture(GL_TEXTURE_2D, window_texture);
+ shader_set_mat4fv(shader, "view", view);
+ shader_set_mat4fv(shader, "proj", proj);
+ for (S32 i = 0; i < (S32)ArrayCount(sorted); ++i) {
+ MAT4 model = transform_apply(sorted[i]);
+ shader_set_mat4fv(shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ }
+ glBindVertexArray(0);
+
+ 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;
+ last_time = current_time;
+ }
+
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/6.cubemaps/shaders/cube.fs b/advanced_opengl/3.blending/shaders/blending.frag
index f58c5d3..71892a7 100644
--- a/advanced_opengl/6.cubemaps/shaders/cube.fs
+++ b/advanced_opengl/3.blending/shaders/blending.frag
@@ -6,8 +6,7 @@ in vec2 tex_coords;
uniform sampler2D texture1;
-void
-main(void)
+void main(void)
{
frag_color = texture(texture1, tex_coords);
}
diff --git a/advanced_opengl/4.face_culling/shaders/face_culling.vs b/advanced_opengl/3.blending/shaders/blending.vert
index 62e71a2..68b8fe2 100644
--- a/advanced_opengl/4.face_culling/shaders/face_culling.vs
+++ b/advanced_opengl/3.blending/shaders/blending.vert
@@ -4,13 +4,12 @@ layout(location = 1) in vec2 atex_coords;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
out vec2 tex_coords;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
tex_coords = atex_coords;
}
diff --git a/advanced_opengl/3.blending/shaders/grass.fs b/advanced_opengl/3.blending/shaders/grass.frag
index cecb0ce..85c806f 100644
--- a/advanced_opengl/3.blending/shaders/grass.fs
+++ b/advanced_opengl/3.blending/shaders/grass.frag
@@ -6,12 +6,10 @@ in vec2 tex_coords;
uniform sampler2D texture1;
-void
-main(void)
+void main(void)
{
vec4 tex_color = texture(texture1, tex_coords);
- if (tex_color.a <= 0.2) {
+ if (tex_color.a <= 0.2)
discard;
- }
frag_color = tex_color;
}
diff --git a/advanced_opengl/4.face_culling/face_culling b/advanced_opengl/4.face_culling/face_culling
index eb6e3e9..c00eeaa 100755
--- a/advanced_opengl/4.face_culling/face_culling
+++ b/advanced_opengl/4.face_culling/face_culling
Binary files differ
diff --git a/advanced_opengl/4.face_culling/face_culling.c b/advanced_opengl/4.face_culling/face_culling.c
index 9769b53..c3a31c0 100644
--- a/advanced_opengl/4.face_culling/face_culling.c
+++ b/advanced_opengl/4.face_culling/face_culling.c
@@ -2,305 +2,234 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ State state;
+ S32 width, height;
+ Input input;
-#define WIDTH 1280
-#define HEIGHT 720
+ if (glfwInit() == GLFW_FALSE) {
+ fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
+ return(1);
+ }
-static V3F camera_pos;
-static F32 dt;
-static Input input;
+ width = 1024;
+ height = 768;
-void
-key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- switch (action)
- {
- case GLFW_PRESS: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_PRESS;
- } break;
- }
- } break;
-
- case GLFW_RELEASE: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_RELEASE;
- } break;
- }
- } break;
- }
-}
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "Face culling", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
-int
-main(void)
-{
- GLFWwindow *window;
-
- 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(WIDTH, HEIGHT, "Face culling", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetKeyCallback(window, key_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glFrontFace(GL_CW);
- glCullFace(GL_BACK);
-
- U32 shader = create_shader_program("shaders/face_culling.vs", "shaders/face_culling.fs");
-
- U32 grid_texture = load_texture("../../data/textures/grid.png");
-
- F32 a = 0.5f;
- /* NOTE(pryazha): Counter-clockwise order */
- F32 cube_vertices_ccw[] = {
- /* NOTE(pryazha): Back face */
- a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, a, -a, 1.0f, 1.0f, /* top-right */
- a, a, -a, 0.0f, 1.0f, /* top-left */
- a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- -a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Front face */
- -a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, a, 1.0f, 1.0f, /* top-right */
- -a, a, a, 0.0f, 1.0f, /* top-left */
- -a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, -a, a, 1.0f, 0.0f, /* bottom-right */
- a, a, a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Left face */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, a, a, 1.0f, 1.0f, /* top-right */
- -a, a, -a, 0.0f, 1.0f, /* top-left */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, -a, a, 1.0f, 0.0f, /* bottom-right */
- -a, a, a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Right face */
- a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, -a, 1.0f, 1.0f, /* top-right */
- a, a, a, 0.0f, 1.0f, /* top-left */
- a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Top face */
- -a, a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, -a, 1.0f, 1.0f, /* top-right */
- -a, a, -a, 0.0f, 1.0f, /* top-left */
- -a, a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, a, 1.0f, 0.0f, /* bottom-right */
- a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Bottom face */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- a, -a, a, 1.0f, 1.0f, /* top-right */
- -a, -a, a, 0.0f, 1.0f, /* top-left */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- a, -a, a, 1.0f, 1.0f, /* top-right */
- };
-
- F32 cube_vertices_cw[] = {
- /* NOTE(pryazha): Back face */
- a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, a, -a, 1.0f, 1.0f, /* top-right */
- -a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- a, a, -a, 0.0f, 1.0f, /* top-left */
- -a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Front face */
- -a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, a, 1.0f, 1.0f, /* top-right */
- a, -a, a, 1.0f, 0.0f, /* bottom-right */
- -a, -a, a, 0.0f, 0.0f, /* bottom-left */
- -a, a, a, 0.0f, 1.0f, /* top-left */
- a, a, a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Left face */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, a, a, 1.0f, 1.0f, /* top-right */
- -a, -a, a, 1.0f, 0.0f, /* bottom-right */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, a, -a, 0.0f, 1.0f, /* top-left */
- -a, a, a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Right face */
- a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, -a, 1.0f, 1.0f, /* top-right */
- a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, a, 0.0f, 1.0f, /* top-left */
- a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Top face */
- -a, a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, -a, 1.0f, 1.0f, /* top-right */
- a, a, a, 1.0f, 0.0f, /* bottom-right */
- -a, a, a, 0.0f, 0.0f, /* bottom-left */
- -a, a, -a, 0.0f, 1.0f, /* top-left */
- a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Bottom face */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- a, -a, a, 1.0f, 1.0f, /* top-right */
- a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, -a, a, 0.0f, 1.0f, /* top-left */
- a, -a, a, 1.0f, 1.0f, /* top-right */
- };
-
- U32 cube_vao, vbo;
- glGenVertexArrays(1, &cube_vao);
- glBindVertexArray(cube_vao);
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices_cw), cube_vertices_cw, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- Transform cube_transform = transform_default();
-
- F32 target_fps = 60.0f;
- F32 target_spf = 1.0f/target_fps;
- camera_pos = v3f(0.0f, 1.0f, 3.0f);
-
- F32 last_time = glfwGetTime();
-
- F32 d_angle = 45.0f;
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* INFO(pryazha): update */
- V3F left, up, forward;
- V3F world_up = v3f(0.0f, 1.0f, 0.0f);
-
- forward = v3f_norm(v3f_sub(v3f(0.0f, 0.0f, 0.0f), camera_pos));
- left = v3f_norm(v3f_cross(world_up, forward));
- up = v3f_cross(forward, left);
-
- V3F dp = v3f_zero();
- F32 speed = 2.0f;
- if (key_is_pressed(input.move_right))
- dp = v3f_add(dp, v3f_scalef(left, -speed*dt));
- if (key_is_pressed(input.move_forward))
- dp = v3f_add(dp, v3f_scalef(forward, speed*dt));
- if (key_is_pressed(input.move_left))
- dp = v3f_add(dp, v3f_scalef(left, speed*dt));
- if (key_is_pressed(input.move_backward))
- dp = v3f_add(dp, v3f_scalef(forward, -speed*dt));
- if (key_is_pressed(input.move_up))
- dp = v3f_add(dp, v3f_scalef(up, speed*dt));
- if (key_is_pressed(input.move_down))
- dp = v3f_add(dp, v3f_scalef(up, -speed*dt));
-
- input_update_last_state(&input);
-
- camera_pos = v3f_add(camera_pos, dp);
-
- /* INFO(pryazha): Render */
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- MAT4 model, view, projection;
- cube_transform = transform_rotate(cube_transform, v3f(0.0f, d_angle*dt, 0.0f));
- model = transform_apply(cube_transform);
- view = look_at(camera_pos, v3f(0.0f, 0.0f, 0.0f), v3f(0.0f, 1.0f, 0.0f));
- projection = perspective(90.0f, (F32)WIDTH/(F32)HEIGHT, 0.1f, 100.0f);
-
- glUseProgram(shader);
- glBindTexture(GL_TEXTURE_2D, grid_texture);
- shader_set_mat4fv(shader, "model", model);
- shader_set_mat4fv(shader, "view", view);
- shader_set_mat4fv(shader, "projection", projection);
- glBindVertexArray(cube_vao);
- glDrawArrays(GL_TRIANGLES, 0, 36);
-
- 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;
- last_time = current_time;
- }
-
- glfwTerminate();
- return(0);
+ glfwMakeContextCurrent(window);
+
+ if (glewInit() != GLEW_OK) {
+ fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glFrontFace(GL_CW);
+ glCullFace(GL_BACK);
+
+ U32 shader = create_shader_program("shaders/face_culling.vert",
+ "shaders/face_culling.frag");
+
+ U32 grid_texture = load_texture("../../data/textures/grid.png");
+
+ F32 a = 0.5f;
+ /* NOTE(pryazha): Counter-clockwise order */
+ F32 cube_vertices_ccw[] = {
+ /* NOTE(pryazha): Back face */
+ a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, -a, 1.0f, 1.0f, /* top-right */
+ a, a, -a, 0.0f, 1.0f, /* top-left */
+ a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ -a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Front face */
+ -a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, a, 1.0f, 1.0f, /* top-right */
+ -a, a, a, 0.0f, 1.0f, /* top-left */
+ -a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, a, 1.0f, 0.0f, /* bottom-right */
+ a, a, a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Left face */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, a, 1.0f, 1.0f, /* top-right */
+ -a, a, -a, 0.0f, 1.0f, /* top-left */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, -a, a, 1.0f, 0.0f, /* bottom-right */
+ -a, a, a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Right face */
+ a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+ a, a, a, 0.0f, 1.0f, /* top-left */
+ a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Top face */
+ -a, a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+ -a, a, -a, 0.0f, 1.0f, /* top-left */
+ -a, a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, a, 1.0f, 0.0f, /* bottom-right */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Bottom face */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, a, 1.0f, 1.0f, /* top-right */
+ -a, -a, a, 0.0f, 1.0f, /* top-left */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ a, -a, a, 1.0f, 1.0f, /* top-right */
+ };
+
+ F32 cube_vertices_cw[] = {
+ /* NOTE(pryazha): Back face */
+ a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, -a, 1.0f, 1.0f, /* top-right */
+ -a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ a, a, -a, 0.0f, 1.0f, /* top-left */
+ -a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Front face */
+ -a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, a, 1.0f, 1.0f, /* top-right */
+ a, -a, a, 1.0f, 0.0f, /* bottom-right */
+ -a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, a, 0.0f, 1.0f, /* top-left */
+ a, a, a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Left face */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, a, 1.0f, 1.0f, /* top-right */
+ -a, -a, a, 1.0f, 0.0f, /* bottom-right */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, -a, 0.0f, 1.0f, /* top-left */
+ -a, a, a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Right face */
+ a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+ a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, a, 0.0f, 1.0f, /* top-left */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Top face */
+ -a, a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+ a, a, a, 1.0f, 0.0f, /* bottom-right */
+ -a, a, a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, -a, 0.0f, 1.0f, /* top-left */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Bottom face */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, a, 1.0f, 1.0f, /* top-right */
+ a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, -a, a, 0.0f, 1.0f, /* top-left */
+ a, -a, a, 1.0f, 1.0f, /* top-right */
+ };
+
+ U32 cube_vao, vbo;
+ glGenVertexArrays(1, &cube_vao);
+ glBindVertexArray(cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices_cw), cube_vertices_cw, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ Transform cube_transform = transform_default();
+
+ state.camera = (Camera) {
+ v3f(0.0f, 0.0f, 3.0f),
+ 90.0f, 0.1f, 100.0f,
+ 0.0f, 0.0f
+ };
+
+ F32 target_fps = 60.0f;
+ F32 target_spf = 1.0f/target_fps;
+ F32 last_time = glfwGetTime();
+
+ F32 d_angle = 45.0f;
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ process_glfw_keyboard(window, &input);
+ glfwGetFramebufferSize(window, &width, &height);
+
+ /* INFO(pryazha): update */
+ V3F target = v3f_zero();
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ V3F dv = get_dv_camera_orbital(&input, state.camera.pos,
+ target, state.dt, 3.0f);
+ state.camera.pos = v3f_add(state.camera.pos, dv);
+
+ input_update_last_state(&input);
+
+ /* INFO(pryazha): Render */
+ MAT4 model, view, proj;
+ view = look_at(state.camera.pos, target, v3f(0.0f, 1.0f, 0.0f));
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+ cube_transform = transform_rotate(cube_transform,
+ v3f(0.0f, d_angle*state.dt, 0.0f));
+ model = transform_apply(cube_transform);
+
+ glViewport(0, 0, width, height);
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glUseProgram(shader);
+ glBindTexture(GL_TEXTURE_2D, grid_texture);
+ shader_set_mat4fv(shader, "model", model);
+ shader_set_mat4fv(shader, "view", view);
+ shader_set_mat4fv(shader, "proj", proj);
+ glBindVertexArray(cube_vao);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ 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;
+ last_time = current_time;
+ }
+
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/5.framebuffers/shaders/cube.fs b/advanced_opengl/4.face_culling/shaders/face_culling.frag
index f58c5d3..71892a7 100644
--- a/advanced_opengl/5.framebuffers/shaders/cube.fs
+++ b/advanced_opengl/4.face_culling/shaders/face_culling.frag
@@ -6,8 +6,7 @@ in vec2 tex_coords;
uniform sampler2D texture1;
-void
-main(void)
+void main(void)
{
frag_color = texture(texture1, tex_coords);
}
diff --git a/advanced_opengl/3.blending/shaders/blending.vs b/advanced_opengl/4.face_culling/shaders/face_culling.vert
index 62e71a2..68b8fe2 100644
--- a/advanced_opengl/3.blending/shaders/blending.vs
+++ b/advanced_opengl/4.face_culling/shaders/face_culling.vert
@@ -4,13 +4,12 @@ layout(location = 1) in vec2 atex_coords;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
out vec2 tex_coords;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
tex_coords = atex_coords;
}
diff --git a/advanced_opengl/5.framebuffers/framebuffers b/advanced_opengl/5.framebuffers/framebuffers
index a1f7170..4a3d49e 100755
--- a/advanced_opengl/5.framebuffers/framebuffers
+++ b/advanced_opengl/5.framebuffers/framebuffers
Binary files differ
diff --git a/advanced_opengl/5.framebuffers/framebuffers.c b/advanced_opengl/5.framebuffers/framebuffers.c
index a0523cc..7948a61 100644
--- a/advanced_opengl/5.framebuffers/framebuffers.c
+++ b/advanced_opengl/5.framebuffers/framebuffers.c
@@ -2,423 +2,336 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ State state;
+ S32 width, height;
+ Input input;
-#define WIDTH 1024
-#define HEIGHT 768
+ if (glfwInit() == GLFW_FALSE) {
+ fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
+ return(1);
+ }
-static V3F camera_pos;
-static F32 dt;
-static Input input;
+ width = 1024;
+ height = 768;
-void
-key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- switch (action)
- {
- case GLFW_PRESS: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_PRESS;
- } break;
- }
- } break;
-
- case GLFW_RELEASE: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_RELEASE;
- } break;
- }
- } break;
- }
-}
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "Framebuffers", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
-int
-main(void)
-{
- GLFWwindow *window;
-
- 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(WIDTH, HEIGHT, "Framebuffers", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetKeyCallback(window, key_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- U32 screen_shader = create_shader_program("shaders/screen.vs", "shaders/screen.fs");
- U32 cube_shader = create_shader_program("shaders/cube.vs", "shaders/cube.fs");
- U32 marble_texture = load_texture("../../data/textures/marble.jpg");
- U32 metal_texture = load_texture("../../data/textures/metal.png");
- U32 window_texture = load_texture("../../data/textures/window.png");
-
- U32 fbo;
- glGenFramebuffers(1, &fbo);
- glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-
- U32 texture_colorbuffer;
- glGenTextures(1, &texture_colorbuffer);
- glBindTexture(GL_TEXTURE_2D, texture_colorbuffer);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glBindTexture(GL_TEXTURE_2D, 0);
-
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
- texture_colorbuffer, 0);
-
- U32 rbo;
- glGenRenderbuffers(1, &rbo);
- glBindRenderbuffer(GL_RENDERBUFFER, rbo);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, WIDTH, HEIGHT);
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
-
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, rbo);
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
- fprintf(stderr, "[ERROR]: Framebuffer is not complete.\n");
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- F32 a = 0.5f;
- F32 vertices[] = {
- -a, -a, -a, 0.0f, 0.0f,
- a, -a, -a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- -a, a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 0.0f,
-
- -a, -a, a, 0.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 1.0f,
- a, a, a, 1.0f, 1.0f,
- -a, a, a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
-
- -a, a, a, 1.0f, 0.0f,
- -a, a, -a, 1.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, a, a, 1.0f, 0.0f,
-
- a, a, a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, a, 0.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
-
- -a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 1.0f, 1.0f,
- a, -a, a, 1.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, -a, -a, 0.0f, 1.0f,
-
- -a, a, -a, 0.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
- -a, a, a, 0.0f, 0.0f,
- -a, a, -a, 0.0f, 1.0f
- };
-
- Transform cube_positions[] = {
- transform_default(),
- transform_make_translate(v3f(a, 0.0f, -4.0f*a))
- };
-
- Transform platform_position =
- transform_make_scale_translate(v3f(10.0f, 0.2f, 10.0f),
- v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f));
-
- U32 cube_vao, quad_vao, vbo;
-
- glGenVertexArrays(1, &cube_vao);
- glBindVertexArray(cube_vao);
-
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- F32 quad_vertices[] = {
- -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- -1.0f, 1.0f, 0.0f, 0.0f, 1.0f
- };
-
- 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, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- Transform window_transforms[] = {
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(0.0f, 0.0f, a+0.1f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(0.0f, 0.0f, 2.0f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(1.0f, 0.0f, -1.0f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(-2.0f, 0.0f, 0.5f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(-3.0f, 0.0f, -3.0f)),
- transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(3.0f, 0.0f, 0.2)),
- };
-
- F32 angle = 0.0f;
- for (S32 window_index = 0;
- window_index < (S32)ArrayCount(window_transforms);
- ++window_index)
- {
- Transform *transform = window_transforms+window_index;
- *transform = transform_rotate(*transform, v3f(0.0f, angle, 0.0f));
- angle += 30.0f;
- }
-
- F32 target_fps = 60.0f;
- F32 target_spf = 1.0f/target_fps;
- camera_pos = v3f(0.0f, 1.0f, 3.0f);
-
- F32 last_time = glfwGetTime();
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* INFO(pryazha): update */
- V3F left, up, forward;
- V3F world_up = v3f(0.0f, 1.0f, 0.0f);
-
- forward = v3f_norm(v3f_sub(v3f(0.0f, 0.0f, 0.0f), camera_pos));
- left = v3f_norm(v3f_cross(world_up, forward));
- up = v3f_cross(forward, left);
-
- V3F dp = v3f_zero();
- F32 speed = 2.0f;
- if (key_is_pressed(input.move_right))
- dp = v3f_add(dp, v3f_scalef(left, -speed*dt));
- if (key_is_pressed(input.move_forward))
- dp = v3f_add(dp, v3f_scalef(forward, speed*dt));
- if (key_is_pressed(input.move_left))
- dp = v3f_add(dp, v3f_scalef(left, speed*dt));
- if (key_is_pressed(input.move_backward))
- dp = v3f_add(dp, v3f_scalef(forward, -speed*dt));
- if (key_is_pressed(input.move_up))
- dp = v3f_add(dp, v3f_scalef(up, speed*dt));
- if (key_is_pressed(input.move_down))
- dp = v3f_add(dp, v3f_scalef(up, -speed*dt));
-
- input_update_last_state(&input);
-
- camera_pos = v3f_add(camera_pos, dp);
-
- Transform sorted_window_transforms[ArrayCount(window_transforms)];
- MemoryCopyArray(sorted_window_transforms, window_transforms);
- for (S32 i = 0; i < (S32)ArrayCount(sorted_window_transforms); ++i) {
- for (S32 pos_index = 1;
- pos_index < (S32)ArrayCount(sorted_window_transforms);
- ++pos_index)
- {
- F32 distance_left = v3f_length(v3f_sub(sorted_window_transforms[pos_index-1].translate, camera_pos));
- F32 distance_right = v3f_length(v3f_sub(sorted_window_transforms[pos_index].translate, camera_pos));
- if (distance_left < distance_right) {
- Transform temp = sorted_window_transforms[pos_index];
- sorted_window_transforms[pos_index] = sorted_window_transforms[pos_index-1];
- sorted_window_transforms[pos_index-1] = temp;
- }
- }
- }
-
- /* INFO(pryazha): Render */
- glBindFramebuffer(GL_FRAMEBUFFER, fbo);
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glEnable(GL_DEPTH_TEST);
- MAT4 view, projection;
- view = look_at(camera_pos, v3f(0.0f, 0.0f, 0.0f), v3f(0.0f, 1.0f, 0.0f));
- projection = perspective(90.0f, (F32)WIDTH/(F32)HEIGHT, 0.1f, 100.0f);
- glUseProgram(cube_shader);
- shader_set_mat4fv(cube_shader, "view", view);
- shader_set_mat4fv(cube_shader, "projection", projection);
- glBindTexture(GL_TEXTURE_2D, marble_texture);
- glBindVertexArray(cube_vao);
- for (S32 transform_index = 0;
- transform_index < (S32)ArrayCount(cube_positions);
- ++transform_index)
- {
- shader_set_mat4fv(cube_shader, "model", transform_apply(cube_positions[transform_index]));
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- glBindTexture(GL_TEXTURE_2D, metal_texture);
- shader_set_mat4fv(cube_shader, "model", transform_apply(platform_position));
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindVertexArray(0);
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- glUseProgram(cube_shader);
- glBindTexture(GL_TEXTURE_2D, window_texture);
- shader_set_mat4fv(cube_shader, "view", view);
- shader_set_mat4fv(cube_shader, "projection", projection);
- glBindVertexArray(quad_vao);
- for (S32 window_index = 0;
- window_index < (S32)ArrayCount(sorted_window_transforms);
- ++window_index)
- {
- shader_set_mat4fv(cube_shader, "model", transform_apply(sorted_window_transforms[window_index]));
- glDrawArrays(GL_TRIANGLES, 0, 6);
- }
- glBindVertexArray(0);
- glDisable(GL_BLEND);
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- glUseProgram(screen_shader);
- glDisable(GL_DEPTH_TEST);
- glBindTexture(GL_TEXTURE_2D, texture_colorbuffer);
- glBindVertexArray(quad_vao);
- shader_set_mat4fv(screen_shader, "model", mat4_identity());
- glDrawArrays(GL_TRIANGLES, 0, 6);
- glBindVertexArray(0);
-
- glBindFramebuffer(GL_FRAMEBUFFER, fbo);
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glEnable(GL_DEPTH_TEST);
- V3F target = v3f_add(camera_pos, v3f_negate(forward));
- view = look_at(camera_pos, target, v3f(0.0f, 1.0f, 0.0f));
- glUseProgram(cube_shader);
- shader_set_mat4fv(cube_shader, "view", view);
- shader_set_mat4fv(cube_shader, "projection", projection);
- glBindTexture(GL_TEXTURE_2D, marble_texture);
- glBindVertexArray(cube_vao);
- for (S32 transform_index = 0;
- transform_index < (S32)ArrayCount(cube_positions);
- ++transform_index)
- {
- shader_set_mat4fv(cube_shader, "model", transform_apply(cube_positions[transform_index]));
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- glBindTexture(GL_TEXTURE_2D, metal_texture);
- shader_set_mat4fv(cube_shader, "model", transform_apply(platform_position));
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindVertexArray(0);
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- glUseProgram(cube_shader);
- glBindTexture(GL_TEXTURE_2D, window_texture);
- shader_set_mat4fv(cube_shader, "view", view);
- shader_set_mat4fv(cube_shader, "projection", projection);
- glBindVertexArray(quad_vao);
- for (S32 window_index = 0;
- window_index < (S32)ArrayCount(sorted_window_transforms);
- ++window_index)
- {
- shader_set_mat4fv(cube_shader, "model", transform_apply(sorted_window_transforms[window_index]));
- glDrawArrays(GL_TRIANGLES, 0, 6);
- }
- glBindVertexArray(0);
- glDisable(GL_BLEND);
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glUseProgram(screen_shader);
- glDisable(GL_DEPTH_TEST);
- glBindTexture(GL_TEXTURE_2D, texture_colorbuffer);
- glBindVertexArray(quad_vao);
- MAT4 model = transform_apply(transform_make_scale_translate(v3f(0.3f, 0.3f, 0.3f), v3f(-0.7f, 0.7f, 0.0f)));
- shader_set_mat4fv(screen_shader, "model", model);
- glDrawArrays(GL_TRIANGLES, 0, 6);
- glBindVertexArray(0);
-
- 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;
- last_time = current_time;
- }
-
- glfwTerminate();
- return(0);
+ glfwMakeContextCurrent(window);
+
+ if (glewInit() != GLEW_OK) {
+ fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ U32 screen_shader = create_shader_program("shaders/screen.vert",
+ "shaders/screen.frag");
+ U32 cube_shader = create_shader_program("shaders/cube.vert",
+ "shaders/cube.frag");
+ U32 marble_texture = load_texture("../../data/textures/marble.jpg");
+ U32 metal_texture = load_texture("../../data/textures/metal.png");
+ U32 window_texture = load_texture("../../data/textures/window.png");
+
+ U32 fbo, texture_colorbuffer, rbo;
+ glGenFramebuffers(1, &fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ glGenTextures(1, &texture_colorbuffer);
+ glBindTexture(GL_TEXTURE_2D, texture_colorbuffer);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D, texture_colorbuffer, 0);
+ glGenRenderbuffers(1, &rbo);
+ glBindRenderbuffer(GL_RENDERBUFFER, rbo);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
+ GL_RENDERBUFFER, rbo);
+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
+ fprintf(stderr, "[ERROR]: Framebuffer is not complete.\n");
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+ F32 a = 0.5f;
+ F32 vertices[] = {
+ -a, -a, -a, 0.0f, 0.0f,
+ a, -a, -a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ -a, a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 0.0f,
+
+ -a, -a, a, 0.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 1.0f,
+ -a, a, a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+
+ -a, a, a, 1.0f, 0.0f,
+ -a, a, -a, 1.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, a, a, 1.0f, 0.0f,
+
+ a, a, a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, a, 0.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+
+ -a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 1.0f, 1.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+
+ -a, a, -a, 0.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+ -a, a, a, 0.0f, 0.0f,
+ -a, a, -a, 0.0f, 1.0f
+ };
+
+ Transform cube_positions[] = {
+ transform_default(),
+ transform_make_translate(v3f(a, 0.0f, -4.0f*a))
+ };
+
+ V3F platform_pos = v3f(10.0f, 0.2f, 10.0f);
+ V3F platform_scale = v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f);
+ Transform platform_transform = transform_make_scale_translate(platform_pos,
+ platform_scale);
+ U32 cube_vao, quad_vao, vbo;
+ glGenVertexArrays(1, &cube_vao);
+ glBindVertexArray(cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ F32 quad_vertices[] = {
+ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
+ 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 0.0f, 0.0f, 1.0f
+ };
+
+ 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, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ Transform window_transforms[] = {
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(0.0f, 0.0f, a+0.1f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(0.0f, 0.0f, 2.0f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(1.0f, 0.0f, -1.0f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(-2.0f, 0.0f, 0.5f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(-3.0f, 0.0f, -3.0f)),
+ transform_make_scale_translate(v3f(0.5f, 0.5f, 0.5f), v3f(3.0f, 0.0f, 0.2)),
+ };
+
+ F32 angle = 0.0f;
+ for (S32 i = 0; i < (S32)ArrayCount(window_transforms); ++i) {
+ Transform *transform = window_transforms+i;
+ *transform = transform_rotate(*transform, v3f(0.0f, angle, 0.0f));
+ angle += 30.0f;
+ }
+
+ state.camera = (Camera) {
+ v3f(0.0f, 0.0f, 3.0f),
+ 90.0f, 0.1f, 100.0f,
+ 0.0f, 0.0f
+ };
+
+ F32 target_fps = 60.0f;
+ F32 target_spf = 1.0f/target_fps;
+ F32 last_time = glfwGetTime();
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ process_glfw_keyboard(window, &input);
+ glfwGetFramebufferSize(window, &width, &height);
+
+ /* INFO(pryazha): Update */
+ V3F target = v3f_zero();
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ V3F dv = get_dv_camera_orbital(&input, state.camera.pos,
+ target, state.dt, 3.0f);
+ state.camera.pos = v3f_add(state.camera.pos, dv);
+
+ input_update_last_state(&input);
+
+ Transform sorted[ArrayCount(window_transforms)];
+ MemoryCopyArray(sorted, window_transforms);
+ for (S32 i = 0; i < (S32)ArrayCount(sorted); ++i) {
+ for (S32 j = 1; j < (S32)ArrayCount(sorted); ++j) {
+ F32 dist_left = v3f_length(v3f_sub(sorted[j-1].translate, state.camera.pos));
+ F32 dist_right = v3f_length(v3f_sub(sorted[j].translate, state.camera.pos));
+ if (dist_left < dist_right) {
+ Transform temp = sorted[j];
+ sorted[j] = sorted[j-1];
+ sorted[j-1] = temp;
+ }
+ }
+ }
+
+ /* INFO(pryazha): Render */
+ MAT4 model, view, proj;
+
+ view = look_at(state.camera.pos, target, v3f(0.0f, 1.0f, 0.0f));
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ glViewport(0, 0, width, height);
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_DEPTH_TEST);
+ glUseProgram(cube_shader);
+ shader_set_mat4fv(cube_shader, "view", view);
+ shader_set_mat4fv(cube_shader, "proj", proj);
+ glBindTexture(GL_TEXTURE_2D, marble_texture);
+ glBindVertexArray(cube_vao);
+ for (S32 i = 0; i < (S32)ArrayCount(cube_positions); ++i) {
+ model = transform_apply(cube_positions[i]);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ }
+
+ glBindTexture(GL_TEXTURE_2D, metal_texture);
+ model = transform_apply(platform_transform);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ glUseProgram(cube_shader);
+ glBindTexture(GL_TEXTURE_2D, window_texture);
+ shader_set_mat4fv(cube_shader, "view", view);
+ shader_set_mat4fv(cube_shader, "proj", proj);
+ glBindVertexArray(quad_vao);
+ for (S32 i = 0; i < (S32)ArrayCount(sorted); ++i) {
+ model = transform_apply(sorted[i]);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ }
+ glBindVertexArray(0);
+ glDisable(GL_BLEND);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glViewport(0, 0, width, height);
+ glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glUseProgram(screen_shader);
+ glDisable(GL_DEPTH_TEST);
+ glBindTexture(GL_TEXTURE_2D, texture_colorbuffer);
+ glBindVertexArray(quad_vao);
+ shader_set_mat4fv(screen_shader, "model", mat4_identity());
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ glBindVertexArray(0);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ glViewport(0, 0, width, height);
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_DEPTH_TEST);
+ V3F f = v3f(view.m2.x, view.m2.y, view.m2.z);
+ target = v3f_add(state.camera.pos, v3f_negate(f));
+ view = look_at(state.camera.pos, target, v3f(0.0f, 1.0f, 0.0f));
+ glUseProgram(cube_shader);
+ shader_set_mat4fv(cube_shader, "view", view);
+ shader_set_mat4fv(cube_shader, "proj", proj);
+ glBindTexture(GL_TEXTURE_2D, marble_texture);
+ glBindVertexArray(cube_vao);
+ for (S32 i = 0; i < (S32)ArrayCount(cube_positions); ++i) {
+ model = transform_apply(cube_positions[i]);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ }
+
+ glBindTexture(GL_TEXTURE_2D, metal_texture);
+ model = transform_apply(platform_transform);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ glUseProgram(cube_shader);
+ glBindTexture(GL_TEXTURE_2D, window_texture);
+ shader_set_mat4fv(cube_shader, "view", view);
+ shader_set_mat4fv(cube_shader, "proj", proj);
+ glBindVertexArray(quad_vao);
+ for (S32 i = 0; i < (S32)ArrayCount(sorted); ++i) {
+ model = transform_apply(sorted[i]);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ }
+ glBindVertexArray(0);
+ glDisable(GL_BLEND);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glViewport(0, 0, width, height);
+ glUseProgram(screen_shader);
+ glDisable(GL_DEPTH_TEST);
+ glBindTexture(GL_TEXTURE_2D, texture_colorbuffer);
+ glBindVertexArray(quad_vao);
+ model = transform_apply(transform_make_scale_translate(v3f(0.3f, 0.3f, 0.3f), v3f(-0.7f, 0.7f, 0.0f)));
+ shader_set_mat4fv(screen_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ glBindVertexArray(0);
+
+ 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;
+ last_time = current_time;
+ }
+
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/4.face_culling/shaders/face_culling.fs b/advanced_opengl/5.framebuffers/shaders/cube.frag
index f58c5d3..71892a7 100644
--- a/advanced_opengl/4.face_culling/shaders/face_culling.fs
+++ b/advanced_opengl/5.framebuffers/shaders/cube.frag
@@ -6,8 +6,7 @@ in vec2 tex_coords;
uniform sampler2D texture1;
-void
-main(void)
+void main(void)
{
frag_color = texture(texture1, tex_coords);
}
diff --git a/advanced_opengl/5.framebuffers/shaders/cube.vs b/advanced_opengl/5.framebuffers/shaders/cube.vert
index aea5c2c..2436f35 100644
--- a/advanced_opengl/5.framebuffers/shaders/cube.vs
+++ b/advanced_opengl/5.framebuffers/shaders/cube.vert
@@ -5,13 +5,12 @@ layout(location = 1) in vec2 atex_coords;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
out vec2 tex_coords;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
tex_coords = atex_coords;
}
diff --git a/advanced_opengl/5.framebuffers/shaders/screen.fs b/advanced_opengl/5.framebuffers/shaders/screen.frag
index 183d490..234b3fc 100644
--- a/advanced_opengl/5.framebuffers/shaders/screen.fs
+++ b/advanced_opengl/5.framebuffers/shaders/screen.frag
@@ -6,15 +6,13 @@ in vec2 tex_coords;
uniform sampler2D texture1;
-vec4
-inversion()
+vec4 inversion()
{
vec4 result = vec4(1.0-vec3(texture(texture1, tex_coords)), 1.0);
return(result);
}
-vec4
-grayscale_average()
+vec4 grayscale_average()
{
vec4 tex_color = texture(texture1, tex_coords);
float average = (tex_color.r+tex_color.g+tex_color.b)/3.0;
@@ -22,8 +20,7 @@ grayscale_average()
return(result);
}
-vec4
-grayscale_weights()
+vec4 grayscale_weights()
{
vec4 tex_color = texture(texture1, tex_coords);
float average = 0.2126*tex_color.r+0.7152*tex_color.g+0.0722*tex_color.b;
@@ -33,8 +30,7 @@ grayscale_weights()
const float offset = 1.0/300.0;
-vec4
-kernel_effect(float[9] kernel)
+vec4 kernel_effect(float[9] kernel)
{
vec2 offsets[9] = vec2[](
vec2(-offset, offset), /* top-left */
@@ -49,13 +45,8 @@ kernel_effect(float[9] kernel)
);
vec3 sample_texture[9];
- for (int offset_index = 0;
- offset_index < 9;
- ++offset_index)
- {
- sample_texture[offset_index] =
- vec3(texture(texture1, tex_coords+offsets[offset_index]));
- }
+ for (int i = 0; i < 9; ++i)
+ sample_texture[i] = vec3(texture(texture1, tex_coords+offsets[i]));
vec3 color = vec3(0.0);
for (int i = 0; i < 9; ++i)
@@ -64,8 +55,7 @@ kernel_effect(float[9] kernel)
return(vec4(color, 1.0));
}
-void
-main(void)
+void main(void)
{
float strange_kernel[9] = float[](
-1, -1, -1,
diff --git a/advanced_opengl/5.framebuffers/shaders/screen.vs b/advanced_opengl/5.framebuffers/shaders/screen.vert
index 8fdea55..92bc378 100644
--- a/advanced_opengl/5.framebuffers/shaders/screen.vs
+++ b/advanced_opengl/5.framebuffers/shaders/screen.vert
@@ -6,8 +6,7 @@ out vec2 tex_coords;
uniform mat4 model;
-void
-main(void)
+void main(void)
{
gl_Position = model*vec4(apos, 1.0);
tex_coords = atex_coords;
diff --git a/advanced_opengl/6.cubemaps/cubemaps b/advanced_opengl/6.cubemaps/cubemaps
index bdf54f5..bc274ea 100755
--- a/advanced_opengl/6.cubemaps/cubemaps
+++ b/advanced_opengl/6.cubemaps/cubemaps
Binary files differ
diff --git a/advanced_opengl/6.cubemaps/cubemaps.c b/advanced_opengl/6.cubemaps/cubemaps.c
index 5ea5300..32a53d1 100644
--- a/advanced_opengl/6.cubemaps/cubemaps.c
+++ b/advanced_opengl/6.cubemaps/cubemaps.c
@@ -2,450 +2,350 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ State state;
+ S32 width, height;
+ Input input;
-#define WIDTH 1024
-#define HEIGHT 768
+ if (glfwInit() == GLFW_FALSE) {
+ fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
+ return(1);
+ }
-static V3F camera_pos;
-static F32 dt;
-static Input input;
-static B32 first_mouse = 1;
+ width = 1024;
+ height = 768;
-void
-key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- switch (action)
- {
- case GLFW_PRESS: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_PRESS;
- } break;
- }
- } break;
-
- case GLFW_RELEASE: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_RELEASE;
- } break;
- }
- } break;
- }
-}
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "Cubemaps", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
-void
-cursor_pos_callback(GLFWwindow* window, double xpos, double ypos)
-{
- if (first_mouse)
- {
- input.last_mouse_pos = v2f(xpos, ypos);
- first_mouse = 0;
- }
- input.mouse_offset = v2f(input.mouse_offset.x+((F32)xpos-input.last_mouse_pos.x),
- input.mouse_offset.y+((F32)ypos-input.last_mouse_pos.y));
- input.last_mouse_pos = v2f((F32)xpos, (F32)ypos);
-}
+ glfwMakeContextCurrent(window);
-int
-main(void)
-{
- GLFWwindow *window;
-
- 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(WIDTH, HEIGHT, "Cubemaps", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
-
- glfwSetKeyCallback(window, key_callback);
- glfwSetCursorPosCallback(window, cursor_pos_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- U32 skybox_shader = create_shader_program("shaders/skybox.vs", "shaders/skybox.fs");
- U32 reflection_shader = create_shader_program("shaders/reflection.vs", "shaders/reflection.fs");
- U32 refraction_shader = create_shader_program("shaders/refraction.vs", "shaders/refraction.fs");
- U32 cube_shader = create_shader_program("shaders/cube.vs", "shaders/cube.fs");
- U32 grid_texture = load_texture("../../data/textures/grid.png");
-
- const char *cube_texture_filenames[6] = {
- "../../data/textures/skybox/right.jpg",
- "../../data/textures/skybox/left.jpg",
- "../../data/textures/skybox/top.jpg",
- "../../data/textures/skybox/bottom.jpg",
- "../../data/textures/skybox/front.jpg",
- "../../data/textures/skybox/back.jpg"
- };
- U32 skybox_texture = load_cubemap(cube_texture_filenames);
-
- F32 a = 0.5f;
- F32 vertices[] = {
- -a, -a, -a, 0.0f, 0.0f,
- a, -a, -a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- -a, a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 0.0f,
-
- -a, -a, a, 0.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 1.0f,
- a, a, a, 1.0f, 1.0f,
- -a, a, a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
-
- -a, a, a, 1.0f, 0.0f,
- -a, a, -a, 1.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, a, a, 1.0f, 0.0f,
-
- a, a, a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, a, 0.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
-
- -a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 1.0f, 1.0f,
- a, -a, a, 1.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, -a, -a, 0.0f, 1.0f,
-
- -a, a, -a, 0.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
- -a, a, a, 0.0f, 0.0f,
- -a, a, -a, 0.0f, 1.0f
- };
-
- Transform cube_positions[] = {
- transform_default(),
- transform_make_translate(v3f(a, 0.0f, -4.0f*a))
- };
-
- Transform platform_position =
- transform_make_scale_translate(v3f(10.0f, 0.2f, 10.0f),
- v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f));
-
- U32 cube_vao, vbo;
-
- glGenVertexArrays(1, &cube_vao);
- glBindVertexArray(cube_vao);
-
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- a = 1.0f;
- F32 skybox_cube_vertices[] = {
- -a, -a, -a,
- a, -a, -a,
- a, a, -a,
- a, a, -a,
- -a, a, -a,
- -a, -a, -a,
-
- -a, -a, a,
- a, -a, a,
- a, a, a,
- a, a, a,
- -a, a, a,
- -a, -a, a,
-
- -a, a, a,
- -a, a, -a,
- -a, -a, -a,
- -a, -a, -a,
- -a, -a, a,
- -a, a, a,
-
- a, a, a,
- a, a, -a,
- a, -a, -a,
- a, -a, -a,
- a, -a, a,
- a, a, a,
-
- -a, -a, -a,
- a, -a, -a,
- a, -a, a,
- a, -a, a,
- -a, -a, a,
- -a, -a, -a,
-
- -a, a, -a,
- a, a, -a,
- a, a, a,
- a, a, a,
- -a, a, a,
- -a, a, -a,
- };
-
- U32 skybox_cube_vao;
- glGenVertexArrays(1, &skybox_cube_vao);
- glBindVertexArray(skybox_cube_vao);
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(skybox_cube_vertices), skybox_cube_vertices, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(F32), (void *)0);
- glBindVertexArray(0);
-
- F32 normals_cube_vertices[] = {
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
- -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
-
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
-
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f
- };
- U32 normals_cube_vao;
- glGenVertexArrays(1, &normals_cube_vao);
- glBindVertexArray(normals_cube_vao);
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(normals_cube_vertices), normals_cube_vertices, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- F32 target_fps = 60.0f;
- F32 target_spf = 1.0f/target_fps;
- camera_pos = v3f(0.0f, 1.0f, 3.0f);
- F32 yaw = 0.0f, pitch = 0.0f;
-
- F32 last_time = glfwGetTime();
-
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
-
- MAT4 view, projection;
- view = mat4_make_translate(v3f_negate(camera_pos));
- view = mat4_rotate_angles(view, v3f(pitch, yaw, 0.0f));
- projection = perspective(90.0f, (F32)WIDTH/(F32)HEIGHT, 0.1f, 100.0f);
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* INFO(pryazha): update */
-
- V3F left, up, forward;
-
- left = v3f(-view.m0.x, -view.m1.x, -view.m2.x);
- up = v3f(view.m0.y, view.m1.y, view.m2.y);
- forward = v3f(-view.m0.z, -view.m1.z, -view.m2.z);
-
- V3F dp = v3f_zero();
- F32 speed = 2.0f;
- if (key_is_pressed(input.move_right))
- dp = v3f_add(dp, v3f_scalef(left, -speed*dt));
- if (key_is_pressed(input.move_forward))
- dp = v3f_add(dp, v3f_scalef(forward, speed*dt));
- if (key_is_pressed(input.move_left))
- dp = v3f_add(dp, v3f_scalef(left, speed*dt));
- if (key_is_pressed(input.move_backward))
- dp = v3f_add(dp, v3f_scalef(forward, -speed*dt));
- if (key_is_pressed(input.move_up))
- dp = v3f_add(dp, v3f_scalef(up, speed*dt));
- if (key_is_pressed(input.move_down))
- dp = v3f_add(dp, v3f_scalef(up, -speed*dt));
-
- camera_pos = v3f_add(camera_pos, dp);
-
- /* NOTE(pryazha): Mouse handling */
- F32 sensitivity = 0.1f;
- input.mouse_offset = v2f_scalef(input.mouse_offset, sensitivity);
- yaw += input.mouse_offset.x;
- pitch += input.mouse_offset.y;
- if (pitch > 89.0f)
- pitch = 89.0f;
- if (pitch < -89.0f)
- pitch = -89.0f;
-
- view = mat4_make_translate(v3f_negate(camera_pos));
- view = mat4_rotate_angles(view, v3f(pitch, yaw, 0.0f));
-
- input_update_last_state(&input);
-
- /* NOTE(pryazha): Render */
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glUseProgram(cube_shader);
- shader_set_mat4fv(cube_shader, "view", view);
- shader_set_mat4fv(cube_shader, "projection", projection);
- glBindTexture(GL_TEXTURE_2D, grid_texture);
-
- glBindVertexArray(cube_vao);
- for (S32 transform_index = 0;
- transform_index < (S32)ArrayCount(cube_positions);
- ++transform_index)
- {
- shader_set_mat4fv(cube_shader, "model", transform_apply(cube_positions[transform_index]));
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- shader_set_mat4fv(cube_shader, "model", transform_apply(platform_position));
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindVertexArray(0);
-
- glUseProgram(reflection_shader);
- shader_set_mat4fv(reflection_shader, "model", mat4_make_translate(v3f(0.0f, 2.0f, 0.0f)));
- shader_set_mat4fv(reflection_shader, "view", view);
- shader_set_mat4fv(reflection_shader, "projection", projection);
- shader_set_3fv(reflection_shader, "camera_pos", camera_pos);
- glBindVertexArray(normals_cube_vao);
- glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_texture);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
- glBindVertexArray(0);
-
- glUseProgram(refraction_shader);
- shader_set_mat4fv(refraction_shader, "model", mat4_make_translate(v3f(2.0f, 2.0f, 0.0f)));
- shader_set_mat4fv(refraction_shader, "view", view);
- shader_set_mat4fv(refraction_shader, "projection", projection);
- shader_set_3fv(refraction_shader, "camera_pos", camera_pos);
- glBindVertexArray(normals_cube_vao);
- glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_texture);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
- glBindVertexArray(0);
-
- glUseProgram(skybox_shader);
- MAT4 rotate_view = mat4_identity();
- rotate_view.m0 = v4f(view.m0.x, view.m0.y, view.m0.z, 0.0f);
- rotate_view.m1 = v4f(view.m1.x, view.m1.y, view.m1.z, 0.0f);
- rotate_view.m2 = v4f(view.m2.x, view.m2.y, view.m2.z, 0.0f);
- shader_set_mat4fv(skybox_shader, "view", rotate_view);
- shader_set_mat4fv(skybox_shader, "projection", projection);
- glBindVertexArray(skybox_cube_vao);
- glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_texture);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindVertexArray(0);
-
- 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;
- last_time = current_time;
- }
-
- glfwTerminate();
- return(0);
+ 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);
+ glDepthFunc(GL_LEQUAL);
+
+ U32 skybox_shader = create_shader_program("shaders/skybox.vert", "shaders/skybox.frag");
+ U32 reflection_shader = create_shader_program("shaders/reflection.vert", "shaders/reflection.frag");
+ U32 refraction_shader = create_shader_program("shaders/refraction.vert", "shaders/refraction.frag");
+ U32 cube_shader = create_shader_program("shaders/cube.vert", "shaders/cube.frag");
+ U32 grid_texture = load_texture("../../data/textures/grid.png");
+
+ const char *cube_texture_filenames[6] = {
+ "../../data/textures/skybox/right.jpg",
+ "../../data/textures/skybox/left.jpg",
+ "../../data/textures/skybox/top.jpg",
+ "../../data/textures/skybox/bottom.jpg",
+ "../../data/textures/skybox/front.jpg",
+ "../../data/textures/skybox/back.jpg"
+ };
+ U32 skybox_texture = load_cubemap(cube_texture_filenames);
+
+ F32 a = 0.5f;
+ F32 vertices[] = {
+ -a, -a, -a, 0.0f, 0.0f,
+ a, -a, -a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ -a, a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 0.0f,
+
+ -a, -a, a, 0.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 1.0f,
+ -a, a, a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+
+ -a, a, a, 1.0f, 0.0f,
+ -a, a, -a, 1.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, a, a, 1.0f, 0.0f,
+
+ a, a, a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, a, 0.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+
+ -a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 1.0f, 1.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+
+ -a, a, -a, 0.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+ -a, a, a, 0.0f, 0.0f,
+ -a, a, -a, 0.0f, 1.0f
+ };
+
+ Transform cube_positions[] = {
+ transform_default(),
+ transform_make_translate(v3f(a, 0.0f, -4.0f*a))
+ };
+
+ V3F platform_pos = v3f(10.0f, 0.2f, 10.0f);
+ V3F platform_scale = v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f);
+ Transform platform_transform = transform_make_scale_translate(platform_pos, platform_scale);
+
+ U32 cube_vao, vbo;
+ glGenVertexArrays(1, &cube_vao);
+ glBindVertexArray(cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ a = 1.0f;
+ F32 skybox_cube_vertices[] = {
+ -a, -a, -a,
+ a, -a, -a,
+ a, a, -a,
+ a, a, -a,
+ -a, a, -a,
+ -a, -a, -a,
+
+ -a, -a, a,
+ a, -a, a,
+ a, a, a,
+ a, a, a,
+ -a, a, a,
+ -a, -a, a,
+
+ -a, a, a,
+ -a, a, -a,
+ -a, -a, -a,
+ -a, -a, -a,
+ -a, -a, a,
+ -a, a, a,
+
+ a, a, a,
+ a, a, -a,
+ a, -a, -a,
+ a, -a, -a,
+ a, -a, a,
+ a, a, a,
+
+ -a, -a, -a,
+ a, -a, -a,
+ a, -a, a,
+ a, -a, a,
+ -a, -a, a,
+ -a, -a, -a,
+
+ -a, a, -a,
+ a, a, -a,
+ a, a, a,
+ a, a, a,
+ -a, a, a,
+ -a, a, -a,
+ };
+
+ U32 skybox_cube_vao;
+ glGenVertexArrays(1, &skybox_cube_vao);
+ glBindVertexArray(skybox_cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(skybox_cube_vertices), skybox_cube_vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(F32), (void *)0);
+ glBindVertexArray(0);
+
+ F32 normals_cube_vertices[] = {
+ -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+ -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
+
+ -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
+
+ -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
+ -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
+
+ 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
+
+ -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
+ -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
+ -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
+
+ -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
+ -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
+ -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f
+ };
+ U32 normals_cube_vao;
+ glGenVertexArrays(1, &normals_cube_vao);
+ glBindVertexArray(normals_cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(normals_cube_vertices), normals_cube_vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ state.camera = (Camera) {
+ v3f(0.0f, 1.0f, 3.0f), 100.0f,
+ 0.1f, 100.0f, 0.0f, 0.0f
+ };
+ input = input_init();
+
+ F32 target_fps = 60.0f;
+ F32 target_spf = 1.0f/target_fps;
+ F32 last_time = glfwGetTime();
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ /* INFO(pryazha): update */
+ glfwGetFramebufferSize(window, &width, &height);
+ process_glfw_keyboard(window, &input);
+ process_glfw_mouse_pos(window, &input);
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ 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 view, proj, model;
+ 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);
+
+ glUseProgram(cube_shader);
+ shader_set_mat4fv(cube_shader, "view", view);
+ shader_set_mat4fv(cube_shader, "proj", proj);
+ glBindTexture(GL_TEXTURE_2D, grid_texture);
+ glBindVertexArray(cube_vao);
+ for (S32 i = 0; i < (S32)ArrayCount(cube_positions); ++i) {
+ model = transform_apply(cube_positions[i]);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ }
+
+ model = transform_apply(platform_transform);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ glUseProgram(reflection_shader);
+ model = mat4_make_translate(v3f(0.0f, 2.0f, 0.0f));
+ shader_set_mat4fv(reflection_shader, "model", model);
+ shader_set_mat4fv(reflection_shader, "view", view);
+ shader_set_mat4fv(reflection_shader, "proj", proj);
+ shader_set_3fv(reflection_shader, "camera_pos", state.camera.pos);
+ glBindVertexArray(normals_cube_vao);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_texture);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
+ glBindVertexArray(0);
+
+ glUseProgram(refraction_shader);
+ model = mat4_make_translate(v3f(2.0f, 2.0f, 0.0f));
+ shader_set_mat4fv(refraction_shader, "model", model);
+ shader_set_mat4fv(refraction_shader, "view", view);
+ shader_set_mat4fv(refraction_shader, "proj", proj);
+ shader_set_3fv(refraction_shader, "camera_pos", state.camera.pos);
+ glBindVertexArray(normals_cube_vao);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_texture);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
+ glBindVertexArray(0);
+
+ glUseProgram(skybox_shader);
+ MAT4 rotate_view = mat4_identity();
+ rotate_view.m0 = v4f(view.m0.x, view.m0.y, view.m0.z, 0.0f);
+ rotate_view.m1 = v4f(view.m1.x, view.m1.y, view.m1.z, 0.0f);
+ rotate_view.m2 = v4f(view.m2.x, view.m2.y, view.m2.z, 0.0f);
+ shader_set_mat4fv(skybox_shader, "view", rotate_view);
+ shader_set_mat4fv(skybox_shader, "proj", proj);
+ glBindVertexArray(skybox_cube_vao);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_texture);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ 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;
+ last_time = current_time;
+ }
+
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/3.blending/shaders/blending.fs b/advanced_opengl/6.cubemaps/shaders/cube.frag
index f58c5d3..71892a7 100644
--- a/advanced_opengl/3.blending/shaders/blending.fs
+++ b/advanced_opengl/6.cubemaps/shaders/cube.frag
@@ -6,8 +6,7 @@ in vec2 tex_coords;
uniform sampler2D texture1;
-void
-main(void)
+void main(void)
{
frag_color = texture(texture1, tex_coords);
}
diff --git a/advanced_opengl/6.cubemaps/shaders/cube.vs b/advanced_opengl/6.cubemaps/shaders/cube.vert
index aea5c2c..2436f35 100644
--- a/advanced_opengl/6.cubemaps/shaders/cube.vs
+++ b/advanced_opengl/6.cubemaps/shaders/cube.vert
@@ -5,13 +5,12 @@ layout(location = 1) in vec2 atex_coords;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
out vec2 tex_coords;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
tex_coords = atex_coords;
}
diff --git a/advanced_opengl/6.cubemaps/shaders/reflection.fs b/advanced_opengl/6.cubemaps/shaders/reflection.frag
index 3723ea9..72b1c0d 100644
--- a/advanced_opengl/6.cubemaps/shaders/reflection.fs
+++ b/advanced_opengl/6.cubemaps/shaders/reflection.frag
@@ -8,8 +8,7 @@ out vec4 frag_color;
uniform vec3 camera_pos;
uniform samplerCube skybox;
-void
-main(void)
+void main(void)
{
vec3 i = pos-camera_pos;
vec3 r = reflect(i, normalize(normal));
diff --git a/advanced_opengl/6.cubemaps/shaders/reflection.vs b/advanced_opengl/6.cubemaps/shaders/reflection.vert
index c9a0698..d7070f2 100644
--- a/advanced_opengl/6.cubemaps/shaders/reflection.vs
+++ b/advanced_opengl/6.cubemaps/shaders/reflection.vert
@@ -8,12 +8,11 @@ out vec3 normal;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
-void
-main(void)
+void main(void)
{
pos = vec3(model*vec4(apos, 1.0));
normal = mat3(transpose(inverse(model)))*anormal;
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
}
diff --git a/advanced_opengl/6.cubemaps/shaders/refraction.fs b/advanced_opengl/6.cubemaps/shaders/refraction.frag
index ef8c415..fa01b2c 100644
--- a/advanced_opengl/6.cubemaps/shaders/refraction.fs
+++ b/advanced_opengl/6.cubemaps/shaders/refraction.frag
@@ -8,8 +8,7 @@ out vec4 frag_color;
uniform vec3 camera_pos;
uniform samplerCube skybox;
-void
-main(void)
+void main(void)
{
float ratio = 1.0/1.52;
vec3 i = pos-camera_pos;
diff --git a/advanced_opengl/6.cubemaps/shaders/refraction.vs b/advanced_opengl/6.cubemaps/shaders/refraction.vert
index c9a0698..d7070f2 100644
--- a/advanced_opengl/6.cubemaps/shaders/refraction.vs
+++ b/advanced_opengl/6.cubemaps/shaders/refraction.vert
@@ -8,12 +8,11 @@ out vec3 normal;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
-void
-main(void)
+void main(void)
{
pos = vec3(model*vec4(apos, 1.0));
normal = mat3(transpose(inverse(model)))*anormal;
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
}
diff --git a/advanced_opengl/6.cubemaps/shaders/skybox.fs b/advanced_opengl/6.cubemaps/shaders/skybox.frag
index bf69c8b..22be301 100644
--- a/advanced_opengl/6.cubemaps/shaders/skybox.fs
+++ b/advanced_opengl/6.cubemaps/shaders/skybox.frag
@@ -6,8 +6,7 @@ out vec4 frag_color;
uniform samplerCube skybox;
-void
-main(void)
+void main(void)
{
frag_color = texture(skybox, tex_coords);
}
diff --git a/advanced_opengl/6.cubemaps/shaders/skybox.vs b/advanced_opengl/6.cubemaps/shaders/skybox.vert
index c790148..c7d91c9 100644
--- a/advanced_opengl/6.cubemaps/shaders/skybox.vs
+++ b/advanced_opengl/6.cubemaps/shaders/skybox.vert
@@ -5,12 +5,11 @@ layout(location = 0) in vec3 apos;
out vec3 tex_coords;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
-void
-main(void)
+void main(void)
{
tex_coords = apos;
- vec4 pos = projection*view*vec4(apos, 1.0);
+ vec4 pos = proj*view*vec4(apos, 1.0);
gl_Position = pos.xyww;
}
diff --git a/advanced_opengl/8.geometry_shader/shaders/normals.fs b/advanced_opengl/7.uniform_buffer/shaders/color_cube.frag
index fbbafbf..d40d866 100644
--- a/advanced_opengl/8.geometry_shader/shaders/normals.fs
+++ b/advanced_opengl/7.uniform_buffer/shaders/color_cube.frag
@@ -2,8 +2,7 @@
out vec4 frag_color;
-void
-main(void)
+void main(void)
{
frag_color = vec4(1.0, 0.0, 0.0, 1.0);
}
diff --git a/advanced_opengl/7.uniform_buffer/shaders/color_cube.vs b/advanced_opengl/7.uniform_buffer/shaders/color_cube.vert
index 17a3448..67226f8 100644
--- a/advanced_opengl/7.uniform_buffer/shaders/color_cube.vs
+++ b/advanced_opengl/7.uniform_buffer/shaders/color_cube.vert
@@ -3,14 +3,13 @@ layout(location = 0) in vec3 apos;
layout(std140) uniform Matrices
{
- mat4 projection;
+ mat4 proj;
mat4 view;
};
uniform mat4 model;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
}
diff --git a/advanced_opengl/7.uniform_buffer/shaders/cube.frag b/advanced_opengl/7.uniform_buffer/shaders/cube.frag
new file mode 100644
index 0000000..71892a7
--- /dev/null
+++ b/advanced_opengl/7.uniform_buffer/shaders/cube.frag
@@ -0,0 +1,12 @@
+#version 330 core
+
+out vec4 frag_color;
+
+in vec2 tex_coords;
+
+uniform sampler2D texture1;
+
+void main(void)
+{
+ frag_color = texture(texture1, tex_coords);
+}
diff --git a/advanced_opengl/7.uniform_buffer/shaders/cube.fs b/advanced_opengl/7.uniform_buffer/shaders/cube.fs
deleted file mode 100644
index f58c5d3..0000000
--- a/advanced_opengl/7.uniform_buffer/shaders/cube.fs
+++ /dev/null
@@ -1,13 +0,0 @@
-#version 330 core
-
-out vec4 frag_color;
-
-in vec2 tex_coords;
-
-uniform sampler2D texture1;
-
-void
-main(void)
-{
- frag_color = texture(texture1, tex_coords);
-}
diff --git a/advanced_opengl/7.uniform_buffer/shaders/cube.vs b/advanced_opengl/7.uniform_buffer/shaders/cube.vert
index 054164d..ec90f37 100644
--- a/advanced_opengl/7.uniform_buffer/shaders/cube.vs
+++ b/advanced_opengl/7.uniform_buffer/shaders/cube.vert
@@ -5,7 +5,7 @@ layout(location = 1) in vec2 atex_coords;
layout(std140) uniform Matrices
{
- uniform mat4 projection;
+ uniform mat4 proj;
uniform mat4 view;
};
@@ -13,9 +13,8 @@ uniform mat4 model;
out vec2 tex_coords;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
tex_coords = atex_coords;
}
diff --git a/advanced_opengl/7.uniform_buffer/shaders/skybox.fs b/advanced_opengl/7.uniform_buffer/shaders/skybox.frag
index bf69c8b..22be301 100644
--- a/advanced_opengl/7.uniform_buffer/shaders/skybox.fs
+++ b/advanced_opengl/7.uniform_buffer/shaders/skybox.frag
@@ -6,8 +6,7 @@ out vec4 frag_color;
uniform samplerCube skybox;
-void
-main(void)
+void main(void)
{
frag_color = texture(skybox, tex_coords);
}
diff --git a/advanced_opengl/7.uniform_buffer/shaders/skybox.vs b/advanced_opengl/7.uniform_buffer/shaders/skybox.vert
index 03b2171..ddbeb21 100644
--- a/advanced_opengl/7.uniform_buffer/shaders/skybox.vs
+++ b/advanced_opengl/7.uniform_buffer/shaders/skybox.vert
@@ -6,14 +6,13 @@ out vec3 tex_coords;
layout(std140) uniform Matrices
{
- uniform mat4 projection;
+ uniform mat4 proj;
uniform mat4 view;
};
-void
-main(void)
+void main(void)
{
tex_coords = apos;
- vec4 pos = projection*view*vec4(apos, 1.0);
+ vec4 pos = proj*view*vec4(apos, 1.0);
gl_Position = pos.xyww;
}
diff --git a/advanced_opengl/7.uniform_buffer/uniform_buffer b/advanced_opengl/7.uniform_buffer/uniform_buffer
index 57aa64d..154fb08 100755
--- a/advanced_opengl/7.uniform_buffer/uniform_buffer
+++ b/advanced_opengl/7.uniform_buffer/uniform_buffer
Binary files differ
diff --git a/advanced_opengl/7.uniform_buffer/uniform_buffer.c b/advanced_opengl/7.uniform_buffer/uniform_buffer.c
index e67b5c9..a27c115 100644
--- a/advanced_opengl/7.uniform_buffer/uniform_buffer.c
+++ b/advanced_opengl/7.uniform_buffer/uniform_buffer.c
@@ -2,391 +2,302 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
+int main(void)
+{
+ GLFWwindow *window;
+ State state;
+ S32 width, height;
+ Input input;
-#define WIDTH 1024
-#define HEIGHT 768
+ if (glfwInit() == GLFW_FALSE) {
+ fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
+ return(1);
+ }
-static V3F camera_pos;
-static F32 dt;
-static Input input;
-static B32 first_mouse = 1;
+ width = 1024;
+ height = 768;
-void
-key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
-{
- switch (action)
- {
- case GLFW_PRESS: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_PRESS;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_PRESS;
- } break;
- }
- } break;
-
- case GLFW_RELEASE: {
- switch (key)
- {
- case GLFW_KEY_D: {
- input.move_right.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_W: {
- input.move_forward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_A: {
- input.move_left.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_S: {
- input.move_backward.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_E: {
- input.move_up.state = KeyState_RELEASE;
- } break;
- case GLFW_KEY_Q: {
- input.move_down.state = KeyState_RELEASE;
- } break;
- }
- } break;
- }
-}
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "Advanced data (uniform buffer)", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
-void
-cursor_pos_callback(GLFWwindow* window, double xpos, double ypos)
-{
- if (first_mouse)
- {
- input.last_mouse_pos = v2f(xpos, ypos);
- first_mouse = 0;
- }
- input.mouse_offset = v2f(input.mouse_offset.x+((F32)xpos-input.last_mouse_pos.x),
- input.mouse_offset.y+((F32)ypos-input.last_mouse_pos.y));
- input.last_mouse_pos = v2f((F32)xpos, (F32)ypos);
-}
+ glfwMakeContextCurrent(window);
-int
-main(void)
-{
- GLFWwindow *window;
-
- 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(WIDTH, HEIGHT, "Advanced data (uniform buffer)", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
-
- glfwSetKeyCallback(window, key_callback);
- glfwSetCursorPosCallback(window, cursor_pos_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- U32 skybox_shader = create_shader_program("shaders/skybox.vs", "shaders/skybox.fs");
- U32 cube_shader = create_shader_program("shaders/cube.vs", "shaders/cube.fs");
- U32 color_cube_shader = create_shader_program("shaders/color_cube.vs",
- "shaders/color_cube.fs");
-
- U32 skybox_matrices = glGetUniformBlockIndex(skybox_shader, "Matrices");
- U32 cube_matrices = glGetUniformBlockIndex(cube_shader, "Matrices");
- U32 color_cube_matrices = glGetUniformBlockIndex(color_cube_shader, "Matrices");
-
- glUniformBlockBinding(skybox_shader, skybox_matrices, 0);
- glUniformBlockBinding(cube_shader, cube_matrices, 0);
- glUniformBlockBinding(color_cube_shader, color_cube_matrices, 0);
-
- U32 matrices_ubo;
- glGenBuffers(1, &matrices_ubo);
- glBindBuffer(GL_UNIFORM_BUFFER, matrices_ubo);
- glBufferData(GL_UNIFORM_BUFFER, 2*sizeof(MAT4), 0, GL_STATIC_DRAW);
- glBindBuffer(GL_UNIFORM_BUFFER, 0);
- glBindBufferRange(GL_UNIFORM_BUFFER, 0, matrices_ubo, 0, 2*sizeof(MAT4));
-
- U32 grid_texture = load_texture("../../data/textures/grid.png");
-
- const char *cube_texture_filenames[6] = {
- "../../data/textures/skybox/right.jpg",
- "../../data/textures/skybox/left.jpg",
- "../../data/textures/skybox/top.jpg",
- "../../data/textures/skybox/bottom.jpg",
- "../../data/textures/skybox/front.jpg",
- "../../data/textures/skybox/back.jpg"
- };
- U32 skybox_texture = load_cubemap(cube_texture_filenames);
-
- F32 a = 0.5f;
- F32 vertices[] = {
- -a, -a, -a, 0.0f, 0.0f,
- a, -a, -a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- -a, a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 0.0f,
-
- -a, -a, a, 0.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 1.0f,
- a, a, a, 1.0f, 1.0f,
- -a, a, a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
-
- -a, a, a, 1.0f, 0.0f,
- -a, a, -a, 1.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, -a, 0.0f, 1.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, a, a, 1.0f, 0.0f,
-
- a, a, a, 1.0f, 0.0f,
- a, a, -a, 1.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 0.0f, 1.0f,
- a, -a, a, 0.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
-
- -a, -a, -a, 0.0f, 1.0f,
- a, -a, -a, 1.0f, 1.0f,
- a, -a, a, 1.0f, 0.0f,
- a, -a, a, 1.0f, 0.0f,
- -a, -a, a, 0.0f, 0.0f,
- -a, -a, -a, 0.0f, 1.0f,
-
- -a, a, -a, 0.0f, 1.0f,
- a, a, -a, 1.0f, 1.0f,
- a, a, a, 1.0f, 0.0f,
- a, a, a, 1.0f, 0.0f,
- -a, a, a, 0.0f, 0.0f,
- -a, a, -a, 0.0f, 1.0f
- };
-
- Transform platform_position =
- transform_make_scale_translate(v3f(10.0f, 0.2f, 10.0f),
- v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f));
-
- U32 cube_vao, vbo;
- glGenVertexArrays(1, &cube_vao);
- glBindVertexArray(cube_vao);
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- a = 1.0f;
- F32 skybox_cube_vertices[] = {
- -a, -a, -a,
- a, -a, -a,
- a, a, -a,
- a, a, -a,
- -a, a, -a,
- -a, -a, -a,
-
- -a, -a, a,
- a, -a, a,
- a, a, a,
- a, a, a,
- -a, a, a,
- -a, -a, a,
-
- -a, a, a,
- -a, a, -a,
- -a, -a, -a,
- -a, -a, -a,
- -a, -a, a,
- -a, a, a,
-
- a, a, a,
- a, a, -a,
- a, -a, -a,
- a, -a, -a,
- a, -a, a,
- a, a, a,
-
- -a, -a, -a,
- a, -a, -a,
- a, -a, a,
- a, -a, a,
- -a, -a, a,
- -a, -a, -a,
-
- -a, a, -a,
- a, a, -a,
- a, a, a,
- a, a, a,
- -a, a, a,
- -a, a, -a,
- };
-
- U32 skybox_cube_vao;
- glGenVertexArrays(1, &skybox_cube_vao);
- glBindVertexArray(skybox_cube_vao);
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(skybox_cube_vertices), skybox_cube_vertices, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(F32), (void *)0);
- glBindVertexArray(0);
-
- F32 target_fps = 60.0f;
- F32 target_spf = 1.0f/target_fps;
- camera_pos = v3f(0.0f, 1.0f, 3.0f);
- F32 yaw = 0.0f, pitch = 0.0f;
-
- F32 last_time = glfwGetTime();
-
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
-
- MAT4 view, projection;
- projection = perspective(90.0f, (F32)WIDTH/(F32)HEIGHT, 0.1f, 100.0f);
- glBindBuffer(GL_UNIFORM_BUFFER, matrices_ubo);
- glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(MAT4), (const void *)&projection);
- glBindBuffer(GL_UNIFORM_BUFFER, 0);
- view = mat4_make_translate(v3f_negate(camera_pos));
- view = mat4_rotate_angles(view, v3f(pitch, yaw, 0.0f));
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* INFO(pryazha): update */
-
- V3F left, up, forward;
-
- left = v3f(-view.m0.x, -view.m1.x, -view.m2.x);
- up = v3f(view.m0.y, view.m1.y, view.m2.y);
- forward = v3f(-view.m0.z, -view.m1.z, -view.m2.z);
-
- V3F dp = v3f_zero();
- F32 speed = 2.0f;
- if (key_is_pressed(input.move_right))
- dp = v3f_add(dp, v3f_scalef(left, -speed*dt));
- if (key_is_pressed(input.move_forward))
- dp = v3f_add(dp, v3f_scalef(forward, speed*dt));
- if (key_is_pressed(input.move_left))
- dp = v3f_add(dp, v3f_scalef(left, speed*dt));
- if (key_is_pressed(input.move_backward))
- dp = v3f_add(dp, v3f_scalef(forward, -speed*dt));
- if (key_is_pressed(input.move_up))
- dp = v3f_add(dp, v3f_scalef(up, speed*dt));
- if (key_is_pressed(input.move_down))
- dp = v3f_add(dp, v3f_scalef(up, -speed*dt));
- input_update_last_state(&input);
- camera_pos = v3f_add(camera_pos, dp);
-
- /* NOTE(pryazha): Mouse handling */
- F32 sensitivity = 0.1f;
- input.mouse_offset = v2f_scalef(input.mouse_offset, sensitivity);
- yaw += input.mouse_offset.x;
- pitch += input.mouse_offset.y;
- if (pitch > 89.0f)
- pitch = 89.0f;
- if (pitch < -89.0f)
- pitch = -89.0f;
- input.mouse_offset = v2f_zero();
-
- view = mat4_make_translate(v3f_negate(camera_pos));
- view = mat4_rotate_angles(view, v3f(pitch, yaw, 0.0f));
- glBindBuffer(GL_UNIFORM_BUFFER, matrices_ubo);
- glBufferSubData(GL_UNIFORM_BUFFER, sizeof(MAT4), sizeof(MAT4), (const void *)&view);
- glBindBuffer(GL_UNIFORM_BUFFER, 0);
-
- /* NOTE(pryazha): Render */
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glUseProgram(cube_shader);
- shader_set_mat4fv(cube_shader, "model", mat4_make_translate(v3f(-2.0f, 0.0f, 0.0f)));
- glBindTexture(GL_TEXTURE_2D, grid_texture);
- glBindVertexArray(cube_vao);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindTexture(GL_TEXTURE_2D, 0);
- glBindVertexArray(0);
-
- glUseProgram(cube_shader);
- shader_set_mat4fv(cube_shader, "model", transform_apply(platform_position));
- glBindTexture(GL_TEXTURE_2D, grid_texture);
- glBindVertexArray(cube_vao);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindTexture(GL_TEXTURE_2D, 0);
- glBindVertexArray(0);
-
- glUseProgram(color_cube_shader);
- shader_set_mat4fv(cube_shader, "model", mat4_make_translate(v3f(2.0f, 0.0f, 0.0f)));
- glBindVertexArray(cube_vao);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindVertexArray(0);
-
- glUseProgram(skybox_shader);
- MAT4 rotate_view = mat4_identity();
- rotate_view.m0 = v4f(view.m0.x, view.m0.y, view.m0.z, 0.0f);
- rotate_view.m1 = v4f(view.m1.x, view.m1.y, view.m1.z, 0.0f);
- rotate_view.m2 = v4f(view.m2.x, view.m2.y, view.m2.z, 0.0f);
- glBindBuffer(GL_UNIFORM_BUFFER, matrices_ubo);
- glBufferSubData(GL_UNIFORM_BUFFER, sizeof(MAT4), sizeof(MAT4), (const void *)&rotate_view);
- glBindBuffer(GL_UNIFORM_BUFFER, 0);
- glBindVertexArray(skybox_cube_vao);
- glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_texture);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindVertexArray(0);
-
- 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;
- last_time = current_time;
- }
-
- glfwTerminate();
- return(0);
+ 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);
+ glDepthFunc(GL_LEQUAL);
+
+ U32 skybox_shader = create_shader_program("shaders/skybox.vert", "shaders/skybox.frag");
+ U32 cube_shader = create_shader_program("shaders/cube.vert", "shaders/cube.frag");
+ U32 color_cube_shader = create_shader_program("shaders/color_cube.vert", "shaders/color_cube.frag");
+
+ U32 skybox_matrices = glGetUniformBlockIndex(skybox_shader, "Matrices");
+ U32 cube_matrices = glGetUniformBlockIndex(cube_shader, "Matrices");
+ U32 color_cube_matrices = glGetUniformBlockIndex(color_cube_shader, "Matrices");
+
+ glUniformBlockBinding(skybox_shader, skybox_matrices, 0);
+ glUniformBlockBinding(cube_shader, cube_matrices, 0);
+ glUniformBlockBinding(color_cube_shader, color_cube_matrices, 0);
+
+ U32 matrices_ubo;
+ glGenBuffers(1, &matrices_ubo);
+ glBindBuffer(GL_UNIFORM_BUFFER, matrices_ubo);
+ glBufferData(GL_UNIFORM_BUFFER, 2*sizeof(MAT4), 0, GL_STATIC_DRAW);
+ glBindBuffer(GL_UNIFORM_BUFFER, 0);
+ glBindBufferRange(GL_UNIFORM_BUFFER, 0, matrices_ubo, 0, 2*sizeof(MAT4));
+
+ U32 grid_texture = load_texture("../../data/textures/grid.png");
+
+ const char *cube_texture_filenames[6] = {
+ "../../data/textures/skybox/right.jpg",
+ "../../data/textures/skybox/left.jpg",
+ "../../data/textures/skybox/top.jpg",
+ "../../data/textures/skybox/bottom.jpg",
+ "../../data/textures/skybox/front.jpg",
+ "../../data/textures/skybox/back.jpg"
+ };
+
+ U32 skybox_texture = load_cubemap(cube_texture_filenames);
+
+ F32 a = 0.5f;
+ F32 vertices[] = {
+ -a, -a, -a, 0.0f, 0.0f,
+ a, -a, -a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ -a, a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 0.0f,
+
+ -a, -a, a, 0.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 1.0f,
+ -a, a, a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+
+ -a, a, a, 1.0f, 0.0f,
+ -a, a, -a, 1.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, a, a, 1.0f, 0.0f,
+
+ a, a, a, 1.0f, 0.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 0.0f, 1.0f,
+ a, -a, a, 0.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+
+ -a, -a, -a, 0.0f, 1.0f,
+ a, -a, -a, 1.0f, 1.0f,
+ a, -a, a, 1.0f, 0.0f,
+ a, -a, a, 1.0f, 0.0f,
+ -a, -a, a, 0.0f, 0.0f,
+ -a, -a, -a, 0.0f, 1.0f,
+
+ -a, a, -a, 0.0f, 1.0f,
+ a, a, -a, 1.0f, 1.0f,
+ a, a, a, 1.0f, 0.0f,
+ a, a, a, 1.0f, 0.0f,
+ -a, a, a, 0.0f, 0.0f,
+ -a, a, -a, 0.0f, 1.0f
+ };
+
+ V3F platform_pos = v3f(10.0f, 0.2f, 10.0f);
+ V3F platform_scale = v3f(0.0f, -(a+(a*0.2f)+0.01f), 0.0f);
+ Transform platform_transform = transform_make_scale_translate(platform_pos, platform_scale);
+
+ U32 cube_vao, vbo;
+ glGenVertexArrays(1, &cube_vao);
+ glBindVertexArray(cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ a = 1.0f;
+ F32 skybox_cube_vertices[] = {
+ -a, -a, -a,
+ a, -a, -a,
+ a, a, -a,
+ a, a, -a,
+ -a, a, -a,
+ -a, -a, -a,
+
+ -a, -a, a,
+ a, -a, a,
+ a, a, a,
+ a, a, a,
+ -a, a, a,
+ -a, -a, a,
+
+ -a, a, a,
+ -a, a, -a,
+ -a, -a, -a,
+ -a, -a, -a,
+ -a, -a, a,
+ -a, a, a,
+
+ a, a, a,
+ a, a, -a,
+ a, -a, -a,
+ a, -a, -a,
+ a, -a, a,
+ a, a, a,
+
+ -a, -a, -a,
+ a, -a, -a,
+ a, -a, a,
+ a, -a, a,
+ -a, -a, a,
+ -a, -a, -a,
+
+ -a, a, -a,
+ a, a, -a,
+ a, a, a,
+ a, a, a,
+ -a, a, a,
+ -a, a, -a,
+ };
+
+ U32 skybox_cube_vao;
+ glGenVertexArrays(1, &skybox_cube_vao);
+ glBindVertexArray(skybox_cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(skybox_cube_vertices), skybox_cube_vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(F32), (void *)0);
+ glBindVertexArray(0);
+
+ state.camera = (Camera) {
+ v3f(0.0f, 1.0f, 3.0f), 100.0f,
+ 0.1f, 100.0f, 0.0f, 0.0f
+ };
+ input = input_init();
+
+ F32 target_fps = 60.0f;
+ F32 target_spf = 1.0f/target_fps;
+ F32 last_time = glfwGetTime();
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ /* INFO(pryazha): Update */
+ glfwGetFramebufferSize(window, &width, &height);
+ process_glfw_keyboard(window, &input);
+ process_glfw_mouse_pos(window, &input);
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ 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 view, proj, model;
+ view = get_view_matrix(&state.camera);
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+
+ glBindBuffer(GL_UNIFORM_BUFFER, matrices_ubo);
+ glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(MAT4),
+ (const void *)&proj);
+ glBindBuffer(GL_UNIFORM_BUFFER, 0);
+ glBindBuffer(GL_UNIFORM_BUFFER, matrices_ubo);
+ glBufferSubData(GL_UNIFORM_BUFFER, sizeof(MAT4),
+ sizeof(MAT4), (const void *)&view);
+ glBindBuffer(GL_UNIFORM_BUFFER, 0);
+
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glUseProgram(cube_shader);
+ model = mat4_make_translate(v3f(-2.0f, 0.0f, 0.0f));
+ shader_set_mat4fv(cube_shader, "model", model);
+ glBindTexture(GL_TEXTURE_2D, grid_texture);
+ glBindVertexArray(cube_vao);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glBindVertexArray(0);
+
+ glUseProgram(cube_shader);
+ model = transform_apply(platform_transform);
+ shader_set_mat4fv(cube_shader, "model", model);
+ glBindTexture(GL_TEXTURE_2D, grid_texture);
+ glBindVertexArray(cube_vao);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glBindVertexArray(0);
+
+ glUseProgram(color_cube_shader);
+ model = mat4_make_translate(v3f(2.0f, 0.0f, 0.0f));
+ shader_set_mat4fv(cube_shader, "model", model);
+ glBindVertexArray(cube_vao);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ glUseProgram(skybox_shader);
+ MAT4 rotate_view = mat4_identity();
+ rotate_view.m0 = v4f(view.m0.x, view.m0.y, view.m0.z, 0.0f);
+ rotate_view.m1 = v4f(view.m1.x, view.m1.y, view.m1.z, 0.0f);
+ rotate_view.m2 = v4f(view.m2.x, view.m2.y, view.m2.z, 0.0f);
+ glBindBuffer(GL_UNIFORM_BUFFER, matrices_ubo);
+ glBufferSubData(GL_UNIFORM_BUFFER, sizeof(MAT4), sizeof(MAT4),
+ (const void *)&rotate_view);
+ glBindBuffer(GL_UNIFORM_BUFFER, 0);
+ glBindVertexArray(skybox_cube_vao);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_texture);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+
+ 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;
+ last_time = current_time;
+ }
+
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/8.geometry_shader/geometry_shader b/advanced_opengl/8.geometry_shader/geometry_shader
index 77fcab4..0bea785 100755
--- a/advanced_opengl/8.geometry_shader/geometry_shader
+++ b/advanced_opengl/8.geometry_shader/geometry_shader
Binary files differ
diff --git a/advanced_opengl/8.geometry_shader/geometry_shader.c b/advanced_opengl/8.geometry_shader/geometry_shader.c
index 678708c..f242709 100644
--- a/advanced_opengl/8.geometry_shader/geometry_shader.c
+++ b/advanced_opengl/8.geometry_shader/geometry_shader.c
@@ -2,338 +2,299 @@
#include "GLFW/glfw3.h"
#include "pwyazh.h"
-
#include "pwyazh_GL.h"
#include "common.h"
-#include <unistd.h>
-
-#define WIDTH 1024
-#define HEIGHT 768
-
-static F32 dt;
-static Input input;
-
-void
-key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
+void draw_cube(U32 cube_vao, U32 texture)
{
- switch (action)
- {
- case GLFW_PRESS: {
- switch (key)
- {
- case GLFW_KEY_SPACE: {
- input.jump.state = KeyState_PRESS;
- } break;
- }
- } break;
-
- case GLFW_RELEASE: {
- switch (key)
- {
- case GLFW_KEY_SPACE: {
- input.jump.state = KeyState_RELEASE;
- } break;
- }
- } break;
- }
+ glBindVertexArray(cube_vao);
+ glBindTexture(GL_TEXTURE_2D, texture);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glBindVertexArray(0);
}
-void
-draw_cube(U32 cube_vao, U32 texture)
+int main(void)
{
- glBindVertexArray(cube_vao);
- glBindTexture(GL_TEXTURE_2D, texture);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindTexture(GL_TEXTURE_2D, 0);
- glBindVertexArray(0);
-}
+ GLFWwindow *window;
+ State state;
+ S32 width, height;
+ Input input;
-int
-main(void)
-{
- GLFWwindow *window;
-
- 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(WIDTH, HEIGHT, "depth testing", 0, 0);
- if (!window)
- {
- fprintf(stderr, "[ERROR] Failed to create window.\n");
- glfwTerminate();
- return(1);
- }
-
- glfwMakeContextCurrent(window);
-
- glfwSetKeyCallback(window, key_callback);
-
- if (glewInit() != GLEW_OK)
- {
- fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
- glfwTerminate();
- return(1);
- }
-
- glEnable(GL_DEPTH_TEST);
-
- U32 shader = create_shader_program_geom("shaders/base.vs",
- "shaders/base.fs",
- "shaders/base.gs");
- U32 explosion_shader = create_shader_program_geom("shaders/explosion.vs",
- "shaders/explosion.fs",
- "shaders/explosion.gs");
- U32 normals_shader = create_shader_program_geom("shaders/normals.vs",
- "shaders/normals.fs",
- "shaders/normals.gs");
- U32 basic_shader = create_shader_program("shaders/basic.vs", "shaders/basic.fs");
-
- U32 grid_texture = load_texture("../../data/textures/grid.png");
-
- F32 points[] = {
- -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
- 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
- 0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 1.0f, 1.0f, 0.0f
- };
-
- GLuint points_vao, vbo;
- glGenVertexArrays(1, &points_vao);
- glBindVertexArray(points_vao);
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, 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);
-
- F32 a = 0.5f;
- /* NOTE(pryazha): Counter-clockwise order */
- F32 cube_vertices[] = {
- /* NOTE(pryazha): Back face */
- a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, a, -a, 1.0f, 1.0f, /* top-right */
- a, a, -a, 0.0f, 1.0f, /* top-left */
- a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- -a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Front face */
- -a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, a, 1.0f, 1.0f, /* top-right */
- -a, a, a, 0.0f, 1.0f, /* top-left */
- -a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, -a, a, 1.0f, 0.0f, /* bottom-right */
- a, a, a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Left face */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, a, a, 1.0f, 1.0f, /* top-right */
- -a, a, -a, 0.0f, 1.0f, /* top-left */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- -a, -a, a, 1.0f, 0.0f, /* bottom-right */
- -a, a, a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Right face */
- a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, -a, 1.0f, 1.0f, /* top-right */
- a, a, a, 0.0f, 1.0f, /* top-left */
- a, -a, a, 0.0f, 0.0f, /* bottom-left */
- a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Top face */
- -a, a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, -a, 1.0f, 1.0f, /* top-right */
- -a, a, -a, 0.0f, 1.0f, /* top-left */
- -a, a, a, 0.0f, 0.0f, /* bottom-left */
- a, a, a, 1.0f, 0.0f, /* bottom-right */
- a, a, -a, 1.0f, 1.0f, /* top-right */
-
- /* NOTE(pryazha): Bottom face */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- a, -a, a, 1.0f, 1.0f, /* top-right */
- -a, -a, a, 0.0f, 1.0f, /* top-left */
- -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
- a, -a, -a, 1.0f, 0.0f, /* bottom-right */
- a, -a, a, 1.0f, 1.0f, /* top-right */
- };
-
- U32 cube_vao;
- glGenVertexArrays(1, &cube_vao);
- glBindVertexArray(cube_vao);
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), cube_vertices, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
- glBindVertexArray(0);
-
- F32 vertices[] = {
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
-
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
- };
-
- U32 normals_cube_vao;
- glGenVertexArrays(1, &normals_cube_vao);
- glBindVertexArray(normals_cube_vao);
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8*sizeof(F32), (void *)0);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8*sizeof(F32), (void *)(3*sizeof(F32)));
- glEnableVertexAttribArray(2);
- glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8*sizeof(F32), (void *)(6*sizeof(F32)));
- glBindVertexArray(0);
-
- F32 target_fps = 60.0f;
- F32 target_spf = 1.0f/target_fps;
-
- F32 last_time = glfwGetTime();
- F32 time = last_time;
-
- S32 scene = 0;
-
- while (!glfwWindowShouldClose(window))
- {
- glfwPollEvents();
-
- /* NOTE(pryazha): Update */
- if (key_first_press(input.jump))
- {
- scene++;
- scene %= 3;
- }
-
- input_update_last_state(&input);
-
- /* NOTE(pryazha): Render */
- glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (scene == 0)
- {
- glUseProgram(shader);
- glBindVertexArray(points_vao);
- glDrawArrays(GL_POINTS, 0, 4);
- glBindVertexArray(0);
- }
- else if (scene == 1)
- {
- F32 radius = 2.0f;
- F32 x = f32_sin(0.5*time)*radius;
- F32 z = f32_cos(0.5*time)*radius;
- MAT4 projection = perspective(90.0f, (F32)WIDTH/(F32)HEIGHT, 0.1f, 100.0f);
- MAT4 view = look_at(v3f(x, 1.0f, z), v3f_zero(), v3f(0.0f, 1.0f, 0.0f));
- MAT4 model = mat4_identity();
- glUseProgram(explosion_shader);
- shader_set_mat4fv(explosion_shader, "projection", projection);
- shader_set_mat4fv(explosion_shader, "view", view);
- shader_set_mat4fv(explosion_shader, "model", model);
- shader_set_1f(explosion_shader, "time", time);
- glBindVertexArray(cube_vao);
- glBindTexture(GL_TEXTURE_2D, grid_texture);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- glBindVertexArray(0);
- }
- else
- {
- MAT4 projection, view, model;
- F32 radius, x, z;
-
- radius = 2.0f;
- x = f32_sin(0.5*time)*radius;
- z = f32_cos(0.5*time)*radius;
-
- projection = perspective(90.0f, (F32)WIDTH/(F32)HEIGHT, 0.1f, 100.0f);
- view = look_at(v3f(x, 1.0f, z), v3f_zero(), v3f(0.0f, 1.0f, 0.0f));
- model = mat4_identity();
-
- glUseProgram(basic_shader);
- shader_set_mat4fv(basic_shader, "projection", projection);
- shader_set_mat4fv(basic_shader, "view", view);
- shader_set_mat4fv(basic_shader, "model", model);
- draw_cube(normals_cube_vao, grid_texture);
-
- glUseProgram(normals_shader);
- shader_set_mat4fv(normals_shader, "projection", projection);
- shader_set_mat4fv(normals_shader, "view", view);
- shader_set_mat4fv(normals_shader, "model", model);
- draw_cube(normals_cube_vao, grid_texture);
- }
-
- 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;
- }
-
- glDeleteBuffers(1, &vbo);
- glDeleteVertexArrays(1, &points_vao);
-
- glfwTerminate();
- return(0);
+ if (glfwInit() == GLFW_FALSE) {
+ fprintf(stderr, "[ERROR] Failed to initialize glfw.\n");
+ return(1);
+ }
+
+ width = 1024;
+ height = 768;
+
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ window = glfwCreateWindow(width, height, "depth testing", 0, 0);
+ if (!window) {
+ fprintf(stderr, "[ERROR] Failed to create window.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ glfwMakeContextCurrent(window);
+
+ if (glewInit() != GLEW_OK) {
+ fprintf(stderr, "[ERROR] Failed to initialize glew.\n");
+ glfwTerminate();
+ return(1);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+
+ U32 shader = create_shader_program_geom("shaders/base.vert",
+ "shaders/base.frag",
+ "shaders/base.geom");
+ U32 explosion_shader = create_shader_program_geom("shaders/explosion.vert",
+ "shaders/explosion.frag",
+ "shaders/explosion.geom");
+ U32 normals_shader = create_shader_program_geom("shaders/normals.vert",
+ "shaders/normals.frag",
+ "shaders/normals.geom");
+ U32 basic_shader = create_shader_program("shaders/basic.vert",
+ "shaders/basic.frag");
+
+ U32 grid_texture = load_texture("../../data/textures/grid.png");
+
+ F32 points[] = {
+ -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
+ 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
+ 0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, 1.0f, 1.0f, 0.0f
+ };
+
+ GLuint points_vao, vbo;
+ glGenVertexArrays(1, &points_vao);
+ glBindVertexArray(points_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, 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);
+
+ F32 a = 0.5f;
+ /* NOTE(pryazha): Counter-clockwise order */
+ F32 cube_vertices[] = {
+ /* NOTE(pryazha): Back face */
+ a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, -a, 1.0f, 1.0f, /* top-right */
+ a, a, -a, 0.0f, 1.0f, /* top-left */
+ a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ -a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Front face */
+ -a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, a, 1.0f, 1.0f, /* top-right */
+ -a, a, a, 0.0f, 1.0f, /* top-left */
+ -a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, a, 1.0f, 0.0f, /* bottom-right */
+ a, a, a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Left face */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, a, a, 1.0f, 1.0f, /* top-right */
+ -a, a, -a, 0.0f, 1.0f, /* top-left */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ -a, -a, a, 1.0f, 0.0f, /* bottom-right */
+ -a, a, a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Right face */
+ a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+ a, a, a, 0.0f, 1.0f, /* top-left */
+ a, -a, a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Top face */
+ -a, a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+ -a, a, -a, 0.0f, 1.0f, /* top-left */
+ -a, a, a, 0.0f, 0.0f, /* bottom-left */
+ a, a, a, 1.0f, 0.0f, /* bottom-right */
+ a, a, -a, 1.0f, 1.0f, /* top-right */
+
+ /* NOTE(pryazha): Bottom face */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, a, 1.0f, 1.0f, /* top-right */
+ -a, -a, a, 0.0f, 1.0f, /* top-left */
+ -a, -a, -a, 0.0f, 0.0f, /* bottom-left */
+ a, -a, -a, 1.0f, 0.0f, /* bottom-right */
+ a, -a, a, 1.0f, 1.0f, /* top-right */
+ };
+
+ U32 cube_vao;
+ glGenVertexArrays(1, &cube_vao);
+ glBindVertexArray(cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), cube_vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(F32), (void *)(3*sizeof(F32)));
+ glBindVertexArray(0);
+
+ F32 vertices[] = {
+ -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
+ -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
+
+ -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
+ -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+
+ -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
+ -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
+ -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
+
+ 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
+ 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
+ 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
+ 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
+
+ -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
+ 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
+ -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
+ -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
+
+ -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
+ 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
+ -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
+ -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
+ };
+
+ U32 normals_cube_vao;
+ glGenVertexArrays(1, &normals_cube_vao);
+ glBindVertexArray(normals_cube_vao);
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8*sizeof(F32), (void *)0);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8*sizeof(F32), (void *)(3*sizeof(F32)));
+ glEnableVertexAttribArray(2);
+ glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8*sizeof(F32), (void *)(6*sizeof(F32)));
+ glBindVertexArray(0);
+
+ state.camera = (Camera) {
+ v3f(2.0f, 1.0f, 2.0f),
+ 90.0f, 0.1f, 100.0f,
+ 0.0f, 0.0f
+ };
+
+ F32 target_fps = 60.0f;
+ F32 target_spf = 1.0f/target_fps;
+ F32 last_time = glfwGetTime();
+ F32 time = last_time;
+
+ S32 scene = 0;
+
+ while (!glfwWindowShouldClose(window)) {
+ glfwPollEvents();
+
+ process_glfw_keyboard(window, &input);
+ glfwGetFramebufferSize(window, &width, &height);
+
+ /* NOTE(pryazha): Update */
+ V3F target = v3f_zero();
+
+ if (key_first_press(input.exit))
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+
+ if (key_first_press(input.jump)) {
+ scene++;
+ scene %= 3;
+ }
+
+ input_update_last_state(&input);
+
+ /* NOTE(pryazha): Render */
+ MAT4 view, proj, model;
+
+ view = look_at(state.camera.pos, target, v3f(0.0f, 1.0f, 0.0f));
+ proj = perspective(state.camera.fovx, (F32)width/(F32)height,
+ state.camera.near, state.camera.far);
+
+ model = mat4_identity();
+
+ glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (scene == 0) {
+ glUseProgram(shader);
+ glBindVertexArray(points_vao);
+ glDrawArrays(GL_POINTS, 0, 4);
+ glBindVertexArray(0);
+ } else if (scene == 1) {
+ glUseProgram(explosion_shader);
+ shader_set_mat4fv(explosion_shader, "proj", proj);
+ shader_set_mat4fv(explosion_shader, "view", view);
+ shader_set_mat4fv(explosion_shader, "model", model);
+ shader_set_1f(explosion_shader, "time", time);
+ glBindVertexArray(cube_vao);
+ glBindTexture(GL_TEXTURE_2D, grid_texture);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+ } else {
+ glUseProgram(basic_shader);
+ shader_set_mat4fv(basic_shader, "proj", proj);
+ shader_set_mat4fv(basic_shader, "view", view);
+ shader_set_mat4fv(basic_shader, "model", model);
+ draw_cube(normals_cube_vao, grid_texture);
+
+ glUseProgram(normals_shader);
+ shader_set_mat4fv(normals_shader, "proj", proj);
+ shader_set_mat4fv(normals_shader, "view", view);
+ shader_set_mat4fv(normals_shader, "model", model);
+ draw_cube(normals_cube_vao, grid_texture);
+ }
+
+ 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;
+ }
+
+ glDeleteBuffers(1, &vbo);
+ glDeleteVertexArrays(1, &points_vao);
+
+ glfwTerminate();
+ return(0);
}
diff --git a/advanced_opengl/8.geometry_shader/shaders/base.fs b/advanced_opengl/8.geometry_shader/shaders/base.frag
index 73897db..70d5585 100644
--- a/advanced_opengl/8.geometry_shader/shaders/base.fs
+++ b/advanced_opengl/8.geometry_shader/shaders/base.frag
@@ -4,8 +4,7 @@ in vec3 fcolor;
out vec4 frag_color;
-void
-main(void)
+void main(void)
{
frag_color = vec4(fcolor, 1.0);
}
diff --git a/advanced_opengl/8.geometry_shader/shaders/base.gs b/advanced_opengl/8.geometry_shader/shaders/base.geom
index 6b140c5..10d5c45 100644
--- a/advanced_opengl/8.geometry_shader/shaders/base.gs
+++ b/advanced_opengl/8.geometry_shader/shaders/base.geom
@@ -8,8 +8,7 @@ in VS_OUT {
out vec3 fcolor;
-void
-main(void)
+void main(void)
{
fcolor = gs_in[0].color;
gl_Position = gl_in[0].gl_Position+vec4(-0.2, -0.2, 0.0, 0.0);
diff --git a/advanced_opengl/8.geometry_shader/shaders/base.vs b/advanced_opengl/8.geometry_shader/shaders/base.vert
index 9ad9e7a..5178f92 100644
--- a/advanced_opengl/8.geometry_shader/shaders/base.vs
+++ b/advanced_opengl/8.geometry_shader/shaders/base.vert
@@ -6,8 +6,7 @@ out VS_OUT {
vec3 color;
} vs_out;
-void
-main(void)
+void main(void)
{
vs_out.color = acolor;
gl_Position = vec4(apos, 0.0, 1.0);
diff --git a/advanced_opengl/8.geometry_shader/shaders/basic.frag b/advanced_opengl/8.geometry_shader/shaders/basic.frag
new file mode 100644
index 0000000..09244b5
--- /dev/null
+++ b/advanced_opengl/8.geometry_shader/shaders/basic.frag
@@ -0,0 +1,12 @@
+#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/8.geometry_shader/shaders/basic.fs b/advanced_opengl/8.geometry_shader/shaders/basic.fs
deleted file mode 100644
index bdd4b9a..0000000
--- a/advanced_opengl/8.geometry_shader/shaders/basic.fs
+++ /dev/null
@@ -1,13 +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/8.geometry_shader/shaders/basic.vs b/advanced_opengl/8.geometry_shader/shaders/basic.vert
index 77e8b70..10ce805 100644
--- a/advanced_opengl/8.geometry_shader/shaders/basic.vs
+++ b/advanced_opengl/8.geometry_shader/shaders/basic.vert
@@ -6,11 +6,10 @@ out vec2 tex_coords;
uniform mat4 model;
uniform mat4 view;
-uniform mat4 projection;
+uniform mat4 proj;
-void
-main(void)
+void main(void)
{
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
tex_coords = atex_coords;
}
diff --git a/advanced_opengl/8.geometry_shader/shaders/explosion.fs b/advanced_opengl/8.geometry_shader/shaders/explosion.frag
index 70e7151..b751460 100644
--- a/advanced_opengl/8.geometry_shader/shaders/explosion.fs
+++ b/advanced_opengl/8.geometry_shader/shaders/explosion.frag
@@ -6,8 +6,7 @@ out vec4 frag_color;
uniform sampler2D texture0;
-void
-main(void)
+void main(void)
{
frag_color = texture(texture0, ftex_coords);
}
diff --git a/advanced_opengl/8.geometry_shader/shaders/explosion.gs b/advanced_opengl/8.geometry_shader/shaders/explosion.geom
index 3498878..e708591 100644
--- a/advanced_opengl/8.geometry_shader/shaders/explosion.gs
+++ b/advanced_opengl/8.geometry_shader/shaders/explosion.geom
@@ -10,16 +10,14 @@ out vec2 ftex_coords;
uniform float time;
-vec3
-get_normal(void)
+vec3 get_normal(void)
{
vec3 a = vec3(gl_in[0].gl_Position)-vec3(gl_in[1].gl_Position);
vec3 b = vec3(gl_in[2].gl_Position)-vec3(gl_in[1].gl_Position);
return(normalize(cross(a, b)));
}
-vec4
-explode(vec4 position, vec3 normal)
+vec4 explode(vec4 position, vec3 normal)
{
float magnitude = 0.2;
vec3 direction = normal*magnitude*((sin(time)+1.0)/2.0);
@@ -27,8 +25,7 @@ explode(vec4 position, vec3 normal)
return(result);
}
-void
-main(void)
+void main(void)
{
vec3 normal = get_normal();
gl_Position = explode(gl_in[0].gl_Position, normal);
diff --git a/advanced_opengl/8.geometry_shader/shaders/explosion.vs b/advanced_opengl/8.geometry_shader/shaders/explosion.vert
index 46abd27..a79b432 100644
--- a/advanced_opengl/8.geometry_shader/shaders/explosion.vs
+++ b/advanced_opengl/8.geometry_shader/shaders/explosion.vert
@@ -6,13 +6,12 @@ out VS_OUT {
vec2 gtex_coords;
} vs_out;
-uniform mat4 projection;
+uniform mat4 proj;
uniform mat4 view;
uniform mat4 model;
-void
-main(void)
+void main(void)
{
vs_out.gtex_coords = atex_coords;
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
}
diff --git a/advanced_opengl/7.uniform_buffer/shaders/color_cube.fs b/advanced_opengl/8.geometry_shader/shaders/normals.frag
index fbbafbf..d40d866 100644
--- a/advanced_opengl/7.uniform_buffer/shaders/color_cube.fs
+++ b/advanced_opengl/8.geometry_shader/shaders/normals.frag
@@ -2,8 +2,7 @@
out vec4 frag_color;
-void
-main(void)
+void main(void)
{
frag_color = vec4(1.0, 0.0, 0.0, 1.0);
}
diff --git a/advanced_opengl/8.geometry_shader/shaders/normals.gs b/advanced_opengl/8.geometry_shader/shaders/normals.geom
index 3720a5f..f0e1a75 100644
--- a/advanced_opengl/8.geometry_shader/shaders/normals.gs
+++ b/advanced_opengl/8.geometry_shader/shaders/normals.geom
@@ -6,23 +6,21 @@ in VS_OUT {
vec3 normal;
} gs_in[];
-uniform mat4 projection;
+uniform mat4 proj;
const float MAGNITUDE = 0.4;
-void
-generate_line(int index)
+void generate_line(int index)
{
- gl_Position = projection*gl_in[index].gl_Position;
+ gl_Position = proj*gl_in[index].gl_Position;
EmitVertex();
- gl_Position = projection*(gl_in[index].gl_Position+
+ gl_Position = proj*(gl_in[index].gl_Position+
vec4(gs_in[index].normal, 0.0)*MAGNITUDE);
EmitVertex();
EndPrimitive();
}
-void
-main(void)
+void main(void)
{
/*
vec4 center = (gl_in[0].gl_Position+
@@ -32,9 +30,9 @@ main(void)
gs_in[1].normal+
gs_in[2].normal)/3.0),
0.0)*MAGNITUDE;
- gl_Position = projection*center;
+ gl_Position = proj*center;
EmitVertex();
- gl_Position = projection*end;
+ gl_Position = proj*end;
EmitVertex();
EndPrimitive();
*/
diff --git a/advanced_opengl/8.geometry_shader/shaders/normals.vs b/advanced_opengl/8.geometry_shader/shaders/normals.vert
index 3b728e5..14f7d8b 100644
--- a/advanced_opengl/8.geometry_shader/shaders/normals.vs
+++ b/advanced_opengl/8.geometry_shader/shaders/normals.vert
@@ -9,8 +9,7 @@ out VS_OUT {
uniform mat4 view;
uniform mat4 model;
-void
-main(void)
+void main(void)
{
mat3 normal_matrix = mat3(transpose(inverse(view*model)));
vs_out.normal = normalize(normal_matrix*anormal);
diff --git a/advanced_opengl/9.instancing/instancing b/advanced_opengl/9.instancing/instancing
index c722860..c1a31f8 100755
--- a/advanced_opengl/9.instancing/instancing
+++ b/advanced_opengl/9.instancing/instancing
Binary files 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 <unistd.h>
+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.fs b/advanced_opengl/9.instancing/shaders/default.frag
index c655ac8..8ae5c3b 100644
--- a/advanced_opengl/9.instancing/shaders/default.fs
+++ b/advanced_opengl/9.instancing/shaders/default.frag
@@ -6,8 +6,7 @@ out vec4 frag_color;
uniform sampler2D texture0;
-void
-main(void)
+void main(void)
{
frag_color = texture(texture0, tex_coords);
-} \ No newline at end of file
+}
diff --git a/advanced_opengl/9.instancing/shaders/default.vs b/advanced_opengl/9.instancing/shaders/default.vert
index 85d3c19..87cb538 100644
--- a/advanced_opengl/9.instancing/shaders/default.vs
+++ b/advanced_opengl/9.instancing/shaders/default.vert
@@ -6,13 +6,12 @@ layout(location = 2) in vec2 atex_coords;
out vec3 normal;
out vec2 tex_coords;
-uniform mat4 projection;
+uniform mat4 proj;
uniform mat4 view;
uniform mat4 model;
-void
-main(void)
+void main(void)
{
tex_coords = atex_coords;
- gl_Position = projection*view*model*vec4(apos, 1.0);
+ gl_Position = proj*view*model*vec4(apos, 1.0);
}
diff --git a/advanced_opengl/9.instancing/shaders/instanced_arrays.fs b/advanced_opengl/9.instancing/shaders/instanced_arrays.frag
index a32e52e..4865933 100644
--- a/advanced_opengl/9.instancing/shaders/instanced_arrays.fs
+++ b/advanced_opengl/9.instancing/shaders/instanced_arrays.frag
@@ -4,8 +4,7 @@ in vec3 color;
out vec4 frag_color;
-void
-main(void)
+void main(void)
{
frag_color = vec4(color, 1.0);
}
diff --git a/advanced_opengl/9.instancing/shaders/instanced_arrays.vs b/advanced_opengl/9.instancing/shaders/instanced_arrays.vert
index 4ea0fe4..ce3ea7d 100644
--- a/advanced_opengl/9.instancing/shaders/instanced_arrays.vs
+++ b/advanced_opengl/9.instancing/shaders/instanced_arrays.vert
@@ -5,8 +5,7 @@ layout(location = 2) in vec2 aoffset;
out vec3 color;
-void
-main(void)
+void main(void)
{
color = acolor;
vec2 pos = apos*(gl_InstanceID/100.0);
diff --git a/advanced_opengl/9.instancing/shaders/instanced_mat4.fs b/advanced_opengl/9.instancing/shaders/instanced_mat4.frag
index ae625b2..3b96d36 100644
--- a/advanced_opengl/9.instancing/shaders/instanced_mat4.fs
+++ b/advanced_opengl/9.instancing/shaders/instanced_mat4.frag
@@ -6,8 +6,7 @@ out vec4 frag_color;
uniform sampler2D texture1;
-void
-main(void)
+void main(void)
{
frag_color = texture(texture1, tex_coords);
}
diff --git a/advanced_opengl/9.instancing/shaders/instanced_mat4.vs b/advanced_opengl/9.instancing/shaders/instanced_mat4.vert
index c65be90..835cc5d 100644
--- a/advanced_opengl/9.instancing/shaders/instanced_mat4.vs
+++ b/advanced_opengl/9.instancing/shaders/instanced_mat4.vert
@@ -5,12 +5,11 @@ layout(location = 3) in mat4 instance_matrix;
out vec2 tex_coords;
-uniform mat4 projection;
+uniform mat4 proj;
uniform mat4 view;
-void
-main(void)
+void main(void)
{
tex_coords = atex_coords;
- gl_Position = projection*view*instance_matrix*vec4(apos, 1.0);
+ gl_Position = proj*view*instance_matrix*vec4(apos, 1.0);
}
diff --git a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.fs b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.frag
index a32e52e..4865933 100644
--- a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.fs
+++ b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.frag
@@ -4,8 +4,7 @@ in vec3 color;
out vec4 frag_color;
-void
-main(void)
+void main(void)
{
frag_color = vec4(color, 1.0);
}
diff --git a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vs b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vert
index a77be31..61b07a0 100644
--- a/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vs
+++ b/advanced_opengl/9.instancing/shaders/instancing_uniform_array.vert
@@ -6,8 +6,7 @@ out vec3 color;
uniform vec2 offsets[100];
-void
-main(void)
+void main(void)
{
color = acolor;
gl_Position = vec4(apos+offsets[gl_InstanceID], 0.0, 1.0);