]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Implement meshes
authorElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 25 Mar 2021 17:56:50 +0000 (18:56 +0100)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 25 Mar 2021 17:56:50 +0000 (18:56 +0100)
src/Makefile
src/client.c
src/client.h
src/mapblock_meshgen.c
src/mesh.c
src/mesh.h
src/scene.c
src/scene.h
src/shaders.c [new file with mode: 0644]
src/shaders.h [new file with mode: 0644]
src/util.h

index b1014a9f4852f9aed42a623be01d853364d54c3c..ce4e7bf5654a1b07fd54706f008193de19074af4 100644 (file)
@@ -6,7 +6,7 @@ CLIENT_LIBRARIES = -lGL -lGLEW -lglfw
 FLAGS = -g -fmax-errors=4
 
 ifdef RELEASE
-FLAGS = -O3
+FLAGS = -O3 -DRELEASE
 endif
 
 all: Dragonblocks DragonblocksServer
index 16401596d4d56a0a346c9077a4af1c00502e533b..4be4783e12e027f0ba4d114451e79f772c9b67df 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <math.h>
 #include <arpa/inet.h>
 #include <unistd.h>
 #include <errno.h>
@@ -11,6 +12,7 @@
 #include "client.h"
 #include "mapblock_meshgen.h"
 #include "signal.h"
+#include "shaders.h"
 #include "util.h"
 
 Client client;
@@ -43,6 +45,12 @@ static void *reciever_thread(void *unused)
        return NULL;
 }
 
+#ifdef RELEASE
+#define SHADER_PATH "shaders/"
+#else
+#define SHADER_PATH "../shaders/"
+#endif
+
 static void client_loop()
 {
        if(! glfwInit()) {
@@ -55,7 +63,11 @@ static void client_loop()
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
 
-       GLFWwindow *window = glfwCreateWindow(1024, 768, "Dragonblocks", NULL, NULL);
+       int width, height;
+       width = 1024;
+       height = 768;
+
+       GLFWwindow *window = glfwCreateWindow(width, height, "Dragonblocks", NULL, NULL);
 
        if (! window) {
                printf("Failed to create window\n");
@@ -69,17 +81,28 @@ static void client_loop()
                return;
        }
 
-       int shader_program = 0;
+       ShaderProgram *prog = create_shader_program(SHADER_PATH);
+
+       mat4x4 view, proj;
+
+       mat4x4_identity(view);  // ToDo: camera
+       mat4x4_perspective(proj, 86.1f / 180.0f * M_PI, (float) width / (float) height, 0.01f, 100.0f);
+
+       glUseProgram(prog->id);
+       glUniformMatrix4fv(prog->loc_view, 1, GL_FALSE, view[0]);
+       glUniformMatrix4fv(prog->loc_proj, 1, GL_FALSE, proj[0]);
 
        while (! glfwWindowShouldClose(window) && client.state != CS_DISCONNECTED && ! interrupted) {
                glClear(GL_COLOR_BUFFER_BIT);
-               glClearColor(0.52941176470588, 0.8078431372549, 0.92156862745098, 1.0);
+               glClearColor(0.52941176470588f, 0.8078431372549f, 0.92156862745098f, 1.0f);
 
-               scene_render(client.scene, shader_program);
+               scene_render(client.scene, prog);
 
                glfwSwapBuffers(window);
                glfwPollEvents();
        }
+
+       delete_shader_program(prog);
 }
 
 static bool client_name_prompt()
index 00b9087a1c1405fe7557a534b06b65eacf0e351a..f1bb4e5182e4a722149406841cbd6fac712ecb6f 100644 (file)
@@ -5,8 +5,8 @@
 #include <pthread.h>
 #include "servercommands.h"
 #include "clientcommands.h"
-#include "network.h"
 #include "map.h"
+#include "network.h"
 #include "scene.h"
 
 typedef struct Client
index 56882c1433cd63542ae2fbbfac20d1813f0600c9..80933ad9b6e6f18c151677cc89ac80f0e577df6a 100644 (file)
@@ -81,7 +81,6 @@ static void *meshgen_thread(void *unused)
 
                        if (vertices.siz > 0) {
                                mesh = mesh_create(vertices.ptr, vertices.siz);
-                               free(vertices.ptr);
                                scene_add_mesh(meshgen.scene, mesh);
                        }
 
index 6016c12e03e99392f2826edde97063f47baae970..80ec6d7423266b25997696c2ad4dd95a6abd1317 100644 (file)
@@ -1 +1,80 @@
+#include <stdlib.h>
 #include "mesh.h"
+
+Mesh *mesh_create(GLfloat *vertices, GLsizei size)
+{
+       Mesh *mesh = malloc(sizeof(Mesh));
+       for (int i = 0; i < 3; i++) {
+               mesh->pos[i] = 0;
+               mesh->rot[i] = 0;
+               mesh->scale[i] = 1;
+       }
+       mesh_transform(mesh);
+       mesh->angle = 0.0f;
+       mesh->VAO = 0;
+       mesh->VBO = 0;
+       mesh->remove = false;
+       mesh->vertices = vertices;
+       mesh->size = size;
+       mesh->count = size / 6;
+       return mesh;
+}
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic warning "-Wpedantic"
+
+void mesh_transform(Mesh *mesh)
+{
+       mat4x4_translate(mesh->transform, mesh->pos[0], mesh->pos[1], mesh->pos[2]);
+       mat4x4_rotate(mesh->transform, mesh->transform, mesh->rot[0], mesh->rot[1], mesh->rot[2], mesh->angle);
+       mat4x4_scale_aniso(mesh->transform, mesh->transform, mesh->scale[0], mesh->scale[1], mesh->scale[2]);
+}
+
+#pragma GCC diagnostic pop
+
+void mesh_delete(Mesh *mesh)
+{
+       if (mesh->vertices)
+               free(mesh->vertices);
+       if (mesh->VAO)
+               glDeleteVertexArrays(1, &mesh->VAO);
+       if (mesh->VBO)
+               glDeleteBuffers(1, &mesh->VAO);
+       free(mesh);
+}
+
+static void mesh_configure(Mesh *mesh)
+{
+       glGenVertexArrays(1, &mesh->VAO);
+       glGenBuffers(1, &mesh->VBO);
+
+       glBindVertexArray(mesh->VAO);
+       glBindBuffer(GL_ARRAY_BUFFER, mesh->VBO);
+
+       glBufferData(GL_ARRAY_BUFFER, mesh->size, mesh->vertices, GL_STATIC_DRAW);
+
+       GLsizei stride = 6 * sizeof(GLfloat);
+
+       glVertexAttribPointer(0, 3, GL_FLOAT, false, stride, (GLvoid *)(0 * sizeof(GLfloat)));
+       glEnableVertexAttribArray(0);
+       glVertexAttribPointer(1, 3, GL_FLOAT, false, stride, (GLvoid *)(3 * sizeof(GLfloat)));
+       glEnableVertexAttribArray(1);
+
+       glBindBuffer(GL_ARRAY_BUFFER, 0);
+       glBindVertexArray(0);
+
+       free(mesh->vertices);
+       mesh->vertices = NULL;
+}
+
+void mesh_render(Mesh *mesh, ShaderProgram *prog)
+{
+       if (mesh->vertices)
+               mesh_configure(mesh);
+
+       glUniformMatrix4fv(prog->loc_model, 1, GL_FALSE, mesh->transform[0]);
+
+       glBindVertexArray(mesh->VAO);
+       glDrawArrays(GL_TRIANGLES, 0, mesh->count);
+       glBindVertexArray(0);
+}
index c3804e1c3c8fe28939e8eba18a2c44b1d5ddcfe9..b29bf3097c97231b1adb927a24fb929d37fe720e 100644 (file)
@@ -5,6 +5,7 @@
 #include <GL/gl.h>
 #include <linmath.h/linmath.h>
 #include <stdbool.h>
+#include "shaders.h"
 
 typedef struct
 {
@@ -13,10 +14,13 @@ typedef struct
        mat4x4 transform;
        GLuint VAO, VBO;
        bool remove;
+       GLfloat *vertices;
+       GLsizei size, count;
 } Mesh;
 
-Mesh *mesh_create(const GLvoid *vertices, GLsizei size);
+Mesh *mesh_create(GLfloat *vertices, GLsizei size);
 void mesh_delete(Mesh *mesh);
-void mesh_render(Mesh *mesh, int prog);
+void mesh_transform(Mesh *mesh);
+void mesh_render(Mesh *mesh, ShaderProgram *prog);
 
 #endif
index 05dec086fc3a7e617467b72df21dd6ce8cf34131..3f5995e51133cdf66fb70e2185ce3b983de4ba6f 100644 (file)
@@ -24,7 +24,7 @@ void scene_add_mesh(Scene *scene, Mesh *mesh)
        pthread_mutex_unlock(&scene->mtx);
 }
 
