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

View File

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