Rendering Engine 0.2.9
Modular Graphics Rendering Engine | v0.2.9
material.cpp
Go to the documentation of this file.
1#include "material.hpp"
2#include "i_renderer.hpp"
4
5#include <cstring>
6
7namespace rendering_engine
8{
9
11 :
12 mRenderer(renderer),
13 mMaterialSettings(matSettings),
14 mGpuHandle(nullptr),
15 mParameterLayout(matSettings.parameterLayout)
16{}
18{
19 if (mGpuHandle)
21}
23{
24 return mMaterialSettings;
25}
27{
28 mGpuHandle = std::unique_ptr<IMaterialRenderResources>(mRenderer->ProvideMaterialRenderResources());
29 mGpuHandle->Initialize(this);
30}
32{
33 if (!mGpuHandle)
34 return;
35
36 mGpuHandle->Shutdown();
37 mGpuHandle.reset();
38}
40{
41 PackedMaterialData result;
42
43 if (!mParameterLayout)
44 return result;
45
46 // Preallocate full buffer size
47 size_t totalSize = 0;
48 for (const auto& e : *mParameterLayout)
49 totalSize = std::max(totalSize, e.offset + e.size);
50
51 result.buffer.resize(totalSize);
52 result.layout = *mParameterLayout;
53
54 for (const auto& entry : *mParameterLayout)
55 {
56 uint8_t* dst = result.buffer.data() + entry.offset;
57
58 switch (entry.type)
59 {
61 std::memcpy(dst, &mFloatParameters[entry.name], 4);
62 break;
63
65 std::memcpy(dst, &mVec2Parameters[entry.name], 8);
66 break;
67
69 std::memcpy(dst, &mVec3Parameters[entry.name], 12);
70 std::memset(dst + 12, 0, 4); // std140 padding
71 break;
72
74 std::memcpy(dst, &mVec4Parameters[entry.name], 16);
75 break;
76 }
77 }
78
79 return result;
80}
81
82std::vector<std::string> Material::GetTextures() const
83{
84 return mTextures;
85}
86
88{
89 return mGpuHandle.get();
90}
91
92void Material::SetFloat(const std::string& name, float value)
93{
94 mFloatParameters[name] = value;
95}
96
97void Material::SetVec2(const std::string& name, glm::vec2 value)
98{
99 mVec2Parameters[name] = value;
100}
101
102void Material::SetVec3(const std::string& name, glm::vec3 value)
103{
104 mVec3Parameters[name] = value;
105}
106
107void Material::SetVec4(const std::string& name, glm::vec4 value)
108{
109 mVec4Parameters[name] = value;
110}
111
112void Material::AddTexture(const std::string& textureName)
113{
114 mTextures.push_back(textureName);
115}
116
117size_t Material::std140_align(MaterialParameterLayoutEntry::Type type)
118{
119 switch (type)
120 {
125 }
126 return 4;
127}
128
129size_t Material::std140_size(MaterialParameterLayoutEntry::Type type)
130{
131 switch (type)
132 {
137 }
138 return 4;
139}
140
141} // namespace rendering_engine
Interface for backend-specific material GPU resources.
Defines an abstract interface for rendering backends.
Definition: i_renderer.hpp:29
virtual IMaterialRenderResources * ProvideMaterialRenderResources() const =0
Provides access to material-related GPU resources.
void ReleaseRenderResources()
Releases any GPU resources associated with this material.
Definition: material.cpp:31
void InitializeRenderResources()
Initializes backend-specific GPU resources associated with this material.
Definition: material.cpp:26
void SetVec3(const std::string &name, glm::vec3 value)
Sets a vec3 parameter for the material.
Definition: material.cpp:102
void SetVec2(const std::string &name, glm::vec2 value)
Sets a vec3 parameter for the material.
Definition: material.cpp:97
void SetVec4(const std::string &name, glm::vec4 value)
Sets a vec4 parameter for the material.
Definition: material.cpp:107
std::vector< std::string > GetTextures() const
Returns the list of texture names used by this material.
Definition: material.cpp:82
Material(IRenderer *renderer, MaterialSettings matSettings)
Constructs a new Material instance.
Definition: material.cpp:10
PackedMaterialData PackMaterialParameters()
Packs the current float/vector parameters into a binary buffer and layout metadata.
Definition: material.cpp:39
const MaterialSettings GetMaterialSettings() const
Returns the material's static settings (domain, blend mode, shading model, etc.).
Definition: material.cpp:22
void AddTexture(const std::string &textureName)
Adds a texture name to the material's list of used textures.
Definition: material.cpp:112
void SetFloat(const std::string &name, float value)
Sets a float parameter for the material.
Definition: material.cpp:92
IMaterialRenderResources * GetMaterialRenderResources() const
Returns the backend-specific GPU handle of the material.
Definition: material.cpp:87
Settings required to define a material instance.
Contains the raw buffer data and layout metadata of packed material parameters.
std::vector< MaterialParameterLayoutEntry > layout