Skip to content

Commit 784e2b9

Browse files
committed
Remove the need for split shader
1 parent b34546a commit 784e2b9

3 files changed

Lines changed: 33 additions & 46 deletions

File tree

debug/satellites-custom-layer.js

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const KM_TO_M = 1000;
22
const TIME_STEP = 3 * 1000;
33

4-
const globeVertCode = `
4+
const vertCode = `
55
attribute vec3 a_pos_ecef;
66
attribute vec3 a_pos_merc;
77
@@ -11,16 +11,6 @@ const globeVertCode = `
1111
}
1212
`;
1313

14-
const mercVertCode = `
15-
precision highp float;
16-
attribute vec3 a_pos_merc;
17-
18-
void main() {
19-
gl_PointSize = 30.;
20-
gl_Position = project_custom_layer(a_pos_merc);
21-
}
22-
`;
23-
2414
const fragCode = `
2515
precision highp float;
2616
uniform vec4 u_color;
@@ -83,8 +73,7 @@ const satellitesLayer = {
8373
this.posEcefVbo = gl.createBuffer();
8474
this.posMercVbo = gl.createBuffer();
8575

86-
this.globeProgram = createProgram(gl, map.customLayerVertexHeader.concat(globeVertCode), fragCode);
87-
this.mercProgram = createProgram(gl, map.customLayerVertexHeader.concat(mercVertCode), fragCode);
76+
this.program = createProgram(gl, map.customLayerVertexHeader.concat(vertCode), fragCode);
8877

8978
fetch('space-track-leo.txt').then(r => r.text()).then(rawData => {
9079
const tleData = rawData.replace(/\r/g, '')
@@ -126,21 +115,20 @@ const satellitesLayer = {
126115
}
127116
},
128117

129-
getShaderProgram (projection) {
130-
return projection && projection.name === 'globe' ? this.globeProgram : this.mercProgram;
118+
getShaderProgram () {
119+
return this.program;
131120
},
132121

133-
render (gl, projectionMatrix, projection) {
122+
render (gl, projectionMatrix) {
134123
if (this.satData) {
135124
this.updateBuffers();
136125

137-
const program = this.getShaderProgram(projection);
138126
const primitiveCount = this.posEcef.length / 3;
139127
gl.disable(gl.DEPTH_TEST);
140-
gl.useProgram(program);
128+
gl.useProgram(this.program);
141129

142-
updateVboAndActivateAttrib(gl, program, this.posEcefVbo, this.posEcef, "a_pos_ecef");
143-
updateVboAndActivateAttrib(gl, program, this.posMercVbo, this.posMerc, "a_pos_merc");
130+
updateVboAndActivateAttrib(gl, this.program, this.posEcefVbo, this.posEcef, "a_pos_ecef");
131+
updateVboAndActivateAttrib(gl, this.program, this.posMercVbo, this.posMerc, "a_pos_merc");
144132

145133
gl.drawArrays(gl.POINTS, 0, primitiveCount);
146134
}

src/render/draw_custom.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,26 +90,24 @@ function drawCustom(painter: Painter, sourceCache: SourceCache, layer: CustomSty
9090

9191
context.setDepthMode(depthMode);
9292

93-
const shaderProgram = implementation.getShaderProgram && implementation.getShaderProgram(painter.transform.getProjection());
94-
if (painter.transform.projection.name === "globe") {
95-
if (shaderProgram) {
96-
context.gl.useProgram(shaderProgram);
93+
const shaderProgram = implementation.getShaderProgram && implementation.getShaderProgram();
94+
if (shaderProgram) {
95+
context.gl.useProgram(shaderProgram);
96+
context.gl.uniform1f(context.gl.getUniformLocation(shaderProgram, "u_isGlobe"), +(painter.transform.projection.name === "globe"));
97+
context.gl.uniform1f(context.gl.getUniformLocation(shaderProgram, "u_transition"), globeToMercatorTransition(painter.transform.zoom));
98+
99+
if (painter.transform.projection.name === "globe") {
97100
const center = painter.transform.pointMerc;
98101
const globeProjection = mat4.multiply([], painter.transform.customLayerMatrix(), painter.transform.globeToMercatorMatrix());
99-
const mercatorProjection = createMercatorGlobeMatrix(painter.transform.customLayerMatrix(), painter.transform.pixelsPerMeterRatio, center)
102+
const mercatorProjection = createMercatorGlobeMatrix(painter.transform.customLayerMatrix(), painter.transform.pixelsPerMeterRatio, center);
100103
context.gl.uniformMatrix4fv(context.gl.getUniformLocation(shaderProgram, "u_projection"), false, globeProjection);
101104
context.gl.uniformMatrix4fv(context.gl.getUniformLocation(shaderProgram, "u_mercatorProjection"), false, mercatorProjection);
102-
context.gl.uniform1f(context.gl.getUniformLocation(shaderProgram, "u_transition"), globeToMercatorTransition(painter.transform.zoom));
103-
}
104-
105-
implementation.render(context.gl, painter.transform.customLayerMatrix(), painter.transform.getProjection());
106-
} else {
107-
if (shaderProgram) {
108-
context.gl.useProgram(shaderProgram);
105+
} else {
109106
context.gl.uniformMatrix4fv(context.gl.getUniformLocation(shaderProgram, "u_projection"), false, painter.transform.customLayerMatrix());
110107
}
111-
implementation.render(context.gl, painter.transform.customLayerMatrix(), painter.transform.getProjection());
112108
}
109+
110+
implementation.render(context.gl, painter.transform.customLayerMatrix());
113111

114112
context.setDirty();
115113
painter.setBaseState();

src/style/style_layer/custom_style_layer.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import assert from 'assert';
77
import type {ValidationErrors} from '../validate_style.js';
88
import type {ProjectionSpecification} from '../../style-spec/types.js';
99

10-
type CustomRenderMethod = (gl: WebGLRenderingContext, matrix: Array<number>, projection: ?ProjectionSpecification) => void;
10+
type CustomRenderMethod = (gl: WebGLRenderingContext, matrix: Array<number>) => void;
1111

1212
/**
1313
* Interface for custom style layers. This is a specification for
@@ -194,23 +194,24 @@ export function customLayerVertexHeader(): string {
194194
return `
195195
uniform mat4 u_projection;
196196
uniform mat4 u_mercatorProjection;
197+
uniform float u_isGlobe;
197198
uniform float u_transition;
198199
199200
vec4 project_custom_layer(vec3 pos_merc, vec3 pos_ecef) {
200-
vec4 projected_pos = u_projection * vec4(pos_ecef, 1.0);
201-
projected_pos /= projected_pos.w;
201+
if (u_isGlobe == 1.0) {
202+
vec4 projected_pos = u_projection * vec4(pos_ecef, 1.0);
203+
projected_pos /= projected_pos.w;
202204
203-
if (u_transition > 0.0) {
204-
vec4 mercator = u_mercatorProjection * vec4(pos_merc, 1.0);
205-
mercator /= mercator.w;
206-
projected_pos = mix(projected_pos, mercator, u_transition);
207-
}
208-
209-
return projected_pos;
210-
}
205+
if (u_transition > 0.0) {
206+
vec4 mercator = u_mercatorProjection * vec4(pos_merc, 1.0);
207+
mercator /= mercator.w;
208+
projected_pos = mix(projected_pos, mercator, u_transition);
209+
}
211210
212-
vec4 project_custom_layer(vec3 pos_merc) {
213-
return u_projection * vec4(pos_merc, 1.0);
211+
return projected_pos;
212+
} else {
213+
return u_projection * vec4(pos_merc, 1.0);
214+
}
214215
}
215216
`;
216217
}

0 commit comments

Comments
 (0)