9#include <IMaterialRendererServices.h>
31 const std::string &filename);
63 virtual void onSetUniforms(video::IMaterialRendererServices *services) = 0;
92template <
typename T, std::
size_t count,
bool cache>
103 void set(
const T value[count], video::IMaterialRendererServices *services)
108 services->setPixelShaderConstant(services->getPixelShaderConstantID(
m_name), value, count);
110 services->setVertexShaderConstant(services->getVertexShaderConstantID(
m_name), value, count);
113 std::copy(value, value + count,
m_sent);
131#define SPECIALIZE(_type, _count_expr) \
132 template<typename T2 = T> \
133 std::enable_if_t<std::is_same_v<T, T2> && std::is_same_v<T2, _type> && (_count_expr)>
138 float array[2] = { value.X, value.Y };
139 set(array, services);
145 float array[3] = { value.X, value.Y, value.Z };
146 set(array, services);
152 if constexpr (count == 3) {
153 float array[3] = { value.r, value.g, value.b };
154 set(array, services);
156 float array[4] = { value.r, value.g, value.b, value.a };
157 set(array, services);
164 set(value.pointer(), services);
170template <
typename T, std::
size_t count = 1,
bool cache=true>
177template <
typename T, std::
size_t count = 1,
bool cache=true>
184template <
typename T, std::
size_t count,
bool cache,
bool is_pixel>
195 void set(
const T value[count], video::IMaterialRendererServices *services)
200 for (std::size_t i = 0; i < count; i++) {
201 std::string uniform_name = std::string(
m_name) +
"." +
m_fields[i];
204 services->setPixelShaderConstant(services->getPixelShaderConstantID(uniform_name.c_str()), value + i, 1);
206 services->setVertexShaderConstant(services->getVertexShaderConstantID(uniform_name.c_str()), value + i, 1);
210 std::copy(value, value + count,
m_sent);
216template<
typename T, std::
size_t count,
bool cache = true>
219template<
typename T, std::
size_t count,
bool cache = true>
234 video::E_MATERIAL_TYPE
material = video::EMT_INVALID;
272 bool array_texture =
false);
280 inline u32
getShaderRaw(
const std::string &name,
bool blendAlpha =
false)
282 auto base_mat = blendAlpha ? video::EMT_TRANSPARENT_ALPHA_CHANNEL :
283 video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
300 const std::string &filename,
const std::string &program)=0;
313 const std::string &program_type, std::string_view program);
CachedPixelShaderSetting(const char *name)
Definition shader.h:173
bool is_pixel
Definition shader.h:97
CachedShaderSetting(const char *name, bool is_pixel)
Definition shader.h:99
T m_sent[count]
Definition shader.h:95
bool has_been_set
Definition shader.h:96
const char * m_name
Definition shader.h:94
void set(const T value[count], video::IMaterialRendererServices *services)
Definition shader.h:103
void set(const T value[count], video::IMaterialRendererServices *services)
Definition shader.h:195
T m_sent[count]
Definition shader.h:187
std::array< const char *, count > m_fields
Definition shader.h:189
bool has_been_set
Definition shader.h:188
CachedStructShaderSetting(const char *name, std::array< const char *, count > &&fields)
Definition shader.h:191
const char * m_name
Definition shader.h:186
CachedVertexShaderSetting(const char *name)
Definition shader.h:180
virtual ~IShaderConstantSetter()=default
virtual void onGenerate(const std::string &name, ShaderConstants &constants)=0
Called when the final shader source is being generated.
virtual bool supportsSampler2DArray() const =0
Returns true if 'sampler2DArray' is supported in GLSL.
u32 getShaderRaw(const std::string &name, bool blendAlpha=false)
Helper: Generates or gets a shader for common, general use.
Definition shader.h:280
virtual u32 getShader(const std::string &name, const ShaderConstants &input_const, video::E_MATERIAL_TYPE base_mat, IShaderUniformSetterRC *setter_cb=nullptr)=0
Generates or gets a shader.
virtual ~IShaderSource()=default
virtual const ShaderInfo & getShaderInfo(u32 id)=0
returns information about an existing shader
virtual void rebuildShaders()=0
virtual ~IWritableShaderSource()=default
virtual void addShaderUniformSetterFactory(std::unique_ptr< IShaderUniformSetterFactory > setter)=0
IWritableShaderSource()=default
virtual void insertSourceShader(const std::string &name_of_shader, const std::string &filename, const std::string &program)=0
virtual void processQueue()=0
virtual void addShaderConstantSetter(std::unique_ptr< IShaderConstantSetter > setter)=0
core::vector2d< f32 > v2f
Definition irr_v2d.h:11
core::vector3df v3f
Definition irr_v3d.h:11
Definition clientmap.h:36
NodeDrawType
Definition nodedef.h:182
@ NDT_NORMAL
Definition nodedef.h:184
std::map< std::string, std::variant< int, float > > ShaderConstants
Definition shader.h:39
IWritableShaderSource * createShaderSource()
Definition shader.cpp:459
std::string getShaderPath(const std::string &name_of_shader, const std::string &filename)
Definition shader.cpp:39
#define SPECIALIZE(_type, _count_expr)
Definition shader.h:131
void dumpShaderProgram(std::ostream &output_stream, const std::string &program_type, std::string_view program)
Definition shader.cpp:885
std::string name
Definition shader.h:231
video::E_MATERIAL_TYPE base_material
Definition shader.h:232
ShaderConstants input_constants
Definition shader.h:236
video::E_MATERIAL_TYPE material
Definition shader.h:234
irr_ptr< IShaderUniformSetterRC > setter_cb
Definition shader.h:238
core::matrix4 matrix4
Definition test_irr_matrix4.cpp:12
MaterialType
Definition tile.h:12