summaryrefslogtreecommitdiff
path: root/src/objects
diff options
context:
space:
mode:
Diffstat (limited to 'src/objects')
-rw-r--r--src/objects/effect.cc21
-rw-r--r--src/objects/effect.h8
-rw-r--r--src/objects/material.cc2
-rw-r--r--src/objects/material.h1
-rw-r--r--src/objects/model.cc10
-rw-r--r--src/objects/model.h7
-rw-r--r--src/objects/object.cc69
-rw-r--r--src/objects/object.h22
-rw-r--r--src/objects/pass.cc58
-rw-r--r--src/objects/pass.h3
-rw-r--r--src/objects/scene.cc34
-rw-r--r--src/objects/scene.h21
12 files changed, 129 insertions, 127 deletions
diff --git a/src/objects/effect.cc b/src/objects/effect.cc
index cbe0b7f..bc94c17 100644
--- a/src/objects/effect.cc
+++ b/src/objects/effect.cc
@@ -16,25 +16,25 @@
using namespace Mauri;
-Effect::Effect(Json::Value root)
+Effect::Effect(json root)
{
- id = root["id"].asInt();
+ id = get_value<u32>(root["id"], INT);
- visible = json_user_value(root.get("visible", true)).asBool();
+ visible = get_value<bool>(root["visible"], BOOL);
for (auto &pass0 : root["passes"])
{
passes0.emplace_back(new Pass(pass0, EFFECT0_PASS));
}
- auto asset = asset_manager()->get_file(root["file"].asString(), NONE);
+ auto asset = asset_manager()->get_file(root["file"], NONE);
if (asset->type == ASSET_VOID)
return;
- Json::Value file = asset->as_json();
+ auto file = json::parse(asset->as_string());
- name = file["name"].asString();
+ name = get_value<std::string>(file["name"], STRING);
for (auto &pass1 : file["passes"])
{
@@ -43,17 +43,18 @@ Effect::Effect(Json::Value root)
for (auto &fbo : file["fbos"])
{
- fbos.emplace_back((EffectBuffer) { fbo["name"].asString(), fbo["scale"].asFloat() });
+ fbos.emplace_back((EffectBuffer) { fbo["name"], fbo["scale"] });
}
}
void Effect::load(Engine *engine, Object *object, bool last_effect)
{
- buffer_id = fmt::format("{}_{}", id, object->id);
+ buffer_id = fmt::format("{}_{}", id.value, object->id.value);
for (auto &fbo : fbos)
{
- engine->create_framebuffer(fbo.name + buffer_id, object->size[0], object->size[1], fbo.scale);
+ engine->create_framebuffer(fbo.name + buffer_id, object->size.value[0],
+ object->size.value[1], fbo.scale);
}
for (u32 i = 0; i < passes0.size(); i++)
@@ -74,7 +75,7 @@ void Effect::load(Engine *engine, Object *object, bool last_effect)
void Effect::draw(Engine *engine)
{
- if (!visible)
+ if (!visible.value)
return;
for (auto &pass : passes)
diff --git a/src/objects/effect.h b/src/objects/effect.h
index 010634c..29b4bb7 100644
--- a/src/objects/effect.h
+++ b/src/objects/effect.h
@@ -20,11 +20,11 @@ struct EffectBuffer
class Effect
{
public:
- Effect(Json::Value root);
+ Effect(json root);
~Effect();
- u32 id;
- std::string name;
+ JsonValue<u32> id;
+ JsonValue<std::string> name;
std::string buffer_id;
@@ -32,7 +32,7 @@ class Effect
void draw(Engine *engine);
private:
- bool visible;
+ JsonValue<bool> visible;
std::vector<Pass *> passes0;
std::vector<Pass *> passes1;
diff --git a/src/objects/material.cc b/src/objects/material.cc
index a1c2146..699c603 100644
--- a/src/objects/material.cc
+++ b/src/objects/material.cc
@@ -21,7 +21,7 @@ Material::Material(std::string path)
return;
}
- Json::Value root = asset->as_json();
+ auto root = json::parse(asset->as_string());
for (auto &pass : root["passes"])
{
diff --git a/src/objects/material.h b/src/objects/material.h
index 24c2ea0..c27c720 100644
--- a/src/objects/material.h
+++ b/src/objects/material.h
@@ -3,6 +3,7 @@
#include <iostream>
+#include "json.h"
#include "engine.h"
namespace Mauri
diff --git a/src/objects/model.cc b/src/objects/model.cc
index c45ac12..0574a92 100644
--- a/src/objects/model.cc
+++ b/src/objects/model.cc
@@ -19,13 +19,13 @@ Model::Model(std::string path)
return;
}
- Json::Value root = asset->as_json();
+ auto root = json::parse(asset->as_string());
- autosize = root.get("autosize", true).asBool();
- fullscreen = root.get("fullscreen", false).asBool();
- passthrough = root.get("passthrough", false).asBool();
+ autosize = get_value<bool>(root["autosize"], BOOL);
+ fullscreen = get_value<bool>(root["fullscreen"], BOOL);
+ passthrough = get_value<bool>(root["passthrough"], BOOL);
- material = new Material(root["material"].asString());
+ material = new Material(root["material"]);
}
void Model::load(Engine *engine, Object *object, bool no_effects)
diff --git a/src/objects/model.h b/src/objects/model.h
index bc6ea93..9e67f07 100644
--- a/src/objects/model.h
+++ b/src/objects/model.h
@@ -4,6 +4,7 @@
#include <iostream>
#include "engine.h"
+#include "json.h"
#include "objects/material.h"
@@ -16,9 +17,9 @@ class Model
Model(std::string path);
~Model();
- bool autosize;
- bool fullscreen;
- bool passthrough;
+ JsonValue<bool> autosize;
+ JsonValue<bool> fullscreen;
+ JsonValue<bool> passthrough;
void load(Engine *engine, Object *object, bool no_effects);
diff --git a/src/objects/object.cc b/src/objects/object.cc
index 0a57adf..a41cfaa 100644
--- a/src/objects/object.cc
+++ b/src/objects/object.cc
@@ -13,39 +13,37 @@
#include "../log.h"
#include "objects/effect.h"
+#include "objects/model.h"
#include "objects/object.h"
#include "objects/scene.h"
#include "objects/pass.h"
using namespace Mauri;
-Object::Object(Json::Value root)
+Object::Object(json root)
{
- id = root["id"].asInt();
- name = root["name"].asString();
+ id = get_value<u32>(root["id"], INT);
+ name = get_value<std::string>(root["id"], STRING);
for (auto &id : root["dependencies"])
- deps.push_back(id.asInt());
+ deps.push_back(id);
- sscanf_vec3(json_user_value(root.get("angles", "")).asCString(), angles);
- sscanf_vec3(json_user_value(root.get("colors", "")).asCString(), color);
- sscanf_vec2(json_user_value(root.get("size", "0 0")).asCString(), size);
- sscanf_vec3(json_user_value(root.get("scale", "")).asCString(), scale);
- sscanf_vec3(json_user_value(root.get("origin", "")).asCString(), origin);
+ angles = get_value<vec3>(root["angles"], VEC3);
+ color = get_value<vec3>(root["colors"], VEC3);
+ size = get_value<vec2>(root["size"], VEC2);
+ scale = get_value<vec3>(root["size"], VEC3);
+ origin = get_value<vec3>(root["origin"], VEC3);
- color_blend_mode = (BlendMode)root.get("colorblendmode", 0).asInt();
+ color_blend_mode = (BlendMode)root["colorblendmode"];
- visible = json_user_value(root.get("visible", true)).asBool();
+ visible = get_value<bool>(root["visible"], BOOL);
- auto _image = root["image"];
-
- if (!_image.isNull())
- image = new Model(_image.asString());
+ image = new Model(root["image"]);
auto config = root["config"];
- if (!config.isNull())
- passthrough = config.get("passthrough", false).asBool();
+ if (!config.is_null())
+ passthrough = get_value<bool>(config["passthrough"], BOOL);
for (auto &effect : root["effects"])
{
@@ -59,13 +57,13 @@ void Object::get_model(f32 width, f32 height, bool flip)
model = glm::translate(model, (vec3){-width, -height, 0.f});
- model = glm::translate(model, origin * 2.f);
+ model = glm::translate(model, origin.value * 2.f);
- model = glm::scale(model, scale);
+ model = glm::scale(model, scale.value);
- model = glm::rotate(model, angles[0], (vec3){1.f, 0.f, 0.f});
- model = glm::rotate(model, angles[1], (vec3){0.f, 1.f, 0.f});
- model = glm::rotate(model, angles[2], (vec3){0.f, 0.f, 1.f});
+ model = glm::rotate(model, angles.value[0], (vec3){1.f, 0.f, 0.f});
+ model = glm::rotate(model, angles.value[1], (vec3){0.f, 1.f, 0.f});
+ model = glm::rotate(model, angles.value[2], (vec3){0.f, 0.f, 1.f});
mat4x4 _ortho = glm::ortho(-width, width, height, -height, 0.f, 1.f);
@@ -84,27 +82,27 @@ void Object::load(Engine *engine)
if (image != nullptr)
{
- if (image->passthrough)
+ if (image->passthrough.value)
passthrough = true;
- if (image->fullscreen || passthrough)
+ if (image->fullscreen.value || passthrough.value)
{
- if (size[0] == 0 && size[1] == 0)
+ if (size.value[0] == 0 && size.value[1] == 0)
{
- size[0] = engine->view.width;
- size[1] = engine->view.height;
- origin[0] = size[0] / 2.f;
- origin[1] = size[1] / 2.f;
+ size.value[0] = engine->view.width;
+ size.value[1] = engine->view.height;
+ origin.value[0] = size.value[0] / 2.f;
+ origin.value[1] = size.value[1] / 2.f;
}
fullscreen = true;
}
}
- auto width = size[0];
- auto height = size[1];
+ auto width = size.value[0];
+ auto height = size.value[1];
- abuffer = fmt::format("_rt_imageLayerComposite_{}_a", this->id);
- bbuffer = fmt::format("_rt_imageLayerComposite_{}_b", this->id);
+ abuffer = fmt::format("_rt_imageLayerComposite_{}_a", this->id.value);
+ bbuffer = fmt::format("_rt_imageLayerComposite_{}_b", this->id.value);
engine->create_framebuffer(abuffer, width, height, 1.f);
engine->create_framebuffer(bbuffer, width, height, 1.f);
@@ -116,8 +114,7 @@ void Object::load(Engine *engine)
gl_object = new RenderObject(OBJECT, width, height);
gl_uv_object = new RenderObject(UV_SCALE, width, height);
- if (image != nullptr)
- image->load(engine, this, effects.size() == 0);
+ image->load(engine, this, effects.size() == 0);
for (u32 i = 0; i < effects.size(); i++)
{
@@ -136,7 +133,7 @@ void Object::update(Engine *engine)
void Object::draw(Engine *engine)
{
- if (!visible)
+ if (!visible.value)
return;
for (auto &pass : passes)
diff --git a/src/objects/object.h b/src/objects/object.h
index 0b22122..14b6615 100644
--- a/src/objects/object.h
+++ b/src/objects/object.h
@@ -28,18 +28,18 @@ enum BlendMode
class Object
{
public:
- Object(Json::Value root);
+ Object(json root);
~Object();
- u32 id;
- std::string name;
+ JsonValue<u32> id;
+ JsonValue<std::string> name;
std::vector<int> deps;
- bool passthrough = false;
- bool fullscreen = false;
+ JsonValue<bool> passthrough;
+ JsonValue<bool> fullscreen;
- vec2 size;
+ JsonValue<vec2> size;
void get_model(f32 width, f32 height, bool flip);
@@ -66,15 +66,15 @@ class Object
void draw(Engine *engine);
private:
- bool visible;
+ JsonValue<bool> visible;
Model *image = nullptr;
- vec3 angles;
- vec3 color;
+ JsonValue<vec3> angles;
+ JsonValue<vec3> color;
- vec3 origin;
- vec3 scale;
+ JsonValue<vec3> origin;
+ JsonValue<vec3> scale;
std::string abuffer;
std::string bbuffer;
diff --git a/src/objects/pass.cc b/src/objects/pass.cc
index f4c237a..333694a 100644
--- a/src/objects/pass.cc
+++ b/src/objects/pass.cc
@@ -20,39 +20,32 @@
using namespace Mauri;
-Pass::Pass(Json::Value root, PassStage stage)
+Pass::Pass(json root, PassStage stage)
{
switch (stage)
{
case EFFECT0_PASS: {
- auto _uniforms = root["constantshadervalues"];
-
- for (auto &name : _uniforms.getMemberNames())
+ for (auto &value : root["constantshadervalues"].items())
{
- auto uniform = Uniform();
-
- uniform.name = name;
-
- auto value = json_user_value(_uniforms[name]);
- json_number(value, glm::value_ptr(uniform.value));
-
- uniforms.push_back(uniform);
+ // In this case type and uname are irrelevant because this is only used to
+ // override the value stored on the shader which contains the type and uname.
+ uniforms.push_back(Uniform(value.key(), get_value<vec4>(value.value(), VEC4)));
}
break;
}
case EFFECT1_PASS: {
- auto _material = root["material"];
+ material = new Material(root["material"]);
- if (_material.isString())
- material = new Material(_material.asString());
+ auto _target = root["target"];
- target = root.get("target", "previous").asString();
+ if (_target.is_string())
+ target = _target;
for (auto &bind : root["bind"])
{
- auto index = bind["index"].asInt();
- binds[index] = bind["name"].asString();
+ u32 index = bind["index"];
+ binds[index] = bind["name"];
}
break;
@@ -61,7 +54,7 @@ Pass::Pass(Json::Value root, PassStage stage)
target = "previous";
[[fallthrough]];
case MATERIAL_PASS: {
- shader = root["shader"].asString();
+ shader = root["shader"];
//auto blending = root.get("blending", "normal").asString();
@@ -73,21 +66,26 @@ Pass::Pass(Json::Value root, PassStage stage)
break;
}
}
-
- auto _textures = root["textures"];
- for (int i = 0; i < _textures.size(); i++)
+ for (int i = 0; i < 8; i++)
{
- auto texture = _textures[i];
- if (texture.isString())
- textures[i] = texture.asString();
+ auto texture = root["textures"][i];
+ if (texture.is_string())
+ textures[i] = texture;
}
- auto _combos = root["combos"];
+ //auto _textures = root["textures"];
+
+ //for (int i = 0; i < _textures.size(); i++)
+ //{
+ // auto texture = _textures[i];
+ // if (texture.is_string())
+ // textures[i] = texture;
+ //}
- for (auto &name : _combos.getMemberNames())
+ for (auto &combo : root["combos"].items())
{
- combos.emplace_back((Combo){name, _combos[name].asInt()});
+ combos.emplace_back((Combo) { combo.key(), combo.value() });
}
}
@@ -249,12 +247,12 @@ RenderPass::RenderPass(Engine *engine, Pass *pass)
if (pass->effect == nullptr)
{
- if (pass->object->passthrough || combine)
+ if (pass->object->passthrough.value || combine)
model = &pass->object->model;
else
model = &pass->object->ortho;
- if (pass->object->passthrough)
+ if (pass->object->passthrough.value)
robject = pass->object->gl_object;
else
robject = pass->object->gl_uv_object;
diff --git a/src/objects/pass.h b/src/objects/pass.h
index 92aa3e5..78de015 100644
--- a/src/objects/pass.h
+++ b/src/objects/pass.h
@@ -4,6 +4,7 @@
#include <glm/glm.hpp>
#include <jsoncpp/json/json.h>
+#include "json.h"
#include "context.h"
#include "engine.h"
#include "gl.h"
@@ -29,7 +30,7 @@ class Pass
{
public:
Pass() {}
- Pass(Json::Value root, PassStage stage);
+ Pass(json root, PassStage stage);
~Pass();
diff --git a/src/objects/scene.cc b/src/objects/scene.cc
index 3cab05c..1e95f4b 100644
--- a/src/objects/scene.cc
+++ b/src/objects/scene.cc
@@ -1,10 +1,10 @@
#include <istream>
-#include <jsoncpp/json/json.h>
#include <sstream>
#include "assets.h"
#include "json.h"
#include "log.h"
+#include "util.h"
#include "objects/scene.h"
#include "objects/pass.h"
@@ -20,24 +20,26 @@ Scene::Scene(std::string path)
log_error("err: failed to open scene.json");
return;
}
-
- Json::Value root = asset->as_json();
+
+ auto root = json::parse(asset->as_string());
auto camera = root["camera"];
+
+ cam.center = get_value<vec3>(camera["center"], VEC3);
+ cam.eye = get_value<vec3>(camera["eye"], VEC3);
+ cam.up = get_value<vec3>(camera["up"], VEC3);
+
auto general = root["general"];
- auto ortho = general["orthogonalprojection"];
-
- sscanf_vec3(json_user_value(camera.get("center", "")).asCString(), cam.center);
- sscanf_vec3(json_user_value(camera.get("eye", "")).asCString(), cam.eye);
- sscanf_vec3(json_user_value(camera.get("up", "")).asCString(), cam.up);
- clear_enabled = general.get("clearenabled", true).asBool();
+ clear_enabled = get_value<bool>(general["clearenabled"], BOOL);
- sscanf_vec3(json_user_value(general.get("clearcolor", "")).asCString(), clear_color);
- clear_color[3] = 1.f;
+ clear_color = get_value<vec4>(general["clearcolor"], VEC3);
+ clear_color.value[3] = 1.f;
+
+ auto ortho = general["orthogonalprojection"];
- width = json_user_value(ortho.get("width", 0.f)).asFloat();
- height = json_user_value(ortho.get("height", 0.f)).asFloat();
+ width = get_value<float>(ortho["width"], FLOAT);
+ height = get_value<float>(ortho["height"], FLOAT);
for (auto &object : root["objects"])
{
@@ -49,7 +51,7 @@ Object *Scene::get_object_by_id(u32 id)
{
for (auto &object : objects)
{
- if (object->id == id)
+ if (object->id.value == id)
{
return object;
}
@@ -60,8 +62,8 @@ Object *Scene::get_object_by_id(u32 id)
void Scene::load(Engine *engine)
{
- engine->view.width = width;
- engine->view.height = height;
+ engine->view.width = width.value;
+ engine->view.height = height.value;
for (auto &object : objects)
{
diff --git a/src/objects/scene.h b/src/objects/scene.h
index 2f6f210..43a4442 100644
--- a/src/objects/scene.h
+++ b/src/objects/scene.h
@@ -8,6 +8,7 @@
#include "assets.h"
#include "engine.h"
+#include "json.h"
#include "objects/object.h"
using namespace glm;
@@ -16,13 +17,13 @@ namespace Mauri
{
struct Camera {
- vec3 center;
- vec3 eye;
- vec3 up;
+ JsonValue<vec3> center;
+ JsonValue<vec3> eye;
+ JsonValue<vec3> up;
- float farz;
- float nearz;
- float fov;
+ JsonValue<float> farz;
+ JsonValue<float> nearz;
+ JsonValue<float> fov;
};
class Scene
@@ -31,11 +32,11 @@ class Scene
Scene(std::string path);
~Scene();
- f32 width;
- f32 height;
+ JsonValue<f32> width;
+ JsonValue<f32> height;
- bool clear_enabled;
- vec4 clear_color;
+ JsonValue<bool> clear_enabled;
+ JsonValue<vec4> clear_color;
void load(Engine *engine);
void draw(Engine *engine);