]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/client_inventory.c
Add items
[dragonblocks_alpha.git] / src / client / client_inventory.c
1 #include <asprintf/asprintf.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include "client/client_config.h"
5 #include "client/client_inventory.h"
6 #include "client/client_item.h"
7 #include "client/gl_debug.h"
8 #include "client/frustum.h"
9 #include "client/light.h"
10 #include "client/shader.h"
11
12 static GLuint _3d_shader_prog;
13 static GLint _3d_loc_VP;
14 static ModelShader _3d_model_shader;
15 static LightShader _3d_light_shader;
16
17 bool client_inventory_init()
18 {
19         char *_3d_shader_defs;
20         asprintf(&_3d_shader_defs, "#define VIEW_DISTANCE %lf\n", client_config.view_distance);
21
22         if (!shader_program_create(RESSOURCE_PATH "shaders/3d/item", &_3d_shader_prog, _3d_shader_defs)) {
23                 fprintf(stderr, "[error] failed to create 3D item shader program\n");
24                 return false;
25         }
26
27         free(_3d_shader_defs);
28
29         _3d_loc_VP = glGetUniformLocation(_3d_shader_prog, "VP");
30
31         _3d_model_shader.prog = _3d_shader_prog;
32         _3d_model_shader.loc_transform = glGetUniformLocation(_3d_shader_prog, "model"); GL_DEBUG
33
34         _3d_light_shader.prog = _3d_shader_prog;
35         light_shader_locate(&_3d_light_shader);
36
37         return true;
38 }
39
40 void client_inventory_deinit()
41 {
42         glDeleteProgram(_3d_shader_prog); GL_DEBUG
43 }
44
45 void client_inventory_update()
46 {
47         glProgramUniformMatrix4fv(_3d_shader_prog, _3d_loc_VP, 1, GL_FALSE, frustum[0]); GL_DEBUG
48         light_shader_update(&_3d_light_shader);
49 }
50
51 static void wield_init(ModelNode *hand)
52 {
53         if (hand)
54                 model_node_add_mesh(hand, &(ModelMesh) {
55                         .mesh = NULL,
56                         .textures = NULL,
57                         .num_textures = 0,
58                         .shader = &_3d_model_shader,
59                 });
60 }
61
62 static void wield_update(ModelNode *hand, ModelNode *arm, ItemType item)
63 {
64         Mesh *mesh = client_item_mesh(item);
65
66         if (hand)
67                 ((ModelMesh *) hand->meshes.ptr)[0].mesh = mesh;
68
69         if (arm) {
70                 arm->rot.x = mesh ? -M_PI / 8.0 : 0.0;
71                 model_node_transform(arm);              
72         }
73 }
74
75 void client_inventory_init_player(ClientEntity *entity)
76 {
77         ClientPlayerData *data = entity->extra;
78
79         item_stack_initialize(&data->inventory.left);
80         item_stack_initialize(&data->inventory.right);
81
82         wield_init(data->bones.hand_left);
83         wield_init(data->bones.hand_right);
84 }
85
86 void client_inventory_deinit_player(ClientEntity *entity)
87 {
88         ClientPlayerData *data = entity->extra;
89
90         item_stack_destroy(&data->inventory.left);
91         item_stack_destroy(&data->inventory.right);
92 }
93
94 void client_inventory_update_player(__attribute__((unused)) void *peer, ToClientPlayerInventory *pkt)
95 {
96         ClientEntity *entity = client_player_entity(pkt->id);
97         if (!entity)
98                 return;
99
100         ClientPlayerData *data = entity->extra;
101
102         item_stack_deserialize(&data->inventory.left, &pkt->left);
103         item_stack_deserialize(&data->inventory.right, &pkt->right);
104
105         wield_update(data->bones.hand_left,  data->bones.arm_left,  data->inventory.left.type);
106         wield_update(data->bones.hand_right, data->bones.arm_right, data->inventory.right.type);
107
108         refcount_drp(&entity->rc);
109 }