diff options
Diffstat (limited to 'src/osd/modules/render/bgfx/effectreader.cpp')
-rw-r--r-- | src/osd/modules/render/bgfx/effectreader.cpp | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/src/osd/modules/render/bgfx/effectreader.cpp b/src/osd/modules/render/bgfx/effectreader.cpp index 63a6a925a64..b787dec12a3 100644 --- a/src/osd/modules/render/bgfx/effectreader.cpp +++ b/src/osd/modules/render/bgfx/effectreader.cpp @@ -22,12 +22,19 @@ #include "effectreader.h" -bgfx_effect* effect_reader::read_from_value(shader_manager& shaders, const Value& value) +bgfx_effect* effect_reader::read_from_value(const Value& value, std::string prefix, shader_manager& shaders) { - validate_parameters(value); + if (!validate_parameters(value, prefix)) + { + return nullptr; + } - uint64_t blend = blend_reader::read_from_value(value["blend"]); - uint64_t depth = depth_reader::read_from_value(value["depth"]); + uint64_t blend = 0; + if (value.HasMember("blend")) + { + blend = blend_reader::read_from_value(value["blend"]); + } + uint64_t depth = depth_reader::read_from_value(value["depth"], prefix + "depth: "); uint64_t cull = cull_reader::read_from_value(value["cull"]); uint64_t write = write_reader::read_from_value(value["write"]); @@ -35,7 +42,12 @@ bgfx_effect* effect_reader::read_from_value(shader_manager& shaders, const Value const Value& uniform_array = value["uniforms"]; for (UINT32 i = 0; i < uniform_array.Size(); i++) { - uniforms.push_back(uniform_reader::read_from_value(uniform_array[i])); + bgfx_uniform* uniform = uniform_reader::read_from_value(uniform_array[i], prefix + "uniforms[" + std::to_string(i) + "]: "); + if (uniform == nullptr) + { + return nullptr; + } + uniforms.push_back(uniform); } std::string vertex_name(value["vertex"].GetString()); @@ -55,23 +67,17 @@ bgfx_effect* effect_reader::read_from_value(shader_manager& shaders, const Value return new bgfx_effect(blend | depth | cull | write, vertex_shader, fragment_shader, uniforms); } -void effect_reader::validate_parameters(const Value& value) +bool effect_reader::validate_parameters(const Value& value, std::string prefix) { - assert(value.HasMember("blend")); - assert(value.HasMember("depth")); - assert(value.HasMember("cull")); - assert(value.HasMember("write")); - assert(value.HasMember("vertex")); - assert(value["vertex"].IsString()); - assert(value.HasMember("fragment") || value.HasMember("pixel")); - if (value.HasMember("fragment")) - { - assert(value["fragment"].IsString()); - } - if (value.HasMember("pixel")) - { - assert(value["pixel"].IsString()); - } - assert(value.HasMember("uniforms")); - assert(value["uniforms"].IsArray()); + if (!READER_CHECK(value.HasMember("depth"), (prefix + "Must have object value 'depth' (what are our Z-buffer settings?)\n").c_str())) return false; + if (!READER_CHECK(value.HasMember("cull"), (prefix + "Must have object value 'cull' (do we cull triangles based on winding?)\n").c_str())) return false; + if (!READER_CHECK(value.HasMember("write"), (prefix + "Must have object value 'write' (what are our color buffer write settings?)\n").c_str())) return false; + if (!READER_CHECK(value.HasMember("vertex"), (prefix + "Must have string value 'vertex' (what is our vertex shader?)\n").c_str())) return false; + if (!READER_CHECK(value["vertex"].IsString(), (prefix + "Value 'vertex' must be a string\n").c_str())) return false; + if (!READER_CHECK(value.HasMember("fragment") || value.HasMember("pixel"), (prefix + "Must have string value named 'fragment' or 'pixel' (what is our fragment/pixel shader?)\n").c_str())) return false; + if (!READER_CHECK(!value.HasMember("fragment") || value["fragment"].IsString(), (prefix + "Value 'fragment' must be a string\n").c_str())) return false; + if (!READER_CHECK(!value.HasMember("pixel") || value["pixel"].IsString(), (prefix + "Value 'pixel' must be a string\n").c_str())) return false; + if (!READER_CHECK(value.HasMember("uniforms"), (prefix + "Must have array value 'uniforms' (what are our shader's parameters?)\n").c_str())) return false; + if (!READER_CHECK(value["uniforms"].IsArray(), (prefix + "Value 'uniforms' must be an array\n").c_str())) return false; + return true; } |