summaryrefslogtreecommitdiff
path: root/src/objects/pass.h
blob: 6d91a03d25e4b606fb0fd1189aa6ce52a8948672 (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifndef _PASS_H
#define _PASS_H

#include "object.h"

#define MAX_TEXTURES 8

namespace Mauri
{

enum PassStage
{
    EFFECT0_PASS = 0,
    EFFECT1_PASS,
    MATERIAL_PASS,
    MATERIAL_ONLY_PASS
};

enum PassCommand
{
    DRAW = 0,
    COPY
};

enum TextureType
{
    STATIC = 0,
    PREVIOUS
};

struct UniformOverride
{
    vec4 value;
    std::string name;
};

class Pass
{
  public:
    Pass() = default;
    ~Pass();

    bool intermediate;

    PassCommand command = DRAW;

    std::string target;
    std::string source;

    Object *object;
    Effect *effect;

    bool depthtest;
    bool depthwrite;

    std::string shader;

    std::array<std::string, MAX_TEXTURES> binds = {};
    std::array<std::string, MAX_TEXTURES> textures = {};

    bool model;
    bool combine;

    std::vector<UniformOverride *> uniforms;
    std::vector<Combo> combos;

    static auto parse(Parser &pr, const json &root, PassStage stage) -> Pass *;

    auto load(Engine *engine, PassStage stage, Pass *pass) -> void;

  private:
    Material *material = nullptr;
};

class RenderPass
{
  public:
    RenderPass(Engine *engine, Pass *pass);
    ~RenderPass();

    bool model;
    bool combine;
    bool depth;

    Shader *shader = nullptr;

    mat4x4 *mat;
    RenderObject *render_object;

    std::array<Texture *, MAX_TEXTURES> textures = {};
    std::array<TextureType, MAX_TEXTURES> texture_types = {};

    auto draw(Engine *engine) -> void;

  private:
    PassCommand command;

    Object *object;

    Framebuffer *target;
    Framebuffer *source;

    RenderShader *render_shader;
};

} // namespace Mauri

#endif // _PASS_H