#include "material.h" #include "pass.h" using namespace Mauri; auto Material::parse(Parser &pr, const std::string &path) -> Material * { Material *material = new Material(); Asset *asset = asset_manager()->get(path); if (asset->type == ASSET_VOID) parse_fail(material); const json &root = json::parse(asset->as_string(), nullptr, false); if (root.is_discarded()) parse_fail(material); if (root.contains("passes")) { for (const json &pass0 : root["passes"]) { Pass *pass = Pass::parse(pr, pass0, MATERIAL_PASS); if (pass) material->passes0.push_back(pass); } } return material; } auto Material::load(Engine *engine, Object *object, MaterialType type, Pass *pass) -> void { for (Pass *pass0 : this->passes0) { switch (type) { case MATERIAL_MODEL: { Pass model_pass; model_pass.intermediate = false; model_pass.object = object; model_pass.effect = nullptr; model_pass.model = true; model_pass.combine = object->visible && object->effects.size() == 0 && !object->passthrough; if (model_pass.combine) { model_pass.combos.push_back(Combo("BLENDMODE", object->color_blend_mode)); } pass0->load(engine, MATERIAL_ONLY_PASS, &model_pass); object->passes.push_back(new RenderPass(engine, &model_pass)); break; } case MATERIAL_EFFECT: { pass0->load(engine, MATERIAL_PASS, pass); break; } } } } Material::~Material() { for (Pass *pass0 : this->passes0) { delete pass0; } }