1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
//============================================================
//
// chainreader.cpp - BGFX chain JSON reader
//
//============================================================
#include <string>
#include <vector>
#include "emu.h"
#include "chain.h"
#include "sliderreader.h"
#include "paramreader.h"
#include "chainentryreader.h"
#include "targetmanager.h"
#include "chainreader.h"
bgfx_chain* chain_reader::read_from_value(const Value& value, texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t screen_width, uint32_t screen_height)
{
validate_parameters(value);
std::string name = value["name"].GetString();
std::string author = value["author"].GetString();
std::vector<bgfx_slider*> sliders;
if (value.HasMember("sliders"))
{
const Value& slider_array = value["sliders"];
for (UINT32 i = 0; i < slider_array.Size(); i++)
{
sliders.push_back(slider_reader::read_from_value(slider_array[i]));
}
}
std::vector<bgfx_parameter*> parameters;
if (value.HasMember("parameters"))
{
const Value& param_array = value["parameters"];
for (UINT32 i = 0; i < param_array.Size(); i++)
{
parameters.push_back(parameter_reader::read_from_value(param_array[i]));
}
}
std::vector<bgfx_chain_entry*> entries;
if (value.HasMember("passes"))
{
const Value& entry_array = value["passes"];
for (UINT32 i = 0; i < entry_array.Size(); i++)
{
entries.push_back(chain_entry_reader::read_from_value(entry_array[i], textures, targets, effects));
}
}
if (value.HasMember("targets"))
{
const Value& target_array = value["targets"];
for (UINT32 i = 0; i < target_array.Size(); i++)
{
assert(target_array[i].HasMember("name"));
assert(target_array[i]["name"].IsString());
uint32_t width = 0;
uint32_t height = 0;
if (target_array[i].HasMember("screen") && target_array[i]["screen"].IsBool())
{
width = screen_width;
height = screen_height;
}
else
{
assert(target_array[i].HasMember("width"));
assert(target_array[i]["width"].IsDouble());
assert(target_array[i].HasMember("height"));
assert(target_array[i]["height"].IsDouble());
width = uint32_t(target_array[i]["width"].GetDouble());
height = uint32_t(target_array[i]["height"].GetDouble());
}
targets.create_target(target_array[i]["name"].GetString(), bgfx::TextureFormat::RGBA8, width, height);
}
}
return new bgfx_chain(name, author, sliders, parameters, entries);
}
void chain_reader::validate_parameters(const Value& value)
{
assert(value.HasMember("name"));
assert(value["name"].IsString());
assert(value.HasMember("author"));
assert(value["author"].IsString());
assert(value.HasMember("passes"));
}
|