diff options
Diffstat (limited to 'src/library_gl.js')
-rw-r--r-- | src/library_gl.js | 77 |
1 files changed, 48 insertions, 29 deletions
diff --git a/src/library_gl.js b/src/library_gl.js index fa9c0f7f..ed592dda 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -1342,42 +1342,61 @@ var LibraryGL = { Module.ctx.drawArrays(mode, first, count); return; } -#if ASSERTIONS assert(first == 0); // TODO -#endif - // Client attributes are to be used here, emulate that - var stride = 0, bytes = 0, attributes = [], start, renderer = ''; - for (var i = 0; i < GL.immediate.NUM_ATTRIBUTES; i++) { - if (GL.immediate.enabledClientAttributes[i]) attributes.push(GL.immediate.clientAttributes[i]); - } - attributes.sort(function(x, y) { return !x ? (!y ? 0 : 1) : (!y ? -1 : (x.pointer - y.pointer)) }); - start = attributes[0].pointer; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - if (!attribute) break; -#if ASSERTIONS - assert(attribute.stride); - assert(stride == 0 || stride == attribute.stride); // must all be in the same buffer -#endif - stride = attribute.stride; - bytes += attribute.size * 4 * count; // XXX assuming float - renderer += attribute.name; - } - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - if (!attribute) break; - attribute.offset = attribute.pointer - start; -#if ASSERTIONS - assert(0 <= attribute.offset && attribute.offset < stride); // must all be in the same buffer -#endif + + var renderer = GL.immediate.prepareClientAttributes(count); + GL.immediate.mode = mode; + GL.immediate.setRenderer(renderer); + GL.immediate.flush(); + }; + + _glDrawElements = function(mode, count, type, indices) { + if (GL.immediate.totalEnabledClientAttributes == 0) { + Module.ctx.drawElements(mode, count, type, indices); + return; } - GL.immediate.vertexData = {{{ makeHEAPView('F32', 'start', 'start + bytes') }}}; // XXX assuming float - GL.immediate.vertexCounter = bytes / 4; // XXX assuming float + + var renderer = GL.immediate.prepareClientAttributes(count); GL.immediate.mode = mode; GL.immediate.setRenderer(renderer); GL.immediate.flush(); }; }, + + prepareClientAttributes: function(count) { + // Client attributes are to be used here, emulate that + var stride = 0, bytes = 0, attributes = [], start, renderer = ''; + for (var i = 0; i < GL.immediate.NUM_ATTRIBUTES; i++) { + if (GL.immediate.enabledClientAttributes[i]) attributes.push(GL.immediate.clientAttributes[i]); + } + attributes.sort(function(x, y) { return !x ? (!y ? 0 : 1) : (!y ? -1 : (x.pointer - y.pointer)) }); + start = attributes[0].pointer; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (!attribute) break; +#if ASSERTIONS + assert(attribute.stride); + assert(stride == 0 || stride == attribute.stride); // must all be in the same buffer +#endif + stride = attribute.stride; + bytes += attribute.size * 4 * count; // XXX assuming float + renderer += attribute.name; + } + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (!attribute) break; + attribute.offset = attribute.pointer - start; +#if ASSERTIONS + assert(0 <= attribute.offset && attribute.offset < stride); // must all be in the same buffer +#endif + } + + GL.immediate.vertexData = {{{ makeHEAPView('F32', 'start', 'start + bytes') }}}; // XXX assuming float + GL.immediate.vertexCounter = bytes / 4; // XXX assuming float + + return renderer; + }, + flush: function() { var renderer = this.setRenderer(this.renderer); |