#include "object.h" #include "allocator.h" #include "log.h" #include "register.h" #include #include #include struct Scene *make_scene(struct Vk *vk, struct Register *reg) { struct Scene *scene = malloc(sizeof(struct Scene)); memset(scene, 0, sizeof(struct Scene)); scene->vk = vk; scene->mem = make_mem(2048); if (reg == NULL) { scene->reg = make_register(); } else { scene->reg = reg; } dyn_array_create_inplace(&scene->objects); dyn_array_create_inplace(&scene->insert_queue); struct timespec time; clock_gettime(CLOCK_MONOTONIC, &time); scene->msecs = time.tv_sec * 1000000 + time.tv_nsec / 1000; return scene; } void free_scene(struct Scene *scene) { for (int i = 0; i < scene->objects.count; i++) { scene->objects.items[i]->type->free(scene, scene->objects.items[i]->data); mem_free(scene->mem, scene->objects.items[i]); } dyn_array_destroy(&scene->objects); for (int i = 0; i < scene->insert_queue.count; i++) { scene->insert_queue.items[i]->type->free( scene, scene->insert_queue.items[i]->data); mem_free(scene->mem, scene->insert_queue.items[i]); } dyn_array_destroy(&scene->insert_queue); uninit_mem(scene->mem); memset(scene, 0, sizeof(struct Scene)); free(scene); } void scene_tick(struct Scene *scene) { struct timespec time; clock_gettime(CLOCK_MONOTONIC, &time); long msecs = time.tv_sec * 1000000 + time.tv_nsec / 1000; msecs *= 1.0f; scene->delta_secs = (float)(msecs - scene->msecs) / 1000; if (scene->insert_queue.count > 0) { for (int i = 0; i < scene->insert_queue.count; i++) { dyn_array_append(&scene->objects, scene->insert_queue.items[i]); } dyn_array_reset(&scene->insert_queue); } for (int i = 0; i < scene->objects.count; i++) { scene->objects.items[i]->type->tick(scene, scene->objects.items[i]->data); } if (scene->insert_queue.count > 0) { for (int i = 0; i < scene->insert_queue.count; i++) { dyn_array_append(&scene->objects, scene->insert_queue.items[i]); } dyn_array_reset(&scene->insert_queue); } scene->msecs = msecs; } void scene_queue_insert(struct Scene *scene, char *name, void *object_data) { struct Type *type = reg_get_type(scene->reg, name); struct Object *object = mem_malloc(scene->mem, sizeof(struct Object)); object->type = type; object->data = object_data; dyn_array_append(&scene->insert_queue, object); } void scene_queue_insert_from_data(struct Scene *scene, char *name, char *data, int len) { struct Type *type = reg_get_type(scene->reg, name); struct Object *object = mem_malloc(scene->mem, sizeof(struct Object)); object->type = type; object->data = type->make(scene, data, len); dyn_array_append(&scene->insert_queue, object); }