55
66THREE . LensFlarePlugin = function ( ) {
77
8+ var _gl , _renderer , _precision ;
9+
810 var flares = [ ] ;
9-
10- var _gl , _renderer , _precision , _lensFlare = { } ;
11+
12+ var vertexBuffer , elementBuffer ;
13+ var program , attributes , uniforms ;
14+ var hasVertexTexture ;
15+
16+ var tempTexture , occlusionTexture ;
1117
1218 this . init = function ( renderer ) {
1319
@@ -16,82 +22,75 @@ THREE.LensFlarePlugin = function () {
1622
1723 _precision = renderer . getPrecision ( ) ;
1824
19- _lensFlare . vertices = new Float32Array ( 8 + 8 ) ;
20- _lensFlare . faces = new Uint16Array ( 6 ) ;
21-
22- var i = 0 ;
23- _lensFlare . vertices [ i ++ ] = - 1 ; _lensFlare . vertices [ i ++ ] = - 1 ; // vertex
24- _lensFlare . vertices [ i ++ ] = 0 ; _lensFlare . vertices [ i ++ ] = 0 ; // uv... etc.
25-
26- _lensFlare . vertices [ i ++ ] = 1 ; _lensFlare . vertices [ i ++ ] = - 1 ;
27- _lensFlare . vertices [ i ++ ] = 1 ; _lensFlare . vertices [ i ++ ] = 0 ;
28-
29- _lensFlare . vertices [ i ++ ] = 1 ; _lensFlare . vertices [ i ++ ] = 1 ;
30- _lensFlare . vertices [ i ++ ] = 1 ; _lensFlare . vertices [ i ++ ] = 1 ;
31-
32- _lensFlare . vertices [ i ++ ] = - 1 ; _lensFlare . vertices [ i ++ ] = 1 ;
33- _lensFlare . vertices [ i ++ ] = 0 ; _lensFlare . vertices [ i ++ ] = 1 ;
25+ var vertices = new Float32Array ( [
26+ - 1 , - 1 , 0 , 0 ,
27+ 1 , - 1 , 1 , 0 ,
28+ 1 , 1 , 1 , 1 ,
29+ - 1 , 1 , 0 , 1
30+ ] ) ;
3431
35- i = 0 ;
36- _lensFlare . faces [ i ++ ] = 0 ; _lensFlare . faces [ i ++ ] = 1 ; _lensFlare . faces [ i ++ ] = 2 ;
37- _lensFlare . faces [ i ++ ] = 0 ; _lensFlare . faces [ i ++ ] = 2 ; _lensFlare . faces [ i ++ ] = 3 ;
32+ var faces = new Uint16Array ( [
33+ 0 , 1 , 2 ,
34+ 0 , 2 , 3
35+ ] ) ;
3836
3937 // buffers
4038
41- _lensFlare . vertexBuffer = _gl . createBuffer ( ) ;
42- _lensFlare . elementBuffer = _gl . createBuffer ( ) ;
39+ vertexBuffer = _gl . createBuffer ( ) ;
40+ elementBuffer = _gl . createBuffer ( ) ;
4341
44- _gl . bindBuffer ( _gl . ARRAY_BUFFER , _lensFlare . vertexBuffer ) ;
45- _gl . bufferData ( _gl . ARRAY_BUFFER , _lensFlare . vertices , _gl . STATIC_DRAW ) ;
42+ _gl . bindBuffer ( _gl . ARRAY_BUFFER , vertexBuffer ) ;
43+ _gl . bufferData ( _gl . ARRAY_BUFFER , vertices , _gl . STATIC_DRAW ) ;
4644
47- _gl . bindBuffer ( _gl . ELEMENT_ARRAY_BUFFER , _lensFlare . elementBuffer ) ;
48- _gl . bufferData ( _gl . ELEMENT_ARRAY_BUFFER , _lensFlare . faces , _gl . STATIC_DRAW ) ;
45+ _gl . bindBuffer ( _gl . ELEMENT_ARRAY_BUFFER , elementBuffer ) ;
46+ _gl . bufferData ( _gl . ELEMENT_ARRAY_BUFFER , faces , _gl . STATIC_DRAW ) ;
4947
5048 // textures
5149
52- _lensFlare . tempTexture = _gl . createTexture ( ) ;
53- _lensFlare . occlusionTexture = _gl . createTexture ( ) ;
50+ tempTexture = _gl . createTexture ( ) ;
51+ occlusionTexture = _gl . createTexture ( ) ;
5452
55- _gl . bindTexture ( _gl . TEXTURE_2D , _lensFlare . tempTexture ) ;
53+ _gl . bindTexture ( _gl . TEXTURE_2D , tempTexture ) ;
5654 _gl . texImage2D ( _gl . TEXTURE_2D , 0 , _gl . RGB , 16 , 16 , 0 , _gl . RGB , _gl . UNSIGNED_BYTE , null ) ;
5755 _gl . texParameteri ( _gl . TEXTURE_2D , _gl . TEXTURE_WRAP_S , _gl . CLAMP_TO_EDGE ) ;
5856 _gl . texParameteri ( _gl . TEXTURE_2D , _gl . TEXTURE_WRAP_T , _gl . CLAMP_TO_EDGE ) ;
5957 _gl . texParameteri ( _gl . TEXTURE_2D , _gl . TEXTURE_MAG_FILTER , _gl . NEAREST ) ;
6058 _gl . texParameteri ( _gl . TEXTURE_2D , _gl . TEXTURE_MIN_FILTER , _gl . NEAREST ) ;
6159
62- _gl . bindTexture ( _gl . TEXTURE_2D , _lensFlare . occlusionTexture ) ;
60+ _gl . bindTexture ( _gl . TEXTURE_2D , occlusionTexture ) ;
6361 _gl . texImage2D ( _gl . TEXTURE_2D , 0 , _gl . RGBA , 16 , 16 , 0 , _gl . RGBA , _gl . UNSIGNED_BYTE , null ) ;
6462 _gl . texParameteri ( _gl . TEXTURE_2D , _gl . TEXTURE_WRAP_S , _gl . CLAMP_TO_EDGE ) ;
6563 _gl . texParameteri ( _gl . TEXTURE_2D , _gl . TEXTURE_WRAP_T , _gl . CLAMP_TO_EDGE ) ;
6664 _gl . texParameteri ( _gl . TEXTURE_2D , _gl . TEXTURE_MAG_FILTER , _gl . NEAREST ) ;
6765 _gl . texParameteri ( _gl . TEXTURE_2D , _gl . TEXTURE_MIN_FILTER , _gl . NEAREST ) ;
6866
69- if ( _gl . getParameter ( _gl . MAX_VERTEX_TEXTURE_IMAGE_UNITS ) <= 0 ) {
67+ hasVertexTexture = _gl . getParameter ( _gl . MAX_VERTEX_TEXTURE_IMAGE_UNITS ) > 0 ;
7068
71- _lensFlare . hasVertexTexture = false ;
72- _lensFlare . program = createProgram ( THREE . ShaderFlares [ "lensFlare" ] , _precision ) ;
69+ if ( hasVertexTexture ) {
70+
71+ program = createProgram ( THREE . ShaderFlares [ "lensFlare" ] , _precision ) ;
7372
7473 } else {
7574
76- _lensFlare . hasVertexTexture = true ;
77- _lensFlare . program = createProgram ( THREE . ShaderFlares [ "lensFlareVertexTexture" ] , _precision ) ;
75+ program = createProgram ( THREE . ShaderFlares [ "lensFlareVertexTexture" ] , _precision ) ;
7876
7977 }
8078
81- _lensFlare . attributes = { } ;
82- _lensFlare . uniforms = { } ;
83-
84- _lensFlare . attributes . vertex = _gl . getAttribLocation ( _lensFlare . program , "position" ) ;
85- _lensFlare . attributes . uv = _gl . getAttribLocation ( _lensFlare . program , "uv" ) ;
79+ attributes = {
80+ vertex : _gl . getAttribLocation ( program , "position" ) ,
81+ uv : _gl . getAttribLocation ( program , "uv" )
82+ }
8683
87- _lensFlare . uniforms . renderType = _gl . getUniformLocation ( _lensFlare . program , "renderType" ) ;
88- _lensFlare . uniforms . map = _gl . getUniformLocation ( _lensFlare . program , "map" ) ;
89- _lensFlare . uniforms . occlusionMap = _gl . getUniformLocation ( _lensFlare . program , "occlusionMap" ) ;
90- _lensFlare . uniforms . opacity = _gl . getUniformLocation ( _lensFlare . program , "opacity" ) ;
91- _lensFlare . uniforms . color = _gl . getUniformLocation ( _lensFlare . program , "color" ) ;
92- _lensFlare . uniforms . scale = _gl . getUniformLocation ( _lensFlare . program , "scale" ) ;
93- _lensFlare . uniforms . rotation = _gl . getUniformLocation ( _lensFlare . program , "rotation" ) ;
94- _lensFlare . uniforms . screenPosition = _gl . getUniformLocation ( _lensFlare . program , "screenPosition" ) ;
84+ uniforms = {
85+ renderType : _gl . getUniformLocation ( program , "renderType" ) ,
86+ map : _gl . getUniformLocation ( program , "map" ) ,
87+ occlusionMap : _gl . getUniformLocation ( program , "occlusionMap" ) ,
88+ opacity : _gl . getUniformLocation ( program , "opacity" ) ,
89+ color : _gl . getUniformLocation ( program , "color" ) ,
90+ scale : _gl . getUniformLocation ( program , "scale" ) ,
91+ rotation : _gl . getUniformLocation ( program , "rotation" ) ,
92+ screenPosition : _gl . getUniformLocation ( program , "screenPosition" )
93+ } ;
9594
9695 } ;
9796
@@ -100,9 +99,6 @@ THREE.LensFlarePlugin = function () {
10099 * Render lens flares
101100 * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,
102101 * reads these back and calculates occlusion.
103- * Then _lensFlare.update_lensFlares() is called to re-position and
104- * update transparency of flares. Then they are rendered.
105- *
106102 */
107103
108104 this . render = function ( scene , camera , viewportWidth , viewportHeight ) {
@@ -133,27 +129,22 @@ THREE.LensFlarePlugin = function () {
133129 var screenPosition = new THREE . Vector3 ( 1 , 1 , 0 ) ,
134130 screenPositionPixels = new THREE . Vector2 ( 1 , 1 ) ;
135131
136- var uniforms = _lensFlare . uniforms ,
137- attributes = _lensFlare . attributes ;
138-
139- // set _lensFlare program and reset blending
140-
141- _gl . useProgram ( _lensFlare . program ) ;
132+ _gl . useProgram ( program ) ;
142133
143- _gl . enableVertexAttribArray ( _lensFlare . attributes . vertex ) ;
144- _gl . enableVertexAttribArray ( _lensFlare . attributes . uv ) ;
134+ _gl . enableVertexAttribArray ( attributes . vertex ) ;
135+ _gl . enableVertexAttribArray ( attributes . uv ) ;
145136
146137 // loop through all lens flares to update their occlusion and positions
147138 // setup gl and common used attribs/unforms
148139
149140 _gl . uniform1i ( uniforms . occlusionMap , 0 ) ;
150141 _gl . uniform1i ( uniforms . map , 1 ) ;
151142
152- _gl . bindBuffer ( _gl . ARRAY_BUFFER , _lensFlare . vertexBuffer ) ;
143+ _gl . bindBuffer ( _gl . ARRAY_BUFFER , vertexBuffer ) ;
153144 _gl . vertexAttribPointer ( attributes . vertex , 2 , _gl . FLOAT , false , 2 * 8 , 0 ) ;
154145 _gl . vertexAttribPointer ( attributes . uv , 2 , _gl . FLOAT , false , 2 * 8 , 8 ) ;
155146
156- _gl . bindBuffer ( _gl . ELEMENT_ARRAY_BUFFER , _lensFlare . elementBuffer ) ;
147+ _gl . bindBuffer ( _gl . ELEMENT_ARRAY_BUFFER , elementBuffer ) ;
157148
158149 _gl . disable ( _gl . CULL_FACE ) ;
159150 _gl . depthMask ( false ) ;
@@ -181,7 +172,7 @@ THREE.LensFlarePlugin = function () {
181172
182173 // screen cull
183174
184- if ( _lensFlare . hasVertexTexture || (
175+ if ( hasVertexTexture || (
185176 screenPositionPixels . x > 0 &&
186177 screenPositionPixels . x < viewportWidth &&
187178 screenPositionPixels . y > 0 &&
@@ -190,7 +181,7 @@ THREE.LensFlarePlugin = function () {
190181 // save current RGB to temp texture
191182
192183 _gl . activeTexture ( _gl . TEXTURE1 ) ;
193- _gl . bindTexture ( _gl . TEXTURE_2D , _lensFlare . tempTexture ) ;
184+ _gl . bindTexture ( _gl . TEXTURE_2D , tempTexture ) ;
194185 _gl . copyTexImage2D ( _gl . TEXTURE_2D , 0 , _gl . RGB , screenPositionPixels . x - 8 , screenPositionPixels . y - 8 , 16 , 16 , 0 ) ;
195186
196187
@@ -209,7 +200,7 @@ THREE.LensFlarePlugin = function () {
209200 // copy result to occlusionMap
210201
211202 _gl . activeTexture ( _gl . TEXTURE0 ) ;
212- _gl . bindTexture ( _gl . TEXTURE_2D , _lensFlare . occlusionTexture ) ;
203+ _gl . bindTexture ( _gl . TEXTURE_2D , occlusionTexture ) ;
213204 _gl . copyTexImage2D ( _gl . TEXTURE_2D , 0 , _gl . RGBA , screenPositionPixels . x - 8 , screenPositionPixels . y - 8 , 16 , 16 , 0 ) ;
214205
215206
@@ -219,7 +210,7 @@ THREE.LensFlarePlugin = function () {
219210 _gl . disable ( _gl . DEPTH_TEST ) ;
220211
221212 _gl . activeTexture ( _gl . TEXTURE1 ) ;
222- _gl . bindTexture ( _gl . TEXTURE_2D , _lensFlare . tempTexture ) ;
213+ _gl . bindTexture ( _gl . TEXTURE_2D , tempTexture ) ;
223214 _gl . drawElements ( _gl . TRIANGLES , 6 , _gl . UNSIGNED_SHORT , 0 ) ;
224215
225216
0 commit comments