summaryrefslogtreecommitdiff
path: root/src/objects/material.cc
blob: 8b582ff59fd1b21edde8c56d37c6b76f07d829e7 (plain)
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;
    }
}