#include "GL/glew.h" #include "GLFW/glfw3.h" #include "pwyazh.h" #include "pwyazh_GL.h" #include "common.h" int main(void) { GLFWwindow *window; State state; S32 width, height; Input input; Arena *arena; F64 time, last_time; U32 texture; S32 blinn = 0; V3F light_pos = (V3F){ 0.0f, 0.0f, 0.0f }; glfwSetErrorCallback(error_callback); if (glfwInit() == GLFW_FALSE) return(1); width = 1024; height = 768; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_SAMPLES, 4); window = glfwCreateWindow(width, height, "Blinn-Phong shading", 0, 0); if (!window) goto error; glfwMakeContextCurrent(window); if (glewInit() != GLEW_OK) goto error; glEnable(GL_DEPTH_TEST); glEnable(GL_MULTISAMPLE); /* NOTE(pryazha): init */ arena = arena_alloc(Megabytes(64)); state.camera = (Camera){ v3f(0.0f, 0.0f, 3.0f), 90.0f, 0.1f, 1000.0f, 0.0f, 0.0f }; Vertex vertices[] = { // positions // normals // texcoords vertex(v3f( 10.0f, -0.5f, 10.0f), v3f(0.0f, 1.0f, 0.0f), v2f(10.0f, 0.0f)), vertex(v3f(-10.0f, -0.5f, 10.0f), v3f(0.0f, 1.0f, 0.0f), v2f( 0.0f, 0.0f)), vertex(v3f(-10.0f, -0.5f, -10.0f), v3f(0.0f, 1.0f, 0.0f), v2f( 0.0f, 10.0f)), vertex(v3f( 10.0f, -0.5f, 10.0f), v3f(0.0f, 1.0f, 0.0f), v2f(10.0f, 0.0f)), vertex(v3f(-10.0f, -0.5f, -10.0f), v3f(0.0f, 1.0f, 0.0f), v2f( 0.0f, 10.0f)), vertex(v3f( 10.0f, -0.5f, -10.0f), v3f(0.0f, 1.0f, 0.0f), v2f(10.0f, 10.0f)) }; U32 indices[] = { 0, 1, 2, 3, 4, 5 }; Mesh *quad = mesh_init(arena, vertices, 6, indices, 6); Mesh *cube = mesh_load_obj(arena, "../../data/models/cube.obj"); U32 blinn_phong_shader = create_shader_program("shaders/blinn_phong.vert", "shaders/blinn_phong.frag"); U32 light_shader = create_shader_program("shaders/light.vert", "shaders/light.frag"); texture = load_texture("../../data/textures/wood.png"); last_time = glfwGetTime(); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); /* INFO(pryazha): Update */ process_glfw_keyboard(window, &input); glfwGetFramebufferSize(window, &width, &height); V3F target = v3f_zero(); if (key_first_press(input.exit)) glfwSetWindowShouldClose(window, GLFW_TRUE); if (key_first_press(input.jump)) blinn = blinn ? 0 : 1; 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); /* NOTE(pryazha): Render */ MAT4 proj, view, 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(); glViewport(0, 0, width, height); glClearColor(0.15f, 0.15f, 0.15f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(blinn_phong_shader); shader_set_mat4fv(blinn_phong_shader, "proj", proj); shader_set_mat4fv(blinn_phong_shader, "view", view); shader_set_mat4fv(blinn_phong_shader, "model", model); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); shader_set_3fv(blinn_phong_shader, "light_pos", light_pos); shader_set_3fv(blinn_phong_shader, "view_pos", state.camera.pos); shader_set_1i(blinn_phong_shader, "blinn", blinn); mesh_draw(quad); glUseProgram(light_shader); shader_set_mat4fv(light_shader, "proj", proj); shader_set_mat4fv(light_shader, "view", view); model = mat4_make_scale(v3f(0.1f, 0.1f, 0.1f)); shader_set_mat4fv(light_shader, "model", model); mesh_draw(cube); glfwSwapBuffers(window); time = glfwGetTime(); state.dt = time-last_time; last_time = time; } glfwTerminate(); return(0); error: glfwTerminate(); return(1); }