Changeset 499 for trunk/src/engine/particle_engine.cc
- Timestamp:
- 06/06/16 18:54:52 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/engine/particle_engine.cc
r491 r499 470 470 } 471 471 472 nv::particle_system nv::particle_engine::create_system( const string_view& id )472 nv::particle_system nv::particle_engine::create_system( const string_view& id, particle_system_group group ) 473 473 { 474 474 auto it = m_names.find( id ); … … 480 480 particle_system result = m_systems.create(); 481 481 particle_system_info* info = m_systems.get( result ); 482 482 info->group = group; 483 483 info->data = data; 484 484 uint32 ecount = data->emmiter_count; … … 496 496 info->count = 0; 497 497 info->particles = new particle[ data->quota ]; 498 info->quads = new particle_quad[ data->quota ]; 499 498 info->last_update = m_last_update; 499 500 return result; 501 } 502 503 void nv::particle_engine::prepare( particle_system_group group ) 504 { 505 particle_system_group_info* info = m_groups.get( group ); 506 if ( info ) 507 { 508 info->count = 0; 509 } 510 } 511 512 void nv::particle_engine::draw( particle_system_group group, const render_state& rs, const scene_state& ss ) 513 { 514 particle_system_group_info* info = m_groups.get( group ); 515 if ( info ) 516 { 517 m_context->draw( nv::TRIANGLES, rs, ss, info->local ? m_program_local : m_program_world, info->vtx_array, info->count * 6, 0 ); 518 } 519 } 520 521 nv::particle_system_group nv::particle_engine::create_group( uint32 max_particles ) 522 { 523 particle_system_group result = m_groups.create(); 524 particle_system_group_info* info = m_groups.get( result ); 525 info->local = false; 526 info->count = 0; 527 info->quota = max_particles; 528 info->vtx_buffer = m_device->create_buffer( VERTEX_BUFFER, STREAM_DRAW, info->quota * sizeof( particle_quad )/*, info->quads_[0].data*/ ); 500 529 vertex_array_desc desc; 501 info->vtx_buffer = m_device->create_buffer( VERTEX_BUFFER, STREAM_DRAW, data->quota * 6 * sizeof( particle_vtx ), info->quads[0].data );502 530 desc.add_vertex_buffers< particle_vtx >( info->vtx_buffer, true ); 503 531 info->vtx_array = m_context->create_vertex_array( desc ); 504 info->last_update = m_last_update; 505 info->test = false; 506 // result->m_own_va = true; 507 // result->m_offset = 0; 508 532 info->quads = new particle_quad[info->quota]; 509 533 return result; 510 }511 512 void nv::particle_engine::draw( particle_system system, const render_state& rs, const scene_state& ss )513 {514 particle_system_info* info = m_systems.get( system );515 if ( info )516 {517 m_context->draw( nv::TRIANGLES, rs, ss, info->data->local ? m_program_local : m_program_world, info->vtx_array, info->count * 6 );518 }519 534 } 520 535 … … 537 552 while ( m_systems.size() > 0 ) 538 553 release( m_systems.get_handle( 0 ) ); 554 while ( m_groups.size() > 0 ) 555 release( m_groups.get_handle( 0 ) ); 539 556 m_emmiters.clear(); 540 557 m_affectors.clear(); … … 551 568 { 552 569 delete[] info->particles; 570 m_systems.destroy( system ); 571 } 572 } 573 574 void nv::particle_engine::release( particle_system_group group ) 575 { 576 particle_system_group_info* info = m_groups.get( group ); 577 if ( info ) 578 { 553 579 delete[] info->quads; 554 //if ( system->own_va )555 580 m_context->release( info->vtx_array ); 556 m_systems.destroy( system ); 557 } 558 } 559 560 void nv::particle_engine::update( particle_system system, const scene_state& s, uint32 ms ) 581 m_groups.destroy( group ); 582 } 583 } 584 585 void nv::particle_engine::update( const scene_state& s, uint32 ms ) 586 { 587 m_last_update += ms; 588 m_view_matrix = s.get_view(); 589 m_model_matrix = s.get_model(); 590 m_camera_pos = s.get_camera().get_position(); 591 m_inv_view_dir = math::normalize(-s.get_camera().get_direction()); 592 } 593 594 void nv::particle_engine::update( particle_system system ) 561 595 { 562 596 particle_system_info* info = m_systems.get( system ); 563 m_last_update += ms;564 597 if ( info ) 565 598 { 566 m_view_matrix = s.get_view();567 m_model_matrix = s.get_model();568 m_camera_pos = s.get_camera().get_position();569 m_inv_view_dir = math::normalize(-s.get_camera().get_direction());570 571 599 update_emmiters( info, m_last_update ); 572 600 destroy_particles( info, m_last_update ); … … 575 603 576 604 generate_data( info ); 577 m_context->update( info->vtx_buffer, info->quads, /*system->m_offset*sizeof(particle_quad)*/ 0, info->count*sizeof(particle_quad) );578 605 } 579 606 } … … 585 612 { 586 613 vec2 texcoords[4] = { a, vec2( b.x, a.y ), vec2( a.x, b.y ), b }; 587 588 for ( uint32 i = 0; i < info->data->quota; ++i ) 589 { 590 particle_quad& rdata = info->quads[i]; 591 rdata.data[0].texcoord = texcoords[0]; 592 rdata.data[1].texcoord = texcoords[1]; 593 rdata.data[2].texcoord = texcoords[2]; 594 rdata.data[3].texcoord = texcoords[3]; 595 rdata.data[4].texcoord = texcoords[2]; 596 rdata.data[5].texcoord = texcoords[1]; 597 } 614 for ( uint32 i = 0; i < 4; ++i ) 615 info->texcoords[i] = texcoords[i]; 598 616 } 599 617 } … … 601 619 void nv::particle_engine::generate_data( particle_system_info* info ) 602 620 { 621 // void* rawptr = m_context->map_buffer( info->vtx_buffer, nv::WRITE_UNSYNCHRONIZED, offset, info->count*sizeof( particle_quad ) ); 622 // particle_quad* quads = reinterpret_cast<particle_quad*>( rawptr ); 623 624 particle_system_group_info* group = m_groups.get( info->group ); 625 if ( !info ) 626 { 627 return; 628 } 629 603 630 vec2 lb = vec2( -0.5f, -0.5f ); 604 631 vec2 rt = vec2( 0.5f, 0.5f ); … … 634 661 vec3 pdir( 0.0f, 1.0f, 0.0f ); 635 662 663 vec2 texcoords[4] = 664 { 665 info->texcoords[0], 666 info->texcoords[1], 667 info->texcoords[2], 668 info->texcoords[3], 669 }; 670 636 671 for ( uint32 i = 0; i < info->count; ++i ) 637 672 { 638 673 const particle& pdata = info->particles[i]; 639 particle_quad& rdata = info->quads[i]; 674 // particle_quad& rdata = quads[i]; 675 particle_quad& rdata = group->quads[i + group->count]; 640 676 641 677 vec3 view_dir( m_inv_view_dir ); … … 676 712 rdata.data[0].position = pdata.position + s0; 677 713 rdata.data[0].color = pdata.color; 714 rdata.data[0].texcoord = texcoords[0]; 678 715 679 716 rdata.data[1].position = pdata.position + s1; 680 717 rdata.data[1].color = pdata.color; 718 rdata.data[1].texcoord = texcoords[1]; 681 719 682 720 rdata.data[2].position = pdata.position + s2; 683 721 rdata.data[2].color = pdata.color; 722 rdata.data[2].texcoord = texcoords[2]; 684 723 685 724 rdata.data[3].position = pdata.position + s3; 686 725 rdata.data[3].color = pdata.color; 726 rdata.data[3].texcoord = texcoords[3]; 687 727 688 728 rdata.data[4] = rdata.data[2]; 689 729 rdata.data[5] = rdata.data[1]; 690 730 } 731 // m_context->unmap_buffer( info->vtx_buffer ); 732 733 m_context->update( group->vtx_buffer, group->quads, group->count*sizeof(particle_quad), info->count*sizeof( particle_quad ) ); 734 group->count += info->count; 691 735 } 692 736
Note: See TracChangeset
for help on using the changeset viewer.