mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
Add support for custom vertex attributes and array-of-matrix uniforms in GLSL.
This was SVN commit r11489.
This commit is contained in:
parent
5e38f4b49d
commit
ce215cace3
6 changed files with 104 additions and 1 deletions
|
|
@ -65,6 +65,9 @@
|
|||
<value>gl_MultiTexCoord5</value>
|
||||
<value>gl_MultiTexCoord6</value>
|
||||
<value>gl_MultiTexCoord7</value>
|
||||
<value>CustomAttribute0</value>
|
||||
<value>CustomAttribute1</value>
|
||||
<value>CustomAttribute2</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</element>
|
||||
|
|
|
|||
|
|
@ -101,7 +101,11 @@ static GLenum ParseAttribSemantics(const CStr& str)
|
|||
if (str == "gl_MultiTexCoord6") return 14;
|
||||
if (str == "gl_MultiTexCoord7") return 15;
|
||||
|
||||
// TODO: support user-defined semantics somehow
|
||||
// Define some arbitrary names for user-defined attribute locations
|
||||
// that won't conflict with any standard semantics
|
||||
if (str == "CustomAttribute0") return 1;
|
||||
if (str == "CustomAttribute1") return 6;
|
||||
if (str == "CustomAttribute2") return 7;
|
||||
|
||||
debug_warn("Invalid attribute semantics");
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -232,6 +232,12 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
virtual void Uniform(Binding id, size_t count, const CMatrix3D* v)
|
||||
{
|
||||
ENSURE(count == 1);
|
||||
Uniform(id, v[0]);
|
||||
}
|
||||
|
||||
private:
|
||||
VfsPath m_VertexFile;
|
||||
VfsPath m_FragmentFile;
|
||||
|
|
@ -580,6 +586,17 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
virtual void Uniform(Binding id, size_t count, const CMatrix3D* v)
|
||||
{
|
||||
if (id.first != -1)
|
||||
{
|
||||
if (id.second == GL_FLOAT_MAT4)
|
||||
pglUniformMatrix4fvARB(id.first, count, GL_FALSE, &v->_11);
|
||||
else
|
||||
LOGERROR(L"CShaderProgramGLSL::Uniform(): Invalid uniform type (expected mat4)");
|
||||
}
|
||||
}
|
||||
|
||||
// Map the various fixed-function Pointer functions onto generic vertex attributes
|
||||
// (matching the attribute indexes from ShaderManager's ParseAttribSemantics):
|
||||
|
||||
|
|
@ -607,6 +624,24 @@ public:
|
|||
m_ValidStreams |= STREAM_UV0 << (texture - GL_TEXTURE0);
|
||||
}
|
||||
|
||||
virtual void VertexAttribPointer(const char* id, GLint size, GLenum type, GLboolean normalized, GLsizei stride, void* pointer)
|
||||
{
|
||||
std::map<CStrIntern, int>::iterator it = m_VertexAttribs.find(CStrIntern(id));
|
||||
if (it != m_VertexAttribs.end())
|
||||
{
|
||||
pglVertexAttribPointerARB(it->second, size, type, normalized, stride, pointer);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void VertexAttribIPointer(const char* id, GLint size, GLenum type, GLsizei stride, void* pointer)
|
||||
{
|
||||
std::map<CStrIntern, int>::iterator it = m_VertexAttribs.find(CStrIntern(id));
|
||||
if (it != m_VertexAttribs.end())
|
||||
{
|
||||
pglVertexAttribIPointerEXT(it->second, size, type, stride, pointer);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
VfsPath m_VertexFile;
|
||||
VfsPath m_FragmentFile;
|
||||
|
|
@ -731,6 +766,11 @@ void CShaderProgram::Uniform(uniform_id_t id, const CMatrix3D& v)
|
|||
Uniform(GetUniformBinding(id), v);
|
||||
}
|
||||
|
||||
void CShaderProgram::Uniform(uniform_id_t id, size_t count, const CMatrix3D* v)
|
||||
{
|
||||
Uniform(GetUniformBinding(id), count, v);
|
||||
}
|
||||
|
||||
#if CONFIG2_GLES
|
||||
|
||||
// These should all be overridden by CShaderProgramGLSL
|
||||
|
|
@ -782,6 +822,18 @@ void CShaderProgram::TexCoordPointer(GLenum texture, GLint size, GLenum type, GL
|
|||
m_ValidStreams |= STREAM_UV0 << (texture - GL_TEXTURE0);
|
||||
}
|
||||
|
||||
void CShaderProgram::VertexAttribPointer(const char* UNUSED(id), GLint UNUSED(size), GLenum UNUSED(type),
|
||||
GLboolean UNUSED(normalized), GLsizei UNUSED(stride), void* UNUSED(pointer))
|
||||
{
|
||||
debug_warn("Shader type doesn't support VertexAttribPointer");
|
||||
}
|
||||
|
||||
void CShaderProgram::VertexAttribIPointer(const char* UNUSED(id), GLint UNUSED(size), GLenum UNUSED(type),
|
||||
GLsizei UNUSED(stride), void* UNUSED(pointer))
|
||||
{
|
||||
debug_warn("Shader type doesn't support VertexAttribIPointer");
|
||||
}
|
||||
|
||||
void CShaderProgram::BindClientStates()
|
||||
{
|
||||
ENSURE(m_StreamFlags == (m_StreamFlags & (STREAM_POS|STREAM_NORMAL|STREAM_COLOR|STREAM_UV0|STREAM_UV1)));
|
||||
|
|
|
|||
|
|
@ -159,6 +159,7 @@ public:
|
|||
// Uniform-setting methods that subclasses must define:
|
||||
virtual void Uniform(Binding id, float v0, float v1, float v2, float v3) = 0;
|
||||
virtual void Uniform(Binding id, const CMatrix3D& v) = 0;
|
||||
virtual void Uniform(Binding id, size_t count, const CMatrix3D* v) = 0;
|
||||
|
||||
// Convenient uniform-setting wrappers:
|
||||
|
||||
|
|
@ -175,6 +176,7 @@ public:
|
|||
void Uniform(uniform_id_t id, const CColor& v);
|
||||
void Uniform(uniform_id_t id, float v0, float v1, float v2, float v3);
|
||||
void Uniform(uniform_id_t id, const CMatrix3D& v);
|
||||
void Uniform(uniform_id_t id, size_t count, const CMatrix3D* v);
|
||||
|
||||
// Vertex attribute pointers (equivalent to glVertexPointer etc):
|
||||
|
||||
|
|
@ -182,6 +184,8 @@ public:
|
|||
virtual void NormalPointer(GLenum type, GLsizei stride, void* pointer);
|
||||
virtual void ColorPointer(GLint size, GLenum type, GLsizei stride, void* pointer);
|
||||
virtual void TexCoordPointer(GLenum texture, GLint size, GLenum type, GLsizei stride, void* pointer);
|
||||
virtual void VertexAttribPointer(const char* id, GLint size, GLenum type, GLboolean normalized, GLsizei stride, void* pointer);
|
||||
virtual void VertexAttribIPointer(const char* id, GLint size, GLenum type, GLsizei stride, void* pointer);
|
||||
|
||||
/**
|
||||
* Checks that all the required vertex attributes have been set.
|
||||
|
|
|
|||
|
|
@ -115,6 +115,10 @@ public:
|
|||
{
|
||||
}
|
||||
|
||||
virtual void Uniform(Binding UNUSED(id), size_t UNUSED(count), const CMatrix3D* UNUSED(v))
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
std::map<CStrIntern, int> m_UniformIndexes;
|
||||
|
||||
|
|
|
|||
|
|
@ -301,6 +301,42 @@ FUNC2(void, glGetVertexAttribfvARB, glGetVertexAttribfv, "2.0", (GLuint index, G
|
|||
FUNC2(void, glGetVertexAttribivARB, glGetVertexAttribiv, "2.0", (GLuint index, GLenum pname, GLint *params))
|
||||
FUNC2(void, glGetVertexAttribPointervARB, glGetVertexAttribPointerv, "2.0", (GLuint index, GLenum pname, void **pointer))
|
||||
|
||||
// GL_EXT_gpu_shader4 / GL3.0:
|
||||
FUNC2(void, glVertexAttribI1iEXT, glVertexAttribI1i, "3.0", (GLuint index, GLint x))
|
||||
FUNC2(void, glVertexAttribI2iEXT, glVertexAttribI2i, "3.0", (GLuint index, GLint x, GLint y))
|
||||
FUNC2(void, glVertexAttribI3iEXT, glVertexAttribI3i, "3.0", (GLuint index, GLint x, GLint y, GLint z))
|
||||
FUNC2(void, glVertexAttribI4iEXT, glVertexAttribI4i, "3.0", (GLuint index, GLint x, GLint y, GLint z, GLint w))
|
||||
FUNC2(void, glVertexAttribI1uiEXT, glVertexAttribI1ui, "3.0", (GLuint index, GLuint x))
|
||||
FUNC2(void, glVertexAttribI2uiEXT, glVertexAttribI2ui, "3.0", (GLuint index, GLuint x, GLuint y))
|
||||
FUNC2(void, glVertexAttribI3uiEXT, glVertexAttribI3ui, "3.0", (GLuint index, GLuint x, GLuint y, GLuint z))
|
||||
FUNC2(void, glVertexAttribI4uiEXT, glVertexAttribI4ui, "3.0", (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w))
|
||||
FUNC2(void, glVertexAttribI1ivEXT, glVertexAttribI1iv, "3.0", (GLuint index, const GLint *v))
|
||||
FUNC2(void, glVertexAttribI2ivEXT, glVertexAttribI2iv, "3.0", (GLuint index, const GLint *v))
|
||||
FUNC2(void, glVertexAttribI3ivEXT, glVertexAttribI3iv, "3.0", (GLuint index, const GLint *v))
|
||||
FUNC2(void, glVertexAttribI4ivEXT, glVertexAttribI4iv, "3.0", (GLuint index, const GLint *v))
|
||||
FUNC2(void, glVertexAttribI1uivEXT, glVertexAttribI1uiv, "3.0", (GLuint index, const GLuint *v))
|
||||
FUNC2(void, glVertexAttribI2uivEXT, glVertexAttribI2uiv, "3.0", (GLuint index, const GLuint *v))
|
||||
FUNC2(void, glVertexAttribI3uivEXT, glVertexAttribI3uiv, "3.0", (GLuint index, const GLuint *v))
|
||||
FUNC2(void, glVertexAttribI4uivEXT, glVertexAttribI4uiv, "3.0", (GLuint index, const GLuint *v))
|
||||
FUNC2(void, glVertexAttribI4bvEXT, glVertexAttribI4bv, "3.0", (GLuint index, const GLbyte *v))
|
||||
FUNC2(void, glVertexAttribI4svEXT, glVertexAttribI4sv, "3.0", (GLuint index, const GLshort *v))
|
||||
FUNC2(void, glVertexAttribI4ubvEXT, glVertexAttribI4ubv, "3.0", (GLuint index, const GLubyte *v))
|
||||
FUNC2(void, glVertexAttribI4usvEXT, glVertexAttribI4usv, "3.0", (GLuint index, const GLushort *v))
|
||||
FUNC2(void, glVertexAttribIPointerEXT, glVertexAttribIPointer, "3.0", (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer))
|
||||
FUNC2(void, glGetVertexAttribIivEXT, glGetVertexAttribIiv, "3.0", (GLuint index, GLenum pname, GLint *params))
|
||||
FUNC2(void, glGetVertexAttribIuivEXT, glGetVertexAttribIuiv, "3.0", (GLuint index, GLenum pname, GLuint *params))
|
||||
FUNC2(void, glUniform1uiEXT, glUniform1ui, "3.0", (GLint location, GLuint v0))
|
||||
FUNC2(void, glUniform2uiEXT, glUniform2ui, "3.0", (GLint location, GLuint v0, GLuint v1))
|
||||
FUNC2(void, glUniform3uiEXT, glUniform3ui, "3.0", (GLint location, GLuint v0, GLuint v1, GLuint v2))
|
||||
FUNC2(void, glUniform4uiEXT, glUniform4ui, "3.0", (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3))
|
||||
FUNC2(void, glUniform1uivEXT, glUniform1uiv, "3.0", (GLint location, GLsizei count, const GLuint *value))
|
||||
FUNC2(void, glUniform2uivEXT, glUniform2uiv, "3.0", (GLint location, GLsizei count, const GLuint *value))
|
||||
FUNC2(void, glUniform3uivEXT, glUniform3uiv, "3.0", (GLint location, GLsizei count, const GLuint *value))
|
||||
FUNC2(void, glUniform4uivEXT, glUniform4uiv, "3.0", (GLint location, GLsizei count, const GLuint *value))
|
||||
FUNC2(void, glGetUniformuivEXT, glGetUniformuiv, "3.0", (GLuint program, GLint location, GLuint *params))
|
||||
FUNC2(void, glBindFragDataLocationEXT, glBindFragDataLocation, "3.0", (GLuint program, GLuint colorNumber, const char *name))
|
||||
FUNC2(GLint, glGetFragDataLocationEXT, glGetFragDataLocation, "3.0", (GLuint program, const char *name))
|
||||
|
||||
// GL_ARB_occlusion_query / GL1.5:
|
||||
FUNC2(void, glGenQueriesARB, glGenQueries, "1.5", (GLsizei n, GLuint *ids))
|
||||
FUNC2(void, glDeleteQueriesARB, glDeleteQueries, "1.5", (GLsizei n, const GLuint *ids))
|
||||
|
|
|
|||
Loading…
Reference in a new issue