89 lines
2.8 KiB
C
89 lines
2.8 KiB
C
#include "object.h"
|
|
#include "allocator.h"
|
|
#include "log.h"
|
|
#include "register.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
|
|
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);
|
|
}
|