|
@@ -3,24 +3,19 @@
|
|
|
* @author alteredq / http://alteredqualia.com/
|
|
|
*/
|
|
|
|
|
|
-THREE.LensFlarePlugin = function () {
|
|
|
+THREE.LensFlarePlugin = function ( renderer ) {
|
|
|
+
|
|
|
+ var gl = renderer.context;
|
|
|
|
|
|
- var _gl, _renderer, _precision;
|
|
|
-
|
|
|
var flares = [];
|
|
|
-
|
|
|
+
|
|
|
var vertexBuffer, elementBuffer;
|
|
|
var program, attributes, uniforms;
|
|
|
var hasVertexTexture;
|
|
|
-
|
|
|
- var tempTexture, occlusionTexture;
|
|
|
|
|
|
- this.init = function ( renderer ) {
|
|
|
-
|
|
|
- _gl = renderer.context;
|
|
|
- _renderer = renderer;
|
|
|
+ var tempTexture, occlusionTexture;
|
|
|
|
|
|
- _precision = renderer.getPrecision();
|
|
|
+ var init = function () {
|
|
|
|
|
|
var vertices = new Float32Array( [
|
|
|
-1, -1, 0, 0,
|
|
@@ -36,64 +31,65 @@ THREE.LensFlarePlugin = function () {
|
|
|
|
|
|
// buffers
|
|
|
|
|
|
- vertexBuffer = _gl.createBuffer();
|
|
|
- elementBuffer = _gl.createBuffer();
|
|
|
+ vertexBuffer = gl.createBuffer();
|
|
|
+ elementBuffer = gl.createBuffer();
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, vertexBuffer );
|
|
|
- _gl.bufferData( _gl.ARRAY_BUFFER, vertices, _gl.STATIC_DRAW );
|
|
|
+ gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );
|
|
|
+ gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
|
|
|
- _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faces, _gl.STATIC_DRAW );
|
|
|
+ gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
|
|
|
+ gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );
|
|
|
|
|
|
// textures
|
|
|
|
|
|
- tempTexture = _gl.createTexture();
|
|
|
- occlusionTexture = _gl.createTexture();
|
|
|
+ tempTexture = gl.createTexture();
|
|
|
+ occlusionTexture = gl.createTexture();
|
|
|
|
|
|
- _gl.bindTexture( _gl.TEXTURE_2D, tempTexture );
|
|
|
- _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, 16, 16, 0, _gl.RGB, _gl.UNSIGNED_BYTE, null );
|
|
|
- _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
|
|
|
- _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
|
|
|
- _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );
|
|
|
- _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );
|
|
|
+ gl.bindTexture( gl.TEXTURE_2D, tempTexture );
|
|
|
+ gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );
|
|
|
+ gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );
|
|
|
+ gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );
|
|
|
+ gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
|
|
|
+ gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
|
|
|
|
|
|
- _gl.bindTexture( _gl.TEXTURE_2D, occlusionTexture );
|
|
|
- _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, 16, 16, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null );
|
|
|
- _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
|
|
|
- _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
|
|
|
- _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );
|
|
|
- _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );
|
|
|
+ gl.bindTexture( gl.TEXTURE_2D, occlusionTexture );
|
|
|
+ gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );
|
|
|
+ gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );
|
|
|
+ gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );
|
|
|
+ gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
|
|
|
+ gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
|
|
|
|
|
|
- hasVertexTexture = _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ) > 0;
|
|
|
+ hasVertexTexture = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ) > 0;
|
|
|
|
|
|
if ( hasVertexTexture ) {
|
|
|
|
|
|
- program = createProgram( THREE.ShaderFlares[ "lensFlareVertexTexture" ], _precision );
|
|
|
+ program = createProgram( THREE.ShaderFlares[ "lensFlareVertexTexture" ] );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- program = createProgram( THREE.ShaderFlares[ "lensFlare" ], _precision );
|
|
|
+ program = createProgram( THREE.ShaderFlares[ "lensFlare" ] );
|
|
|
|
|
|
}
|
|
|
|
|
|
attributes = {
|
|
|
- vertex: _gl.getAttribLocation ( program, "position" ),
|
|
|
- uv: _gl.getAttribLocation ( program, "uv" )
|
|
|
+ vertex: gl.getAttribLocation ( program, "position" ),
|
|
|
+ uv: gl.getAttribLocation ( program, "uv" )
|
|
|
}
|
|
|
|
|
|
uniforms = {
|
|
|
- renderType: _gl.getUniformLocation( program, "renderType" ),
|
|
|
- map: _gl.getUniformLocation( program, "map" ),
|
|
|
- occlusionMap: _gl.getUniformLocation( program, "occlusionMap" ),
|
|
|
- opacity: _gl.getUniformLocation( program, "opacity" ),
|
|
|
- color: _gl.getUniformLocation( program, "color" ),
|
|
|
- scale: _gl.getUniformLocation( program, "scale" ),
|
|
|
- rotation: _gl.getUniformLocation( program, "rotation" ),
|
|
|
- screenPosition: _gl.getUniformLocation( program, "screenPosition" )
|
|
|
+ renderType: gl.getUniformLocation( program, "renderType" ),
|
|
|
+ map: gl.getUniformLocation( program, "map" ),
|
|
|
+ occlusionMap: gl.getUniformLocation( program, "occlusionMap" ),
|
|
|
+ opacity: gl.getUniformLocation( program, "opacity" ),
|
|
|
+ color: gl.getUniformLocation( program, "color" ),
|
|
|
+ scale: gl.getUniformLocation( program, "scale" ),
|
|
|
+ rotation: gl.getUniformLocation( program, "rotation" ),
|
|
|
+ screenPosition: gl.getUniformLocation( program, "screenPosition" )
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
+ this.init = function () {}; // TODO: Remove
|
|
|
|
|
|
/*
|
|
|
* Render lens flares
|
|
@@ -129,25 +125,31 @@ THREE.LensFlarePlugin = function () {
|
|
|
var screenPosition = new THREE.Vector3( 1, 1, 0 ),
|
|
|
screenPositionPixels = new THREE.Vector2( 1, 1 );
|
|
|
|
|
|
- _gl.useProgram( program );
|
|
|
+ if ( program === undefined ) {
|
|
|
+
|
|
|
+ init();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ gl.useProgram( program );
|
|
|
|
|
|
- _gl.enableVertexAttribArray( attributes.vertex );
|
|
|
- _gl.enableVertexAttribArray( attributes.uv );
|
|
|
+ gl.enableVertexAttribArray( attributes.vertex );
|
|
|
+ gl.enableVertexAttribArray( attributes.uv );
|
|
|
|
|
|
// loop through all lens flares to update their occlusion and positions
|
|
|
// setup gl and common used attribs/unforms
|
|
|
|
|
|
- _gl.uniform1i( uniforms.occlusionMap, 0 );
|
|
|
- _gl.uniform1i( uniforms.map, 1 );
|
|
|
+ gl.uniform1i( uniforms.occlusionMap, 0 );
|
|
|
+ gl.uniform1i( uniforms.map, 1 );
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, vertexBuffer );
|
|
|
- _gl.vertexAttribPointer( attributes.vertex, 2, _gl.FLOAT, false, 2 * 8, 0 );
|
|
|
- _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 );
|
|
|
+ gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );
|
|
|
+ gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );
|
|
|
+ gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
|
|
|
+ gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
|
|
|
|
|
|
- _gl.disable( _gl.CULL_FACE );
|
|
|
- _gl.depthMask( false );
|
|
|
+ gl.disable( gl.CULL_FACE );
|
|
|
+ gl.depthMask( false );
|
|
|
|
|
|
for ( var i = 0, l = flares.length; i < l; i ++ ) {
|
|
|
|
|
@@ -180,38 +182,38 @@ THREE.LensFlarePlugin = function () {
|
|
|
|
|
|
// save current RGB to temp texture
|
|
|
|
|
|
- _gl.activeTexture( _gl.TEXTURE1 );
|
|
|
- _gl.bindTexture( _gl.TEXTURE_2D, tempTexture );
|
|
|
- _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 );
|
|
|
+ gl.activeTexture( gl.TEXTURE1 );
|
|
|
+ gl.bindTexture( gl.TEXTURE_2D, tempTexture );
|
|
|
+ gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 );
|
|
|
|
|
|
|
|
|
// render pink quad
|
|
|
|
|
|
- _gl.uniform1i( uniforms.renderType, 0 );
|
|
|
- _gl.uniform2f( uniforms.scale, scale.x, scale.y );
|
|
|
- _gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );
|
|
|
+ gl.uniform1i( uniforms.renderType, 0 );
|
|
|
+ gl.uniform2f( uniforms.scale, scale.x, scale.y );
|
|
|
+ gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );
|
|
|
|
|
|
- _gl.disable( _gl.BLEND );
|
|
|
- _gl.enable( _gl.DEPTH_TEST );
|
|
|
+ gl.disable( gl.BLEND );
|
|
|
+ gl.enable( gl.DEPTH_TEST );
|
|
|
|
|
|
- _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
|
|
|
+ gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );
|
|
|
|
|
|
|
|
|
// copy result to occlusionMap
|
|
|
|
|
|
- _gl.activeTexture( _gl.TEXTURE0 );
|
|
|
- _gl.bindTexture( _gl.TEXTURE_2D, occlusionTexture );
|
|
|
- _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 );
|
|
|
+ gl.activeTexture( gl.TEXTURE0 );
|
|
|
+ gl.bindTexture( gl.TEXTURE_2D, occlusionTexture );
|
|
|
+ gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 );
|
|
|
|
|
|
|
|
|
// restore graphics
|
|
|
|
|
|
- _gl.uniform1i( uniforms.renderType, 1 );
|
|
|
- _gl.disable( _gl.DEPTH_TEST );
|
|
|
+ gl.uniform1i( uniforms.renderType, 1 );
|
|
|
+ gl.disable( gl.DEPTH_TEST );
|
|
|
|
|
|
- _gl.activeTexture( _gl.TEXTURE1 );
|
|
|
- _gl.bindTexture( _gl.TEXTURE_2D, tempTexture );
|
|
|
- _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
|
|
|
+ gl.activeTexture( gl.TEXTURE1 );
|
|
|
+ gl.bindTexture( gl.TEXTURE_2D, tempTexture );
|
|
|
+ gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );
|
|
|
|
|
|
|
|
|
// update object positions
|
|
@@ -230,8 +232,8 @@ THREE.LensFlarePlugin = function () {
|
|
|
|
|
|
// render flares
|
|
|
|
|
|
- _gl.uniform1i( uniforms.renderType, 2 );
|
|
|
- _gl.enable( _gl.BLEND );
|
|
|
+ gl.uniform1i( uniforms.renderType, 2 );
|
|
|
+ gl.enable( gl.BLEND );
|
|
|
|
|
|
for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {
|
|
|
|
|
@@ -248,17 +250,17 @@ THREE.LensFlarePlugin = function () {
|
|
|
scale.x = size * invAspect;
|
|
|
scale.y = size;
|
|
|
|
|
|
- _gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );
|
|
|
- _gl.uniform2f( uniforms.scale, scale.x, scale.y );
|
|
|
- _gl.uniform1f( uniforms.rotation, sprite.rotation );
|
|
|
+ gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );
|
|
|
+ gl.uniform2f( uniforms.scale, scale.x, scale.y );
|
|
|
+ gl.uniform1f( uniforms.rotation, sprite.rotation );
|
|
|
|
|
|
- _gl.uniform1f( uniforms.opacity, sprite.opacity );
|
|
|
- _gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );
|
|
|
+ gl.uniform1f( uniforms.opacity, sprite.opacity );
|
|
|
+ gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );
|
|
|
|
|
|
- _renderer.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );
|
|
|
- _renderer.setTexture( sprite.texture, 1 );
|
|
|
+ renderer.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );
|
|
|
+ renderer.setTexture( sprite.texture, 1 );
|
|
|
|
|
|
- _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
|
|
|
+ gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -270,33 +272,33 @@ THREE.LensFlarePlugin = function () {
|
|
|
|
|
|
// restore gl
|
|
|
|
|
|
- _gl.enable( _gl.CULL_FACE );
|
|
|
- _gl.enable( _gl.DEPTH_TEST );
|
|
|
- _gl.depthMask( true );
|
|
|
+ gl.enable( gl.CULL_FACE );
|
|
|
+ gl.enable( gl.DEPTH_TEST );
|
|
|
+ gl.depthMask( true );
|
|
|
|
|
|
- _renderer.resetGLState();
|
|
|
+ renderer.resetGLState();
|
|
|
|
|
|
};
|
|
|
|
|
|
- function createProgram ( shader, precision ) {
|
|
|
+ function createProgram ( shader ) {
|
|
|
|
|
|
- var program = _gl.createProgram();
|
|
|
+ var program = gl.createProgram();
|
|
|
|
|
|
- var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER );
|
|
|
- var vertexShader = _gl.createShader( _gl.VERTEX_SHADER );
|
|
|
+ var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );
|
|
|
+ var vertexShader = gl.createShader( gl.VERTEX_SHADER );
|
|
|
|
|
|
- var prefix = "precision " + precision + " float;\n";
|
|
|
+ var prefix = "precision " + renderer.getPrecision() + " float;\n";
|
|
|
|
|
|
- _gl.shaderSource( fragmentShader, prefix + shader.fragmentShader );
|
|
|
- _gl.shaderSource( vertexShader, prefix + shader.vertexShader );
|
|
|
+ gl.shaderSource( fragmentShader, prefix + shader.fragmentShader );
|
|
|
+ gl.shaderSource( vertexShader, prefix + shader.vertexShader );
|
|
|
|
|
|
- _gl.compileShader( fragmentShader );
|
|
|
- _gl.compileShader( vertexShader );
|
|
|
+ gl.compileShader( fragmentShader );
|
|
|
+ gl.compileShader( vertexShader );
|
|
|
|
|
|
- _gl.attachShader( program, fragmentShader );
|
|
|
- _gl.attachShader( program, vertexShader );
|
|
|
+ gl.attachShader( program, fragmentShader );
|
|
|
+ gl.attachShader( program, vertexShader );
|
|
|
|
|
|
- _gl.linkProgram( program );
|
|
|
+ gl.linkProgram( program );
|
|
|
|
|
|
return program;
|
|
|
|