Merge pull request #425 from twpayne/glsl-unit

Use glsl-unit for WebGL shaders
This commit is contained in:
Tom Payne
2013-03-25 03:42:27 -07:00
13 changed files with 507 additions and 230 deletions

1
.gitignore vendored
View File

@@ -2,6 +2,7 @@
/bin/plovr*.jar
/build/gh-pages
/build/check-requires-timestamp
/build/glsl-unit
/build/jsdoc-*-timestamp
/build/lint-timestamp
/build/ol.css

View File

@@ -1,10 +1,12 @@
before_install:
- "sudo pip install http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz"
- "git clone https://github.com/jsdoc3/jsdoc && (cd jsdoc && git checkout master)"
- "git clone https://code.google.com/p/glsl-unit/ build/glsl-unit"
before_script:
- "./build.py plovr"
- "./build.py serve-integration-test &"
- "rm src/ol/renderer/webgl/*shader.js"
- "sleep 3"
script: "./build.py JSDOC=jsdoc/jsdoc integration-test"

View File

@@ -21,6 +21,7 @@ if sys.platform == 'win32':
variables.JAVA = os.path.join(
ProgramFiles, 'Java', 'jre7', 'bin', 'java.exe')
variables.JSDOC = 'jsdoc' # FIXME
variables.NODE = 'node'
variables.PYTHON = os.path.join(Python27, 'python.exe')
PHANTOMJS_WINDOWS_ZIP = 'build/phantomjs-1.8.1-windows.zip'
# FIXME we should not need both a pake variable and a Python constant here
@@ -34,9 +35,12 @@ else:
variables.JAVA = 'java'
variables.JAR = 'jar'
variables.JSDOC = 'jsdoc'
variables.NODE = 'node'
variables.PYTHON = 'python'
variables.PHANTOMJS = 'phantomjs'
TEMPLATE_GLSL_COMPILER_JS = 'build/glsl-unit/bin/template_glsl_compiler.js'
variables.BRANCH = output(
'%(GIT)s', 'rev-parse', '--abbrev-ref', 'HEAD').strip()
@@ -73,13 +77,21 @@ INTERNAL_SRC = [
'build/src/internal/src/requireall.js',
'build/src/internal/src/types.js']
GLSL_SRC = [path
for path in ifind('src')
if path.endswith('.glsl')]
SHADER_SRC = [path.replace('.glsl', 'shader.js')
for path in GLSL_SRC]
SPEC = [path
for path in ifind('test/spec')
if path.endswith('.js')]
SRC = [path
for path in ifind('src/ol')
if path.endswith('.js')]
if path.endswith('.js')
if path not in SHADER_SRC]
PLOVR_JAR = 'bin/plovr-eba786b34df9.jar'
PLOVR_JAR_MD5 = '20eac8ccc4578676511cf7ccbfc65100'
@@ -121,22 +133,22 @@ def build_ol_css(t):
t.touch()
@target('build/ol.js', PLOVR_JAR, SRC, EXTERNAL_SRC, 'base.json',
'build/ol.json')
@target('build/ol.js', PLOVR_JAR, SRC, EXTERNAL_SRC, SHADER_SRC,
'base.json', 'build/ol.json')
def build_ol_js(t):
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build', 'build/ol.json')
report_sizes(t)
@target('build/ol-simple.js', PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json',
'build/ol.json', 'build/ol-simple.json')
@target('build/ol-simple.js', PLOVR_JAR, SRC, INTERNAL_SRC, SHADER_SRC,
'base.json', 'build/ol.json', 'build/ol-simple.json')
def build_ol_simple_js(t):
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build', 'build/ol-simple.json')
report_sizes(t)
@target('build/ol-whitespace.js', PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json',
'build/ol.json', 'build/ol-whitespace.json')
@target('build/ol-whitespace.js', PLOVR_JAR, SRC, INTERNAL_SRC, SHADER_SRC,
'base.json', 'build/ol.json', 'build/ol-whitespace.json')
def build_ol_whitespace_js(t):
t.output('%(JAVA)s', '-jar', PLOVR_JAR,
'build', 'build/ol-whitespace.json')
@@ -146,8 +158,8 @@ def build_ol_whitespace_js(t):
virtual('build-all', 'build/ol-all.js')
@target('build/ol-all.js', PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json',
'build/ol-all.json')
@target('build/ol-all.js', PLOVR_JAR, SRC, INTERNAL_SRC, SHADER_SRC,
'base.json', 'build/ol-all.json')
def build_ol_all_js(t):
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build', 'build/ol-all.json')
@@ -173,6 +185,18 @@ def build_src_external_src_types_js(t):
'--typedef', 'src/objectliterals.exports')
for glsl_src in GLSL_SRC:
def shader_src_helper(glsl_src):
@target(glsl_src.replace('.glsl', 'shader.js'), glsl_src,
'src/ol/webgl/shader.mustache')
def shader_src(t):
t.run('%(NODE)s', TEMPLATE_GLSL_COMPILER_JS,
'--input', glsl_src,
'--template', 'src/ol/webgl/shader.mustache',
'--output', t.name)
shader_src_helper(glsl_src)
def _build_require_list(dependencies, output_file_name):
requires = set()
for dependency in dependencies:
@@ -185,7 +209,7 @@ def _build_require_list(dependencies, output_file_name):
f.write('goog.require(\'%s\');\n' % (require,))
@target('build/src/internal/src/requireall.js', SRC)
@target('build/src/internal/src/requireall.js', SRC, SHADER_SRC)
def build_src_internal_src_requireall_js(t):
_build_require_list(t.dependencies, t.name)
@@ -252,7 +276,7 @@ def examples_star_combined_js(name, match):
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build',
'examples/%(id)s.json' % match.groupdict())
report_sizes(t)
dependencies = [PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json',
dependencies = [PLOVR_JAR, SRC, INTERNAL_SRC, SHADER_SRC, 'base.json',
'examples/%(id)s.js' % match.groupdict(),
'examples/%(id)s.json' % match.groupdict()]
return Target(name, action=action, dependencies=dependencies)
@@ -309,7 +333,7 @@ def _strip_comments(lines):
@target('build/check-requires-timestamp', SRC, INTERNAL_SRC, EXTERNAL_SRC,
EXAMPLES_SRC, SPEC)
EXAMPLES_SRC, SHADER_SRC, SPEC)
def build_check_requires_timestamp(t):
unused_count = 0
all_provides = set()
@@ -408,7 +432,7 @@ def gh_pages(t):
virtual('doc', 'build/jsdoc-%(BRANCH)s-timestamp' % vars(variables))
@target('build/jsdoc-%(BRANCH)s-timestamp' % vars(variables), SRC,
@target('build/jsdoc-%(BRANCH)s-timestamp' % vars(variables), SRC, SHADER_SRC,
ifind('doc/template'))
def jsdoc_BRANCH_timestamp(t):
t.run('%(JSDOC)s', '-t', 'doc/template', '-r',

View File

@@ -1,81 +0,0 @@
goog.provide('ol.renderer.webgl.FragmentShader');
goog.provide('ol.renderer.webgl.VertexShader');
goog.require('goog.functions');
goog.require('goog.webgl');
/**
* @constructor
* @param {string} source Source.
*/
ol.renderer.webgl.Shader = function(source) {
/**
* @private
* @type {string}
*/
this.source_ = source;
};
/**
* @return {number} Type.
*/
ol.renderer.webgl.Shader.prototype.getType = goog.abstractMethod;
/**
* @return {string} Source.
*/
ol.renderer.webgl.Shader.prototype.getSource = function() {
return this.source_;
};
/**
* @return {boolean} Is animated?
*/
ol.renderer.webgl.Shader.prototype.isAnimated = goog.functions.FALSE;
/**
* @constructor
* @extends {ol.renderer.webgl.Shader}
* @param {string} source Source.
*/
ol.renderer.webgl.FragmentShader = function(source) {
goog.base(this, source);
};
goog.inherits(ol.renderer.webgl.FragmentShader, ol.renderer.webgl.Shader);
/**
* @inheritDoc
*/
ol.renderer.webgl.FragmentShader.prototype.getType = function() {
return goog.webgl.FRAGMENT_SHADER;
};
/**
* @constructor
* @extends {ol.renderer.webgl.Shader}
* @param {string} source Source.
*/
ol.renderer.webgl.VertexShader = function(source) {
goog.base(this, source);
};
goog.inherits(ol.renderer.webgl.VertexShader, ol.renderer.webgl.Shader);
/**
* @inheritDoc
*/
ol.renderer.webgl.VertexShader.prototype.getType = function() {
return goog.webgl.VERTEX_SHADER;
};

View File

@@ -0,0 +1,31 @@
//! NAMESPACE=ol.renderer.webgl.map
//! COMMON
varying vec2 v_texCoord;
//! VERTEX
attribute vec2 a_position;
attribute vec2 a_texCoord;
uniform mat4 u_texCoordMatrix;
uniform mat4 u_projectionMatrix;
void main(void) {
gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);
v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;
}
//! FRAGMENT
// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp
uniform mat4 u_colorMatrix;
uniform float u_opacity;
uniform sampler2D u_texture;
void main(void) {
vec4 texColor = texture2D(u_texture, v_texCoord);
gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;
gl_FragColor.a = texColor.a * u_opacity;
}

View File

@@ -1,7 +1,6 @@
// FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE)
goog.provide('ol.renderer.webgl.Map');
goog.provide('ol.renderer.webgl.map.shader');
goog.require('goog.array');
goog.require('goog.debug.Logger');
@@ -18,15 +17,15 @@ goog.require('ol.Tile');
goog.require('ol.layer.ImageLayer');
goog.require('ol.layer.TileLayer');
goog.require('ol.renderer.Map');
goog.require('ol.renderer.webgl.FragmentShader');
goog.require('ol.renderer.webgl.ImageLayer');
goog.require('ol.renderer.webgl.TileLayer');
goog.require('ol.renderer.webgl.VertexShader');
goog.require('ol.renderer.webgl.map.shader');
goog.require('ol.structs.Buffer');
goog.require('ol.structs.IntegerSet');
goog.require('ol.structs.LRUCache');
goog.require('ol.webgl');
goog.require('ol.webgl.WebGLContextEventType');
goog.require('ol.webgl.shader');
/**
@@ -50,64 +49,6 @@ ol.renderer.webgl.TextureCacheEntry;
/**
* @constructor
* @extends {ol.renderer.webgl.FragmentShader}
* @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp
*/
ol.renderer.webgl.map.shader.Fragment = function() {
goog.base(this, [
'precision mediump float;',
'',
'uniform mat4 u_colorMatrix;',
'uniform float u_opacity;',
'uniform sampler2D u_texture;',
'',
'varying vec2 v_texCoord;',
'',
'void main(void) {',
'',
' vec4 texColor = texture2D(u_texture, v_texCoord);',
' vec4 color = u_colorMatrix * vec4(texColor.rgb, 1.);',
' color.a = texColor.a * u_opacity;',
'',
' gl_FragColor = color;',
'',
'}'
].join('\n'));
};
goog.inherits(
ol.renderer.webgl.map.shader.Fragment, ol.renderer.webgl.FragmentShader);
goog.addSingletonGetter(ol.renderer.webgl.map.shader.Fragment);
/**
* @constructor
* @extends {ol.renderer.webgl.VertexShader}
*/
ol.renderer.webgl.map.shader.Vertex = function() {
goog.base(this, [
'attribute vec2 a_position;',
'attribute vec2 a_texCoord;',
'',
'uniform mat4 u_texCoordMatrix;',
'uniform mat4 u_projectionMatrix;',
'',
'varying vec2 v_texCoord;',
'',
'void main(void) {',
' gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);',
' v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;',
'}'
].join('\n'));
};
goog.inherits(
ol.renderer.webgl.map.shader.Vertex, ol.renderer.webgl.VertexShader);
goog.addSingletonGetter(ol.renderer.webgl.map.shader.Vertex);
/**
* @constructor
* @extends {ol.renderer.Map}
@@ -221,13 +162,13 @@ ol.renderer.webgl.Map = function(container, map) {
/**
* @private
* @type {ol.renderer.webgl.FragmentShader}
* @type {ol.webgl.shader.Fragment}
*/
this.fragmentShader_ = ol.renderer.webgl.map.shader.Fragment.getInstance();
/**
* @private
* @type {ol.renderer.webgl.VertexShader}
* @type {ol.webgl.shader.Vertex}
*/
this.vertexShader_ = ol.renderer.webgl.map.shader.Vertex.getInstance();
@@ -426,9 +367,8 @@ ol.renderer.webgl.Map.prototype.getGL = function() {
/**
* @param {ol.renderer.webgl.FragmentShader} fragmentShaderObject
* Fragment shader.
* @param {ol.renderer.webgl.VertexShader} vertexShaderObject Vertex shader.
* @param {ol.webgl.shader.Fragment} fragmentShaderObject Fragment shader.
* @param {ol.webgl.shader.Vertex} vertexShaderObject Vertex shader.
* @return {WebGLProgram} Program.
*/
ol.renderer.webgl.Map.prototype.getProgram = function(
@@ -458,7 +398,7 @@ ol.renderer.webgl.Map.prototype.getProgram = function(
/**
* @param {ol.renderer.webgl.Shader} shaderObject Shader object.
* @param {ol.webgl.Shader} shaderObject Shader object.
* @return {WebGLShader} Shader.
*/
ol.renderer.webgl.Map.prototype.getShader = function(shaderObject) {
@@ -586,13 +526,20 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
gl.useProgram(program);
if (goog.isNull(this.locations_)) {
this.locations_ = {
a_position: gl.getAttribLocation(program, 'a_position'),
a_texCoord: gl.getAttribLocation(program, 'a_texCoord'),
u_colorMatrix: gl.getUniformLocation(program, 'u_colorMatrix'),
u_texCoordMatrix: gl.getUniformLocation(program, 'u_texCoordMatrix'),
u_projectionMatrix: gl.getUniformLocation(program, 'u_projectionMatrix'),
u_opacity: gl.getUniformLocation(program, 'u_opacity'),
u_texture: gl.getUniformLocation(program, 'u_texture')
a_position: gl.getAttribLocation(
program, ol.renderer.webgl.map.shader.attribute.a_position),
a_texCoord: gl.getAttribLocation(
program, ol.renderer.webgl.map.shader.attribute.a_texCoord),
u_colorMatrix: gl.getUniformLocation(
program, ol.renderer.webgl.map.shader.uniform.u_colorMatrix),
u_texCoordMatrix: gl.getUniformLocation(
program, ol.renderer.webgl.map.shader.uniform.u_texCoordMatrix),
u_projectionMatrix: gl.getUniformLocation(
program, ol.renderer.webgl.map.shader.uniform.u_projectionMatrix),
u_opacity: gl.getUniformLocation(
program, ol.renderer.webgl.map.shader.uniform.u_opacity),
u_texture: gl.getUniformLocation(
program, ol.renderer.webgl.map.shader.uniform.u_texture)
};
}

View File

@@ -0,0 +1,105 @@
// This file is automatically generated, do not edit
goog.provide('ol.renderer.webgl.map.shader');
goog.require('ol.webgl.shader');
/**
* @constructor
* @extends {ol.webgl.shader.Fragment}
*/
ol.renderer.webgl.map.shader.Fragment = function() {
goog.base(this, ol.renderer.webgl.map.shader.Fragment.SOURCE);
};
goog.inherits(ol.renderer.webgl.map.shader.Fragment, ol.webgl.shader.Fragment);
goog.addSingletonGetter(ol.renderer.webgl.map.shader.Fragment);
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.map\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! FRAGMENT\n// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp\nuniform mat4 u_colorMatrix;\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n vec4 texColor = texture2D(u_texture, v_texCoord);\n gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;\n gl_FragColor.a = texColor.a * u_opacity;\n}\n\n';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform mat4 d;uniform float e;uniform sampler2D f;void main(){vec4 g=texture2D(f,a);gl_FragColor.rgb=(d*vec4(g.rgb,1)).rgb;gl_FragColor.a=g.a*e;}';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.Fragment.SOURCE = goog.DEBUG ?
ol.renderer.webgl.map.shader.Fragment.DEBUG_SOURCE :
ol.renderer.webgl.map.shader.Fragment.OPTIMIZED_SOURCE;
/**
* @constructor
* @extends {ol.webgl.shader.Vertex}
*/
ol.renderer.webgl.map.shader.Vertex = function() {
goog.base(this, ol.renderer.webgl.map.shader.Vertex.SOURCE);
};
goog.inherits(ol.renderer.webgl.map.shader.Vertex, ol.webgl.shader.Vertex);
goog.addSingletonGetter(ol.renderer.webgl.map.shader.Vertex);
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.Vertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.map\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! VERTEX\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);\n v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.Vertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 d,e;uniform mat4 b,c;void main(){gl_Position=c*vec4(d,0,1);a=(b*vec4(e,0,1)).st;}';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.Vertex.SOURCE = goog.DEBUG ?
ol.renderer.webgl.map.shader.Vertex.DEBUG_SOURCE :
ol.renderer.webgl.map.shader.Vertex.OPTIMIZED_SOURCE;
/**
* @constructor
*/
ol.renderer.webgl.map.shader.uniform = function() {};
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.uniform.u_texCoordMatrix =
goog.DEBUG ? 'u_texCoordMatrix' : 'b';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.uniform.u_projectionMatrix =
goog.DEBUG ? 'u_projectionMatrix' : 'c';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.uniform.u_colorMatrix =
goog.DEBUG ? 'u_colorMatrix' : 'd';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.uniform.u_opacity =
goog.DEBUG ? 'u_opacity' : 'e';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.uniform.u_texture =
goog.DEBUG ? 'u_texture' : 'f';
/**
* @constructor
*/
ol.renderer.webgl.map.shader.attribute = function() {};
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.attribute.a_position =
goog.DEBUG ? 'a_position' : 'd';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.map.shader.attribute.a_texCoord =
goog.DEBUG ? 'a_texCoord' : 'e';

View File

@@ -0,0 +1,24 @@
//! NAMESPACE=ol.renderer.webgl.tilelayer
//! COMMON
varying vec2 v_texCoord;
//! VERTEX
attribute vec2 a_position;
attribute vec2 a_texCoord;
uniform vec4 u_tileOffset;
void main(void) {
gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);
v_texCoord = a_texCoord;
}
//! FRAGMENT
uniform sampler2D u_texture;
void main(void) {
gl_FragColor = texture2D(u_texture, v_texCoord);
}

View File

@@ -2,7 +2,6 @@
// FIXME animated shaders! check in redraw
goog.provide('ol.renderer.webgl.TileLayer');
goog.provide('ol.renderer.webgl.tilelayer.shader');
goog.require('goog.array');
goog.require('goog.object');
@@ -18,65 +17,12 @@ goog.require('ol.TileRange');
goog.require('ol.TileState');
goog.require('ol.layer.TileLayer');
goog.require('ol.math');
goog.require('ol.renderer.webgl.FragmentShader');
goog.require('ol.renderer.webgl.Layer');
goog.require('ol.renderer.webgl.VertexShader');
goog.require('ol.renderer.webgl.tilelayer.shader');
goog.require('ol.structs.Buffer');
/**
* @constructor
* @extends {ol.renderer.webgl.FragmentShader}
*/
ol.renderer.webgl.tilelayer.shader.Fragment = function() {
goog.base(this, [
'precision mediump float;',
'',
'uniform sampler2D u_texture;',
'',
'varying vec2 v_texCoord;',
'',
'void main(void) {',
' gl_FragColor = texture2D(u_texture, v_texCoord);',
'}'
].join('\n'));
};
goog.inherits(
ol.renderer.webgl.tilelayer.shader.Fragment,
ol.renderer.webgl.FragmentShader);
goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Fragment);
/**
* @constructor
* @extends {ol.renderer.webgl.VertexShader}
*/
ol.renderer.webgl.tilelayer.shader.Vertex = function() {
goog.base(this, [
'attribute vec2 a_position;',
'attribute vec2 a_texCoord;',
'',
'varying vec2 v_texCoord;',
'',
'uniform vec4 u_tileOffset;',
'',
'void main(void) {',
' gl_Position.xy = a_position * u_tileOffset.xy + u_tileOffset.zw;',
' gl_Position.z = 0.;',
' gl_Position.w = 1.;',
' v_texCoord = a_texCoord;',
'}'
].join('\n'));
};
goog.inherits(
ol.renderer.webgl.tilelayer.shader.Vertex,
ol.renderer.webgl.VertexShader);
goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Vertex);
/**
* @constructor
* @extends {ol.renderer.webgl.Layer}
@@ -89,14 +35,14 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) {
/**
* @private
* @type {ol.renderer.webgl.FragmentShader}
* @type {ol.webgl.shader.Fragment}
*/
this.fragmentShader_ =
ol.renderer.webgl.tilelayer.shader.Fragment.getInstance();
/**
* @private
* @type {ol.renderer.webgl.VertexShader}
* @type {ol.webgl.shader.Vertex}
*/
this.vertexShader_ = ol.renderer.webgl.tilelayer.shader.Vertex.getInstance();
@@ -232,10 +178,14 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
gl.useProgram(program);
if (goog.isNull(this.locations_)) {
this.locations_ = {
a_position: gl.getAttribLocation(program, 'a_position'),
a_texCoord: gl.getAttribLocation(program, 'a_texCoord'),
u_tileOffset: gl.getUniformLocation(program, 'u_tileOffset'),
u_texture: gl.getUniformLocation(program, 'u_texture')
a_position: gl.getAttribLocation(
program, ol.renderer.webgl.tilelayer.shader.attribute.a_position),
a_texCoord: gl.getAttribLocation(
program, ol.renderer.webgl.tilelayer.shader.attribute.a_texCoord),
u_tileOffset: gl.getUniformLocation(
program, ol.renderer.webgl.tilelayer.shader.uniform.u_tileOffset),
u_texture: gl.getUniformLocation(
program, ol.renderer.webgl.tilelayer.shader.uniform.u_texture)
};
}

View File

@@ -0,0 +1,87 @@
// This file is automatically generated, do not edit
goog.provide('ol.renderer.webgl.tilelayer.shader');
goog.require('ol.webgl.shader');
/**
* @constructor
* @extends {ol.webgl.shader.Fragment}
*/
ol.renderer.webgl.tilelayer.shader.Fragment = function() {
goog.base(this, ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE);
};
goog.inherits(ol.renderer.webgl.tilelayer.shader.Fragment, ol.webgl.shader.Fragment);
goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Fragment);
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n//! NAMESPACE=ol.renderer.webgl.tilelayer\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! FRAGMENT\nuniform sampler2D u_texture;\n\nvoid main(void) {\n gl_FragColor = texture2D(u_texture, v_texCoord);\n}\n\n';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform sampler2D c;void main(){gl_FragColor=texture2D(c,a);}';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE = goog.DEBUG ?
ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE :
ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE;
/**
* @constructor
* @extends {ol.webgl.shader.Vertex}
*/
ol.renderer.webgl.tilelayer.shader.Vertex = function() {
goog.base(this, ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE);
};
goog.inherits(ol.renderer.webgl.tilelayer.shader.Vertex, ol.webgl.shader.Vertex);
goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Vertex);
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE = '//! NAMESPACE=ol.renderer.webgl.tilelayer\n\n\n//! COMMON\nvarying vec2 v_texCoord;\n\n\n//! VERTEX\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nuniform vec4 u_tileOffset;\n\nvoid main(void) {\n gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);\n v_texCoord = a_texCoord;\n}\n\n\n';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 c,d;uniform vec4 b;void main(){gl_Position=vec4(c*b.xy+b.zw,0,1);a=d;}';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE = goog.DEBUG ?
ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE :
ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE;
/**
* @constructor
*/
ol.renderer.webgl.tilelayer.shader.uniform = function() {};
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.uniform.u_tileOffset =
goog.DEBUG ? 'u_tileOffset' : 'b';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.uniform.u_texture =
goog.DEBUG ? 'u_texture' : 'c';
/**
* @constructor
*/
ol.renderer.webgl.tilelayer.shader.attribute = function() {};
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.attribute.a_position =
goog.DEBUG ? 'a_position' : 'c';
/**
* @const
* @type {string}
*/
ol.renderer.webgl.tilelayer.shader.attribute.a_texCoord =
goog.DEBUG ? 'a_texCoord' : 'd';

