]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/scene.c
Redesign file structure and graphics pipeline; add font rendering
[dragonblocks_alpha.git] / src / client / scene.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <pthread.h>
4 #include <linmath.h/linmath.h>
5 #include "client/camera.h"
6 #include "client/client.h"
7 #include "client/scene.h"
8 #include "client/shader.h"
9 #include "list.h"
10
11 static struct
12 {
13         List objects;
14         pthread_mutex_t mtx;
15         GLuint prog;
16         GLint loc_model;
17         GLint loc_view;
18         GLint loc_projection;
19         mat4x4 projection;
20         f32 fov;
21         f32 render_distance;
22 } scene;
23
24 bool scene_init()
25 {
26         scene.objects = list_create(NULL),
27         pthread_mutex_init(&scene.mtx, NULL);
28
29         if (! shader_program_create(RESSOURCEPATH "shaders/3d", &scene.prog)) {
30                 fprintf(stderr, "Failed to create 3D shader program\n");
31                 return false;
32         }
33
34         scene.loc_model = glGetUniformLocation(scene.prog, "model");
35         scene.loc_view = glGetUniformLocation(scene.prog, "view");
36         scene.loc_projection = glGetUniformLocation(scene.prog, "projection");
37
38         scene.fov = 86.1f;
39         scene.render_distance = 1000.0f;
40
41         return true;
42 }
43
44 static void list_delete_object(void *key, __attribute__((unused)) void *value, __attribute__((unused)) void *unused)
45 {
46         object_delete(key);
47 }
48
49 void scene_deinit()
50 {
51         list_clear_func(&scene.objects, &list_delete_object, NULL);
52         pthread_mutex_destroy(&scene.mtx);
53         glDeleteProgram(scene.prog);
54 }
55
56 void scene_add_object(Object *obj)
57 {
58         pthread_mutex_lock(&scene.mtx);
59         list_put(&scene.objects, obj, NULL);
60         pthread_mutex_unlock(&scene.mtx);
61 }
62
63 void scene_render()
64 {
65         glUseProgram(scene.prog);
66         camera_enable(scene.loc_view);
67         glUniformMatrix4fv(scene.loc_projection, 1, GL_FALSE, scene.projection[0]);
68
69         glActiveTexture(GL_TEXTURE0);
70
71         for (ListPair **pairptr = &scene.objects.first; *pairptr != NULL; ) {
72                 ListPair *pair = *pairptr;
73                 Object *obj = pair->key;
74                 if (obj->remove) {
75                         pthread_mutex_lock(&scene.mtx);
76                         *pairptr = pair->next;
77                         pthread_mutex_unlock(&scene.mtx);
78                         free(pair);
79                         object_delete(obj);
80                 } else {
81                         object_render(obj, scene.loc_model);
82                         pairptr = &pair->next;
83                 }
84         }
85 }
86
87 void scene_on_resize(int width, int height)
88 {
89         mat4x4_perspective(scene.projection, scene.fov / 180.0f * M_PI, (float) width / (float) height, 0.01f, scene.render_distance);
90 }