@@ -72,9 +72,7 @@ var ParticleRenderer = new Class({
7272
7373 vertexBufferObject . addAttribute ( shader . getAttribLocation ( 'a_position' ) , 2 , gl . FLOAT , false , CONST . VERTEX_SIZE , 0 ) ;
7474 vertexBufferObject . addAttribute ( shader . getAttribLocation ( 'a_tex_coord' ) , 2 , gl . FLOAT , false , CONST . VERTEX_SIZE , 8 ) ;
75- vertexBufferObject . addAttribute ( shader . getAttribLocation ( 'a_scale' ) , 2 , gl . FLOAT , false , CONST . VERTEX_SIZE , 16 ) ;
76- vertexBufferObject . addAttribute ( shader . getAttribLocation ( 'a_rotation' ) , 2 , gl . FLOAT , false , CONST . VERTEX_SIZE , 24 ) ;
77- vertexBufferObject . addAttribute ( shader . getAttribLocation ( 'a_color' ) , 4 , gl . UNSIGNED_BYTE , true , CONST . VERTEX_SIZE , 28 ) ;
75+ vertexBufferObject . addAttribute ( shader . getAttribLocation ( 'a_color' ) , 4 , gl . UNSIGNED_BYTE , true , CONST . VERTEX_SIZE , 16 ) ;
7876
7977 // Populate the index buffer only once
8078 for ( var indexA = 0 , indexB = 0 ; indexA < max ; indexA += CONST . INDEX_COUNT , indexB += CONST . VERTEX_COUNT )
@@ -214,6 +212,8 @@ var ParticleRenderer = new Class({
214212 var particleCount = 0 ;
215213 var batchCount = Math . ceil ( length / CONST . MAX ) ;
216214 var renderTarget = emitter . renderTarget ;
215+ var tempMatrix = this . tempMatrix ;
216+ var tempMatrixMatrix = tempMatrix . matrix ;
217217 var particleOffset = 0 ;
218218
219219 if ( length === 0 ) return ;
@@ -226,64 +226,67 @@ var ParticleRenderer = new Class({
226226 for ( var index = 0 ; index < batchSize ; ++ index )
227227 {
228228 var particle = particles [ particleOffset + index ] ;
229- var x = particle . x - ox ;
230- var y = particle . y - oy ;
229+ var x = - ox ;
230+ var y = - oy ;
231231 var scaleX = particle . scaleX ;
232232 var scaleY = particle . scaleY ;
233233 var rotation = particle . rotation ;
234- var color = 0xFFFFFFFF ;
234+ var color = particle . color ;
235235 var xw = x + width ;
236236 var yh = y + height ;
237- var tx0 = x * cma + y * cmc + cme ;
238- var ty0 = x * cmb + y * cmd + cmf ;
239- var tx1 = x * cma + yh * cmc + cme ;
240- var ty1 = x * cmb + yh * cmd + cmf ;
241- var tx2 = xw * cma + yh * cmc + cme ;
242- var ty2 = xw * cmb + yh * cmd + cmf ;
243- var tx3 = xw * cma + y * cmc + cme ;
244- var ty3 = xw * cmb + y * cmd + cmf ;
245-
246- vtxOffset = data . allocate ( 32 ) ;
237+
238+ tempMatrix . applyITRS ( particle . x , particle . y , rotation , scaleX , scaleY ) ;
239+
240+ var sra = tempMatrixMatrix [ 0 ] ;
241+ var srb = tempMatrixMatrix [ 1 ] ;
242+ var src = tempMatrixMatrix [ 2 ] ;
243+ var srd = tempMatrixMatrix [ 3 ] ;
244+ var sre = tempMatrixMatrix [ 4 ] ;
245+ var srf = tempMatrixMatrix [ 5 ] ;
246+ var mva = sra * cma + srb * cmc ;
247+ var mvb = sra * cmb + srb * cmd ;
248+ var mvc = src * cma + srd * cmc ;
249+ var mvd = src * cmb + srd * cmd ;
250+ var mve = sre * cma + srf * cmc + cme ;
251+ var mvf = sre * cmb + srf * cmd + cmf ;
252+ var tx0 = x * mva + y * mvc + mve ;
253+ var ty0 = x * mvb + y * mvd + mvf ;
254+ var tx1 = x * mva + yh * mvc + mve ;
255+ var ty1 = x * mvb + yh * mvd + mvf ;
256+ var tx2 = xw * mva + yh * mvc + mve ;
257+ var ty2 = xw * mvb + yh * mvd + mvf ;
258+ var tx3 = xw * mva + y * mvc + mve ;
259+ var ty3 = xw * mvb + y * mvd + mvf ;
260+
261+ vtxOffset = data . allocate ( 20 ) ;
247262 elementCount += 6 ;
248263
249264 // Top Left
250265 vbF32 [ vtxOffset ++ ] = tx0 ;
251266 vbF32 [ vtxOffset ++ ] = ty0 ;
252267 vbF32 [ vtxOffset ++ ] = u0 ;
253268 vbF32 [ vtxOffset ++ ] = v0 ;
254- vbF32 [ vtxOffset ++ ] = scaleX ;
255- vbF32 [ vtxOffset ++ ] = scaleY ;
256- vbF32 [ vtxOffset ++ ] = rotation ;
257269 vbU32 [ vtxOffset ++ ] = color ;
258270
259271 // Bottom Left
260272 vbF32 [ vtxOffset ++ ] = tx1 ;
261273 vbF32 [ vtxOffset ++ ] = ty1 ;
262274 vbF32 [ vtxOffset ++ ] = u1 ;
263275 vbF32 [ vtxOffset ++ ] = v1 ;
264- vbF32 [ vtxOffset ++ ] = scaleX ;
265- vbF32 [ vtxOffset ++ ] = scaleY ;
266- vbF32 [ vtxOffset ++ ] = rotation ;
267276 vbU32 [ vtxOffset ++ ] = color ;
268277
269278 // Bottom Right
270279 vbF32 [ vtxOffset ++ ] = tx2 ;
271280 vbF32 [ vtxOffset ++ ] = ty2 ;
272281 vbF32 [ vtxOffset ++ ] = u2 ;
273282 vbF32 [ vtxOffset ++ ] = v2 ;
274- vbF32 [ vtxOffset ++ ] = scaleX ;
275- vbF32 [ vtxOffset ++ ] = scaleY ;
276- vbF32 [ vtxOffset ++ ] = rotation ;
277283 vbU32 [ vtxOffset ++ ] = color ;
278284
279285 // Top Right
280286 vbF32 [ vtxOffset ++ ] = tx3 ;
281287 vbF32 [ vtxOffset ++ ] = ty3 ;
282288 vbF32 [ vtxOffset ++ ] = u3 ;
283289 vbF32 [ vtxOffset ++ ] = v3 ;
284- vbF32 [ vtxOffset ++ ] = scaleX ;
285- vbF32 [ vtxOffset ++ ] = scaleY ;
286- vbF32 [ vtxOffset ++ ] = rotation ;
287290 vbU32 [ vtxOffset ++ ] = color ;
288291 }
289292 particleOffset += batchSize ;
0 commit comments