81
src/ol/webgl/shader.js Normal file
View File

@@ -0,0 +1,81 @@
goog.provide('ol.webgl.shader');
goog.require('goog.functions');
goog.require('goog.webgl');
goog.require('ol.webgl');
/**
* @constructor
* @param {string} source Source.
*/
ol.webgl.Shader = function(source) {
/**
* @private
* @type {string}
*/
this.source_ = source;
};
/**
* @return {number} Type.
*/
ol.webgl.Shader.prototype.getType = goog.abstractMethod;
/**
* @return {string} Source.
*/
ol.webgl.Shader.prototype.getSource = function() {
return this.source_;
};
/**
* @return {boolean} Is animated?
*/
ol.webgl.Shader.prototype.isAnimated = goog.functions.FALSE;
/**
* @constructor
* @extends {ol.webgl.Shader}
* @param {string} source Source.
*/
ol.webgl.shader.Fragment = function(source) {
goog.base(this, source);
};
goog.inherits(ol.webgl.shader.Fragment, ol.webgl.Shader);
/**
* @inheritDoc
*/
ol.webgl.shader.Fragment.prototype.getType = function() {
return goog.webgl.FRAGMENT_SHADER;
};
/**
* @constructor
* @extends {ol.webgl.Shader}
* @param {string} source Source.
*/
ol.webgl.shader.Vertex = function(source) {
goog.base(this, source);
};
goog.inherits(ol.webgl.shader.Vertex, ol.webgl.Shader);
/**
* @inheritDoc
*/
ol.webgl.shader.Vertex.prototype.getType = function() {
return goog.webgl.VERTEX_SHADER;
};

