diff --git a/src/ol/renderer/webgl/webglvectorlayer2pointcollection.glsl b/src/ol/renderer/webgl/webglvectorlayer2pointcollection.glsl new file mode 100644 index 0000000000..07f09ef42e --- /dev/null +++ b/src/ol/renderer/webgl/webglvectorlayer2pointcollection.glsl @@ -0,0 +1,21 @@ +//! NAMESPACE=ol.renderer.webgl.vectorlayer2.shader.PointCollection +//! CLASS=ol.renderer.webgl.vectorlayer2.shader.PointCollection + + +//! VERTEX +attribute vec2 a_position; +uniform float u_pointSize; +uniform mat4 u_modelViewMatrix; + +void main(void) { + gl_Position = u_modelViewMatrix * vec4(a_position, 0., 1.); + gl_PointSize = u_pointSize; +} + + +//! FRAGMENT +uniform vec4 u_color; + +void main(void) { + gl_FragColor = u_color; +} diff --git a/src/ol/renderer/webgl/webglvectorlayer2pointcollectionshader.js b/src/ol/renderer/webgl/webglvectorlayer2pointcollectionshader.js new file mode 100644 index 0000000000..825697a28f --- /dev/null +++ b/src/ol/renderer/webgl/webglvectorlayer2pointcollectionshader.js @@ -0,0 +1,82 @@ +// This file is automatically generated, do not edit +goog.provide('ol.renderer.webgl.vectorlayer2.shader.PointCollection'); +goog.require('ol.webgl.shader'); +/** + * @constructor + * @extends {ol.webgl.shader.Fragment} + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment = function() { + goog.base(this, ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment.SOURCE); +}; +goog.inherits(ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment, ol.webgl.shader.Fragment); +goog.addSingletonGetter(ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment); +/** + * @const + * @type {string} + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.vectorlayer2.shader.PointCollection\n//! CLASS=ol.renderer.webgl.vectorlayer2.shader.PointCollection\n\n\n//! FRAGMENT\nuniform vec4 u_color;\n\nvoid main(void) {\n gl_FragColor = u_color;\n}\n\n'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment.OPTIMIZED_SOURCE = 'precision mediump float;uniform vec4 c;void main(){gl_FragColor=c;}'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment.SOURCE = goog.DEBUG ? + ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment.DEBUG_SOURCE : + ol.renderer.webgl.vectorlayer2.shader.PointCollectionFragment.OPTIMIZED_SOURCE; +/** + * @constructor + * @extends {ol.webgl.shader.Vertex} + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex = function() { + goog.base(this, ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex.SOURCE); +}; +goog.inherits(ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex, ol.webgl.shader.Vertex); +goog.addSingletonGetter(ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex); +/** + * @const + * @type {string} + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.vectorlayer2.shader.PointCollection\n//! CLASS=ol.renderer.webgl.vectorlayer2.shader.PointCollection\n\n\n//! VERTEX\nattribute vec2 a_position;\nuniform float u_pointSize;\nuniform mat4 u_modelViewMatrix;\n\nvoid main(void) {\n gl_Position = u_modelViewMatrix * vec4(a_position, 0., 1.);\n gl_PointSize = u_pointSize;\n}\n\n\n'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex.OPTIMIZED_SOURCE = 'attribute vec2 c;uniform float a;uniform mat4 b;void main(){gl_Position=b*vec4(c,0,1);gl_PointSize=a;}'; +/** + * @const + * @type {string} + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex.SOURCE = goog.DEBUG ? + ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex.DEBUG_SOURCE : + ol.renderer.webgl.vectorlayer2.shader.PointCollectionVertex.OPTIMIZED_SOURCE; +/** + * @constructor + * @param {WebGLRenderingContext} gl GL. + * @param {WebGLProgram} program Program. + */ +ol.renderer.webgl.vectorlayer2.shader.PointCollection.Locations = function(gl, program) { + /** + * @type {WebGLUniformLocation} + */ + this.u_pointSize = gl.getUniformLocation( + program, goog.DEBUG ? 'u_pointSize' : 'a'); + /** + * @type {WebGLUniformLocation} + */ + this.u_modelViewMatrix = gl.getUniformLocation( + program, goog.DEBUG ? 'u_modelViewMatrix' : 'b'); + /** + * @type {WebGLUniformLocation} + */ + this.u_color = gl.getUniformLocation( + program, goog.DEBUG ? 'u_color' : 'c'); + /** + * @type {number} + */ + this.a_position = gl.getAttribLocation( + program, goog.DEBUG ? 'a_position' : 'c'); +}; diff --git a/src/ol/renderer/webgl/webglvectorlayer2renderer.js b/src/ol/renderer/webgl/webglvectorlayer2renderer.js new file mode 100644 index 0000000000..d16d4fa8ec --- /dev/null +++ b/src/ol/renderer/webgl/webglvectorlayer2renderer.js @@ -0,0 +1,156 @@ +goog.provide('ol.renderer.webgl.VectorLayer2'); + +goog.require('goog.vec.Mat4'); +goog.require('goog.webgl'); +goog.require('ol.math'); +goog.require('ol.renderer.webgl.Layer'); +goog.require('ol.renderer.webgl.vectorlayer2.shader.PointCollection'); + + + +/** + * @constructor + * @extends {ol.renderer.webgl.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.VectorLayer2} vectorLayer2 Vector layer. + */ +ol.renderer.webgl.VectorLayer2 = function(mapRenderer, vectorLayer2) { + + goog.base(this, mapRenderer, vectorLayer2); + + goog.vec.Mat4.makeIdentity(this.projectionMatrix); + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.modelViewMatrix_ = goog.vec.Mat4.createNumberIdentity(); + + /** + * @private + * @type {ol.renderer.webgl.vectorlayer2.shader.PointCollection.Locations} + */ + this.pointCollectionLocations_ = null; + +}; +goog.inherits(ol.renderer.webgl.VectorLayer2, ol.renderer.webgl.Layer); + + +/** + * @return {ol.layer.VectorLayer2} Vector layer. + */ +ol.renderer.webgl.VectorLayer2.prototype.getVectorLayer = function() { + return /** @type {ol.layer.VectorLayer2} */ (this.getLayer()); +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.VectorLayer2.prototype.handleWebGLContextLost = function() { + goog.base(this, 'handleWebGLContextLost'); + this.pointCollectionLocations_ = null; +}; + + +/** + * @inheritDoc + */ +ol.renderer.webgl.VectorLayer2.prototype.renderFrame = + function(frameState, layerState) { + + var mapRenderer = this.getWebGLMapRenderer(); + var gl = mapRenderer.getGL(); + + var view2DState = frameState.view2DState; + + var vectorLayer = this.getVectorLayer(); + var vectorSource = vectorLayer.getVectorSource(); + + var size = frameState.size; + var framebufferDimension = ol.math.roundUpToPowerOfTwo( + Math.max(size[0], size[1])); + + this.bindFramebuffer(frameState, framebufferDimension); + gl.viewport(0, 0, framebufferDimension, framebufferDimension); + + gl.clearColor(0, 0, 0, 0); + gl.clear(goog.webgl.COLOR_BUFFER_BIT); + gl.enable(goog.webgl.BLEND); + + goog.vec.Mat4.makeIdentity(this.modelViewMatrix_); + if (view2DState.rotation !== 0) { + goog.vec.Mat4.rotateZ(this.modelViewMatrix_, -view2DState.rotation); + } + goog.vec.Mat4.scale(this.modelViewMatrix_, + 2 / (framebufferDimension * view2DState.resolution), + 2 / (framebufferDimension * view2DState.resolution), + 1); + goog.vec.Mat4.translate(this.modelViewMatrix_, + -view2DState.center[0], + -view2DState.center[1], + 0); + + var pointCollections = vectorSource.getPointCollections(); + if (pointCollections.length > 0) { + this.renderPointCollections(pointCollections); + } + + goog.vec.Mat4.makeIdentity(this.texCoordMatrix); + goog.vec.Mat4.translate(this.texCoordMatrix, + 0.5, + 0.5, + 0); + goog.vec.Mat4.scale(this.texCoordMatrix, + size[0] / framebufferDimension, + size[1] / framebufferDimension, + 1); + goog.vec.Mat4.translate(this.texCoordMatrix, + -0.5, + -0.5, + 0); + +}; + + +/** + * @param {Array.