summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp
diff options
context:
space:
mode:
authorTony Wasserka <neobrainx@gmail.com>2014-01-31 06:13:26 -0800
committerTony Wasserka <neobrainx@gmail.com>2014-01-31 06:13:26 -0800
commit3dd31fe22b2c3b53fa9830b9dc743b87773aec34 (patch)
treeecb2eda85933d52eae117b8a20374b77dd09ff17 /Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp
parent0735fb7a52876939bebda82be89145b1aa344606 (diff)
parenta65162f1cd345b8f206fd01e19ac261d09ac291b (diff)
Merge pull request #11 from degasus/VertexLoaderCleanup
Vertex loader cleanup.
Diffstat (limited to 'Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp38
1 files changed, 18 insertions, 20 deletions
diff --git a/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp b/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp
index c0112c4e9e..4f3f2ad0d7 100644
--- a/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp
+++ b/Source/Core/VideoBackends/OGL/NativeVertexFormat.cpp
@@ -37,11 +37,23 @@ GLVertexFormat::~GLVertexFormat()
inline GLuint VarToGL(VarType t)
{
static const GLuint lookup[5] = {
- GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FLOAT
+ GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT, GL_FLOAT
};
return lookup[t];
}
+static void SetPointer(u32 attrib, u32 stride, const AttributeFormat &format)
+{
+ if (!format.enable)
+ return;
+
+ glEnableVertexAttribArray(attrib);
+ if (format.integer)
+ glVertexAttribIPointer(attrib, format.components, VarToGL(format.type), stride, (u8*)NULL + format.offset);
+ else
+ glVertexAttribPointer(attrib, format.components, VarToGL(format.type), true, stride, (u8*)NULL + format.offset);
+}
+
void GLVertexFormat::Initialize(const PortableVertexDeclaration &_vtx_decl)
{
this->vtx_decl = _vtx_decl;
@@ -60,35 +72,21 @@ void GLVertexFormat::Initialize(const PortableVertexDeclaration &_vtx_decl)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vm->m_index_buffers);
glBindBuffer(GL_ARRAY_BUFFER, vm->m_vertex_buffers);
- glEnableVertexAttribArray(SHADER_POSITION_ATTRIB);
- glVertexAttribPointer(SHADER_POSITION_ATTRIB, 3, GL_FLOAT, GL_FALSE, vtx_decl.stride, (u8*)NULL);
+ SetPointer(SHADER_POSITION_ATTRIB, vertex_stride, vtx_decl.position);
for (int i = 0; i < 3; i++) {
- if (vtx_decl.num_normals > i) {
- glEnableVertexAttribArray(SHADER_NORM0_ATTRIB+i);
- glVertexAttribPointer(SHADER_NORM0_ATTRIB+i, vtx_decl.normal_gl_size, VarToGL(vtx_decl.normal_gl_type), GL_TRUE, vtx_decl.stride, (u8*)NULL + vtx_decl.normal_offset[i]);
- }
+ SetPointer(SHADER_NORM0_ATTRIB+i, vertex_stride, vtx_decl.normals[i]);
}
for (int i = 0; i < 2; i++) {
- if (vtx_decl.color_offset[i] != -1) {
- glEnableVertexAttribArray(SHADER_COLOR0_ATTRIB+i);
- glVertexAttribPointer(SHADER_COLOR0_ATTRIB+i, 4, GL_UNSIGNED_BYTE, GL_TRUE, vtx_decl.stride, (u8*)NULL + vtx_decl.color_offset[i]);
- }
+ SetPointer(SHADER_COLOR0_ATTRIB+i, vertex_stride, vtx_decl.colors[i]);
}
for (int i = 0; i < 8; i++) {
- if (vtx_decl.texcoord_offset[i] != -1) {
- glEnableVertexAttribArray(SHADER_TEXTURE0_ATTRIB+i);
- glVertexAttribPointer(SHADER_TEXTURE0_ATTRIB+i, vtx_decl.texcoord_size[i], VarToGL(vtx_decl.texcoord_gl_type[i]),
- GL_FALSE, vtx_decl.stride, (u8*)NULL + vtx_decl.texcoord_offset[i]);
- }
+ SetPointer(SHADER_TEXTURE0_ATTRIB+i, vertex_stride, vtx_decl.texcoords[i]);
}
- if (vtx_decl.posmtx_offset != -1) {
- glEnableVertexAttribArray(SHADER_POSMTX_ATTRIB);
- glVertexAttribPointer(SHADER_POSMTX_ATTRIB, 4, GL_UNSIGNED_BYTE, GL_FALSE, vtx_decl.stride, (u8*)NULL + vtx_decl.posmtx_offset);
- }
+ SetPointer(SHADER_POSMTX_ATTRIB, vertex_stride, vtx_decl.posmtx);
vm->m_last_vao = VAO;
}