@@ -12,7 +12,7 @@ var VertexArray = require('../../utils/VertexArray');
1212var PHASER_CONST = require ( '../../../../const' ) ;
1313var CONST = require ( './const' ) ;
1414
15- var ParticleRenderer = function ( game )
15+ var BlitterBatch = function ( game , gl , manager )
1616{
1717 this . game = game ;
1818 this . type = PHASER_CONST . WEBGL ;
@@ -22,7 +22,7 @@ var ParticleRenderer = function (game)
2222 this . width = game . config . width * game . config . resolution ;
2323 this . height = game . config . height * game . config . resolution ;
2424
25- this . glContext = null ;
25+ this . glContext = gl ;
2626
2727 this . maxParticles = null ;
2828
@@ -57,78 +57,73 @@ var ParticleRenderer = function (game)
5757 }
5858 } ;
5959
60- this . init ( ) ;
60+ this . manager = manager ;
61+ this . dirty = false ;
62+
63+ this . init ( this . glContext ) ;
6164} ;
6265
63- ParticleRenderer . prototype . constructor = ParticleRenderer ;
66+ BlitterBatch . prototype . constructor = BlitterBatch ;
6467
65- ParticleRenderer . prototype = {
68+ BlitterBatch . prototype = {
6669
67- init : function ( )
70+ init : function ( gl )
6871 {
69- if ( this . glContext === null )
70- {
71- var gl = this . view . getContext ( 'webgl' , this . config . WebGLContextOptions ) || this . view . getContext ( 'experimental-webgl' , this . config . WebGLContextOptions ) ;
7272
73- var vertexDataBuffer = new VertexBuffer ( CONST . VERTEX_SIZE * CONST . PARTICLE_VERTEX_COUNT * CONST . MAX_PARTICLES ) ;
73+ var vertexDataBuffer = new VertexBuffer ( CONST . VERTEX_SIZE * CONST . PARTICLE_VERTEX_COUNT * CONST . MAX_PARTICLES ) ;
7474
75- var indexDataBuffer = new IndexBuffer ( CONST . INDEX_SIZE * CONST . PARTICLE_INDEX_COUNT * CONST . MAX_PARTICLES ) ;
75+ var indexDataBuffer = new IndexBuffer ( CONST . INDEX_SIZE * CONST . PARTICLE_INDEX_COUNT * CONST . MAX_PARTICLES ) ;
7676
77- var vertShader = CreateShader ( gl , CONST . VERTEX_SHADER_SOURCE , gl . VERTEX_SHADER ) ;
78- var fragShader = CreateShader ( gl , CONST . FRAGMENT_SHADER_SOURCE , gl . FRAGMENT_SHADER ) ;
79- var program = CreateProgram ( gl , vertShader , fragShader ) ;
77+ var vertShader = CreateShader ( gl , CONST . VERTEX_SHADER_SOURCE , gl . VERTEX_SHADER ) ;
78+ var fragShader = CreateShader ( gl , CONST . FRAGMENT_SHADER_SOURCE , gl . FRAGMENT_SHADER ) ;
79+ var program = CreateProgram ( gl , vertShader , fragShader ) ;
8080
81- var indexBufferObject = CreateBuffer ( gl , gl . ELEMENT_ARRAY_BUFFER , gl . STATIC_DRAW , null , indexDataBuffer . getByteCapacity ( ) ) ;
81+ var indexBufferObject = CreateBuffer ( gl , gl . ELEMENT_ARRAY_BUFFER , gl . STATIC_DRAW , null , indexDataBuffer . getByteCapacity ( ) ) ;
8282
83- var attribArray = [
84- CreateAttribDesc ( gl , program , 'a_position' , 2 , gl . FLOAT , false , CONST . VERTEX_SIZE , 0 ) ,
85- CreateAttribDesc ( gl , program , 'a_tex_coord' , 2 , gl . FLOAT , false , CONST . VERTEX_SIZE , 8 )
86- ] ;
83+ var attribArray = [
84+ CreateAttribDesc ( gl , program , 'a_position' , 2 , gl . FLOAT , false , CONST . VERTEX_SIZE , 0 ) ,
85+ CreateAttribDesc ( gl , program , 'a_tex_coord' , 2 , gl . FLOAT , false , CONST . VERTEX_SIZE , 8 )
86+ ] ;
8787
88- var vertexArray = new VertexArray ( CreateBuffer ( gl , gl . ARRAY_BUFFER , gl . STREAM_DRAW , null , vertexDataBuffer . getByteCapacity ( ) ) , attribArray ) ;
88+ var vertexArray = new VertexArray ( CreateBuffer ( gl , gl . ARRAY_BUFFER , gl . STREAM_DRAW , null , vertexDataBuffer . getByteCapacity ( ) ) , attribArray ) ;
8989
90- var viewMatrixLocation = gl . getUniformLocation ( program , 'u_view_matrix' ) ;
90+ var viewMatrixLocation = gl . getUniformLocation ( program , 'u_view_matrix' ) ;
9191
92- this . vertexDataBuffer = vertexDataBuffer ;
93- this . indexDataBuffer = indexDataBuffer ;
92+ this . vertexDataBuffer = vertexDataBuffer ;
93+ this . indexDataBuffer = indexDataBuffer ;
9494
95- this . vertShader = vertShader ;
96- this . fragShader = fragShader ;
97- this . program = program ;
95+ this . vertShader = vertShader ;
96+ this . fragShader = fragShader ;
97+ this . program = program ;
9898
99- this . indexBufferObject = indexBufferObject ;
100- this . vertexArray = vertexArray ;
99+ this . indexBufferObject = indexBufferObject ;
100+ this . vertexArray = vertexArray ;
101101
102- this . glContext = gl ;
103102
104- this . viewMatrixLocation = viewMatrixLocation ;
103+ this . viewMatrixLocation = viewMatrixLocation ;
105104
106- gl . bindBuffer ( gl . ELEMENT_ARRAY_BUFFER , indexBufferObject ) ;
105+ gl . bindBuffer ( gl . ELEMENT_ARRAY_BUFFER , indexBufferObject ) ;
107106
108- var indexBuffer = indexDataBuffer . wordView ;
109- var max = CONST . MAX_PARTICLES * CONST . PARTICLE_INDEX_COUNT ;
107+ var indexBuffer = indexDataBuffer . wordView ;
108+ var max = CONST . MAX_PARTICLES * CONST . PARTICLE_INDEX_COUNT ;
110109
111110 // Populate the index buffer only once
112- for ( var indexA = 0 , indexB = 0 ; indexA < max ; indexA += CONST . PARTICLE_INDEX_COUNT , indexB += CONST . PARTICLE_VERTEX_COUNT )
111+ for ( var indexA = 0 , indexB = 0 ; indexA < max ; indexA += CONST . PARTICLE_INDEX_COUNT , indexB += CONST . PARTICLE_VERTEX_COUNT )
113112 {
114- indexBuffer [ indexA + 0 ] = indexB + 0 ;
115- indexBuffer [ indexA + 1 ] = indexB + 1 ;
116- indexBuffer [ indexA + 2 ] = indexB + 2 ;
117- indexBuffer [ indexA + 3 ] = indexB + 0 ;
118- indexBuffer [ indexA + 4 ] = indexB + 2 ;
119- indexBuffer [ indexA + 5 ] = indexB + 3 ;
120- }
113+ indexBuffer [ indexA + 0 ] = indexB + 0 ;
114+ indexBuffer [ indexA + 1 ] = indexB + 1 ;
115+ indexBuffer [ indexA + 2 ] = indexB + 2 ;
116+ indexBuffer [ indexA + 3 ] = indexB + 0 ;
117+ indexBuffer [ indexA + 4 ] = indexB + 2 ;
118+ indexBuffer [ indexA + 5 ] = indexB + 3 ;
119+ }
120+ gl . bufferSubData ( gl . ELEMENT_ARRAY_BUFFER , 0 , indexDataBuffer . getUsedBufferAsWord ( ) ) ;
121121
122- this . bind ( ) ;
122+ this . bind ( ) ;
123123
124- this . resize ( this . width , this . height ) ;
124+ this . resize ( this . width , this . height ) ;
125125
126- this . unbind ( ) ;
127- }
128- else
129- {
130- console . error ( 'ParticleRenderer already initialized' ) ;
131- }
126+ this . unbind ( ) ;
132127 } ,
133128
134129 isFull : function ( )
@@ -138,9 +133,19 @@ ParticleRenderer.prototype = {
138133
139134 add : function ( x , y , width , height , umin , vmin , umax , vmax )
140135 {
141- // The user must check if the buffers are full before flushing
142- // this is to give freedom of when should the renderer flush.
136+ var manager = this . manager ;
137+ if ( manager . batch !== this || this . dirty )
138+ {
139+ if ( manager . batch )
140+ manager . batch . flush ( ) ;
141+
142+ this . bind ( ) ;
143+ this . setTexture2D ( manager . currentTexture2D , true ) ;
144+ manager . batch = this ;
145+ }
143146
147+ // The user must check if the buffers are full before flushing
148+ // this is to give freedom of when should the renderer flush. var vertexDataBuffer = this.vertexDataBuffer;
144149 var vertexDataBuffer = this . vertexDataBuffer ;
145150 var vertexBuffer = vertexDataBuffer . floatView ;
146151 var vertexOffset = vertexDataBuffer . allocate ( CONST . PARTICLE_VERTEX_COMPONENT_COUNT * CONST . PARTICLE_VERTEX_COUNT ) ;
@@ -168,11 +173,11 @@ ParticleRenderer.prototype = {
168173 this . elementCount += CONST . PARTICLE_INDEX_COUNT ;
169174 } ,
170175
171- setTexture2D : function ( texture2D )
176+ setTexture2D : function ( texture2D , force )
172177 {
173178 var gl = this . glContext ;
174179
175- if ( this . currentTexture2D !== texture2D )
180+ if ( this . currentTexture2D !== texture2D || force )
176181 {
177182 this . flush ( ) ;
178183
@@ -183,16 +188,6 @@ ParticleRenderer.prototype = {
183188 }
184189 } ,
185190
186- render : function ( )
187- {
188- // Stops it breaking
189- } ,
190-
191- createFBO : function ( )
192- {
193- // Stops it breaking
194- } ,
195-
196191 bind : function ( )
197192 {
198193 var gl = this . glContext ;
@@ -282,4 +277,4 @@ ParticleRenderer.prototype = {
282277
283278} ;
284279
285- module . exports = ParticleRenderer ;
280+ module . exports = BlitterBatch ;
0 commit comments