proyecto-carga-electrica/main/main.c
2025-10-30 00:55:27 -06:00

140 lines
4.5 KiB
C

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <cglm/cglm.h>
#define SKR_BACKEND_API 0 // opengl
#define SKR_BACKEND_WINDOW 0 // glfw
#include <skr/skr.h>
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;
}