View File

@@ -0,0 +1,106 @@
// This file is automatically generated, do not edit
goog.provide('{{namespace}}.shader');
goog.require('ol.webgl.shader');
/**
* @constructor
* @extends {ol.webgl.shader.Fragment}
*/
{{namespace}}.shader.Fragment = function() {
goog.base(this, {{namespace}}.shader.Fragment.SOURCE);
};
goog.inherits({{namespace}}.shader.Fragment, ol.webgl.shader.Fragment);
goog.addSingletonGetter({{namespace}}.shader.Fragment);
/**
* @const
* @type {string}
*/
{{namespace}}.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\n{{getOriginalFragmentSource}}';
/**
* @const
* @type {string}
*/
{{namespace}}.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;{{getFragmentSource}}';
/**
* @const
* @type {string}
*/
{{namespace}}.shader.Fragment.SOURCE = goog.DEBUG ?
{{namespace}}.shader.Fragment.DEBUG_SOURCE :
{{namespace}}.shader.Fragment.OPTIMIZED_SOURCE;
/**
* @constructor
* @extends {ol.webgl.shader.Vertex}
*/
{{namespace}}.shader.Vertex = function() {
goog.base(this, {{namespace}}.shader.Vertex.SOURCE);
};
goog.inherits({{namespace}}.shader.Vertex, ol.webgl.shader.Vertex);
goog.addSingletonGetter({{namespace}}.shader.Vertex);
/**
* @const
* @type {string}
*/
{{namespace}}.shader.Vertex.DEBUG_SOURCE = '{{getOriginalVertexSource}}';
/**
* @const
* @type {string}
*/
{{namespace}}.shader.Vertex.OPTIMIZED_SOURCE = '{{getVertexSource}}';
/**
* @const
* @type {string}
*/
{{namespace}}.shader.Vertex.SOURCE = goog.DEBUG ?
{{namespace}}.shader.Vertex.DEBUG_SOURCE :
{{namespace}}.shader.Vertex.OPTIMIZED_SOURCE;
/**
* @constructor
*/
{{namespace}}.shader.uniform = function() {};
{{#getUniforms}}
/**
* @const
* @type {string}
*/
{{namespace}}.shader.uniform.{{originalName}} =
goog.DEBUG ? '{{originalName}}' : '{{shortName}}';
{{/getUniforms}}
/**
* @constructor
*/
{{namespace}}.shader.attribute = function() {};
{{#getAttributes}}
/**
* @const
* @type {string}
*/
{{namespace}}.shader.attribute.{{originalName}} =
goog.DEBUG ? '{{originalName}}' : '{{shortName}}';
{{/getAttributes}}

View File

@@ -214,7 +214,7 @@ describe('ol.Map', function() {
expect(loc.x).to.eql(destination.x);
expect(loc.y).to.eql(destination.y);
done();
}, duration + goog.async.AnimationDelay.TIMEOUT);
}, duration + 2 * goog.async.AnimationDelay.TIMEOUT);
});