Brenta Engine 1.2
Loading...
Searching...
No Matches
material.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/renderer/material.hpp>
7#include <brenta/renderer/opengl/texture.hpp>
8
9using namespace brenta;
10
11Material::Material(Shader&& s)
12{
13 this->shader = tenno::make_shared<Shader>(tenno::move(s));
14}
15
16void Material::apply()
17{
18 this->shader->use();
19
20 for (auto const& [name, val] : this->ints)
21 shader->set_int(name.c_str(), val);
22 for (auto const& [name, val] : this->floats)
23 shader->set_float(name.c_str(), val);
24 for (auto const& [name, val] : this->vectors)
25 shader->set_vec3(name.c_str(), val);
26
27 for (auto const& [name, index_tex] : this->textures)
28 {
29 auto tex = std::get<1>(index_tex);
30 tex->active_texture(std::get<0>(index_tex));
31 tex->bind();
32 shader->set_int(name.c_str(), std::get<0>(index_tex));
33 }
34 return;
35}
36
37Material &Material::set_int(const std::string &name, int val)
38{
39 this->ints[name] = val;
40 return *this;
41}
42
43Material &Material::set_float(const std::string &name, float val)
44{
45 this->floats[name] = val;
46 return *this;
47}
48
49Material &Material::set_vector(const std::string &name, glm::vec3 val)
50{
51 this->vectors[name] = val;
52 return *this;
53}
54
55Material &Material::set_texture(const std::string &name,
56 tenno::shared_ptr<Texture> val,
57 int index)
58{
59 this->textures[name] = std::make_pair(index, val);
60 return *this;
61}
62
64Material::Builder::shader(tenno::shared_ptr<Shader> shader)
65{
66 this->_shader = shader;
67 return *this;
68}
69
71Material::Builder::integer(const std::string &name, int val)
72{
73 this->ints.push_back(std::make_tuple(name, val));
74 return *this;
75}
76
78Material::Builder::floating(const std::string &name, float val)
79{
80 this->floats.push_back(std::make_tuple(name, val));
81 return *this;
82}
83
85Material::Builder::vector(const std::string &name, glm::vec3 val)
86{
87 this->vectors.push_back(std::make_tuple(name, val));
88 return *this;
89}
90
92Material::Builder::texture(const std::string &name,
93 tenno::shared_ptr<Texture> val, int index)
94{
95 this->textures.push_back(std::make_tuple(name,
96 std::make_tuple(index, val)));
97 return *this;
98}
99
100Material Material::Builder::build()
101{
102 Material material = Material(this->_shader);
103
104 for (auto& f : this->ints)
105 {
106 material.set_int(std::get<0>(f), std::get<1>(f));
107 }
108 for (auto& f : this->floats)
109 {
110 material.set_float(std::get<0>(f), std::get<1>(f));
111 }
112 for (auto& v : this->vectors)
113 {
114 material.set_vector(std::get<0>(v), std::get<1>(v));
115 }
116 for (auto& t : this->textures)
117 {
118 material.set_texture(std::get<0>(t),
119 std::get<1>(std::get<1>(t)),
120 std::get<0>(std::get<1>(t)));
121 }
122
123 return material; // copy elision
124}