Add ol.renderer.webgl.VectorLayer2

This commit is contained in:
Tom Payne
2013-04-23 18:52:23 +02:00
parent bed8c44859
commit e4b5ec8f0b
3 changed files with 259 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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');
};

View File

@@ -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.<ol.geom2.PointCollection>} pointCollections Point collections.
*/
ol.renderer.webgl.VectorLayer2.prototype.renderPointCollections =
function(pointCollections) {
var mapRenderer = this.getWebGLMapRenderer();
var gl = mapRenderer.getGL();
var fragmentShader = ol.renderer.webgl.vectorlayer2.shader.
PointCollectionFragment.getInstance();
var vertexShader = ol.renderer.webgl.vectorlayer2.shader.
PointCollectionVertex.getInstance();
var program = mapRenderer.getProgram(fragmentShader, vertexShader);
gl.useProgram(program);
if (goog.isNull(this.pointCollectionLocations_)) {
this.pointCollectionLocations_ =
new ol.renderer.webgl.vectorlayer2.shader.PointCollection.Locations(
gl, program);
}
gl.uniformMatrix4fv(this.pointCollectionLocations_.u_modelViewMatrix, false,
this.modelViewMatrix_);
var buf, dim, i, pointCollection;
for (i = 0; i < pointCollections.length; ++i) {
pointCollection = pointCollections[i];
buf = pointCollection.buf;
dim = pointCollection.dim;
mapRenderer.bindBuffer(goog.webgl.ARRAY_BUFFER, buf);
gl.enableVertexAttribArray(this.pointCollectionLocations_.a_position);
gl.vertexAttribPointer(this.pointCollectionLocations_.a_position, 2,
goog.webgl.FLOAT, false, 4 * dim, 0);
gl.uniform4fv(this.pointCollectionLocations_.u_color, [1, 0, 0, 0.75]);
gl.uniform1f(this.pointCollectionLocations_.u_pointSize, 3);
buf.forEachRange(function(start, stop) {
gl.drawArrays(goog.webgl.POINTS, start / dim, (stop - start) / dim);
});
}
};