trying to get mesh drawing working for #183

This commit is contained in:
Vadim Lopatin 2016-02-29 14:58:17 +03:00
parent 99325e8dbb
commit b7b44d3e14
2 changed files with 23 additions and 11 deletions

View File

@ -316,9 +316,7 @@ class GLProgram : GraphicsEffect {
vb = new GLVertexBuffer();
mesh.vertexBuffer = vb;
}
vb.bind();
vb.draw(this);
vb.unbind();
}
}
@ -1068,6 +1066,7 @@ alias FBO = GLObject!(GLObjectTypes.Framebuffer, GL_FRAMEBUFFER);
class GLVertexBuffer : VertexBuffer {
protected VertexFormat _format;
protected IndexFragment[] _indexFragments;
protected int _vertexCount;
protected GLuint _vertexBuffer;
protected GLuint _indexBuffer;
protected GLuint _vao;
@ -1090,9 +1089,9 @@ class GLVertexBuffer : VertexBuffer {
// TODO: is it necessary to bind vertex/index buffers?
// specify vertex buffer
checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
//checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
// specify index buffer
checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
//checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
}
/// unbind from current context
@ -1103,7 +1102,11 @@ class GLVertexBuffer : VertexBuffer {
}
/// update vertex element locations for effect/shader program
override void prepareDrawing(GraphicsEffect effect) {
void enableAttributes(GraphicsEffect effect) {
// specify vertex buffer
checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
// specify index buffer
checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
int offset = 0;
for(int i = 0; i < _format.length; i++) {
int loc = effect.getVertexElementLocation(_format[i].type);
@ -1117,10 +1120,20 @@ class GLVertexBuffer : VertexBuffer {
}
}
void disableAttributes(GraphicsEffect effect) {
for(int i = 0; i < _format.length; i++) {
int loc = effect.getVertexElementLocation(_format[i].type);
if (loc >= 0) {
checkgl!glDisableVertexAttribArray(loc);
}
}
}
/// set or change data
override void setData(Mesh mesh) {
_format = mesh.vertexFormat;
_indexFragments = mesh.indexFragments;
_vertexCount = mesh.vertexCount;
// vertex buffer
checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
checkgl!glBufferData(GL_ARRAY_BUFFER, _format.vertexSize * mesh.vertexCount, mesh.vertexData.ptr, GL_STATIC_DRAW);
@ -1141,13 +1154,14 @@ class GLVertexBuffer : VertexBuffer {
/// draw mesh using specified effect
override void draw(GraphicsEffect effect) {
bind();
prepareDrawing(effect);
enableAttributes(effect);
foreach (fragment; _indexFragments) {
glDrawRangeElements(primitiveTypeToGL(fragment.type),
fragment.start, fragment.end,
checkgl!glDrawRangeElements(primitiveTypeToGL(fragment.type),
0, _vertexCount,
fragment.end - fragment.start,
GL_UNSIGNED_SHORT, null);
GL_UNSIGNED_SHORT, cast(char*)(fragment.start * short.sizeof));
}
disableAttributes(effect);
unbind();
}
}

View File

@ -35,8 +35,6 @@ class VertexBuffer {
void unbind() {}
/// set or change data
void setData(Mesh mesh) { }
/// update vertex element locations for effect/shader program
void prepareDrawing(GraphicsEffect effect) { }
/// draw mesh using specified effect
void draw(GraphicsEffect effect) { }
}