entity.c (2662B)
1 2 #include "entity.h" 3 #include "node.h" 4 #include "model.h" 5 #include "resource.h" 6 #include "debug.h" 7 #include <assert.h> 8 9 #define DEF_NUM_ENTITIES 1024 10 11 static struct resource_manager esys; 12 13 static inline struct resource_manager *_internal_get_entity_system() 14 { 15 return &esys; 16 } 17 18 static inline struct entity *new_uninitialized_entity(struct entity_id *id) 19 { 20 return new_resource(&esys, &id->id); 21 } 22 23 struct entity *get_all_entities(u32 *count, struct entity_id **ids) { 24 return get_all_resources(&esys, count, (struct resource_id**)ids); 25 } 26 27 struct entity *init_entity(struct entity *ent, struct node_id *id) { 28 init_id(&ent->model_id); 29 if (id == NULL) { 30 init_id(&ent->node_id); 31 new_node(&ent->node_id); 32 /* debug("init_entity with new node_id %llu\n", new_id.uuid); */ 33 } 34 else { 35 ent->node_id = *id; 36 } 37 ent->flags &= ~ENT_CASTS_SHADOWS; 38 return ent; 39 } 40 41 struct entity *get_entity(struct entity_id *ent_id) { 42 return get_resource(&esys, (struct resource_id *)ent_id); 43 } 44 45 struct entity *new_entity_with_node(struct entity_id *id, struct node_id *node) 46 { 47 struct entity_id new_id; 48 49 if (id == NULL) { 50 id = &new_id; 51 init_id(&new_id); 52 } 53 54 return init_entity(new_uninitialized_entity(id), node); 55 } 56 57 struct entity *add_entity(struct entity *e, struct entity_id *id) { 58 struct entity *new = new_uninitialized_entity(id); 59 *new = *e; 60 return new; 61 } 62 63 void destroy_entities() 64 { 65 struct resource_id *ids; 66 u32 count; 67 get_all_resources(&esys, &count, &ids); 68 for (u32 i = 0; i < count; i++) { 69 destroy_entity((struct entity_id*)&ids[i]); 70 } 71 }; 72 73 void destroy_entity(struct entity_id *id) 74 { 75 struct entity *ent = get_entity(id); 76 if (ent == NULL) 77 return; 78 79 struct node *node = get_node(&ent->node_id); 80 assert(node); 81 if (node == NULL) 82 return; 83 84 node_detach_from_parent(node); 85 destroy_resource(&esys, &id->id); 86 } 87 88 const char *entity_label(struct entity *ent) 89 { 90 struct node *node = get_node(&ent->node_id); assert(node); 91 return node->label; 92 } 93 94 void destroy_entity_system() { 95 destroy_resource_manager(&esys); 96 } 97 98 void init_entity_system() { 99 init_resource_manager(&esys, sizeof(struct entity), DEF_NUM_ENTITIES, 100 MAX_ENTITIES, "entity"); 101 } 102 103 struct entity *new_debug_entity(struct entity_id *ent_id, float *pos) 104 { 105 init_id(ent_id); 106 struct entity *ent = new_entity(ent_id); 107 ent->model_id = get_model_by_name("barrel", NULL); 108 struct node *enode = get_node(&ent->node_id); 109 node_set_label(enode, "debug"); 110 vec3_copy(pos, enode->pos); 111 node_scale(enode, 5.0); 112 node_mark_for_recalc(enode); 113 node_recalc(enode); 114 return ent; 115 } 116