81 typedef std::list<ShaderSlice> ShaderSliceList;
82 ShaderSliceList VertexSlices, FragmentSlices;
83 std::vector<std::string> SourceFiles;
84 std::vector<std::string> Categories;
85 std::set<int> ScriptShaders;
87 int GetSourceFileId(
const char *file)
const;
91 bool ScriptSlicesLoaded =
false;
100 struct Variable {
int address;
const char* name; };
101 std::vector<Variable> Uniforms;
102 std::vector<Variable> Attributes;
119 return iUniform >= 0 &&
static_cast<unsigned int>(iUniform) < Uniforms.size() ? Uniforms[iUniform].address : -1;
129 return iAttribute >= 0 &&
static_cast<unsigned int>(iAttribute) < Attributes.size() ? Attributes[iAttribute].address : -1;
151 void AddVertexSlices(
const char *szWhat,
const char *szText,
const char *szSource =
"",
int iFileTime = 0);
152 void AddFragmentSlices(
const char *szWhat,
const char *szText,
const char *szSource =
"",
int iFileTime = 0);
158 bool Init(
const char *szWhat,
const char **szUniforms,
const char **szAttributes);
165 void AddSlice(ShaderSliceList& slices,
int iPos,
const char *szText,
const char *szSource,
int line,
int iFileTime);
166 void AddSlices(ShaderSliceList& slices,
const char *szWhat,
const char *szText,
const char *szSource,
int iFileTime);
167 bool LoadSlices(ShaderSliceList& slices,
C4GroupSet *pGroupSet,
const char *szFile);
168 int ParsePosition(
const char *szWhat,
const char **ppPos);
170 void LoadScriptSlices();
171 void LoadScriptSlice(
int id);
173 StdStrBuf Build(
const ShaderSliceList &Slices,
bool fDebug =
false);
176 GLuint Create(GLenum iShaderType,
const char *szWhat,
const char *szShader);
177 void DumpInfoLog(
const char *szWhat, GLuint hShader,
bool forProgram);
190 : fStarted(false), pShader(pShader), iUnits(0)
211 glUniform1i(pShader->
GetUniform(iUniform), iX);
215 glUniform2i(pShader->
GetUniform(iUniform), iX, iY);
219 glUniform3i(pShader->
GetUniform(iUniform), iX, iY, iZ);
221 void SetUniform4i(
int iUniform,
int iX,
int iY,
int iZ,
int iW)
const {
223 glUniform4i(pShader->
GetUniform(iUniform), iX, iY, iZ, iW);
227 glUniform1ui(pShader->
GetUniform(iUniform), iX);
231 glUniform2ui(pShader->
GetUniform(iUniform), iX, iY);
233 void Setuniform3ui(
int iUniform,
unsigned int iX,
unsigned int iY,
unsigned int iZ)
const {
235 glUniform3ui(pShader->
GetUniform(iUniform), iX, iY, iZ);
237 void Setuniform4ui(
int iUniform,
unsigned int iX,
unsigned int iY,
unsigned int iZ,
unsigned int iW)
const {
239 glUniform4ui(pShader->
GetUniform(iUniform), iX, iY, iZ, iW);
243 glUniform1f(pShader->
GetUniform(iUniform), gX);
247 glUniform2f(pShader->
GetUniform(iUniform), gX, gY);
251 glUniform3f(pShader->
GetUniform(iUniform), gX, gY, gZ);
253 void SetUniform4f(
int iUniform,
float gX,
float gY,
float gZ,
float gW)
const {
255 glUniform4f(pShader->
GetUniform(iUniform), gX, gY, gZ, gW);
259 glUniform1iv(pShader->
GetUniform(iUniform), iLength, pVals);
263 glUniform2iv(pShader->
GetUniform(iUniform), iLength, pVals);
267 glUniform3iv(pShader->
GetUniform(iUniform), iLength, pVals);
271 glUniform4iv(pShader->
GetUniform(iUniform), iLength, pVals);
273 void SetUniform1uiv(
int iUniform,
int iLength,
const unsigned int *pVals)
const {
275 glUniform1uiv(pShader->
GetUniform(iUniform), iLength, pVals);
277 void SetUniform2uiv(
int iUniform,
int iLength,
const unsigned int *pVals)
const {
279 glUniform2uiv(pShader->
GetUniform(iUniform), iLength, pVals);
281 void SetUniform3uiv(
int iUniform,
int iLength,
const unsigned int *pVals)
const {
283 glUniform3uiv(pShader->
GetUniform(iUniform), iLength, pVals);
285 void SetUniform4uiv(
int iUniform,
int iLength,
const unsigned int *pVals)
const {
287 glUniform4uiv(pShader->
GetUniform(iUniform), iLength, pVals);
291 glUniform1fv(pShader->
GetUniform(iUniform), iLength, pVals);
295 glUniform2fv(pShader->
GetUniform(iUniform), iLength, pVals);
299 glUniform3fv(pShader->
GetUniform(iUniform), iLength, pVals);
303 glUniform4fv(pShader->
GetUniform(iUniform), iLength, pVals);
309 glUniformMatrix3x2fv(pShader->
GetUniform(iUniform), iLength, GL_TRUE, pVals);
314 glUniformMatrix3fv(pShader->
GetUniform(iUniform), iLength, GL_TRUE, pVals);
319 glUniformMatrix4x3fv(pShader->
GetUniform(iUniform), iLength, GL_TRUE, pVals);
324 glUniformMatrix4fv(pShader->
GetUniform(iUniform), iLength, GL_TRUE, pVals);
331 const float mat[9] = { matrix(0, 0), matrix(1, 0), matrix(2, 0), matrix(0, 1), matrix(1, 1), matrix(2, 1), matrix(0, 2), matrix(1, 2), matrix(2, 2) };
332 glUniformMatrix3fv(pShader->
GetUniform(iUniform), 1, GL_FALSE, mat);
340 const float mat[9] = { matrix(0, 0), matrix(0, 1), matrix(0, 2), matrix(1, 0), matrix(1, 1), matrix(1, 2), matrix(2, 0), matrix(2, 1), matrix(2, 2) };
341 glUniformMatrix3fv(pShader->
GetUniform(iUniform), 1, GL_FALSE, mat);
348 glUniformMatrix4x3fv(pShader->
GetUniform(iUniform), 1, GL_TRUE, matrix.
data());
355 const float mat[16] = { matrix(0, 0), matrix(1, 0), matrix(2, 0), 0.0f, matrix(0, 1), matrix(1, 1), matrix(2, 1), 0.0f, matrix(0, 2), matrix(1, 2), matrix(2, 2), 0.0f, matrix(0, 3), matrix(1, 3), matrix(2, 3), 1.0f };
356 glUniformMatrix4fv(pShader->
GetUniform(iUniform), 1, GL_FALSE, mat);
363 glUniformMatrix4fv(pShader->
GetUniform(iUniform), 1, GL_TRUE, matrix.
data());
388 struct ShaderInstance
396 std::map<std::string, std::set<int>> categories;
398 std::map<int, ShaderInstance> shaders;
400 uint32_t LastUpdate = 0;
403 std::set<int>
GetShaderIDs(
const std::vector<std::string>& cats);
407 int Add(
const std::string& shaderName,
ShaderType type,
const std::string& source);
430 typedef std::map<std::string, Uniform> UniformMap;
431 std::stack<UniformMap> uniformStack;
440 ~Popper() { assert(size == p->uniformStack.size()); p->uniformStack.pop(); }
const int C4Shader_PositionMaterial
const int C4Shader_Vertex_NormalPos
const int C4Shader_PositionTexture
const int C4Shader_Vertex_ColorPos
const int C4Shader_Vertex_TexCoordPos
const int C4Shader_PositionFinish
const int C4Shader_LastPosition
const int C4ShaderCall_MaxUnits
const int C4Shader_PositionNormal
const int C4Shader_Vertex_PositionPos
const int C4Shader_PositionColor
const int C4Shader_MaxTexCoords
const int C4Shader_PositionCoordinate
const int C4Shader_PositionInit
C4ScriptShader ScriptShader
const int C4Shader_Version
const int C4Shader_PositionLight
int Add(const std::string &shaderName, ShaderType type, const std::string &source)
std::set< int > GetShaderIDs(const std::vector< std::string > &cats)
void SetUniform1f(int iUniform, float gX) const
void SetUniformMatrix4x4(int iUniform, const StdMeshMatrix &matrix)
GLint AllocTexUnit(int iUniform)
void SetUniform1ui(int iUniform, unsigned int iX) const
void SetUniformMatrix4x4fv(int iUniform, int iLength, const float *pVals) const
void SetUniformMatrix3x3(int iUniform, const StdMeshMatrix &matrix)
GLint GetAttribute(int iAttribute) const
void SetUniform2f(int iUniform, float gX, float gY) const
void SetUniform3i(int iUniform, int iX, int iY, int iZ) const
void SetUniform4fv(int iUniform, int iLength, const float *pVals) const
void SetUniform2i(int iUniform, int iX, int iY) const
void Setuniform4ui(int iUniform, unsigned int iX, unsigned int iY, unsigned int iZ, unsigned int iW) const
void SetUniformMatrix3x4fv(int iUniform, int iLength, const float *pVals) const
void SetUniformMatrix3x3fv(int iUniform, int iLength, const float *pVals) const
void SetUniform1uiv(int iUniform, int iLength, const unsigned int *pVals) const
void SetUniform3f(int iUniform, float gX, float gY, float gZ) const
void SetUniform3uiv(int iUniform, int iLength, const unsigned int *pVals) const
void SetUniformMatrix3x4(int iUniform, const StdMeshMatrix &matrix)
void SetUniform2fv(int iUniform, int iLength, const float *pVals) const
void SetUniform1iv(int iUniform, int iLength, const int *pVals) const
void SetUniform3fv(int iUniform, int iLength, const float *pVals) const
void SetUniform4f(int iUniform, float gX, float gY, float gZ, float gW) const
void SetUniform2uiv(int iUniform, int iLength, const unsigned int *pVals) const
void SetUniform4uiv(int iUniform, int iLength, const unsigned int *pVals) const
void SetUniform1fv(int iUniform, int iLength, const float *pVals) const
void SetUniform2iv(int iUniform, int iLength, const int *pVals) const
void Setuniform3ui(int iUniform, unsigned int iX, unsigned int iY, unsigned int iZ) const
void SetUniformMatrix2x3fv(int iUniform, int iLength, const float *pVals) const
void Setuniform2ui(int iUniform, unsigned int iX, unsigned int iY) const
void SetUniform4iv(int iUniform, int iLength, const int *pVals) const
void SetUniform4i(int iUniform, int iX, int iY, int iZ, int iW) const
void SetUniformMatrix4x4(int iUniform, const StdProjectionMatrix &matrix)
void SetUniform3iv(int iUniform, int iLength, const int *pVals) const
C4ShaderCall(const C4Shader *pShader)
void SetUniform1i(int iUniform, int iX) const
void SetUniformMatrix3x3Transpose(int iUniform, const StdMeshMatrix &matrix)
bool LoadVertexSlices(C4GroupSet *pGroupSet, const char *szFile)
bool LoadFragmentSlices(C4GroupSet *pGroupSet, const char *szFile)
void AddFragmentSlice(int iPos, const char *szText)
void AddDefine(const char *name)
GLint GetAttribute(int iAttribute) const
bool HaveUniform(int iUniform) const
void AddVertexSlice(int iPos, const char *szText)
void AddVertexSlices(const char *szWhat, const char *szText, const char *szSource="", int iFileTime=0)
void SetScriptCategories(const std::vector< std::string > &categories)
GLint GetUniform(int iUniform) const
bool Init(const char *szWhat, const char **szUniforms, const char **szAttributes)
void AddFragmentSlices(const char *szWhat, const char *szText, const char *szSource="", int iFileTime=0)
const float * data() const
const float * data() const