Subversion Repositories ps3ware

Rev

Rev 210 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 210 Rev 212
Line 90... Line 90...
90
90
91
91
92
sin_cos table;
92
sin_cos table;
93
93
94
           
94
           
95
void inline process_linear_spline( qword &address, vec_float4 &value, vec_float4 time, vec_uint4 startFrame, vec_uint4 endFrame )
-
 
96
{
-
 
97
    vec_uint4 num = spu_rl( uint16_uload( address ), 1 );
-
 
98
    vec_uint4 dec = spu_sub( num, spu_splats( (unsigned int)0x2) );
-
 
99
    vec_uint4 ptr = spu_sel( num, dec, spu_cmpgt( num, (unsigned int)0x2 ) );
-
 
100
    vec_uint4 fptr = spu_add( (vec_uint4)address, ptr );
-
 
101
   
-
 
102
    vec_uint4 beg = spu_splats( (unsigned int)0x0 );
-
 
103
    vec_uint4 end = dec;
-
 
104
    vec_uint4 ibeg = startFrame;
-
 
105
    vec_uint4 iend = endFrame;
-
 
106
   
-
 
107
    while( 1 )
-
 
108
    {
-
 
109
        vec_uint4 bega = spu_add( beg, spu_splats( (unsigned int)0x4 ) );
-
 
110
        vec_uint4 tst = spu_cmpgt( bega, end );
-
 
111
       
-
 
112
        unsigned int ret = si_to_uint( (qword)tst );
-
 
113
       
-
 
114
        if( ret == 0xffffffff )
-
 
115
        {
-
 
116
            break;
-
 
117
        }
-
 
118
       
-
 
119
        vec_uint4 med = spu_rl( spu_rlmask( spu_add( beg, end ), -2 ), 1 );
-
 
120
        vec_uint4 i = uint16_uload( (qword)spu_add( med, (vec_uint4)address ) );
-
 
121
       
-
 
122
        vec_float4 fi = spu_convtf( i, 0 );
-
 
123
        vec_uint4 b = spu_cmpgt( time, fi );
-
 
124
       
-
 
125
        beg = spu_sel( beg, med, b );
-
 
126
        end = spu_sel( med, end, b );
-
 
127
       
-
 
128
        ibeg = spu_sel( ibeg, i, b );
-
 
129
        iend = spu_sel( i, iend, b );
-
 
130
       
-
 
131
    }
-
 
132
   
-
 
133
    vec_uint4 f1 = uint16_uload( (qword)spu_add( beg, fptr) );
-
 
134
    vec_uint4 f2 = uint16_uload( (qword)spu_add( end, fptr) );
-
 
135
   
-
 
136
    vec_float4 f = h2f( spu_shuffle( f1, f2, SWZ{ F_X, S_X, E_4, E_4 } ) );
-
 
137
    vec_float4 times = spu_convtf( spu_shuffle( ibeg, iend, SWZ{ S_X, F_X, E_4, E_4 } ), 0 );
-
 
138
    vec_float4 d = spu_sub( times, time );
-
 
139
   
-
 
140
    vec_float4 mul = spu_sub( times, YX( times ) );
-
 
141
    mul = spu_mul( spu_re( mul ), spu_mul( f, d ) );
-
 
142
    value = spu_add( mul, Y( mul ) );
-
 
143
    address = (qword)spu_add( fptr, num );
-
 
144
}
-
 
