aboutsummaryrefslogtreecommitdiff
path: root/scene.ino
diff options
context:
space:
mode:
authorJulian T <julian@jtle.dk>2020-03-23 18:09:32 +0100
committerJulian T <julian@jtle.dk>2020-03-23 18:09:32 +0100
commit7641384c1fc9827ac012caa6481ffd35b4369e47 (patch)
tree17ed94a78d77ceb0007433e67129b3ba7535422f /scene.ino
parent83b552b622da561de047f798e5d50d59f724b1eb (diff)
Runs on arduino, output not testetarduino
Diffstat (limited to 'scene.ino')
-rw-r--r--scene.ino137
1 files changed, 137 insertions, 0 deletions
diff --git a/scene.ino b/scene.ino
new file mode 100644
index 0000000..77dbdc1
--- /dev/null
+++ b/scene.ino
@@ -0,0 +1,137 @@
+#include "scene.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+static inline void link_object(space_t *s, object_t *o)
+{
+ if (s) {
+ o->next = s->objects;
+ s->objects = o;
+ } else {
+ o->next = 0;
+ }
+}
+
+container_t *container_init(container_t *c, unsigned objs, unsigned mats, unsigned ligs)
+{
+ c->obj_index = c->mat_index = c->lig_index = 0;
+
+ c->obj_cap = objs;
+ c->mat_cap = mats;
+ c->lig_cap = ligs;
+
+ return c;
+}
+
+space_t *container_prepare_space(container_t *c)
+{
+ //memset(&c->space, 0, sizeof(space_t));
+ for (int i = 0; i < sizeof(space_t); i++) {
+ *(uint8_t *)&c->space = 0;
+ }
+
+ return &c->space;
+}
+
+// Finds the next empty object_t space
+// Return NULL if full
+static inline object_t *container_obj_space(container_t *cont)
+{
+ if (cont->obj_index >= cont->obj_cap) {
+ //fprintf(stderr, "Could not create object, because container is full\n");
+ return NULL;
+ }
+
+ // Find a nice spot in the content blob
+ return &((object_t *) cont->content)[cont->obj_index++];
+}
+
+static inline material_t *container_mat_space(container_t *cont)
+{
+ if (cont->mat_index >= cont->mat_cap) {
+ //fprintf(stderr, "Could not create material, because container is full\n");
+ return NULL;
+ }
+
+ // Find a nice spot in the content blob.
+ // Remember to jump over objects
+ return &((material_t *) (
+ cont->content +
+ sizeof(object_t) * cont->obj_cap
+ ))[cont->mat_index++];
+}
+
+static inline light_t *container_lig_space(container_t *cont)
+{
+ if (cont->lig_index >= cont->lig_cap) {
+ //fprintf(stderr, "Could not create light, because container is full\n");
+ return NULL;
+ }
+
+ // Find a nice spot in the content blob.
+ // Remember to jump over objects and materials
+ return &((light_t *) (
+ cont->content +
+ sizeof(object_t) * cont->obj_cap +
+ sizeof(material_t) * cont->mat_cap
+ ))[cont->lig_index++];
+}
+
+object_t *add_object(container_t *cont, unsigned type)
+{
+
+ object_t *o = container_obj_space(cont);
+ if (!o) {
+ return NULL;
+ }
+
+ // Fill out the data
+ o->type = type;
+
+ // Link to the linked list
+ link_object(&cont->space, o);
+
+ return o;
+}
+
+light_t *add_light(container_t *cont)
+{
+ light_t *o = container_lig_space(cont);
+ if (!o) {
+ return NULL;
+ }
+
+ space_t *s = &cont->space;
+ if (s) {
+ o->next = s->lights;
+ s->lights = o;
+ } else {
+ o->next = NULL;
+ }
+
+ return o;
+}
+
+// It's alot easier to set the stuff outside of this function
+material_t *add_material(container_t *cont)
+{
+ material_t *m = container_mat_space(cont);
+
+ return m;
+}
+
+void obj_norm_at(object_t *o, vector_t *dest, vector_t *point)
+{
+ switch(o->type) {
+ case TYPE_SPHERE:
+ vector_sub(dest, point, &o->sph.center);
+ vector_scale_inv(dest, dest, vector_len(dest));
+ break;
+ case TYPE_PLANE:
+ vector_copy(dest, &o->pl.norm);
+ break;
+ }
+
+ return;
+}