From 1be303f6f6927165f1fb804b790763a95529baed Mon Sep 17 00:00:00 2001 From: orangerot Date: Tue, 14 Oct 2025 08:21:09 +0200 Subject: [PATCH] feat: web export --- Makefile | 8 +++- game.c | 3 +- main.c | 113 +++++++++++++++++++++++++++++++------------------------ 3 files changed, 72 insertions(+), 52 deletions(-) diff --git a/Makefile b/Makefile index 5d74d89..3f40477 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,9 @@ CFLAGS := -Wall -Wextra LDFLAGS = -lglfw -lm -lGL -I./glad/include -domino-dungeon: main.c game.c game.h glad/src/glad.c assets/dominos.h +SOURCES = main.c game.c game.h glad/src/glad.c assets/dominos.h + +domino-dungeon: ${SOURCES} $(CC) ${CFLAGS} ${LDFLAGS} -o $@ $^ assets/dominos.h: src_build/domino_assets @@ -10,3 +12,7 @@ assets/dominos.h: src_build/domino_assets src_build/domino_assets: src_build/domino_assets.c $(CC) -o $@ $^ -lm +# https://gist.github.com/ousttrue/0f3a11d5d28e365b129fe08f18f4e141 +domino-dungeon.html: ${SOURCES} + emcc -sUSE_WEBGL2=1 -sUSE_GLFW=3 -sWASM=1 -I./glad/include $(filter %.c,$^) -o $@ + diff --git a/game.c b/game.c index 77ce70c..e50defb 100644 --- a/game.c +++ b/game.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -40,7 +39,7 @@ void mouse_button_callback(int button, int action, int mods) { } void draw_image(decoded_image img) { - // for (int i = 0; i < img.buf_size; i++) img.buf[i] = i; + for (int i = 0; i < img.buf_size; i++) img.buf[i] = i; for (int y = 0; y < DOMINO_HEIGHT; y++) { for (int x = 0; x < DOMINO_WIDTH; x++) { diff --git a/main.c b/main.c index 1207254..5ecb5f5 100644 --- a/main.c +++ b/main.c @@ -4,26 +4,37 @@ #include #include #include -#include + +#ifdef __EMSCRIPTEN__ +#include +#endif #include "game.h" unsigned int SCR_WIDTH = 800; unsigned int SCR_HEIGHT = 600; +GLFWwindow* window; +unsigned int texture; +GLuint shader_program; +unsigned int VAO; + extern void key_callback(int key, int scancode, int action, int mods); extern void cursor_position_callback(int xpos, int ypos); extern void mouse_button_callback(int button, int action, int mods); extern void draw_image(decoded_image img); +uint32_t buffer[256 * 240] = {0}; + struct decoded_image canvas = { .width = 256, .height = 240, .buf_size = 256 * 240, + .buf = buffer, }; const char *vertex_shader_source = - "#version 330 core\n" + "#version 300 es\n" "layout (location = 0) in vec3 aPos;\n" "layout (location = 1) in vec3 aColor;\n" "layout (location = 2) in vec2 aTexCoord;\n" @@ -40,7 +51,8 @@ const char *vertex_shader_source = "}\n"; const char *fragment_shader_source = - "#version 330 core\n" + "#version 300 es\n" + "precision mediump float;\n" "out vec4 FragColor;\n" "\n" "in vec3 ourColor;\n" @@ -89,9 +101,47 @@ void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mouse_button_callback(button, action, mods); } -int main() { +void loop() { + if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) + glfwSetWindowShouldClose(window, 1); - canvas.buf = malloc(canvas.buf_size * sizeof(int)); + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + draw_image(canvas); + + // bind textures on corresponding texture units + glActiveTexture(GL_TEXTURE); + glBindTexture(GL_TEXTURE_2D, texture); + + float scale_x = fmin( + (float) SCR_HEIGHT / SCR_WIDTH * (float) canvas.height / canvas.width, + 1.0 + ); + float scale_y = fmin((float) SCR_WIDTH / SCR_HEIGHT * (float) canvas.width / canvas.height, + 1.0 + ); + + float m[] = { + 2.0 * scale_x, 0.0, 0.0, 0.0, + 0.0, 2.0 * scale_y, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + }; + + // render container + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, canvas.width, canvas.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, canvas.buf); + glUseProgram(shader_program); + glUniform1i(glGetUniformLocation(shader_program, "texture1"), 0); + glUniformMatrix4fv(glGetUniformLocation(shader_program, "transform"), 1, GL_FALSE, m); + glBindVertexArray(VAO); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + + glfwSwapBuffers(window); + glfwPollEvents(); +} + +int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); @@ -102,7 +152,7 @@ int main() { glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif - GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "202-anything", NULL, NULL); + window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "202-anything", NULL, NULL); if (window == NULL) { printf("Failed to create GLFW window\n"); glfwTerminate(); @@ -146,7 +196,7 @@ int main() { return 1; } - GLuint shader_program = glCreateProgram(); + shader_program = glCreateProgram(); glAttachShader(shader_program, vertex_shader); glAttachShader(shader_program, fragment_shader); glLinkProgram(shader_program); @@ -162,7 +212,7 @@ int main() { 0, 1, 3, // first triangle 1, 2, 3 // second triangle }; - unsigned int VBO, VAO, EBO; + unsigned int VBO, EBO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); @@ -185,7 +235,6 @@ int main() { glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); - unsigned int texture; // texture 1 // --------- glGenTextures(1, &texture); @@ -202,46 +251,12 @@ int main() { glUseProgram(shader_program); glUniform1i(glGetUniformLocation(shader_program, "texture1"), 0); - while (!glfwWindowShouldClose(window)) { - if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) - glfwSetWindowShouldClose(window, 1); - - glClearColor(0.2f, 0.3f, 0.3f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - draw_image(canvas); - - // bind textures on corresponding texture units - glActiveTexture(GL_TEXTURE); - glBindTexture(GL_TEXTURE_2D, texture); - - float scale_x = fmin( - (float) SCR_HEIGHT / SCR_WIDTH * (float) canvas.height / canvas.width, - 1.0 - ); - float scale_y = fmin((float) SCR_WIDTH / SCR_HEIGHT * (float) canvas.width / canvas.height, - 1.0 - ); - - float m[] = { - 2.0 * scale_x, 0.0, 0.0, 0.0, - 0.0, 2.0 * scale_y, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0, - }; - - // render container - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, canvas.width, canvas.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, canvas.buf); - glUseProgram(shader_program); - glUniform1i(glGetUniformLocation(shader_program, "texture1"), 0); - glUniformMatrix4fv(glGetUniformLocation(shader_program, "transform"), 1, GL_FALSE, m); - - glBindVertexArray(VAO); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); - - glfwSwapBuffers(window); - glfwPollEvents(); - } +#ifdef __EMSCRIPTEN__ + emscripten_set_main_loop(loop, 0, true); +#else + while (!glfwWindowShouldClose(window)) + loop(); +#endif glfwTerminate();