1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
#pragma once
#include "GL/GLShaderUniforms.h"
#include "GL/GLShaderUniformBlocks.h"
#include "GL/GLTexture.h"
#include "Shader.h"
namespace nCine
{
class GLShaderProgram;
class GLTexture;
class Texture;
class GLUniformCache;
class GLAttribute;
/// Contains material data for a drawable node
class Material
{
friend class RenderCommand;
public:
/// One of the predefined shader programs
enum class ShaderProgramType
{
/// Shader program for Sprite classes
Sprite = 0,
// Shader program for Sprite classes with grayscale font texture
//SpriteGray,
/// Shader program for Sprite classes with a solid color and no texture
SpriteNoTexture,
/// Shader program for MeshSprite classes
MeshSprite,
// Shader program for MeshSprite classes with grayscale font texture
//MeshSpriteGray,
/// Shader program for MeshSprite classes with a solid color and no texture
MeshSpriteNoTexture,
// Shader program for TextNode classes with glyph data in alpha channel
//TextNodeAlpha,
// Shader program for TextNode classes with glyph data in red channel
//TextNodeRed,
/// Shader program for a batch of Sprite classes
BatchedSprites,
// Shader program for a batch of Sprite classes with grayscale font texture
//BatchedSpritesGray,
/// Shader program for a batch of Sprite classes with solid colors and no texture
BatchedSpritesNoTexture,
/// Shader program for a batch of MeshSprite classes
BatchedMeshSprites,
// Shader program for a batch of MeshSprite classes with grayscale font texture
//BatchedMeshSpritesGray,
/// Shader program for a batch of MeshSprite classes with solid colors and no texture
BatchedMeshSpritesNoTexture,
// Shader program for a batch of TextNode classes with color font texture
//BatchedTextNodesAlpha,
// Shader program for a batch of TextNode classes with grayscale font texture
//BatchedTextNodesRed,
/// A custom shader program
Custom
};
/** @{ @name Constants */
// Shader uniform block and model matrix uniform names
static constexpr char InstanceBlockName[] = "InstanceBlock";
static constexpr char InstancesBlockName[] = "InstancesBlock"; // for batched shaders
static constexpr char ModelMatrixUniformName[] = "modelMatrix";
// Camera related shader uniform names
static constexpr char GuiProjectionMatrixUniformName[] = "uGuiProjection";
static constexpr char DepthUniformName[] = "uDepth";
static constexpr char ProjectionMatrixUniformName[] = "uProjectionMatrix";
static constexpr char ViewMatrixUniformName[] = "uViewMatrix";
static constexpr char ProjectionViewMatrixExcludeString[] = "uProjectionMatrix\0uViewMatrix\0";
// Shader uniform and attribute names
static constexpr char TextureUniformName[] = "uTexture";
static constexpr char ColorUniformName[] = "color";
static constexpr char SpriteSizeUniformName[] = "spriteSize";
static constexpr char TexRectUniformName[] = "texRect";
static constexpr char PositionAttributeName[] = "aPosition";
static constexpr char TexCoordsAttributeName[] = "aTexCoords";
static constexpr char MeshIndexAttributeName[] = "aMeshIndex";
static constexpr char ColorAttributeName[] = "aColor";
/** @} */
/// Default constructor
Material();
Material(GLShaderProgram* program, GLTexture* texture);
inline bool IsBlendingEnabled() const {
return isBlendingEnabled_;
}
inline void SetBlendingEnabled(bool blendingEnabled) {
isBlendingEnabled_ = blendingEnabled;
}
inline GLenum GetSrcBlendingFactor() const {
return srcBlendingFactor_;
}
inline GLenum GetDestBlendingFactor() const {
return destBlendingFactor_;
}
void SetBlendingFactors(GLenum srcBlendingFactor, GLenum destBlendingFactor);
inline ShaderProgramType GetShaderProgramType() const {
return shaderProgramType_;
}
bool SetShaderProgramType(ShaderProgramType shaderProgramType);
inline const GLShaderProgram* GetShaderProgram() const {
return shaderProgram_;
}
void SetShaderProgram(GLShaderProgram* program);
bool SetShader(Shader* shader);
void SetDefaultAttributesParameters();
void ReserveUniformsDataMemory();
void SetUniformsDataPointer(GLubyte* dataPointer);
/// Wrapper around `GLShaderUniforms::hasUniform()`
inline bool HasUniform(const char* name) const {
return shaderUniforms_.HasUniform(name);
}
/// Wrapper around `GLShaderUniformBlocks::hasUniformBlock()`
inline bool HasUniformBlock(const char* name) const {
return shaderUniformBlocks_.HasUniformBlock(name);
}
/// Wrapper around `GLShaderUniforms::uniform()`
inline GLUniformCache* Uniform(const char* name) {
return shaderUniforms_.GetUniform(name);
}
/// Wrapper around `GLShaderUniformBlocks::uniformBlock()`
inline GLUniformBlockCache* UniformBlock(const char* name) {
return shaderUniformBlocks_.GetUniformBlock(name);
}
/// Wrapper around `GLShaderUniforms::allUniforms()`
inline const GLShaderUniforms::UniformHashMapType GetAllUniforms() const {
return shaderUniforms_.GetAllUniforms();
}
/// Wrapper around `GLShaderUniformBlocks::allUniformBlocks()`
inline const GLShaderUniformBlocks::UniformHashMapType GetAllUniformBlocks() const {
return shaderUniformBlocks_.GetAllUniformBlocks();
}
const GLTexture* GetTexture(std::uint32_t unit) const;
bool SetTexture(std::uint32_t unit, const GLTexture* texture);
bool SetTexture(std::uint32_t unit, const Texture& texture);
inline const GLTexture* GetTexture() const {
return GetTexture(0);
}
inline bool SetTexture(const GLTexture* texture) {
return SetTexture(0, texture);
}
inline bool SetTexture(const Texture& texture) {
return SetTexture(0, texture);
}
private:
bool isBlendingEnabled_;
GLenum srcBlendingFactor_;
GLenum destBlendingFactor_;
ShaderProgramType shaderProgramType_;
GLShaderProgram* shaderProgram_;
GLShaderUniforms shaderUniforms_;
GLShaderUniformBlocks shaderUniformBlocks_;
const GLTexture* textures_[GLTexture::MaxTextureUnits];
/// The size of the memory buffer containing uniform values
std::uint32_t uniformsHostBufferSize_;
/// Memory buffer with uniform values to be sent to the GPU
std::unique_ptr<GLubyte[]> uniformsHostBuffer_;
void Bind();
/// Wrapper around `GLShaderUniforms::commitUniforms()`
inline void CommitUniforms() {
shaderUniforms_.CommitUniforms();
}
/// Wrapper around `GLShaderUniformBlocks::commitUniformBlocks()`
inline void CommitUniformBlocks() {
shaderUniformBlocks_.CommitUniformBlocks();
}
/// Wrapper around `GLShaderProgram::defineVertexFormat()`
void DefineVertexFormat(const GLBufferObject* vbo, const GLBufferObject* ibo, std::uint32_t vboOffset);
std::uint32_t GetSortKey();
};
}
|