From c5ab6fd0e37cfb8c5ba65ade8eb076e980010048 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 24 Aug 2020 00:52:48 -0400 Subject: initial commit --- src/objects/material.c | 41 ++++++++++++++++++++++++++++++++++++ src/objects/material.h | 13 ++++++++++++ src/objects/model.c | 35 +++++++++++++++++++++++++++++++ src/objects/model.h | 18 ++++++++++++++++ src/objects/object.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ src/objects/object.h | 46 ++++++++++++++++++++++++++++++++++++++++ src/objects/pass.c | 19 +++++++++++++++++ src/objects/pass.h | 20 ++++++++++++++++++ src/objects/scene.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/scene.h | 42 +++++++++++++++++++++++++++++++++++++ 10 files changed, 343 insertions(+) create mode 100644 src/objects/material.c create mode 100644 src/objects/material.h create mode 100644 src/objects/model.c create mode 100644 src/objects/model.h create mode 100644 src/objects/object.c create mode 100644 src/objects/object.h create mode 100644 src/objects/pass.c create mode 100644 src/objects/pass.h create mode 100644 src/objects/scene.c create mode 100644 src/objects/scene.h (limited to 'src/objects') 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 + +#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 + +#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 + +#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 +#include +#include +#include + +#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 + +#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 +#include + +#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 +#include + +#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 -- cgit v1.2.3-101-g0448