Ignore:
Timestamp:
06/06/16 18:54:52 (9 years ago)
Author:
epyon
Message:
  • ecs work
  • particle engine rehaul
  • added map/unmap buffer to ::context
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine/particle_engine.cc

    r491 r499  
    470470}
    471471
    472 nv::particle_system nv::particle_engine::create_system( const string_view& id )
     472nv::particle_system nv::particle_engine::create_system( const string_view& id, particle_system_group group )
    473473{
    474474        auto it = m_names.find( id );
     
    480480        particle_system result = m_systems.create();
    481481        particle_system_info* info = m_systems.get( result );
    482 
     482        info->group = group;
    483483        info->data     = data;
    484484        uint32 ecount = data->emmiter_count;
     
    496496        info->count = 0;
    497497        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
     503void 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
     512void 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
     521nv::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*/ );
    500529        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 );
    502530        desc.add_vertex_buffers< particle_vtx >( info->vtx_buffer, true );
    503531        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];
    509533        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         }
    519534}
    520535
     
    537552        while ( m_systems.size() > 0 )
    538553                release( m_systems.get_handle( 0 ) );
     554        while ( m_groups.size() > 0 )
     555                release( m_groups.get_handle( 0 ) );
    539556        m_emmiters.clear();
    540557        m_affectors.clear();
     
    551568        {
    552569                delete[] info->particles;
     570                m_systems.destroy( system );
     571        }
     572}
     573
     574void nv::particle_engine::release( particle_system_group group )
     575{
     576        particle_system_group_info* info = m_groups.get( group );
     577        if ( info )
     578        {
    553579                delete[] info->quads;
    554                 //if ( system->own_va )
    555580                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
     585void 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
     594void nv::particle_engine::update( particle_system system )
    561595{
    562596        particle_system_info* info = m_systems.get( system );
    563         m_last_update += ms;
    564597        if ( info )
    565598        {
    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 
    571599                update_emmiters( info, m_last_update );
    572600                destroy_particles( info, m_last_update );
     
    575603
    576604                generate_data( info );
    577                 m_context->update( info->vtx_buffer, info->quads, /*system->m_offset*sizeof(particle_quad)*/ 0, info->count*sizeof(particle_quad) );
    578605        }
    579606}
     
    585612        {
    586613                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];
    598616        }
    599617}
     
    601619void nv::particle_engine::generate_data( particle_system_info* info )
    602620{
     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
    603630        vec2 lb     = vec2( -0.5f, -0.5f );
    604631        vec2 rt     = vec2( 0.5f, 0.5f );
     
    634661        vec3 pdir( 0.0f, 1.0f, 0.0f );
    635662
     663        vec2 texcoords[4] =
     664        {
     665                info->texcoords[0],
     666                info->texcoords[1],
     667                info->texcoords[2],
     668                info->texcoords[3],
     669        };
     670
    636671        for ( uint32 i = 0; i < info->count; ++i )
    637672        {
    638673                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];
    640676
    641677                vec3 view_dir( m_inv_view_dir );
     
    676712                rdata.data[0].position = pdata.position + s0;
    677713                rdata.data[0].color    = pdata.color;
     714                rdata.data[0].texcoord = texcoords[0];
    678715
    679716                rdata.data[1].position = pdata.position + s1;
    680717                rdata.data[1].color    = pdata.color;
     718                rdata.data[1].texcoord = texcoords[1];
    681719
    682720                rdata.data[2].position = pdata.position + s2;
    683721                rdata.data[2].color    = pdata.color;
     722                rdata.data[2].texcoord = texcoords[2];
    684723
    685724                rdata.data[3].position = pdata.position + s3;
    686725                rdata.data[3].color    = pdata.color;
     726                rdata.data[3].texcoord = texcoords[3];
    687727
    688728                rdata.data[4] = rdata.data[2];
    689729                rdata.data[5] = rdata.data[1];
    690730        }
     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;
    691735}
    692736
Note: See TracChangeset for help on using the changeset viewer.