mirror of https://github.com/buggins/dlangui.git
mesh drawing is working; still some problems with 3d math for matrix calculation
This commit is contained in:
parent
60861462fe
commit
5d733dd8c3
|
@ -102,10 +102,15 @@ class UiWidget : VerticalLayout {
|
|||
VertexFormat vfmt = VertexFormat(VertexElementType.POSITION, VertexElementType.COLOR, VertexElementType.TEXCOORD0);
|
||||
_mesh = new Mesh(vfmt);
|
||||
// square
|
||||
_mesh.addVertex([-1,-1, 3, 1,1,1,1, 0,0]);
|
||||
_mesh.addVertex([-1, 1, 3, 1,1,1,1, 1,0]);
|
||||
_mesh.addVertex([ 1, 1, 3, 1,1,1,1, 1,1]);
|
||||
_mesh.addVertex([ 1,-1, 3, 1,1,1,1, 0,1]);
|
||||
|
||||
float x0 = 0.3;
|
||||
float y0 = 0.2;
|
||||
float z0 = -0.9;
|
||||
|
||||
_mesh.addVertex([x0-1,y0-1,z0+0, 1,0,1,1, 0,0]);
|
||||
_mesh.addVertex([x0-1,y0+1,z0+0, 1,1,1,1, 1,0]);
|
||||
_mesh.addVertex([x0+1,y0+1,z0+0, 0,1,1,1, 1,1]);
|
||||
_mesh.addVertex([x0+1,y0-1,z0+0, 1,1,0,1, 0,1]);
|
||||
_mesh.addPart(PrimitiveType.triangles, [0, 1, 2, 2, 3, 0]);
|
||||
|
||||
}
|
||||
|
@ -168,7 +173,8 @@ class UiWidget : VerticalLayout {
|
|||
} else {
|
||||
projectionViewModelMatrix = _scene.viewProjectionMatrix;
|
||||
}
|
||||
//Log.d("matrix uniform: ", projectionViewModelMatrix.m);
|
||||
projectionViewModelMatrix.setIdentity();
|
||||
Log.d("matrix uniform: ", projectionViewModelMatrix.m);
|
||||
|
||||
_program.bind();
|
||||
_program.setUniform("matrix", projectionViewModelMatrix);
|
||||
|
|
|
@ -1083,26 +1083,27 @@ class GLVertexBuffer : VertexBuffer {
|
|||
checkgl!glDeleteVertexArrays(1, &_vao);
|
||||
}
|
||||
|
||||
/// bind into current context
|
||||
override void bind() {
|
||||
checkgl!glBindVertexArray(_vao);
|
||||
|
||||
// TODO: is it necessary to bind vertex/index buffers?
|
||||
// specify vertex buffer
|
||||
//checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||
// specify index buffer
|
||||
//checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||
}
|
||||
|
||||
/// unbind from current context
|
||||
override void unbind() {
|
||||
checkgl!glBindVertexArray(0);
|
||||
checkgl!glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
}
|
||||
///// bind into current context
|
||||
//override void bind() {
|
||||
// checkgl!glBindVertexArray(_vao);
|
||||
//
|
||||
// // TODO: is it necessary to bind vertex/index buffers?
|
||||
// // specify vertex buffer
|
||||
// checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||
// // specify index buffer
|
||||
// checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||
//}
|
||||
//
|
||||
///// unbind from current context
|
||||
//override void unbind() {
|
||||
// checkgl!glBindVertexArray(0);
|
||||
// checkgl!glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
// checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
//}
|
||||
|
||||
/// update vertex element locations for effect/shader program
|
||||
void enableAttributes(GraphicsEffect effect) {
|
||||
checkgl!glBindVertexArray(_vao);
|
||||
// specify vertex buffer
|
||||
checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||
// specify index buffer
|
||||
|
@ -1120,6 +1121,100 @@ 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);
|
||||
}
|
||||
}
|
||||
checkgl!glBindVertexArray(0);
|
||||
checkgl!glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
//unbind();
|
||||
}
|
||||
|
||||
/// set or change data
|
||||
override void setData(Mesh mesh) {
|
||||
_format = mesh.vertexFormat;
|
||||
_indexFragments = mesh.indexFragments;
|
||||
_vertexCount = mesh.vertexCount;
|
||||
const(ushort[]) indexData = mesh.indexData;
|
||||
|
||||
Log.d("GLVertexBuffer.setData vertex data size=", mesh.vertexData.length, " index data size=", indexData.length, " vertex count=", _vertexCount, " indexBuffer=", _indexBuffer, " vertexBuffer=", _vertexBuffer, " vao=", _vao);
|
||||
|
||||
// vertex buffer
|
||||
checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||
checkgl!glBufferData(GL_ARRAY_BUFFER, _format.vertexSize * mesh.vertexCount, mesh.vertexData.ptr, GL_STATIC_DRAW);
|
||||
checkgl!glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
// index buffer
|
||||
checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||
checkgl!glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexData.length * ushort.sizeof, indexData.ptr, GL_STATIC_DRAW);
|
||||
checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
// vertex layout
|
||||
//checkgl!glBindVertexArray(_vao);
|
||||
// specify vertex buffer
|
||||
//checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||
// specify index buffer
|
||||
//checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||
|
||||
//unbind();
|
||||
}
|
||||
|
||||
/// draw mesh using specified effect
|
||||
override void draw(GraphicsEffect effect) {
|
||||
//bind();
|
||||
enableAttributes(effect);
|
||||
Log.d("draw ", _indexFragments);
|
||||
foreach (fragment; _indexFragments) {
|
||||
checkgl!glDrawRangeElements(primitiveTypeToGL(fragment.type),
|
||||
0, _vertexCount - 1, // The first to last vertex
|
||||
fragment.end - fragment.start, // count of indexes used to draw elements
|
||||
GL_UNSIGNED_SHORT,
|
||||
cast(char*)(fragment.start * short.sizeof) // offset from index buffer beginning to fragment start
|
||||
);
|
||||
}
|
||||
disableAttributes(effect);
|
||||
//unbind();
|
||||
}
|
||||
}
|
||||
|
||||
class DummyVertexBuffer : VertexBuffer {
|
||||
protected VertexFormat _format;
|
||||
protected IndexFragment[] _indexFragments;
|
||||
protected int _vertexCount;
|
||||
protected const(float)[] _vertexData;
|
||||
protected const(ushort)[] _indexData;
|
||||
|
||||
this() {
|
||||
}
|
||||
|
||||
~this() {
|
||||
}
|
||||
|
||||
///// bind into current context
|
||||
//override void bind() {
|
||||
//}
|
||||
//
|
||||
///// unbind from current context
|
||||
//override void unbind() {
|
||||
//}
|
||||
|
||||
/// update vertex element locations for effect/shader program
|
||||
void enableAttributes(GraphicsEffect effect) {
|
||||
int offset = 0;
|
||||
for(int i = 0; i < _format.length; i++) {
|
||||
int loc = effect.getVertexElementLocation(_format[i].type);
|
||||
if (loc >= 0) {
|
||||
checkgl!glVertexAttribPointer(loc, _format[i].size, GL_FLOAT, GL_FALSE, _format.vertexSize, cast(char*)(offset));
|
||||
checkgl!glEnableVertexAttribArray(loc);
|
||||
} else {
|
||||
Log.d("Attribute location not found for ", _format[i].type);
|
||||
}
|
||||
offset += _format[i].byteSize;
|
||||
}
|
||||
}
|
||||
|
||||
void disableAttributes(GraphicsEffect effect) {
|
||||
for(int i = 0; i < _format.length; i++) {
|
||||
int loc = effect.getVertexElementLocation(_format[i].type);
|
||||
|
@ -1134,35 +1229,22 @@ class GLVertexBuffer : VertexBuffer {
|
|||
_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);
|
||||
// index buffer
|
||||
checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||
const(ushort[]) indexData = mesh.indexData;
|
||||
checkgl!glBufferData(GL_ELEMENT_ARRAY_BUFFER, ushort.sizeof * mesh.indexData.length, indexData.ptr, GL_STATIC_DRAW);
|
||||
// vertex layout
|
||||
checkgl!glBindVertexArray(_vao);
|
||||
// specify vertex buffer
|
||||
checkgl!glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||
// specify index buffer
|
||||
checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||
|
||||
unbind();
|
||||
_vertexData = mesh.vertexData;
|
||||
_indexData = mesh.indexData;
|
||||
}
|
||||
|
||||
/// draw mesh using specified effect
|
||||
override void draw(GraphicsEffect effect) {
|
||||
bind();
|
||||
//bind();
|
||||
enableAttributes(effect);
|
||||
foreach (fragment; _indexFragments) {
|
||||
checkgl!glDrawRangeElements(primitiveTypeToGL(fragment.type),
|
||||
0, _vertexCount,
|
||||
fragment.end - fragment.start,
|
||||
GL_UNSIGNED_SHORT, cast(char*)(fragment.start * short.sizeof));
|
||||
0, _vertexCount,
|
||||
fragment.end - fragment.start,
|
||||
GL_UNSIGNED_SHORT, cast(char*)(fragment.start * short.sizeof));
|
||||
}
|
||||
disableAttributes(effect);
|
||||
unbind();
|
||||
//unbind();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -30,9 +30,9 @@ enum PrimitiveType : int {
|
|||
/// Vertex buffer object base class
|
||||
class VertexBuffer {
|
||||
/// bind into current context
|
||||
void bind() {}
|
||||
//void bind() {}
|
||||
/// unbind from current context
|
||||
void unbind() {}
|
||||
//void unbind() {}
|
||||
/// set or change data
|
||||
void setData(Mesh mesh) { }
|
||||
/// draw mesh using specified effect
|
||||
|
|
Loading…
Reference in New Issue