Monad Engine da02fba2
> Undercity Codex_
Loading...
Searching...
No Matches
Material.cpp
Go to the documentation of this file.
1#include "render/Material.h"
2#include "graphics/ShaderProgram.h"
3#include "graphics/Texture.h"
4#include "Engine.h"
5
6#include <nlohmann/json.hpp>
7
8namespace eng
9{
10 void Material::SetShaderProgram(const std::shared_ptr<ShaderProgram>& shaderProgram)
11 {
12 m_shaderProgram = shaderProgram;
13 }
14
16 {
17 return m_shaderProgram.get();
18 }
19
20 void Material::SetParam(const std::string& name, float value)
21 {
22 m_floatParams[name] = value;
23 }
24
25 void Material::SetParam(const std::string& name, float v0, float v1)
26 {
27 m_float2Params[name] = { v0, v1 };
28 }
29
30 void Material::SetParam(const std::string& name, const glm::vec3& value)
31 {
32 m_float3Params[name] = value;
33 }
34
35 void Material::SetParam(const std::string& name, const std::shared_ptr<Texture>& texture)
36 {
37 m_textures[name] = texture;
38 }
39
41 {
42 if (!m_shaderProgram)
43 {
44 return;
45 }
46
47 m_shaderProgram->Bind();
48
49 for (auto& param : m_floatParams)
50 {
51 m_shaderProgram->SetUniform(param.first, param.second);
52 }
53
54 for (auto& param : m_float2Params)
55 {
56 m_shaderProgram->SetUniform(param.first, param.second.first, param.second.second);
57 }
58
59 for (auto& param : m_float3Params)
60 {
61 m_shaderProgram->SetUniform(param.first, param.second);
62 }
63
64 for (auto& param : m_textures)
65 {
66 m_shaderProgram->SetTexture(param.first, param.second.get());
67 }
68 }
69
70 std::shared_ptr<Material> Material::Load(const std::string& path)
71 {
72 auto contents = Engine::GetInstance().GetFileSystem().LoadAssetFileText(path);
73
74 if (contents.empty())
75 {
76 return nullptr;
77 }
78
79 nlohmann::json json = nlohmann::json::parse(contents);
80 std::shared_ptr<Material> result;
81
82 if (json.contains("shader"))
83 {
84 auto shaderObj = json["shader"];
85 std::string vertexPath = shaderObj.value("vertex", "");
86 std::string fragmentPath = shaderObj.value("fragment", "");
87
89 auto vertexSrc = fs.LoadAssetFileText(vertexPath);
90 auto fragmentSrc = fs.LoadAssetFileText(fragmentPath);
91
92 auto& graphicsAPI = Engine::GetInstance().GetGraphicsAPI();
93 auto shaderProgram = graphicsAPI.CreateShaderProgram(vertexSrc, fragmentSrc);
94 if (!shaderProgram)
95 {
96 return nullptr;
97 }
98
99 result = std::make_shared<Material>();
100 result->SetShaderProgram(shaderProgram);
101 }
102
103 if (json.contains("params"))
104 {
105 auto paramsObj = json["params"];
106
107 // Floats
108 if (paramsObj.contains("float"))
109 {
110 for (auto& p : paramsObj["float"])
111 {
112 std::string name = p.value("name", "");
113 float value = p.value("value", 0.0f);
114 result->SetParam(name, value);
115 }
116 }
117
118 // Float2
119 if (paramsObj.contains("float2"))
120 {
121 for (auto& p : paramsObj["float2"])
122 {
123 std::string name = p.value("name", "");
124 float v0 = p.value("value0", 0.0f);
125 float v1 = p.value("value1", 0.0f);
126 result->SetParam(name, v0, v1);
127 }
128 }
129
130 // Float3
131 if (paramsObj.contains("float3"))
132 {
133 for (auto& p : paramsObj["float3"])
134 {
135 std::string name = p.value("name", "");
136 float v0 = p.value("value0", 0.0f);
137 float v1 = p.value("value1", 0.0f);
138 float v2 = p.value("value2", 0.0f);
139 result->SetParam(name, glm::vec3(v0, v1, v2));
140 }
141 }
142
143 // Textures
144 if (paramsObj.contains("textures"))
145 {
146 for (auto& p : paramsObj["textures"])
147 {
148 std::string name = p.value("name", "");
149 std::string texPath = p.value("path", "");
150 auto texture = Texture::Load(texPath);
151
152 result->SetParam(name, texture);
153 }
154 }
155 }
156
157 return result;
158 }
159}
GraphicsAPI & GetGraphicsAPI()
Definition Engine.cpp:195
FileSystem & GetFileSystem()
Definition Engine.cpp:205
static Engine & GetInstance()
Definition Engine.cpp:50
std::string LoadAssetFileText(const std::string &relativePath)
std::shared_ptr< ShaderProgram > CreateShaderProgram(const std::string &vertexSource, const std::string &fragmentSource)
static std::shared_ptr< Material > Load(const std::string &path)
Definition Material.cpp:70
void SetParam(const std::string &name, float value)
Definition Material.cpp:20
void SetShaderProgram(const std::shared_ptr< ShaderProgram > &shaderProgram)
Definition Material.cpp:10
ShaderProgram * GetShaderProgram()
Definition Material.cpp:15
static std::shared_ptr< Texture > Load(const std::string &path)
Definition Texture.cpp:53