Changeset 307 for trunk/src/gfx
- Timestamp:
- 08/12/14 11:46:15 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/particle_engine.cc
r306 r307 104 104 edata.lifetime_min = uint32( element.get<float>("lifetime_min", lifetime ) * 1000.f ); 105 105 edata.lifetime_max = uint32( element.get<float>("lifetime_max", lifetime ) * 1000.f ); 106 float duration = element.get<float>("duration", 0.0f ); 107 edata.duration_min = uint32( element.get<float>("duration_min", duration ) * 1000.f ); 108 edata.duration_max = uint32( element.get<float>("duration_max", duration ) * 1000.f ); 109 float repeat = element.get<float>("repeat_delay", 0.0f ); 110 edata.repeat_min = uint32( element.get<float>("repeat_delay_min", repeat ) * 1000.f ); 111 edata.repeat_max = uint32( element.get<float>("repeat_delay_max", repeat ) * 1000.f ); 112 106 113 edata.rate = element.get<float>("rate", 1.0f ); 107 114 edata.dir = glm::normalize( element.get<vec3>("direction", vec3(0,1,0) ) ); … … 153 160 for ( uint32 i = 0; i < ecount; ++i ) 154 161 { 162 info->emmiters[i].active = true; 155 163 info->emmiters[i].last_create = 0; 164 info->emmiters[i].next_toggle = random::get().urange( data->emmiters[i].duration_min, data->emmiters[i].duration_max ); 156 165 } 157 166 … … 208 217 m_inv_view_dir = glm::normalize(-s.get_camera().get_direction()); 209 218 219 update_emmiters( info, ms ); 210 220 destroy_particles( info, ms ); 211 221 create_particles( info, ms ); … … 348 358 const auto& edata = info->data->emmiters[i]; 349 359 auto& einfo = info->emmiters[i]; 350 351 uint32 period = glm::max<uint32>( uint32(1000.f / edata.rate), 1 ); 352 while ( ms - einfo.last_create > period ) 353 { 354 if ( info->count < info->data->quota-1 ) 355 { 356 particle& pinfo = info->particles[info->count]; 357 pinfo.position = source; 358 pinfo.color = edata.color_min == edata.color_max ? 359 edata.color_min : r.range( edata.color_min, edata.color_max ); 360 pinfo.size = edata.size_min == edata.size_max ? 361 edata.size_min : r.range( edata.size_min, edata.size_max ); 362 if ( edata.square ) pinfo.size.y = pinfo.size.x; 363 pinfo.velocity = edata.velocity_min == edata.velocity_max ? 364 edata.velocity_min : r.frange( edata.velocity_min, edata.velocity_max ); 365 pinfo.death = ms + ( edata.lifetime_min == edata.lifetime_max ? 366 edata.lifetime_min : r.urange( edata.lifetime_min, edata.lifetime_max ) ); 367 //pinfo.rotation = r.frand( 360.0f ); 368 369 pinfo.dir = edata.dir; 370 if ( edata.angle > 0.0f ) 360 if ( einfo.active ) 361 { 362 uint32 period = glm::max<uint32>( uint32(1000.f / edata.rate), 1 ); 363 while ( ms - einfo.last_create > period ) 364 { 365 if ( info->count < info->data->quota-1 ) 371 366 { 372 float emission_angle = glm::radians( edata.angle ); 373 float cos_theta = r.frange( cos( emission_angle ), 1.0f ); 374 float sin_theta = glm::sqrt(1.0f - cos_theta * cos_theta ); 375 float phi = r.frange( 0.0f, 2*glm::pi<float>() ); 376 pinfo.dir = orient * 377 ( edata.odir * ( glm::cos(phi) * sin_theta ) + 378 edata.cdir * ( glm::sin(phi)*sin_theta ) + 379 edata.dir * cos_theta ); 367 particle& pinfo = info->particles[info->count]; 368 pinfo.position = source; 369 pinfo.color = edata.color_min == edata.color_max ? 370 edata.color_min : r.range( edata.color_min, edata.color_max ); 371 pinfo.size = edata.size_min == edata.size_max ? 372 edata.size_min : r.range( edata.size_min, edata.size_max ); 373 if ( edata.square ) pinfo.size.y = pinfo.size.x; 374 pinfo.velocity = edata.velocity_min == edata.velocity_max ? 375 edata.velocity_min : r.frange( edata.velocity_min, edata.velocity_max ); 376 pinfo.death = ms + ( edata.lifetime_min == edata.lifetime_max ? 377 edata.lifetime_min : r.urange( edata.lifetime_min, edata.lifetime_max ) ); 378 //pinfo.rotation = r.frand( 360.0f ); 379 380 pinfo.dir = edata.dir; 381 if ( edata.angle > 0.0f ) 382 { 383 float emission_angle = glm::radians( edata.angle ); 384 float cos_theta = r.frange( cos( emission_angle ), 1.0f ); 385 float sin_theta = glm::sqrt(1.0f - cos_theta * cos_theta ); 386 float phi = r.frange( 0.0f, 2*glm::pi<float>() ); 387 pinfo.dir = orient * 388 ( edata.odir * ( glm::cos(phi) * sin_theta ) + 389 edata.cdir * ( glm::sin(phi)*sin_theta ) + 390 edata.dir * cos_theta ); 391 } 392 393 info->count++; 380 394 } 381 382 info->count++; 383 } 384 einfo.last_create += period; 395 einfo.last_create += period; 396 } 385 397 } 386 398 } … … 416 428 system->last_update = ms; 417 429 } 430 431 void nv::particle_engine::update_emmiters( particle_system_info* info, uint32 ms ) 432 { 433 uint32 ecount = info->data->emmiter_count; 434 if ( ecount == 0 ) return; 435 random& r = random::get(); 436 437 for ( uint32 i = 0; i < ecount; ++i ) 438 { 439 const auto& edata = info->data->emmiters[i]; 440 auto& einfo = info->emmiters[i]; 441 442 if ( einfo.next_toggle != 0 && ms >= einfo.next_toggle ) 443 { 444 if ( einfo.active ) 445 { 446 einfo.active = false; 447 if ( edata.repeat_min > 0 ) 448 einfo.next_toggle += r.urange( edata.repeat_min, edata.repeat_max ); 449 else 450 einfo.next_toggle = 0; 451 } 452 else 453 { 454 einfo.active = true; 455 einfo.last_create = einfo.next_toggle; 456 einfo.next_toggle += r.urange( edata.duration_min, edata.duration_max ); 457 } 458 } 459 } 460 461 }
Note: See TracChangeset
for help on using the changeset viewer.