updates
This commit is contained in:
parent
4c53238d01
commit
7ed72132b8
4 changed files with 157 additions and 19 deletions
|
|
@ -134,6 +134,7 @@ add_custom_target(transpile_shaders ALL DEPENDS ${TRANSPILED_SHADERS})
|
||||||
|
|
||||||
add_executable(${BIN}
|
add_executable(${BIN}
|
||||||
main/main.c
|
main/main.c
|
||||||
|
main/utils.c
|
||||||
|
|
||||||
# external/ini/src/ini.c
|
# external/ini/src/ini.c
|
||||||
)
|
)
|
||||||
|
|
|
||||||
2
external/skr
vendored
2
external/skr
vendored
|
|
@ -1 +1 @@
|
||||||
Subproject commit 836aadb32cf5df09cfd0cae71767b9d09b695571
|
Subproject commit fc862a279f36560a04d21d7193d4851398003901
|
||||||
136
main/main.c
136
main/main.c
|
|
@ -1,36 +1,140 @@
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include <cglm/cglm.h>
|
#include <cglm/cglm.h>
|
||||||
|
|
||||||
#define SKR_BACKEND_API 0 // opengl
|
#define SKR_BACKEND_API 0 // opengl
|
||||||
#define SKR_BACKEND_WINDOW 0 // glfw
|
#define SKR_BACKEND_WINDOW 0 // glfw
|
||||||
#include <skr/skr.h>
|
#include <skr/skr.h>
|
||||||
|
|
||||||
|
SkrCamera* g_skr_camera = SkrDefaultFPSCamera;
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
SkrWindow window = {
|
SkrState state = SkrInit(&(SkrWindow){
|
||||||
.Title = "Hello SKR",
|
.Title = "Hello SKR",
|
||||||
.Width = 800,
|
.Width = 800,
|
||||||
.Height = 600,
|
.Height = 600,
|
||||||
};
|
});
|
||||||
|
|
||||||
SkrState state = SkrInit(&window);
|
glewInit();
|
||||||
if (!SKR_OK) {
|
|
||||||
fprintf(stderr, "Failed to init window: %s\n", SKR_LAST_ERROR);
|
SkrCaptureCursor(&state);
|
||||||
return 1;
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (glewInit() != GLEW_OK) {
|
glfwSwapBuffers(state.Window->Backend.Handler.GLFW);
|
||||||
fprintf(stderr, "Failed to init GLEW\n");
|
glfwPollEvents();
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!SkrWindowShouldClose(&window)) {
|
|
||||||
SkrRendererRender(&state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_skr_free_textures_2d(textures, 2);
|
||||||
SkrFinalize(&state);
|
SkrFinalize(&state);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
33
main/utils.c
Normal file
33
main/utils.c
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
|
#include <skr/skr.h>
|
||||||
|
#include <stb_image.h>
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue