WebGL points / Added a color attribute
This commit is contained in:
@@ -14,6 +14,7 @@ const VERTEX_SHADER = `
|
|||||||
attribute float a_rotateWithView;
|
attribute float a_rotateWithView;
|
||||||
attribute vec2 a_offsets;
|
attribute vec2 a_offsets;
|
||||||
attribute float a_opacity;
|
attribute float a_opacity;
|
||||||
|
attribute vec4 a_color;
|
||||||
|
|
||||||
uniform mat4 u_projectionMatrix;
|
uniform mat4 u_projectionMatrix;
|
||||||
uniform mat4 u_offsetScaleMatrix;
|
uniform mat4 u_offsetScaleMatrix;
|
||||||
@@ -21,6 +22,7 @@ const VERTEX_SHADER = `
|
|||||||
|
|
||||||
varying vec2 v_texCoord;
|
varying vec2 v_texCoord;
|
||||||
varying float v_opacity;
|
varying float v_opacity;
|
||||||
|
varying vec4 v_color;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
mat4 offsetMatrix = u_offsetScaleMatrix;
|
mat4 offsetMatrix = u_offsetScaleMatrix;
|
||||||
@@ -31,6 +33,7 @@ const VERTEX_SHADER = `
|
|||||||
gl_Position = u_projectionMatrix * vec4(a_position, 0.0, 1.0) + offsets;
|
gl_Position = u_projectionMatrix * vec4(a_position, 0.0, 1.0) + offsets;
|
||||||
v_texCoord = a_texCoord;
|
v_texCoord = a_texCoord;
|
||||||
v_opacity = a_opacity;
|
v_opacity = a_opacity;
|
||||||
|
v_color = a_color;
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
const FRAGMENT_SHADER = `
|
const FRAGMENT_SHADER = `
|
||||||
@@ -38,14 +41,15 @@ const FRAGMENT_SHADER = `
|
|||||||
|
|
||||||
varying vec2 v_texCoord;
|
varying vec2 v_texCoord;
|
||||||
varying float v_opacity;
|
varying float v_opacity;
|
||||||
|
varying vec4 v_color;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
gl_FragColor.rgb = vec3(1.0, 1.0, 1.0);
|
if (v_opacity == 0.0) {
|
||||||
float alpha = v_opacity;
|
|
||||||
if (alpha == 0.0) {
|
|
||||||
discard;
|
discard;
|
||||||
}
|
}
|
||||||
gl_FragColor.a = alpha;
|
gl_FragColor = v_color;
|
||||||
|
gl_FragColor.a *= v_opacity;
|
||||||
|
gl_FragColor.rgb *= gl_FragColor.a;
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -66,9 +70,15 @@ const FRAGMENT_SHADER = `
|
|||||||
* The second argument is 0 for `x` component and 1 for `y`.
|
* The second argument is 0 for `x` component and 1 for `y`.
|
||||||
* @property {function(import("../../Feature").default, number):number} [texCoordCallback] Will be called on every feature in the
|
* @property {function(import("../../Feature").default, number):number} [texCoordCallback] Will be called on every feature in the
|
||||||
* source to compute the texture coordinates of each corner of the quad. This is only done on source change.
|
* source to compute the texture coordinates of each corner of the quad. This is only done on source change.
|
||||||
* The second argument is 0 for `u0` component, 1 or `v0`, 2 for `u1`, and 3 for `v1`.
|
* The second argument is 0 for `u0` component, 1 for `v0`, 2 for `u1`, and 3 for `v1`.
|
||||||
|
* @property {function(import("../../Feature").default, number, number):number} [colorCallback] Will be called on every feature in the
|
||||||
|
* source to compute the color of each corner of the quad. This is only done on source change.
|
||||||
|
* The second argument is 0 for bottom left, 1 for bottom right, 2 for top right and 3 for top left
|
||||||
|
* The third argument is 0 for red, 1 for green, 2 for blue and 3 for alpha
|
||||||
|
* The return value should be between 0 and 1.
|
||||||
* @property {function(import("../../Feature").default):number} [opacityCallback] Will be called on every feature in the
|
* @property {function(import("../../Feature").default):number} [opacityCallback] Will be called on every feature in the
|
||||||
* source to compute the opacity of the quad on screen (from 0 to 1). This is only done on source change.
|
* source to compute the opacity of the quad on screen (from 0 to 1). This is only done on source change.
|
||||||
|
* Note: this is multiplied with the color of the point which can also have an alpha value < 1.
|
||||||
* @property {function(import("../../Feature").default):boolean} [rotateWithViewCallback] Will be called on every feature in the
|
* @property {function(import("../../Feature").default):boolean} [rotateWithViewCallback] Will be called on every feature in the
|
||||||
* source to compute whether the quad on screen must stay upwards (`false`) or follow the view rotation (`true`).
|
* source to compute whether the quad on screen must stay upwards (`false`) or follow the view rotation (`true`).
|
||||||
* This is only done on source change.
|
* This is only done on source change.
|
||||||
@@ -183,6 +193,9 @@ class WebGLPointsLayerRenderer extends LayerRenderer {
|
|||||||
this.texCoordCallback_ = options.texCoordCallback || function(feature, index) {
|
this.texCoordCallback_ = options.texCoordCallback || function(feature, index) {
|
||||||
return index < 2 ? 0 : 1;
|
return index < 2 ? 0 : 1;
|
||||||
};
|
};
|
||||||
|
this.colorCallback_ = options.colorCallback || function(feature, index, component) {
|
||||||
|
return 1;
|
||||||
|
};
|
||||||
this.rotateWithViewCallback_ = options.rotateWithViewCallback || function() {
|
this.rotateWithViewCallback_ = options.rotateWithViewCallback || function() {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -218,6 +231,8 @@ class WebGLPointsLayerRenderer extends LayerRenderer {
|
|||||||
const vectorLayer = /** @type {import("../../layer/Vector.js").default} */ (this.getLayer());
|
const vectorLayer = /** @type {import("../../layer/Vector.js").default} */ (this.getLayer());
|
||||||
const vectorSource = /** @type {import("../../source/Vector.js").default} */ (vectorLayer.getSource());
|
const vectorSource = /** @type {import("../../source/Vector.js").default} */ (vectorLayer.getSource());
|
||||||
|
|
||||||
|
const stride = 12;
|
||||||
|
|
||||||
this.helper_.prepareDraw(frameState);
|
this.helper_.prepareDraw(frameState);
|
||||||
|
|
||||||
if (this.sourceRevision_ < vectorSource.getRevision()) {
|
if (this.sourceRevision_ < vectorSource.getRevision()) {
|
||||||
@@ -242,14 +257,29 @@ class WebGLPointsLayerRenderer extends LayerRenderer {
|
|||||||
const size = this.sizeCallback_(feature);
|
const size = this.sizeCallback_(feature);
|
||||||
const opacity = this.opacityCallback_(feature);
|
const opacity = this.opacityCallback_(feature);
|
||||||
const rotateWithView = this.rotateWithViewCallback_(feature) ? 1 : 0;
|
const rotateWithView = this.rotateWithViewCallback_(feature) ? 1 : 0;
|
||||||
const stride = 8;
|
const v0_r = this.colorCallback_(feature, 0, 0);
|
||||||
|
const v0_g = this.colorCallback_(feature, 0, 1);
|
||||||
|
const v0_b = this.colorCallback_(feature, 0, 2);
|
||||||
|
const v0_a = this.colorCallback_(feature, 0, 3);
|
||||||
|
const v1_r = this.colorCallback_(feature, 1, 0);
|
||||||
|
const v1_g = this.colorCallback_(feature, 1, 1);
|
||||||
|
const v1_b = this.colorCallback_(feature, 1, 2);
|
||||||
|
const v1_a = this.colorCallback_(feature, 1, 3);
|
||||||
|
const v2_r = this.colorCallback_(feature, 2, 0);
|
||||||
|
const v2_g = this.colorCallback_(feature, 2, 1);
|
||||||
|
const v2_b = this.colorCallback_(feature, 2, 2);
|
||||||
|
const v2_a = this.colorCallback_(feature, 2, 3);
|
||||||
|
const v3_r = this.colorCallback_(feature, 3, 0);
|
||||||
|
const v3_g = this.colorCallback_(feature, 3, 1);
|
||||||
|
const v3_b = this.colorCallback_(feature, 3, 2);
|
||||||
|
const v3_a = this.colorCallback_(feature, 3, 3);
|
||||||
const baseIndex = this.verticesBuffer_.getArray().length / stride;
|
const baseIndex = this.verticesBuffer_.getArray().length / stride;
|
||||||
|
|
||||||
this.verticesBuffer_.getArray().push(
|
this.verticesBuffer_.getArray().push(
|
||||||
x, y, -size / 2, -size / 2, u0, v0, opacity, rotateWithView,
|
x, y, -size / 2, -size / 2, u0, v0, opacity, rotateWithView, v0_r, v0_g, v0_b, v0_a,
|
||||||
x, y, +size / 2, -size / 2, u1, v0, opacity, rotateWithView,
|
x, y, +size / 2, -size / 2, u1, v0, opacity, rotateWithView, v1_r, v1_g, v1_b, v1_a,
|
||||||
x, y, +size / 2, +size / 2, u1, v1, opacity, rotateWithView,
|
x, y, +size / 2, +size / 2, u1, v1, opacity, rotateWithView, v2_r, v2_g, v2_b, v2_a,
|
||||||
x, y, -size / 2, +size / 2, u0, v1, opacity, rotateWithView
|
x, y, -size / 2, +size / 2, u0, v1, opacity, rotateWithView, v3_r, v3_g, v3_b, v3_a
|
||||||
);
|
);
|
||||||
this.indicesBuffer_.getArray().push(
|
this.indicesBuffer_.getArray().push(
|
||||||
baseIndex, baseIndex + 1, baseIndex + 3,
|
baseIndex, baseIndex + 1, baseIndex + 3,
|
||||||
@@ -263,11 +293,12 @@ class WebGLPointsLayerRenderer extends LayerRenderer {
|
|||||||
this.helper_.bindBuffer(ELEMENT_ARRAY_BUFFER, this.indicesBuffer_);
|
this.helper_.bindBuffer(ELEMENT_ARRAY_BUFFER, this.indicesBuffer_);
|
||||||
|
|
||||||
const bytesPerFloat = Float32Array.BYTES_PER_ELEMENT;
|
const bytesPerFloat = Float32Array.BYTES_PER_ELEMENT;
|
||||||
this.helper_.enableAttributeArray(DefaultAttrib.POSITION, 2, FLOAT, bytesPerFloat * 8, 0);
|
this.helper_.enableAttributeArray(DefaultAttrib.POSITION, 2, FLOAT, bytesPerFloat * stride, 0);
|
||||||
this.helper_.enableAttributeArray(DefaultAttrib.OFFSETS, 2, FLOAT, bytesPerFloat * 8, bytesPerFloat * 2);
|
this.helper_.enableAttributeArray(DefaultAttrib.OFFSETS, 2, FLOAT, bytesPerFloat * stride, bytesPerFloat * 2);
|
||||||
this.helper_.enableAttributeArray(DefaultAttrib.TEX_COORD, 2, FLOAT, bytesPerFloat * 8, bytesPerFloat * 4);
|
this.helper_.enableAttributeArray(DefaultAttrib.TEX_COORD, 2, FLOAT, bytesPerFloat * stride, bytesPerFloat * 4);
|
||||||
this.helper_.enableAttributeArray(DefaultAttrib.OPACITY, 1, FLOAT, bytesPerFloat * 8, bytesPerFloat * 6);
|
this.helper_.enableAttributeArray(DefaultAttrib.OPACITY, 1, FLOAT, bytesPerFloat * stride, bytesPerFloat * 6);
|
||||||
this.helper_.enableAttributeArray(DefaultAttrib.ROTATE_WITH_VIEW, 1, FLOAT, bytesPerFloat * 8, bytesPerFloat * 7);
|
this.helper_.enableAttributeArray(DefaultAttrib.ROTATE_WITH_VIEW, 1, FLOAT, bytesPerFloat * stride, bytesPerFloat * 7);
|
||||||
|
this.helper_.enableAttributeArray(DefaultAttrib.COLOR, 4, FLOAT, bytesPerFloat * stride, bytesPerFloat * 8);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,8 @@ export const DefaultAttrib = {
|
|||||||
TEX_COORD: 'a_texCoord',
|
TEX_COORD: 'a_texCoord',
|
||||||
OPACITY: 'a_opacity',
|
OPACITY: 'a_opacity',
|
||||||
ROTATE_WITH_VIEW: 'a_rotateWithView',
|
ROTATE_WITH_VIEW: 'a_rotateWithView',
|
||||||
OFFSETS: 'a_offsets'
|
OFFSETS: 'a_offsets',
|
||||||
|
COLOR: 'a_color'
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user