pawengine/object.c
2025-02-09 18:48:25 +01:00

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);
}