entity.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "entity.h"
  2. #include "entity_i.h"
  3. #include <stdlib.h>
  4. #include <furi.h>
  5. #define ENTITY_DEBUG(...) FURI_LOG_D("Entity", __VA_ARGS__)
  6. static size_t entities_count = 0;
  7. size_t entities_get_count(void) {
  8. return entities_count;
  9. }
  10. struct Entity {
  11. Vector position;
  12. const EntityDescription* behaviour;
  13. void* context;
  14. };
  15. Entity* entity_alloc(const EntityDescription* behaviour) {
  16. entities_count++;
  17. Entity* entity = malloc(sizeof(Entity));
  18. entity->position = VECTOR_ZERO;
  19. entity->behaviour = behaviour;
  20. entity->context = NULL;
  21. if(behaviour && behaviour->context_size > 0) {
  22. entity->context = malloc(behaviour->context_size);
  23. }
  24. ENTITY_DEBUG("Allocated entity at %p", entity);
  25. return entity;
  26. }
  27. void entity_free(Entity* entity) {
  28. entities_count--;
  29. ENTITY_DEBUG("Freeing entity at %p", entity);
  30. if(entity->context) {
  31. free(entity->context);
  32. }
  33. free(entity);
  34. }
  35. Vector entity_pos_get(Entity* entity) {
  36. return entity->position;
  37. }
  38. void entity_pos_set(Entity* entity, Vector position) {
  39. entity->position = position;
  40. }
  41. void* entity_context_get(Entity* entity) {
  42. return entity->context;
  43. }
  44. void entity_call_start(Entity* entity) {
  45. if(entity->behaviour && entity->behaviour->start) {
  46. entity->behaviour->start(entity->context);
  47. }
  48. }
  49. void entity_call_stop(Entity* entity) {
  50. if(entity->behaviour && entity->behaviour->stop) {
  51. entity->behaviour->stop(entity->context);
  52. }
  53. }
  54. void entity_call_update(Entity* entity, Director* director) {
  55. if(entity->behaviour && entity->behaviour->update) {
  56. entity->behaviour->update(entity, director, entity->context);
  57. }
  58. }
  59. void entity_call_render(Entity* entity, Director* director, Canvas* canvas) {
  60. if(entity->behaviour && entity->behaviour->render) {
  61. entity->behaviour->render(entity, director, canvas, entity->context);
  62. }
  63. }