-void scene_render(Scene *scene, int prog)
+void scene_render(Scene *scene, ShaderProgram *prog)
 {
        for (ListPair **pairptr = &scene->meshes.first; *pairptr != NULL; ) {
                ListPair *pair = *pairptr;
index 0f0ac92b9872c98cc4b0e63a24815842e2eb5d8d..e8edd88a7cbc30fe77f91448f41a7846af33b861 100644 (file)
@@ -4,6 +4,7 @@
 #include <pthread.h>
 #include "list.h"
 #include "mesh.h"
+#include "shaders.h"
 
 typedef struct
 {
@@ -16,6 +17,6 @@ void scene_delete(Scene *scene);
 
 void scene_add_mesh(Scene *scene, Mesh *mesh);
 void scene_remove_mesh(Scene *scene, Mesh *mesh);
-void scene_render(Scene *scene, int prog);
+void scene_render(Scene *scene, ShaderProgram *prog);
 
 #endif
diff --git a/src/shaders.c b/src/shaders.c
new file mode 100644 (file)
index 0000000..8d1c8b6
--- /dev/null
@@ -0,0 +1 @@
diff --git a/src/shaders.h b/src/shaders.h
new file mode 100644 (file)
index 0000000..6344625
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef _SHADERS_H_
+#define _SHADERS_H_
+
+typedef struct
+{
+       GLuint id;
+       GLint loc_model;
+       GLint loc_view;
+       GLint loc_proj;
+} ShaderProgram;
+
+ShaderProgram *create_shader_program(const char *path);        // ToDo
+void delete_shader_program(ShaderProgram *);
+
+#endif
index ed53816b902f78576cd78f20290de4ef14b6122d..17968821e026d75de6b7848fda3b6f6c3f09af52 100644 (file)
@@ -2,6 +2,7 @@
 #define _UTIL_H_
 
 #include <arpa/inet.h>
+#include <linmath.h/linmath.h>
 #include "types.h"
 
 #define ever (;;)