diff --git a/src/core/renderers/webgl/systems/geometry/GeometrySystem.js b/src/core/renderers/webgl/systems/geometry/GeometrySystem.js index 0f2138b..4b948c8 100644 --- a/src/core/renderers/webgl/systems/geometry/GeometrySystem.js +++ b/src/core/renderers/webgl/systems/geometry/GeometrySystem.js @@ -71,6 +71,15 @@ // TODO - optimise later! // don't need to loop through if nothing changed! // maybe look to add an 'autoupdate' to geometry? + this.updateBuffers(geometry); + + } + + + updateBuffers(geometry) + { + const gl = this.gl; + for (let i = 0; i < geometry.buffers.length; i++) { const buffer = geometry.buffers[i]; @@ -80,8 +89,23 @@ if (buffer._updateID !== glBuffer._updateID) { glBuffer._updateID = buffer._updateID; - // TODO - partial upload?? - glBuffer.upload(buffer.data, 0); + + // can cache this on buffer! maybe added a getter / setter? + const type = buffer.index ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER; + const drawType = buffer.static ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW; + + gl.bindBuffer(type, glBuffer.buffer); + + if(glBuffer.byteLength >= buffer.data.byteLength) + { + // offset is always zero for now! + gl.bufferSubData(type, 0, buffer.data); + } + else + { + gl.bufferData(type, buffer.data, drawType); + } + } } } @@ -123,15 +147,7 @@ if (!buffer._glBuffers[CONTEXT_UID]) { - if (buffer.index) - { - buffer._glBuffers[CONTEXT_UID] = GLBuffer.createIndexBuffer(gl, buffer.data); - } - else - { - /* eslint-disable max-len */ - buffer._glBuffers[CONTEXT_UID] = GLBuffer.createVertexBuffer(gl, buffer.data, buffer.static ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW); - } + buffer._glBuffers[CONTEXT_UID] = new GLBufferData(gl.createBuffer()); } } @@ -181,6 +197,7 @@ } } + const vao = gl.createVertexArray(); gl.bindVertexArray(vao); @@ -188,7 +205,7 @@ if (geometry.indexBuffer) { // first update the index buffer if we have one.. - geometry.indexBuffer._glBuffers[CONTEXT_UID].bind(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geometry.indexBuffer._glBuffers[CONTEXT_UID].buffer); } let lastBuffer = null; @@ -204,7 +221,8 @@ { if(lastBuffer !== glBuffer) { - glBuffer.bind(); + gl.bindBuffer(gl.ARRAY_BUFFER, glBuffer.buffer); + lastBuffer = glBuffer; } @@ -226,6 +244,8 @@ } } + // TODO - maybe make this a data object? + // lets wait to see if we need to first! geometry.glVertexArrayObjects[CONTEXT_UID][glShader.id] = vao; gl.bindVertexArray(null); @@ -233,7 +253,6 @@ return vao; } - draw(type, size, start, instanceCount) { const gl = this.gl; @@ -245,7 +264,7 @@ { if(geometry.instanced) { - gl.drawElementsInstanced(type, size || this.indexBuffer.data.length, gl.UNSIGNED_SHORT, (start || 0) * 2, instanceCount || 1); + gl.drawElementsInstanced(type, size || geometry.indexBuffer.data.length, gl.UNSIGNED_SHORT, (start || 0) * 2, instanceCount || 1); } else { @@ -288,3 +307,13 @@ { } } + +class GLBufferData +{ + constructor(buffer) + { + this.buffer = buffer; + this.updateID = -1; + this.byteLength = -1; + } +}