145
95
146
vec_float4 inline conv(
96
vec_float4 inline conv(
147
    vec_uint4 kbeg,
97
    vec_uint4 kbeg,
148
    vec_uint4 kend,
98
    vec_uint4 kend,
149
    vec_uint4 vbeg,
99
    vec_uint4 vbeg,
Line 265... Line 215...
265
    mfc_read_tag_status_any();
215
    mfc_read_tag_status_any();
266
   
216
   
267
    float  x, y, z, u, v;
217
    float  x, y, z, u, v;
268
    short  r, g, b, a;
218
    short  r, g, b, a;
269
   
219
   
-
 
220
    /*
-
 
221
    unsigned long long te;
-
 
222
    GetTime( te );
-
 
223
    */
-
 
224
   
-
 
225
   
-
 
226
    vec_float4 *iptr = (vec_float4 *)&insts[inst];
-
 
227
   
270
    qword dptr = si_from_ptr( data );
228
    qword dptr = si_from_ptr( data );
271
   
229
   
272
    vec_float4 vtime = spu_splats( time );
230
    vec_float4 vtime = spu_splats( time );
273
    vec_float4 vx, vy, vz, vu, vv, vp, vs;
-
 
274
   
-
 
275
   
231
   
276
    process_linear_spline( dptr, vx, vtime, startFrame, endFrame );
-
 
277
    process_linear_spline( dptr, vy, vtime, startFrame, endFrame );
-
 
278
    process_linear_spline( dptr, vz, vtime, startFrame, endFrame );
-
 
279
   
232
   
280
    vec_uint4  kbeg = spu_splats( (unsigned int)0 );
233
    vec_uint4  kbeg = spu_splats( (unsigned int)0 );
281
    vec_uint4  kend = spu_splats( (unsigned int)0 );
234
    vec_uint4  kend = spu_splats( (unsigned int)0 );
282
    vec_uint4  vbeg = spu_splats( (unsigned int)0 );
235
    vec_uint4  vbeg = spu_splats( (unsigned int)0 );
283
    vec_uint4  vend = spu_splats( (unsigned int)0 );
236
    vec_uint4  vend = spu_splats( (unsigned int)0 );
284
   
237
   
-
 
238
   
-
 
239
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
-
 
240
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
-
 
241
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
-
 
242
   
-
 
243
    vec_float4 exyz = conv( kbeg, kend, vbeg, vend, vtime );
-
 
244
   
285
    //printf( "a7 \n" );
245
    vec_float4 xxxx = YYYY( exyz );
-
 
246
    vec_float4 yyyy = ZZZZ( exyz );
-
 
247
    vec_float4 zzzz = WWWW( exyz );
286
248
   
-
 
249
    vec_float4 xyze = spu_madd( xxxx, iptr[1], spu_madd( yyyy, iptr[2], spu_madd( zzzz, iptr[3] , iptr[4] ) ) );
287
   
250
   
288
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
251
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
289
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
252
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
290
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
253
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
291
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
254
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
292
   
255
   
293
    //printf( "a6 \n" );
-
 
294
256
295
   
-
 
296
    vec_float4 rgba = conv( kbeg, kend, vbeg, vend, vtime );
257
    vec_float4 rgba = conv( kbeg, kend, vbeg, vend, vtime );
297
    rgba = spu_mul( *(vec_float4 *)insts[inst].col, rgba );
258
    rgba = spu_mul( rgba, iptr[0] );
298
    vec_uint4  colh = f2h( ( vec_uint4 ) rgba );
259
    vec_uint4  colh = f2h( ( vec_uint4 ) rgba );
299
   
260
   
300
    process_linear_spline( dptr, vu, vtime, startFrame, endFrame );
261
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
301
    process_linear_spline( dptr, vv, vtime, startFrame, endFrame );
262
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
302
    process_linear_spline( dptr, vp, vtime, startFrame, endFrame );
263
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
303
    process_linear_spline( dptr, vs, vtime, startFrame, endFrame );
264
    process_linear_spline( dptr, kbeg, kend, vbeg, vend, vtime, startFrame, endFrame );
304
-
 
305
    float ix, iy, iz;
-
 
306
   
-
 
307
    ix = *(float *)&vx;
-
 
308
    iy = *(float *)&vy;
-
 
309
    iz = *(float *)&vz;
-
 
310
   
265
   
-
 
266
    vec_float4 uvps = conv( kbeg, kend, vbeg, vend, vtime );
311
   
267
   
-
 
268
312
    x = ix * insts[inst].mat[0] + iy * insts[inst].mat[1] + iz * insts[inst].mat[2] + insts[inst].mat[3];
269
    x = ((float *)&xyze)[0];
313
    y = ix * insts[inst].mat[4] + iy * insts[inst].mat[5] + iz * insts[inst].mat[6] + insts[inst].mat[7];
270
    y = ((float *)&xyze)[1];
314
    z = ix * insts[inst].mat[8] + iy * insts[inst].mat[9] + iz * insts[inst].mat[10] + insts[inst].mat[11];
271
    z = ((float *)&xyze)[2];
315
   
272
   
316
   
273
   
317
   
274
   
318
    r = ((unsigned  int *)&colh)[0];
275
    r = ((unsigned  int *)&colh)[0];
319
    g = ((unsigned  int *)&colh)[1];
276
    g = ((unsigned  int *)&colh)[1];
320
    b = ((unsigned  int *)&colh)[2];
277
    b = ((unsigned  int *)&colh)[2];
321
    a = ((unsigned  int *)&colh)[3];
278
    a = ((unsigned  int *)&colh)[3];
322
   
279
   
323
   
280
   
324
    u = *(float *)&vu;
281
    u = ((float *)&uvps)[0];
325
    v = *(float *)&vv;
282
    v = ((float *)&uvps)[1];
326
283
327
    u *= insts[inst].scale;
284
    u *= insts[inst].scale;
328
    v *= insts[inst].scale;
285
    v *= insts[inst].scale;
329
           
286
           
330
287
-
 
288
    Vertex &a00 = outBuffer[outPtr + 0];
-
 
289
    Vertex &a01 = outBuffer[outPtr + 1];
-
 
290
    Vertex &a11 = outBuffer[outPtr + 2];
-
 
291
    Vertex &a10 = outBuffer[outPtr + 3];
331
   
292
   
332
    Vertex &a00 = outBuffer[(outPtr + 0 ) & 511];
-
 
333
    Vertex &a01 = outBuffer[(outPtr + 1 ) & 511];
-
 
334
    Vertex &a11 = outBuffer[(outPtr + 2 ) & 511];
-
 
335
    Vertex &a10 = outBuffer[(outPtr + 3 ) & 511];
-
 
336
   
-
 
337
    vec_uint4 ind = spu_convtu( vs, 0 );
293
    vec_uint4 ind = spu_convtu( WWWW( uvps ), 0 );
338
    uint32_t sprite = si_to_uint( (qword)ind ) & 255;    
294
    uint32_t sprite = si_to_uint( (qword)ind ) & 255;    
339
   
295
   
340
   
296
   
341
    vec_float4 rot = table.value( XXXX( vp ) );
297
    vec_float4 rot = table.value( ZZZZ( uvps ) );
342
   
298
   
343
    float si = ((float *)&rot)[0];
299
    float si = ((float *)&rot)[0];
344
    float co = ((float *)&rot)[1];
300
    float co = ((float *)&rot)[1];
345
   
301
   
346
    a00.x = x + co * u - si * v;
302
    a00.x = x + co * u - si * v;
Line 386... Line 342...
386
    a01.a = a;
342
    a01.a = a;
387
    a11.a = a;
343
    a11.a = a;
388
    a10.a = a;
344
    a10.a = a;
389
   
345
   
390
   
346
   
391
    outPtr += 4;
347
    outPtr = ( outPtr + 4 ) & 511;
392
    ++number;
348
    ++number;
-
 
349
   
-
 
350
   
-
 
351
    /*
-
 
352
    float cl1 = GetTime( te );
-
 
353
   
-
 
354
   
-
 
355
    static int out = 0;
-
 
356
   
-
 
357
    if( ++out < 100 )
-
 
358
    {
-
 
359
        printf( "%f \n", 1.0f / cl1 );
-
 
360
    }*/
393
}
361
}
394
362
395
363
396
364
397
void SampleParticles( float _time, uint32 num, unsigned long long base, uint16 loopFrame, size_t inst )
365
void SampleParticles( float _time, uint32 num, unsigned long long base, uint16 loopFrame, size_t inst )
Line 456... Line 424...
456
        }
