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
|
#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;
}
}
|