#include #include #include #define SKR_BACKEND_API 0 // opengl #define SKR_BACKEND_WINDOW 0 // glfw #include SkrCamera* g_skr_camera = SkrDefaultFPSCamera; int main(void) { SkrState state = SkrInit(&(SkrWindow){ .Title = "Hello SKR", .Width = 800, .Height = 600, }); glewInit(); SkrCaptureCursor(&state); SkrInitCamera(&state, skr_fps_camera_vert); float vertices[] = { -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, -0.5f, 0.5f, -0.5f, 1.0f, 1.0f, -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f}; // world space positions of our cubes vec3 cubePositions[] = {{0.0f, 0.0f, 0.0f}, {2.0f, 5.0f, -15.0f}, {-1.5f, -2.2f, -2.5f}, {-3.8f, -2.0f, -12.3f}, {2.4f, -0.4f, -3.5f}, {-1.7f, 3.0f, -7.5f}, {1.3f, -2.0f, -2.5f}, {1.5f, 2.0f, -2.5f}, {1.5f, 0.2f, -1.5f}, {-1.3f, 1.0f, -1.5f}}; SkrMesh mesh = {0}; glGenVertexArrays(1, &mesh.VAO); glGenBuffers(1, &mesh.VBO); glBindVertexArray(mesh.VAO); glBindBuffer(GL_ARRAY_BUFFER, mesh.VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // position attribute glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // texture coord attribute glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); GLuint program = m_skr_gl_create_program_from_shaders( (SkrShader[]){skr_fps_camera_vert}, 1); const char* paths[] = {"assets/container.jpg", "assets/awesomeface.png"}; unsigned int textures[2]; m_skr_gl_load_textures_2d_from_paths(paths, textures, 2); glUseProgram(program); while (!SkrWindowShouldClose(state.Window)) { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); m_skr_gl_shader_use(program); // Projection matrix mat4 projection; glm_perspective(glm_rad(g_skr_camera->FOV), 800.0f / 600.0f, 0.1f, 100.0f, projection); m_skr_gl_shader_set_mat4(program, "projection", projection); // View matrix (camera) vec3 center; glm_vec3_add(g_skr_camera->Position, g_skr_camera->Front, center); mat4 view; glm_lookat(g_skr_camera->Position, center, g_skr_camera->Up, view); m_skr_gl_shader_set_mat4(program, "view", view); // Draw all cubes glBindVertexArray(mesh.VAO); for (unsigned int i = 0; i < 10; i++) { mat4 model; glm_mat4_identity(model); glm_translate(model, cubePositions[i]); glm_rotate(model, glm_rad(20.0f * i), (vec3){1.0f, 0.3f, 0.5f}); m_skr_gl_shader_set_mat4(program, "model", model); glDrawArrays(GL_TRIANGLES, 0, 36); } glfwSwapBuffers(state.Window->Backend.Handler.GLFW); glfwPollEvents(); } m_skr_free_textures_2d(textures, 2); SkrFinalize(&state); return 0; }