1 #include <asprintf/asprintf.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"
12 static GLuint _3d_shader_prog;
13 static GLint _3d_loc_VP;
14 static ModelShader _3d_model_shader;
15 static LightShader _3d_light_shader;
17 bool client_inventory_init()
19 char *_3d_shader_defs;
20 asprintf(&_3d_shader_defs, "#define VIEW_DISTANCE %lf\n", client_config.view_distance);
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");
27 free(_3d_shader_defs);
29 _3d_loc_VP = glGetUniformLocation(_3d_shader_prog, "VP");
31 _3d_model_shader.prog = _3d_shader_prog;
32 _3d_model_shader.loc_transform = glGetUniformLocation(_3d_shader_prog, "model"); GL_DEBUG
34 _3d_light_shader.prog = _3d_shader_prog;
35 light_shader_locate(&_3d_light_shader);
40 void client_inventory_deinit()
42 glDeleteProgram(_3d_shader_prog); GL_DEBUG
45 void client_inventory_update()
47 glProgramUniformMatrix4fv(_3d_shader_prog, _3d_loc_VP, 1, GL_FALSE, frustum[0]); GL_DEBUG
48 light_shader_update(&_3d_light_shader);
51 static void wield_init(ModelNode *hand)
54 model_node_add_mesh(hand, &(ModelMesh) {
58 .shader = &_3d_model_shader,
62 static void wield_update(ModelNode *hand, ModelNode *arm, ItemType item)
64 Mesh *mesh = client_item_mesh(item);
67 ((ModelMesh *) hand->meshes.ptr)[0].mesh = mesh;
70 arm->rot.x = mesh ? -M_PI / 8.0 : 0.0;
71 model_node_transform(arm);
75 void client_inventory_init_player(ClientEntity *entity)
77 ClientPlayerData *data = entity->extra;
79 item_stack_initialize(&data->inventory.left);
80 item_stack_initialize(&data->inventory.right);
82 wield_init(data->bones.hand_left);
83 wield_init(data->bones.hand_right);
86 void client_inventory_deinit_player(ClientEntity *entity)
88 ClientPlayerData *data = entity->extra;
90 item_stack_destroy(&data->inventory.left);
91 item_stack_destroy(&data->inventory.right);
94 void client_inventory_update_player(__attribute__((unused)) void *peer, ToClientPlayerInventory *pkt)
96 ClientEntity *entity = client_player_entity(pkt->id);
100 ClientPlayerData *data = entity->extra;
102 item_stack_deserialize(&data->inventory.left, &pkt->left);
103 item_stack_deserialize(&data->inventory.right, &pkt->right);
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);
108 refcount_drp(&entity->rc);