424
        }
457
}
425
}
458
426
459
427
460
428
-
 
429
void transpose( vec_float4 *mat )
-
 
430
{
-
 
431
    vec_float4 m0 = mat[0];
-
 
432
    vec_float4 m1 = mat[1];
-
 
433
    vec_float4 m2 = mat[2];
-
 
434
    vec_float4 m3 = mat[3];
-
 
435
   
-
 
436
    vec_float4 s0 = spu_shuffle( m0, m1, SWZ{ F_X, F_Y, S_X, S_Y } );
-
 
437
    vec_float4 s1 = spu_shuffle( m0, m1, SWZ{ F_Z, F_W, S_Z, S_W } );
-
 
438
   
-
 
439
    vec_float4 s2 = spu_shuffle( m2, m3, SWZ{ F_X, F_Y, S_X, S_Y } );
-
 
440
    vec_float4 s3 = spu_shuffle( m2, m3, SWZ{ F_Z, F_W, S_Z, S_W } );
-
 
441
   
-
 
442
    mat[0] = spu_shuffle( s0, s2, SWZ{ F_X, F_Z, S_X, S_Z } );
-
 
443
    mat[1] = spu_shuffle( s0, s2, SWZ{ F_Y, F_W, S_Y, S_W } );
-
 
444
    mat[2] = spu_shuffle( s1, s3, SWZ{ F_X, F_Z, S_X, S_Z } );
-
 
445
    mat[3] = spu_shuffle( s1, s3, SWZ{ F_Y, F_W, S_Y, S_W } );
-
 
446
   
-
 
447
   
-
 
448
}
-
 
