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"
26 scene.objects = list_create(NULL),
27 pthread_mutex_init(&scene.mtx, NULL);
29 if (! shader_program_create(RESSOURCEPATH "shaders/3d", &scene.prog)) {
30 fprintf(stderr, "Failed to create 3D shader program\n");
34 scene.loc_model = glGetUniformLocation(scene.prog, "model");
35 scene.loc_view = glGetUniformLocation(scene.prog, "view");
36 scene.loc_projection = glGetUniformLocation(scene.prog, "projection");
39 scene.render_distance = 1000.0f;
44 static void list_delete_object(void *key, __attribute__((unused)) void *value, __attribute__((unused)) void *unused)
51 list_clear_func(&scene.objects, &list_delete_object, NULL);
52 pthread_mutex_destroy(&scene.mtx);
53 glDeleteProgram(scene.prog);
56 void scene_add_object(Object *obj)
58 pthread_mutex_lock(&scene.mtx);
59 list_put(&scene.objects, obj, NULL);
60 pthread_mutex_unlock(&scene.mtx);
65 glUseProgram(scene.prog);
66 camera_enable(scene.loc_view);
67 glUniformMatrix4fv(scene.loc_projection, 1, GL_FALSE, scene.projection[0]);
69 glActiveTexture(GL_TEXTURE0);
71 for (ListPair **pairptr = &scene.objects.first; *pairptr != NULL; ) {
72 ListPair *pair = *pairptr;
73 Object *obj = pair->key;
75 pthread_mutex_lock(&scene.mtx);
76 *pairptr = pair->next;
77 pthread_mutex_unlock(&scene.mtx);
81 object_render(obj, scene.loc_model);
82 pairptr = &pair->next;
87 void scene_on_resize(int width, int height)
89 mat4x4_perspective(scene.projection, scene.fov / 180.0f * M_PI, (float) width / (float) height, 0.01f, scene.render_distance);