sculpto
material_phong.h
Go to the documentation of this file.
1/*!****************************************************************//*!*
2 * \file material_phong.h
3 * \brief Mesh material for bling-phone lighting model class deinition module.
4 *
5 * \author Sabitov Kirill
6 * \date 05 July 2022
7 *********************************************************************/
8
9#pragma once
10
11#include "material.h"
15
16namespace scl
17{
19 class material_phong : public material
20 {
21 private:
23 struct buffer_data
24 {
25 vec3 Specular {};
26 float Shininess {};
27 vec3 Diffuse {};
28 u32 IsSpecularMap {};
29 u32 IsDiffuseMap {};
30 u32 IsEmissionMap {};
31 u32 IsNormalMap {};
32 } Data {};
33
35 shared<constant_buffer> DataBuffer {};
36
38 shared<texture_2d> SpecularMapTexture {};
39 shared<texture_2d> DiffuseMapTexture {};
40 shared<texture_2d> EmissionMapTexture {};
41 shared<texture_2d> NormalMapTexture {};
42
43 public:
45 const vec3 &GetSpecular() const { return Data.Specular; }
47 const vec3 &GetDiffuse() const { return Data.Diffuse; }
49 float GetShininess() const { return Data.Shininess; }
50
52 bool GetIsSpecularMap() const { return Data.IsSpecularMap; }
54 bool GetIsDiffuseMap() const { return Data.IsDiffuseMap; }
56 bool GetIsEmissionMap() const { return Data.IsEmissionMap; }
58 bool GetIsNormalMap() const { return Data.IsNormalMap; }
59
61 const shared<texture_2d> &GetDiffuseMapTexture() const { return DiffuseMapTexture; }
63 const shared<texture_2d> &GetSpecularMapTexture() const { return SpecularMapTexture; }
65 const shared<texture_2d> &GetEmissionMapTexture() const { return EmissionMapTexture; }
67 const shared<texture_2d> &GetNormalMapTexture() const { return NormalMapTexture; }
68
70 void SetDiffuse(const vec3 &Diffuse) {
71 if (DiffuseMapTexture)
72 {
73 DiffuseMapTexture->Free();
74 DiffuseMapTexture = nullptr;
75 }
76 Data.Diffuse = Diffuse;
77 Data.IsDiffuseMap = false;
78 DataBuffer->Update(&Data, sizeof(Data));
79 }
81 void SetSpecular(const vec3 &Specular) {
82 if (SpecularMapTexture)
83 {
84 SpecularMapTexture->Free();
85 SpecularMapTexture = nullptr;
86 }
87 Data.Specular = Specular;
88 Data.IsSpecularMap = false;
89 DataBuffer->Update(&Data, sizeof(Data));
90 }
92 void SetShininess(float Shininess) {
93 Data.Shininess = Shininess;
94 DataBuffer->Update(&Data, sizeof(Data));
95 }
96
98 void SetDiffuseMapTexture(shared<texture_2d> DiffuseMapTexture) {
99 if (!DiffuseMapTexture) return;
100
101 if (this->DiffuseMapTexture) this->DiffuseMapTexture->Free();
102 this->DiffuseMapTexture = DiffuseMapTexture;
103 if (!Data.IsDiffuseMap)
104 {
105 Data.IsDiffuseMap = true;
106 DataBuffer->Update(&Data, sizeof(Data));
107 }
108 }
110 void SetSpecularMapTexture(shared<texture_2d> SpecularMapTexture) {
111 if (!SpecularMapTexture) return;
112
113 if (this->SpecularMapTexture) this->SpecularMapTexture->Free();
114 this->SpecularMapTexture = SpecularMapTexture;
115 if (!Data.IsSpecularMap)
116 {
117 Data.IsSpecularMap = true;
118 DataBuffer->Update(&Data, sizeof(Data));
119 }
120 }
122 void SetEmissionMapTexture(shared<texture_2d> EmissionMapTexture) {
123 if (!EmissionMapTexture) return;
124
125 if (this->EmissionMapTexture) this->EmissionMapTexture->Free();
126 this->EmissionMapTexture = EmissionMapTexture;
127 if (!Data.IsEmissionMap)
128 {
129 Data.IsEmissionMap = true;
130 DataBuffer->Update(&Data, sizeof(Data));
131 }
132 }
135 if (!NormalMapTexture) return;
136
137 if (this->NormalMapTexture) this->NormalMapTexture->Free();
138 this->NormalMapTexture = NormalMapTexture;
139 if (!Data.IsNormalMap)
140 {
141 Data.IsNormalMap = true;
142 DataBuffer->Update(&Data, sizeof(Data));
143 }
144 }
145
147 material_phong() = default;
148
150 material_phong(const material_phong &Other) = default;
151
152 /*!*
153 * Material for blin-phong lighting model class contructor.
154 *
155 * \param Diffuse - Material diffuse lighting coefficient.
156 * \param Specular - Material specular lighting coefficient.
157 * \param Shininess - Material shiness exponent lighting coefficient.
158 */
159 material_phong(const vec3 &Diffuse, const vec3 &Specular, float Shininess) :
160 material(render_bridge::GetPhongGeometryShader())
161 {
162 Data.Diffuse = Diffuse;
163 Data.Specular = Specular;
164 Data.Shininess = Shininess;
165
166 DataBuffer = constant_buffer::Create(&Data, sizeof(buffer_data));
167 }
168
169 /*!*
170 * Bind material to current render stage function.
171 *
172 * \param None.
173 * \return None.
174 */
175 void Bind() const override
176 {
177 if (Shader != nullptr) Shader->Bind();
178 if (DataBuffer != nullptr) DataBuffer->Bind(render_context::BINDING_POINT_MATERIAL_DATA);
179
180 if (DiffuseMapTexture && Data.IsDiffuseMap) DiffuseMapTexture->Bind(render_context::TEXTURE_SLOT_MATERIAL_DIFFUSE);
181 if (SpecularMapTexture && Data.IsSpecularMap) SpecularMapTexture->Bind(render_context::TEXTURE_SLOT_MATERIAL_SPECULAR);
182 if (EmissionMapTexture && Data.IsEmissionMap) EmissionMapTexture->Bind(render_context::TEXTURE_SLOT_MATERIAL_EMISSION_MAP);
183 if (NormalMapTexture && Data.IsNormalMap) NormalMapTexture->Bind(render_context::TEXTURE_SLOT_MATERIAL_NORMAL_MAP);
184 }
185
186 /*!*
187 * Unbind material from current render stage function.
188 *
189 * \param None.
190 * \return None.
191 */
192 void Unbind() const override
193 {
194 if (Shader != nullptr) Shader->Unbind();
195 if (DataBuffer != nullptr) DataBuffer->Unbind();
196 if (SpecularMapTexture && Data.IsSpecularMap) SpecularMapTexture->Unbind();
197 if (DiffuseMapTexture && Data.IsDiffuseMap) DiffuseMapTexture->Unbind();
198 if (NormalMapTexture && Data.IsNormalMap) NormalMapTexture->Unbind();
199 }
200
201 /*!*
202 * Material for blin-phong lighting model class contructor.
203 *
204 * \param Specular - Material specular lighting coefficient.
205 * \param Diffuse - Material diffuse lighting coefficient.
206 * \param Shininess - Material shiness exponent lighting coefficient.
207 */
208 static shared<material_phong> Create(const vec3 &Diffuse, const vec3 &Specular, float Shininess)
209 {
210 return CreateShared<material_phong>(Diffuse, Specular, Shininess);
211 }
212 };
213}
Buffer interfaces implementation module.
static shared< constant_buffer > Create(u32 Size)
Definition: buffer.cpp:14
bool GetIsEmissionMap() const
bool GetIsDiffuseMap() const
const shared< texture_2d > & GetSpecularMapTexture() const
float GetShininess() const
void SetEmissionMapTexture(shared< texture_2d > EmissionMapTexture)
const vec3 & GetDiffuse() const
static shared< material_phong > Create(const vec3 &Diffuse, const vec3 &Specular, float Shininess)
material_phong(const vec3 &Diffuse, const vec3 &Specular, float Shininess)
const shared< texture_2d > & GetEmissionMapTexture() const
const vec3 & GetSpecular() const
material_phong()=default
void SetDiffuseMapTexture(shared< texture_2d > DiffuseMapTexture)
void SetDiffuse(const vec3 &Diffuse)
void SetSpecularMapTexture(shared< texture_2d > SpecularMapTexture)
const shared< texture_2d > & GetDiffuseMapTexture() const
bool GetIsNormalMap() const
bool GetIsSpecularMap() const
void Bind() const override
const shared< texture_2d > & GetNormalMapTexture() const
void SetShininess(float Shininess)
void SetSpecular(const vec3 &Specular)
material_phong(const material_phong &Other)=default
void SetNormalMapTexture(shared< texture_2d > NormalMapTexture)
void Unbind() const override
shared< shader_program > Shader
Definition: material.h:20
static const int TEXTURE_SLOT_MATERIAL_EMISSION_MAP
static const int TEXTURE_SLOT_MATERIAL_NORMAL_MAP
static const int BINDING_POINT_MATERIAL_DATA
static const int TEXTURE_SLOT_MATERIAL_DIFFUSE
static const int TEXTURE_SLOT_MATERIAL_SPECULAR
Mesh material class deinition module.
Definition: base.h:33
std::shared_ptr< T > shared
Definition: smart_ptr.h:15
uint32_t u32
Definition: math_common.h:21
Render bridge class implementation module. Static class for making calls to low-level render api,...
Texture interface definition module.