]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/client_entity.h
c97bc06d201e687048f99cc867ac2b63aba92b76
[dragonblocks_alpha.git] / src / client / client_entity.h
1 #ifndef _CLIENT_ENTITY_H_
2 #define _CLIENT_ENTITY_H_
3
4 #include <dragonstd/refcount.h>
5 #include <pthread.h>
6 #include "client/gui.h"
7 #include "client/model.h"
8 #include "entity.h"
9 #include "item.h"
10 #include "types.h"
11
12 typedef struct {
13         EntityData data;
14         struct ClientEntityType *type;
15         Refcount rc;
16
17         Model *model;
18         GUIElement *nametag;
19         void *extra;
20
21         aabb3f32 box_collision;
22         aabb3f32 box_culling;   // ToDo
23         mat4x4 *nametag_offset;
24
25         pthread_rwlock_t lock_pos_rot;
26         pthread_rwlock_t lock_nametag;
27         pthread_rwlock_t lock_box_off;
28 } ClientEntity;
29
30 // Entity is pronounced N-Tiddy, hmmmm...
31
32 typedef struct ClientEntityType {
33         void (*add   )(ClientEntity *entity); // called when server sent addition of entity
34         void (*remove)(ClientEntity *entity); // called when server sent removal of entity
35         void (*free  )(ClientEntity *entity); // called when entity is garbage collected
36
37         void (*update_pos_rot)(ClientEntity *entity);
38         void (*update_nametag)(ClientEntity *entity);
39
40         void (*transform)(ClientEntity *entity);
41 } ClientEntityType;
42
43 extern ClientEntityType client_entity_types[];
44 extern Mesh client_entity_cube;
45 extern ModelShader client_entity_shader;
46
47 void client_entity_init();
48 void client_entity_deinit();
49
50 bool client_entity_gfx_init();
51 void client_entity_gfx_deinit();
52 void client_entity_gfx_update();
53 void client_entity_depth_offset(f32 offset);
54
55 ClientEntity *client_entity_grab(u64 id);
56 void client_entity_drop(ClientEntity *entity);
57
58 void client_entity_transform(ClientEntity *entity);
59
60 void client_entity_add(void *peer, ToClientEntityAdd *pkt);
61 void client_entity_remove(void *peer, ToClientEntityRemove *pkt);
62 void client_entity_update_pos_rot(void *peer, ToClientEntityUpdatePosRot *pkt);
63 void client_entity_update_nametag(void *peer, ToClientEntityUpdateNametag *pkt);
64
65 #endif // _CLIENT_ENTITY_H_