From 7ed72132b87aec1e3f449f119b1c621a534528ce Mon Sep 17 00:00:00 2001 From: tavo Date: Thu, 30 Oct 2025 00:55:27 -0600 Subject: [PATCH] updates --- CMakeLists.txt | 1 + external/skr | 2 +- main/main.c | 140 ++++++++++++++++++++++++++++++++++++++++++------- main/utils.c | 33 ++++++++++++ 4 files changed, 157 insertions(+), 19 deletions(-) create mode 100644 main/utils.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 128619b..9fd5a94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,6 +134,7 @@ add_custom_target(transpile_shaders ALL DEPENDS ${TRANSPILED_SHADERS}) add_executable(${BIN} main/main.c + main/utils.c # external/ini/src/ini.c ) diff --git a/external/skr b/external/skr index 836aadb..fc862a2 160000 --- a/external/skr +++ b/external/skr @@ -1 +1 @@ -Subproject commit 836aadb32cf5df09cfd0cae71767b9d09b695571 +Subproject commit fc862a279f36560a04d21d7193d4851398003901 diff --git a/main/main.c b/main/main.c index d375e29..1cd1d90 100644 --- a/main/main.c +++ b/main/main.c @@ -1,36 +1,140 @@ -#include - #include #include - #include #define SKR_BACKEND_API 0 // opengl #define SKR_BACKEND_WINDOW 0 // glfw #include +SkrCamera* g_skr_camera = SkrDefaultFPSCamera; + int main(void) { - SkrWindow window = { + SkrState state = SkrInit(&(SkrWindow){ .Title = "Hello SKR", .Width = 800, .Height = 600, - }; + }); - SkrState state = SkrInit(&window); - if (!SKR_OK) { - fprintf(stderr, "Failed to init window: %s\n", SKR_LAST_ERROR); - return 1; - } - - if (glewInit() != GLEW_OK) { - fprintf(stderr, "Failed to init GLEW\n"); - return 1; - } - - while (!SkrWindowShouldClose(&window)) { - SkrRendererRender(&state); + 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; } diff --git a/main/utils.c b/main/utils.c new file mode 100644 index 0000000..ed2f4fd --- /dev/null +++ b/main/utils.c @@ -0,0 +1,33 @@ +#define STB_IMAGE_IMPLEMENTATION +#include +#include + +unsigned char* m_skr_load_image_from_file(const char* path, int* width, + int* height, int* channels) { + stbi_set_flip_vertically_on_load(1); + + int w = 0, h = 0, ch = 0; + unsigned char* data = stbi_load(path, &w, &h, &ch, 0); + if (!data) { + const char* reason = stbi_failure_reason(); + m_skr_last_error_set("stb_image failed to load %s: %s", path, + reason ? reason : "unknown error"); + return NULL; + } + + if (width) + *width = w; + if (height) + *height = h; + if (channels) + *channels = ch; + + m_skr_last_error_clear(); + return data; +} + +void m_skr_free_image(unsigned char* image_data) { + if (image_data) + stbi_image_free(image_data); + m_skr_last_error_clear(); +}