Skip to content

Commit

Permalink
Use generated buffer names
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas Wojciechowski committed Oct 30, 2015
1 parent 79fbf35 commit e221723
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 39 deletions.
55 changes: 31 additions & 24 deletions js/data/bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ function Bucket(options) {

for (var shaderName in this.shaders) {
var shader = this.shaders[shaderName];
this[this.getAddMethodName(shaderName, 'vertex')] = createVertexAddMethod(shaderName, shader);
this[this.getAddMethodName(shaderName, 'element')] = createElementAddMethod(shaderName, shader, false);
this[this.getAddMethodName(shaderName, 'secondElement')] = createElementAddMethod(shaderName, shader, true);
this[this.getAddMethodName(shaderName, 'vertex')] = createVertexAddMethod(shaderName, shader, this.getBufferName(shaderName, 'vertex'));
this[this.getAddMethodName(shaderName, 'element')] = createElementAddMethod(shaderName, shader, this.getBufferName(shaderName, 'element'), false);
this[this.getAddMethodName(shaderName, 'secondElement')] = createElementAddMethod(shaderName, shader, this.getBufferName(shaderName, 'secondElement'), true);
}
}

Expand Down Expand Up @@ -105,30 +105,36 @@ Bucket.prototype.makeRoomFor = function(shaderName, vertexLength) {
*/
Bucket.prototype.resetBuffers = function(buffers) {
this.buffers = buffers;
this.elementGroups = {}


for (var shaderName in this.shaders) {
var shader = this.shaders[shaderName];

var vertexBufferName = shader.vertexBuffer;
if (vertexBufferName && !buffers[vertexBufferName]) {
var vertexBufferName = this.getBufferName(shaderName, 'vertex');
if (shader.vertexBuffer && !buffers[vertexBufferName]) {
buffers[vertexBufferName] = new Buffer({
type: Buffer.BufferType.VERTEX,
attributes: shader.attributes
});
}

var elementBufferName = shader.elementBuffer;
if (elementBufferName && !buffers[elementBufferName]) {
var elementBufferName = this.getBufferName(shaderName, 'element');
if (shader.elementBuffer && !buffers[elementBufferName]) {
buffers[elementBufferName] = createElementBuffer(shader.elementBufferComponents);
}

var secondElementBufferName = shader.secondElementBuffer;
if (secondElementBufferName && !buffers[secondElementBufferName]) {
var secondElementBufferName = this.getBufferName(shaderName, 'secondElement');
if (shader.secondElementBuffer && !buffers[secondElementBufferName]) {
buffers[secondElementBufferName] = createElementBuffer(shader.secondElementBufferComponents);
}
}

this.elementGroups = createElementGroups(this.shaders, this.buffers);
this.elementGroups[shaderName] = new ElementGroups(
buffers[this.getBufferName(shaderName, 'vertex')],
buffers[this.getBufferName(shaderName, 'element')],
buffers[this.getBufferName(shaderName, 'secondElement')]
);
}
};

/**
Expand All @@ -141,6 +147,16 @@ Bucket.prototype.getAddMethodName = function(shaderName, type) {
return 'add' + capitalize(shaderName) + capitalize(type);
};

/**
* Get the name of a buffer.
* @param {string} shaderName The name of the shader that will use the buffer
* @param {string} type One of "vertex", "element", or "secondElement"
* @returns {string}
*/
Bucket.prototype.getBufferName = function(shaderName, type) {
return shaderName + capitalize(type);
};

function createLayoutProperties(layer, zoom) {
var values = new StyleDeclarationSet('layout', layer.type, layer.layout, {}).values();
var fakeZoomHistory = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };
Expand Down Expand Up @@ -168,7 +184,7 @@ function createLayoutProperties(layer, zoom) {
return new LayoutProperties[layer.type](layout);
}

function createVertexAddMethod(shaderName, shader) {
function createVertexAddMethod(shaderName, shader, bufferName) {
if (!shader.vertexBuffer) return null;

var pushArgs = [];
Expand All @@ -179,13 +195,12 @@ function createVertexAddMethod(shaderName, shader) {
var body = '';
body += 'var elementGroup = this.elementGroups.' + shaderName + '.current;\n';
body += 'elementGroup.vertexLength++;\n';
body += 'return this.buffers.' + shader.vertexBuffer + '.push(\n ' + pushArgs.join(',\n ') + '\n) - elementGroup.vertexStartIndex;';
body += 'return this.buffers.' + bufferName + '.push(\n ' + pushArgs.join(',\n ') + '\n) - elementGroup.vertexStartIndex;';

return new Function(shader.attributeArgs, body);
}

function createElementAddMethod(shaderName, shader, isSecond) {
var bufferName = isSecond ? shader.secondElementBuffer : shader.elementBuffer;
function createElementAddMethod(shaderName, shader, bufferName, isSecond) {
if (!bufferName) return function() { assert(false); };
var lengthName = isSecond ? 'secondElementLength' : 'elementLength';

Expand All @@ -196,15 +211,7 @@ function createElementAddMethod(shaderName, shader, isSecond) {
}

function createElementGroups(shaders, buffers) {
var elementGroups = {};
for (var shaderName in shaders) {
var shader = shaders[shaderName];
elementGroups[shaderName] = new ElementGroups(
buffers[shader.vertexBuffer],
buffers[shader.elementBuffer],
buffers[shader.secondElementBuffer]
);
}

return elementGroups;
}

Expand Down
6 changes: 2 additions & 4 deletions js/data/circle_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,8 @@ CircleBucket.prototype = util.inherit(Bucket, {});

CircleBucket.prototype.shaders = {
circle: {

vertexBuffer: 'circleVertex',

elementBuffer: 'circleElement',
vertexBuffer: true,
elementBuffer: true,

attributeArgs: ['x', 'y', 'extrudeX', 'extrudeY'],

Expand Down
7 changes: 3 additions & 4 deletions js/data/fill_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@ FillBucket.prototype = util.inherit(Bucket, {});

FillBucket.prototype.shaders = {
fill: {
vertexBuffer: 'fillVertex',
elementBuffer: 'fillElement',
secondElementBuffer: 'outlineElement',

vertexBuffer: true,
elementBuffer: true,
secondElementBuffer: true,
secondElementBufferComponents: 2,

attributeArgs: ['x', 'y'],
Expand Down
4 changes: 2 additions & 2 deletions js/data/line_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ LineBucket.prototype = util.inherit(Bucket, {});

LineBucket.prototype.shaders = {
line: {
vertexBuffer: 'lineVertex',
elementBuffer: 'lineElement',
vertexBuffer: true,
elementBuffer: true,

attributeArgs: ['point', 'extrude', 'tx', 'ty', 'linesofar'],

Expand Down
8 changes: 4 additions & 4 deletions js/data/symbol_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,15 @@ var shaderAttributes = [{
SymbolBucket.prototype.shaders = {

glyph: {
vertexBuffer: 'glyphVertex',
elementBuffer: 'glyphElement',
vertexBuffer: true,
elementBuffer: true,
attributeArgs: shaderAttributeArgs,
attributes: shaderAttributes
},

icon: {
vertexBuffer: 'iconVertex',
elementBuffer: 'iconElement',
vertexBuffer: true,
elementBuffer: true,
attributeArgs: shaderAttributeArgs,
attributes: shaderAttributes
},
Expand Down
2 changes: 1 addition & 1 deletion js/render/draw_fill.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ function drawFill(painter, layer, posMatrix, tile) {

// Draw all buffers
vertex = tile.buffers.fillVertex;
elements = tile.buffers.outlineElement;
elements = tile.buffers.fillSecondElement;
elements.bind(gl);

for (var k = 0; k < elementGroups.groups.length; k++) {
Expand Down

0 comments on commit e221723

Please sign in to comment.