Skip to content

Commit

Permalink
convert mat4 exMatrix to a vec2 extrudeScale
Browse files Browse the repository at this point in the history
The matrix was only be used to scale vec2s. We don't need a mat4 to do
that. This should be slightly faster
  • Loading branch information
ansis committed Apr 26, 2016
1 parent 6c37e94 commit eab813c
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 34 deletions.
5 changes: 1 addition & 4 deletions js/geo/transform.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,7 @@ Transform.prototype = {
this.width = width;
this.height = height;

// The extrusion matrix
this.exMatrix = mat4.create();
mat4.ortho(this.exMatrix, 0, width, height, 0, 0, -1);

this.pixelsToGLUnits = [2 / width, -2 / height];
this._calcProjMatrix();
this._constrain();
},
Expand Down
2 changes: 1 addition & 1 deletion js/render/draw_circle.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ function drawCircles(painter, source, layer, coords) {

var program = painter.useProgram('circle', bucket.getProgramMacros('circle', layer));

gl. uniformMatrix4fv(program.u_exmatrix, false, painter.transform.exMatrix);
gl.uniform2fv(program.u_extrude_scale, painter.transform.pixelsToGLUnits);
gl.uniform1f(program.u_blur, layer.paint['circle-blur']);
gl.uniform1f(program.u_devicepixelratio, browser.devicePixelRatio);
gl.uniform1f(program.u_opacity, layer.paint['circle-opacity']);
Expand Down
25 changes: 11 additions & 14 deletions js/render/draw_symbol.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
'use strict';

var mat4 = require('gl-matrix').mat4;

var browser = require('../util/browser');
var drawCollisionDebug = require('./draw_collision_debug');
var util = require('../util/util');
Expand Down Expand Up @@ -113,24 +111,23 @@ function drawSymbol(painter, layer, posMatrix, tile, bucket, elementGroups, isTe

var tr = painter.transform;
var alignedWithMap = rotationAlignment === 'map';

var fontSize = size;
var defaultSize = isText ? 24 : 1;
var fontScale = fontSize / defaultSize;

var skewed = alignedWithMap;
var exMatrix, s, gammaScale;
var extrudeScale, s, gammaScale;

if (skewed) {
exMatrix = mat4.create();
s = pixelsToTileUnits(tile, 1, painter.transform.zoom);
s = pixelsToTileUnits(tile, 1, painter.transform.zoom) * fontScale;
gammaScale = 1 / Math.cos(tr._pitch);
extrudeScale = [s, s];
} else {
exMatrix = mat4.clone(painter.transform.exMatrix);
s = painter.transform.altitude;
s = painter.transform.altitude * fontScale;
gammaScale = 1;
extrudeScale = [ tr.pixelsToGLUnits[0] * s, tr.pixelsToGLUnits[1] * s];
}
mat4.scale(exMatrix, exMatrix, [s, s, 1]);

var fontSize = size;
var defaultSize = isText ? 24 : 1;
var fontScale = fontSize / defaultSize;
mat4.scale(exMatrix, exMatrix, [ fontScale, fontScale, 1 ]);

// calculate how much longer the real world distance is at the top of the screen
// than at the middle of the screen.
Expand All @@ -145,7 +142,6 @@ function drawSymbol(painter, layer, posMatrix, tile, bucket, elementGroups, isTe

var program = painter.useProgram(sdf ? 'sdf' : 'icon');
gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(posMatrix, tile, translate, translateAnchor));
gl.uniformMatrix4fv(program.u_exmatrix, false, exMatrix);

var texsize;
if (isText) {
Expand All @@ -169,6 +165,7 @@ function drawSymbol(painter, layer, posMatrix, tile, bucket, elementGroups, isTe
gl.uniform2fv(program.u_texsize, texsize);
gl.uniform1i(program.u_skewed, skewed);
gl.uniform1f(program.u_extra, extra);
gl.uniform2fv(program.u_extrude_scale, extrudeScale);

// adjust min/max zooms for variable font sizes
var zoomAdjust = Math.log(fontSize / elementGroups.adjustedSize) / Math.LN2 || 0;
Expand Down
6 changes: 3 additions & 3 deletions shaders/circle.vertex.glsl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
precision highp float;

uniform mat4 u_matrix;
uniform mat4 u_exmatrix;
uniform vec2 u_extrude_scale;
uniform float u_devicepixelratio;

attribute vec2 a_pos;
Expand Down Expand Up @@ -64,14 +64,14 @@ void main(void) {
// unencode the extrusion vector that we snuck into the a_pos vector
v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);

vec4 extrude = u_exmatrix * vec4(v_extrude * radius, 0, 0);
vec2 extrude = v_extrude * radius * u_extrude_scale;
// multiply a_pos by 0.5, since we had it * 2 in order to sneak
// in extrusion data
gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);

// gl_Position is divided by gl_Position.w after this shader runs.
// Multiply the extrude by it so that it isn't affected by it.
gl_Position += extrude * gl_Position.w;
gl_Position.xy += extrude * gl_Position.w;

#ifdef ATTRIBUTE_A_COLOR
v_color = a_color / 255.0;
Expand Down
12 changes: 5 additions & 7 deletions shaders/icon.vertex.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ attribute vec4 a_data2;
// matrix is for the vertex position, exmatrix is for rotating and projecting
// the extrusion vector.
uniform mat4 u_matrix;
uniform mat4 u_exmatrix;

uniform mediump float u_zoom;
uniform bool u_skewed;
uniform float u_extra;
uniform vec2 u_extrude_scale;

uniform vec2 u_texsize;

Expand All @@ -26,18 +27,15 @@ void main() {
mediump float a_minzoom = a_zoom[0];
mediump float a_maxzoom = a_zoom[1];

float a_fadedist = 10.0;

// u_zoom is the current zoom level adjusted for the change in font size
mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));

vec2 extrude = u_extrude_scale * (a_offset / 64.0);
if (u_skewed) {
vec4 extrude = u_exmatrix * vec4(a_offset / 64.0, 0, 0);
gl_Position = u_matrix * vec4(a_pos + extrude.xy, 0, 1);
gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);
gl_Position.z += z * gl_Position.w;
} else {
vec4 extrude = u_exmatrix * vec4(a_offset / 64.0, z, 0);
gl_Position = u_matrix * vec4(a_pos, 0, 1) + extrude;
gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);
}

v_tex = a_tex / u_texsize;
Expand Down
9 changes: 4 additions & 5 deletions shaders/sdf.vertex.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ attribute vec4 a_data2;
// matrix is for the vertex position, exmatrix is for rotating and projecting
// the extrusion vector.
uniform mat4 u_matrix;
uniform mat4 u_exmatrix;

uniform mediump float u_zoom;
uniform bool u_skewed;
uniform float u_extra;
uniform vec2 u_extrude_scale;

uniform vec2 u_texsize;

Expand All @@ -31,13 +31,12 @@ void main() {
// u_zoom is the current zoom level adjusted for the change in font size
mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));

vec2 extrude = u_extrude_scale * (a_offset / 64.0);
if (u_skewed) {
vec4 extrude = u_exmatrix * vec4(a_offset / 64.0, 0, 0);
gl_Position = u_matrix * vec4(a_pos + extrude.xy, 0, 1);
gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);
gl_Position.z += z * gl_Position.w;
} else {
vec4 extrude = u_exmatrix * vec4(a_offset / 64.0, z, 0);
gl_Position = u_matrix * vec4(a_pos, 0, 1) + extrude;
gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);
}

// position of y on the screen
Expand Down

0 comments on commit eab813c

Please sign in to comment.