polyadvent

A game engine from scratch in C
git clone git://jb55.com/polyadvent
Log | Files | Refs | README

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