449
461
450
462
int main(unsigned long long spe_id, unsigned long long program_data_ea, unsigned long long env)
451
int main(unsigned long long spe_id, unsigned long long program_data_ea, unsigned long long env)
463
{
452
{
464
        //unsigned long long te;
453
        //unsigned long long te;
465
        spu_write_decrementer( 0xffffffff );
454
        spu_write_decrementer( 0xffffffff );
Line 481... Line 470...
481
                mfc_get( &coords[0], data.atlas, data.asize, 0, 0, 0 );
470
                mfc_get( &coords[0], data.atlas, data.asize, 0, 0, 0 );
482
                mfc_get( &insts[0], data.insts, data.isize * sizeof( instance_data_t ), 0, 0, 0 );
471
                mfc_get( &insts[0], data.insts, data.isize * sizeof( instance_data_t ), 0, 0, 0 );
483
                mfc_get( &header, data.fx, sizeof( header ), 0, 0, 0 );
472
                mfc_get( &header, data.fx, sizeof( header ), 0, 0, 0 );
484
                mfc_write_tag_mask( 1 );
473
                mfc_write_tag_mask( 1 );
485
                mfc_read_tag_status_any();
474
                mfc_read_tag_status_any();
-
 
475
               
-
 
476
       
486
477
487
                int particleSize =  header.trackOffset - header.particleOffset;
478
                int particleSize =  header.trackOffset - header.particleOffset;
488
               
479
               
489
               
480
               
490
                mfc_get( &particles[0], data.fx + header.particleOffset, particleSize, 0, 0, 0 );
481
                mfc_get( &particles[0], data.fx + header.particleOffset, particleSize, 0, 0, 0 );
Line 498... Line 489...
498
               
489
               
499
                for( size_t i = 0; i < data.isize; ++i )
490
                for( size_t i = 0; i < data.isize; ++i )
500
                {
491
                {
501
                    outPtr = 0;
492
                    outPtr = 0;
502
                   
493
                   
-
 
494
                    transpose( (vec_float4 *)insts[i].mat );
503
                    uint32_t t = insts[i].time;
495
                    uint32_t t = insts[i].time;
504
                   
496
                   
505
                    float ftime = ( t >> 8 ) % ( header.loopFrame ) + ( t & 255 ) / 256.0f;
497
                    float ftime = ( t >> 8 ) % ( header.loopFrame ) + ( t & 255 ) / 256.0f;
506
                   
498
                   
507
                    SampleParticles( ftime, header.particles, data.fx + header.trackOffset, header.loopFrame, i );                     
499
                    SampleParticles( ftime, header.particles, data.fx + header.trackOffset, header.loopFrame, i );