summaryrefslogtreecommitdiff
path: root/src/objects
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2020-08-24 00:52:48 -0400
committerAndrew Opalach <andrew@akon.city> 2020-08-24 00:52:48 -0400
commitc5ab6fd0e37cfb8c5ba65ade8eb076e980010048 (patch)
treee70c74fe46bac58449d9161378a24a8f1bf452d6 /src/objects
downloadmauri-c5ab6fd0e37cfb8c5ba65ade8eb076e980010048.tar.gz
mauri-c5ab6fd0e37cfb8c5ba65ade8eb076e980010048.tar.bz2
mauri-c5ab6fd0e37cfb8c5ba65ade8eb076e980010048.zip
initial commit
Diffstat (limited to 'src/objects')
-rw-r--r--src/objects/material.c41
-rw-r--r--src/objects/material.h13
-rw-r--r--src/objects/model.c35
-rw-r--r--src/objects/model.h18
-rw-r--r--src/objects/object.c52
-rw-r--r--src/objects/object.h46
-rw-r--r--src/objects/pass.c19
-rw-r--r--src/objects/pass.h20
-rw-r--r--src/objects/scene.c57
-rw-r--r--src/objects/scene.h42
10 files changed, 343 insertions, 0 deletions
diff --git a/src/objects/material.c b/src/objects/material.c
new file mode 100644
index 0000000..d01b8fe
--- /dev/null
+++ b/src/objects/material.c
@@ -0,0 +1,41 @@
+#include "material.h"
+#include "pass.h"
+
+#include "../log.h"
+#include "../json.h"
+
+void mri_material_parse(mri_material *material, json_t *value) {
+ if (json_is_string(value)) {
+ mri_asset *asset = mri_asset_manager_get(json_string_value(value), NONE);
+
+ json_error_t error;
+ json_t *root = json_loadb((char *)asset->data, asset->size, 0, &error);
+
+ if (!root) {
+ log_error("error parsing json on line %d: %s", error.line, error.text);
+ return;
+ }
+
+ mvec_init(material->passes);
+
+ json_t *pass;
+ json_t *passes = json_object_get(root, "passes");
+ json_array(pass, passes) {
+ mri_pass _pass;
+ mri_pass_parse(&_pass, pass);
+ mvec_push(material->passes, _pass);
+ }
+
+ json_decref(root);
+ } else {
+ memset(material, 0, sizeof(mri_material));
+ }
+}
+
+void mri_material_unload(mri_material *material) {
+ mri_pass *pass;
+ mvec_loop_ptr(material->passes, pass) {
+ mri_pass_unload(pass);
+ }
+ mvec_free(material->passes);
+}
diff --git a/src/objects/material.h b/src/objects/material.h
new file mode 100644
index 0000000..72b2d45
--- /dev/null
+++ b/src/objects/material.h
@@ -0,0 +1,13 @@
+#ifndef _MATERIAL_H
+#define _MATERIAL_H
+
+#include "pass.h"
+
+typedef struct {
+ mvec(mri_pass) passes;
+} mri_material;
+
+void mri_material_parse(mri_material *material, json_t *value);
+void mri_material_unload(mri_material *material);
+
+#endif // MATERIAL_H
diff --git a/src/objects/model.c b/src/objects/model.c
new file mode 100644
index 0000000..c821786
--- /dev/null
+++ b/src/objects/model.c
@@ -0,0 +1,35 @@
+#include <jansson.h>
+
+#include "../json.h"
+#include "../assets.h"
+#include "../log.h"
+
+#include "model.h"
+
+void mri_model_parse(mri_model *model, json_t *value) {
+ if (json_is_string(value)) {
+ mri_asset *asset = mri_asset_manager_get(json_string_value(value), NONE);
+
+ json_error_t error;
+ json_t *root = json_loadb((char *)asset->data, asset->size, 0, &error);
+
+ if (!root) {
+ log_error("error parsing json on line %d: %s", error.line, error.text);
+ return;
+ }
+
+ json_get_bool(&model->autosize, root, "autosize");
+ json_get_bool(&model->fullscreen, root, "fullscreen");
+ json_get_bool(&model->passthrough, root, "passthrough");
+
+ mri_material_parse(&model->material, json_object_get(root, "material"));
+
+ json_decref(root);
+ } else {
+ memset(model, 0, sizeof(mri_model));
+ }
+}
+
+void mri_model_unload(mri_model *model) {
+ mri_material_unload(&model->material);
+}
diff --git a/src/objects/model.h b/src/objects/model.h
new file mode 100644
index 0000000..e59b369
--- /dev/null
+++ b/src/objects/model.h
@@ -0,0 +1,18 @@
+#ifndef _MODEL_H
+#define _MODEL_H
+
+#include <jansson.h>
+
+#include "material.h"
+
+typedef struct {
+ bool autosize;
+ bool fullscreen;
+ bool passthrough;
+ mri_material material;
+} mri_model;
+
+void mri_model_parse(mri_model *model, json_t *value);
+void mri_model_unload(mri_model *model);
+
+#endif // _MODEL_H
diff --git a/src/objects/object.c b/src/objects/object.c
new file mode 100644
index 0000000..6b679a0
--- /dev/null
+++ b/src/objects/object.c
@@ -0,0 +1,52 @@
+#include <jansson.h>
+
+#include "object.h"
+#include "model.h"
+
+#include "../log.h"
+#include "../json.h"
+
+void mri_object_parse(mri_object *object, json_t *root) {
+ json_get_int(&object->id, root, "id");
+
+ json_get_float(&object->alpha, root, "alpha");
+
+ json_get_vec3(&object->angles, root, "angles");
+ json_get_vec3(&object->color, root, "color");
+
+ json_get_int(&object->color_blend_mode, root, "colorblendmode");
+
+ json_get_bool(&object->copy_background, root, "copybackground");
+
+ mvec_init(object->deps);
+
+ json_t *dep;
+ json_t *deps = json_object_get(root, "dependencies");
+ json_array(dep, deps) {
+ int value = json_integer_value(dep);
+ mvec_push(object->deps, value);
+ }
+
+ json_get_vec2(&object->size, root, "size");
+ json_get_vec3(&object->scale, root, "scale");
+ json_get_vec3(&object->origin, root, "origin");
+
+ mri_model_parse(&object->image, json_object_get(root, "image"));
+
+ json_get_bool(&object->visible, root, "visible");
+
+ //mvec_init(object->effects);
+
+ json_t *effect;
+ json_t *effects = json_object_get(root, "effects");
+ json_array(effect, effects) {
+ // parse effect
+ }
+}
+
+void mri_object_unload(mri_object *object) {
+ mvec_free(object->deps);
+ //mvec_free(object->effects);
+ mri_model_unload(&object->image);
+}
+
diff --git a/src/objects/object.h b/src/objects/object.h
new file mode 100644
index 0000000..18c0dec
--- /dev/null
+++ b/src/objects/object.h
@@ -0,0 +1,46 @@
+#ifndef _OBJECT_H
+#define _OBJECT_H
+
+#include <moro_vec.h>
+#include <jansson.h>
+#include <stdbool.h>
+#include <cglm/cglm.h>
+
+#include "model.h"
+
+typedef enum {
+ CENTER,
+} mri_object_alignment;
+
+typedef struct {
+ int id;
+ char *name;
+
+ mvec(int) deps;
+
+ mri_object_alignment alignment;
+
+ float alpha;
+
+ vec3 angles;
+ vec3 color;
+
+ int color_blend_mode;
+
+ bool copy_background;
+
+ mri_model image;
+
+ vec2 size;
+ vec3 origin;
+ vec3 scale;
+
+ bool visible;
+
+ //mvec(mri_effect) effects;
+} mri_object;
+
+void mri_object_parse(mri_object *object, json_t *root);
+void mri_object_unload(mri_object *object);
+
+#endif // _OBJECT_H
diff --git a/src/objects/pass.c b/src/objects/pass.c
new file mode 100644
index 0000000..c2107aa
--- /dev/null
+++ b/src/objects/pass.c
@@ -0,0 +1,19 @@
+#include "pass.h"
+
+#include "../json.h"
+#include "../texture.h"
+#include "../assets.h"
+
+void mri_pass_parse(mri_pass *pass, json_t *root) {
+ json_t *texture;
+ json_t *textures = json_object_get(root, "textures");
+ json_array(texture, textures) {
+ if (json_is_string(texture)) {
+ //mri_texture_load(&pass->textures[0], mri_asset_manager_get(json_string_value(texture), TEXTURE));
+ //mri_texture_unload(&pass->textures[0]);
+ }
+ }
+}
+
+void mri_pass_unload(mri_pass *pass) {
+}
diff --git a/src/objects/pass.h b/src/objects/pass.h
new file mode 100644
index 0000000..fca8bac
--- /dev/null
+++ b/src/objects/pass.h
@@ -0,0 +1,20 @@
+#ifndef _PASS_H
+#define _PASS_H
+
+#include <jansson.h>
+
+#include "../texture.h"
+
+typedef struct {
+ // mri_shader *shader;
+ // mri_material *material;
+ mri_texture textures[7];
+
+ // mvec(mri_uniform) uniforms;
+ // mvec(mri_combo) combos;
+} mri_pass;
+
+void mri_pass_parse(mri_pass *pass, json_t *root);
+void mri_pass_unload(mri_pass *pass);
+
+#endif // _PASS_H
diff --git a/src/objects/scene.c b/src/objects/scene.c
new file mode 100644
index 0000000..6b8cfce
--- /dev/null
+++ b/src/objects/scene.c
@@ -0,0 +1,57 @@
+#include <jansson.h>
+#include <moro_vec.h>
+
+#include "scene.h"
+#include "object.h"
+
+#include "../json.h"
+#include "../log.h"
+
+void mri_scene_parse(mri_scene *scene) {
+ mri_asset *scene_json = mri_asset_manager_get("scene.json", NONE);
+
+ json_error_t error;
+ json_t *root = json_loadb((char *)scene_json->data, scene_json->size, 0, &error);
+
+ if (!root) {
+ log_error("error parsing json on line %d: %s", error.line, error.text);
+ return;
+ }
+
+ json_t *camera = json_object_get(root, "camera");
+ json_t *general = json_object_get(root, "general");
+ json_t *ortho = json_object_get(general, "orthogonalprojection");
+
+ json_get_vec3(&scene->camera.center, camera, "center");
+ json_get_vec3(&scene->camera.eye, camera, "eye");
+ json_get_vec3(&scene->camera.up, camera, "up");
+
+ json_get_bool(&scene->clear_enabled, general, "clearenabled");
+
+ json_get_vec3(&scene->clear_color, general, "clearcolor");
+ json_get_vec3(&scene->ambient_color, general, "ambientcolor");
+ json_get_vec3(&scene->skylight_color, general, "skylightcolor");
+
+ json_get_float(&scene->width, ortho, "width");
+ json_get_float(&scene->height, ortho, "height");
+
+ mvec_init(scene->objects);
+
+ json_t *object;
+ json_t *objects = json_object_get(root, "objects");
+ json_array(object, objects) {
+ mri_object _object;
+ mri_object_parse(&_object, object);
+ mvec_push(scene->objects, _object);
+ }
+
+ json_decref(root);
+}
+
+void mri_scene_unload(mri_scene *scene) {
+ mri_object *object;
+ mvec_loop_ptr(scene->objects, object) {
+ mri_object_unload(object);
+ }
+ mvec_free(scene->objects);
+}
diff --git a/src/objects/scene.h b/src/objects/scene.h
new file mode 100644
index 0000000..5c7e90b
--- /dev/null
+++ b/src/objects/scene.h
@@ -0,0 +1,42 @@
+#ifndef _SCENE_H
+#define _SCENE_H
+
+#include <cglm/cglm.h>
+#include <moro_vec.h>
+
+#include "object.h"
+
+#include "../assets.h"
+
+typedef struct {
+ float width;
+ float height;
+
+ struct {
+ vec3 center;
+ vec3 eye;
+ vec3 up;
+
+ float farz;
+ float nearz;
+ float fov;
+ } camera;
+
+ bool clear_enabled;
+
+ vec3 clear_color;
+ vec3 ambient_color;
+ vec3 skylight_color;
+
+ bool bloom;
+
+ float bloom_strength;
+ float bloom_threshold;
+
+ mvec(mri_object) objects;
+} mri_scene;
+
+void mri_scene_parse(mri_scene *scene);
+void mri_scene_unload(mri_scene *scene);
+
+#endif // _SCENE_H