Changeset 543
- Timestamp:
- 02/06/17 21:13:58 (8 years ago)
- Location:
- trunk
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/ecs/component.hh
r542 r543 136 136 } 137 137 138 void remove_by_index( index_type i ) 139 { 140 if ( i > size() ) return; 141 destroy( &m_data[i] ); 142 index_type dead_eindex = m_index.remove_swap_by_index( i ); 143 if ( dead_eindex == -1 ) return; 144 if ( dead_eindex != static_cast<index_type>( m_data.size() - 1 ) ) 145 { 146 m_data[unsigned( dead_eindex )] = move( m_data.back() ); 147 } 148 m_data.pop_back(); 149 } 150 151 template < typename F > 152 void remove_if( F f ) 153 { 154 uint32 i = 0; 155 while ( i < size() ) 156 { 157 auto& md = m_data[i]; 158 if ( f( md ) ) 159 remove_by_index( i ); 160 else 161 ++i; 162 } 163 } 164 138 165 virtual void destroy( value_type* ) 139 166 { … … 146 173 } 147 174 148 inline handle_type _get_handle( index_type i ) const { return m_index.get_handle( i ); }149 150 175 inline const value_type& operator[] ( index_type i ) const { return m_data[i]; } 151 176 inline value_type& operator[] ( index_type i ) { return m_data[i]; } … … 159 184 inline const_iterator end() const { return m_data.end(); } 160 185 161 //inline virtual component_storage* storage() { return &m_data; }186 inline virtual component_storage* storage() { return &m_data; } 162 187 protected: 163 188 ecs_type& m_ecs; -
trunk/nv/ecs/component_storage.hh
r542 r543 156 156 return ( component_storage_handler< Component >* )storage; 157 157 } 158 158 /* 159 159 template < typename Handle, typename Component > 160 160 class index_storage … … 237 237 238 238 } 239 240 inline handle_type get_handle( index_type i ) const { return m_handles[unsigned( i )]; }241 239 242 240 inline const value_type& operator[] ( index_type i ) const { return m_data[i]; } … … 428 426 429 427 class direct_storage; 430 /*428 431 429 template < typename Handle, typename Component > 432 430 class hash_storage -
trunk/nv/ecs/ecs.hh
r542 r543 36 36 namespace ecs 37 37 { 38 39 namespace detail 40 { 41 template<typename, typename T> 42 struct has_update 43 { 44 static_assert( nv::integral_constant<T, false>::value, "Second template parameter needs to be of function type." ); 45 }; 46 47 template< typename C, typename Ret, typename... Args > 48 struct has_update<C, Ret( Args... )> 49 { 50 private: 51 template<typename T> 52 static constexpr auto check( T* ) 53 -> typename nv::is_same< decltype( nv::declval<T>().update( nv::declval<Args>()... ) ), Ret >::type; 54 55 template<typename> 56 static constexpr nv::false_type check( ... ); 57 58 typedef decltype( check<C>( 0 ) ) type; 59 60 public: 61 static constexpr bool value = type::value; 62 }; 63 } 64 65 template < typename E, typename S, typename T > 66 using has_ecs_update = detail::has_update<S, void( E&, T ) >; 67 68 template < typename S, typename C, typename T > 69 using has_component_update = detail::has_update<S, void( C&, T ) >; 70 71 template < typename E, typename S, typename C, typename T > 72 using has_ecs_component_update = detail::has_update<S, void( E&, C&, T ) >; 73 38 74 template < typename S, typename C, typename M > 39 75 using has_component_message = detail::has_message<S, void( const M&, C& ) >; … … 44 80 template < typename E, typename S, typename M > 45 81 using has_ecs_message = detail::has_message<S, void( const M&, E& ) >; 46 47 82 48 83 template < typename Handle, typename MessageList, typename Time = f32 > … … 57 92 using base_type::message; 58 93 59 94 using update_handler = function< void( time_type ) >; 60 95 61 96 class component_interface … … 68 103 virtual void* get_raw( handle_type h ) = 0; 69 104 virtual const void* get_raw( handle_type h ) const = 0; 70 //virtual component_storage* storage() = 0;105 virtual component_storage* storage() = 0; 71 106 }; 72 107 … … 81 116 return *this; 82 117 } 83 // enumerator operator++ ( int )84 // {85 // auto result = *this;86 // base_class::m_value = m_ecs.next( base_class::m_value );87 // return result;88 // }89 118 private: 90 119 const ecs& m_ecs; … … 115 144 } 116 145 Component& operator* () { return *m_component; } 117 Component* operator-> () { return &m_component; }118 146 const Component& operator* () const { return *m_component; } 119 const Component* operator-> () const { return &m_component; }120 147 bool operator== ( const component_enumerator& rhs ) const 121 148 { … … 149 176 register_handler< Handler >( name, (Handler*)c ); 150 177 register_component_messages< Handler, Component >( (Handler*)( c ), message_list{} ); 178 register_ecs_component_update< Handler, Component >( (Handler*)( c ) ); 179 register_component_update< Handler, Component >( (Handler*)( c ) ); 180 register_ecs_update< Handler >( (Handler*)( c ) ); 151 181 // auto s = c->storage(); 152 182 // m_cstorage.push_back( s ); … … 165 195 for ( auto c : m_components ) 166 196 c->update( dtime ); 197 for ( auto u : m_update_handlers ) 198 u( dtime ); 167 199 } 168 200 … … 294 326 void register_component_messages( System* h, List<Messages...>&& ) 295 327 { 296 int unused_0[] = { ( register_ component_message<System,Components,Messages>( h ), 0 )... };297 int unused_1[] = { ( register_ ecs_component_message<System,Components,Messages>( h ), 0 )... };328 int unused_0[] = { ( register_ecs_component_message<System,Components,Messages>( h ), 0 )... }; 329 int unused_1[] = { ( register_component_message<System,Components,Messages>( h ), 0 )... }; 298 330 int unused_2[] = { ( register_ecs_message<System,Messages>( h ), 0 )... }; 299 331 } … … 349 381 register_ecs_message( System* ) {} 350 382 351 383 template < typename System > 384 typename enable_if< has_ecs_update< this_type, System, time_type >::value, void >::type 385 register_ecs_update( System* s ) 386 { 387 register_update( [=] ( time_type dtime ) 388 { 389 s->update( *this, dtime ); 390 } ); 391 } 392 393 template < typename System, typename Components > 394 typename enable_if< has_component_update< System, Components, time_type >::value, void >::type 395 register_component_update( System* s ) 396 { 397 component_interface* ci = get_interface<Components>(); 398 component_storage_handler<Components>* storage = storage_cast<Components>( ci->storage() ); 399 register_update( [=] ( time_type dtime ) 400 { 401 for ( auto& c : *storage ) 402 s->update( c, dtime ); 403 } ); 404 } 405 406 template < typename System, typename Components > 407 typename enable_if< has_ecs_component_update< this_type, System, Components, time_type >::value, void >::type 408 register_ecs_component_update( System* s ) 409 { 410 component_interface* ci = get_interface<Components>(); 411 component_storage_handler<Components>* storage = storage_cast<Components>( ci->storage() ); 412 register_update( [=] ( time_type dtime ) 413 { 414 for ( auto& c : *storage ) 415 s->update( *this, c, dtime ); 416 } ); 417 } 418 419 420 template < typename System > 421 typename enable_if< !has_ecs_update< this_type, System, time_type >::value, void >::type 422 register_ecs_update( System* ) {} 423 424 template < typename System, typename Components > 425 typename enable_if< !has_component_message< System, Components, time_type >::value, void >::type 426 register_component_update( System* ) {} 427 428 template < typename System, typename Components > 429 typename enable_if< !has_ecs_component_update< this_type, System, Components, time_type >::value, void >::type 430 register_ecs_component_update( System* ) {} 431 432 void register_update( update_handler&& handler ) 433 { 434 m_update_handlers.push_back( handler ); 435 } 352 436 353 437 handle_tree_manager< handle_type > m_handles; … … 355 439 hash_store< thash64, component_interface* > m_component_map; 356 440 hash_store< shash64, component_interface* > m_component_map_by_name; 441 vector< update_handler > m_update_handlers; 442 357 443 // vector< component_storage* > m_cstorage; 358 444 // hash_store< thash64, component_storage* > m_cmap; -
trunk/nv/engine/particle_engine.hh
r522 r543 149 149 ~particle_engine(); 150 150 private: 151 void release( particle_system_info* system ); 151 152 void clear(); 152 153 void register_standard_emitters(); -
trunk/nv/engine/particle_group.hh
r530 r543 113 113 bool unref( particle_group group ); 114 114 protected: 115 void release( particle_group_info* group ); 115 116 void clear(); 116 117 -
trunk/nv/fmod/fmod_audio.hh
r530 r543 42 42 virtual ~audio(); 43 43 private: 44 void release( sound_info* info ); 45 44 46 handle_store< sound_info, sound > m_sounds; 45 47 vec3 m_position; -
trunk/nv/gl/gl_context.hh
r535 r543 90 90 91 91 protected: 92 void release( gl_vertex_array_info* va ); 93 void release( gl_framebuffer_info* f ); 94 92 95 void bind( program p ); 93 96 void bind( vertex_array va ); -
trunk/nv/gl/gl_device.hh
r530 r543 73 73 virtual ~gl_device(); 74 74 protected: 75 76 void release( gl_buffer_info* b ); 77 void release( gl_texture_info* t ); 78 void release( gl_program_info* p ); 79 void release( gl_shader_info* s ); 80 75 81 gl_texture_info* get_full_texture_info( texture t ); 76 82 gl_buffer_info* get_full_buffer_info( buffer t ); -
trunk/nv/sdl/sdl_audio.hh
r530 r543 40 40 virtual ~audio(); 41 41 private: 42 void release( sound_info* info ); 43 42 44 vec3 m_position; 43 45 vec3 m_forward; -
trunk/nv/stl/handle_store.hh
r530 r543 84 84 } 85 85 86 handle_type get_handle( index_type i ) const { return m_index.get_handle( i ); }87 88 86 const value_type& operator[] ( index_type i ) const { return m_data[i]; } 89 87 value_type& operator[] ( index_type i ) { return m_data[i]; } … … 116 114 typedef typename storage::const_reference const_reference; 117 115 116 static const index_type INVALID = index_type( -1 ); 117 118 118 unpacked_indexed_array() {} 119 119 unpacked_indexed_array( uint32 reserve ) 120 120 { 121 121 m_data.reserve( reserve ); 122 m_indices.reserve( reserve ); 122 123 } 123 124 … … 126 127 NV_ASSERT( !exists( h ), "Reinserting handle!" ); 127 128 resize_to( index_type( h.index() ) ); 128 m_ handles[h.index()] = h;129 m_indices[h.index()] = h.index(); 129 130 return &( m_data[h.index()] ); 130 131 } … … 133 134 { 134 135 if ( h.is_nil() || h.index() >= m_data.size() ) return false; 135 return m_ handles[h.index()].is_valid();136 return m_indices[h.index()] != INVALID; 136 137 } 137 138 … … 152 153 void remove( handle h ) 153 154 { 154 m_ handles[h.index()] = handle();155 m_indices[h.index()] = INVALID; 155 156 } 156 157 … … 158 159 { 159 160 m_data.clear(); 160 m_handles.clear(); 161 } 162 163 handle get_handle( index_type i ) const { return m_handles[unsigned( i )]; } 161 m_indices.clear(); 162 } 164 163 165 164 const value_type& operator[] ( index_type i ) const { return m_data[i]; } … … 178 177 void resize_to( index_type i ) 179 178 { 180 index_type size = index_type( m_ handles.size() );179 index_type size = index_type( m_indices.size() ); 181 180 if ( i >= size ) 182 181 { … … 184 183 while ( i >= size ) size = size * 2; 185 184 m_data.resize( static_cast<size_t>( size ) ); 186 m_ handles.resize( static_cast<size_t>( size ));185 m_indices.resize( static_cast<size_t>( size ), INVALID ); 187 186 } 188 187 } 189 188 190 189 vector< T > m_data; 191 vector< handle > m_handles;190 vector< index_type > m_indices; 192 191 }; 193 192 … … 241 240 } 242 241 243 handle get_handle( index_type i ) const { return m_data.get_handle( i ); } 242 void clear() 243 { 244 m_data.clear(); 245 m_indexes.clear(); 246 } 247 244 248 const value_type& operator[] ( index_type i ) const { return m_data[unsigned( i )]; } 245 249 value_type& operator[] ( index_type i ) { return m_data[unsigned( i )]; } -
trunk/nv/stl/index_table.hh
r542 r543 25 25 typename Index = sint32 26 26 > 27 27 class index_table 28 28 { 29 29 public: … … 43 43 index_type lindex = m_handles.size(); 44 44 m_indexes[h.index()] = index_type( lindex ); 45 m_handles.push_back( h );45 m_handles.push_back( h.index() ); 46 46 return lindex; 47 47 } … … 63 63 if ( h.is_nil() || h.index() >= m_indexes.size() || m_indexes[h.index()] == -1 ) 64 64 return -1; 65 handle_type swap_handle = m_handles.back();66 index_type 67 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 68 { 69 m_handles[unsigned( dead_eindex )] = swap_handle; 70 m_indexes[swap_handle .index()] = dead_eindex;65 index_type swap_handle = m_handles.back(); 66 index_type dead_eindex = m_indexes[h.index()]; 67 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 68 { 69 m_handles[unsigned( dead_eindex )] = swap_handle; 70 m_indexes[swap_handle] = dead_eindex; 71 71 } 72 72 m_handles.pop_back(); … … 75 75 } 76 76 77 // index_type remove_swap( index_type dead_eindex )78 //{79 //if ( uint32( dead_eindex ) >= m_handles.size() ) return -1;80 // handle_type h = m_handles[dead_eindex];81 // handle_type swap_handle = m_handles.back();82 //if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) )83 //{84 //m_handles[unsigned( dead_eindex )] = swap_handle;85 // m_indexes[swap_handle.index()] = dead_eindex;86 //}87 //m_handles.pop_back();88 // m_indexes[h.index()] = -1;89 //return dead_eindex;90 //}77 index_type remove_swap_by_index( index_type dead_eindex ) 78 { 79 if ( uint32( dead_eindex ) >= m_handles.size() ) return -1; 80 index_type h = m_handles[dead_eindex]; 81 index_type swap_handle = m_handles.back(); 82 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 83 { 84 m_handles[unsigned( dead_eindex )] = swap_handle; 85 m_indexes[swap_handle] = dead_eindex; 86 } 87 m_handles.pop_back(); 88 m_indexes[h] = -1; 89 return dead_eindex; 90 } 91 91 92 92 … … 96 96 m_indexes.clear(); 97 97 } 98 99 handle_type get_handle( index_type i ) const { return m_handles[unsigned( i )]; }100 98 101 99 uint32 size() const { return m_handles.size(); } … … 113 111 } 114 112 115 vector< handle_type > m_handles;116 vector< index_type > 113 vector< index_type > m_handles; 114 vector< index_type > m_indexes; 117 115 }; 118 116 … … 135 133 index_type insert( handle_type h ) 136 134 { 137 NV_ASSERT( m_indexes.find( h ) == m_indexes.end(), "Reinserting handle!" );135 NV_ASSERT( m_indexes.find( h.index() ) == m_indexes.end(), "Reinserting handle!" ); 138 136 index_type lindex = m_handles.size(); 139 m_indexes[h ] = index_type( lindex );140 m_handles.push_back( h );137 m_indexes[h.index()] = index_type( lindex ); 138 m_handles.push_back( h.index() ); 141 139 return lindex; 142 140 } … … 144 142 bool exists( handle_type h ) const 145 143 { 146 auto ih = m_indexes.find( h );144 auto ih = m_indexes.find( h.index() ); 147 145 return ( ih != m_indexes.end() ); 148 146 } … … 150 148 index_type get( handle_type h ) const 151 149 { 152 auto ih = m_indexes.find( h );150 auto ih = m_indexes.find( h.index() ); 153 151 if ( ih == m_indexes.end() ) return -1; 154 152 return ih->second; … … 158 156 { 159 157 if ( h.is_nil() ) return -1; 160 auto ih = m_indexes.find( h );158 auto ih = m_indexes.find( h.index() ); 161 159 if ( ih == m_indexes.end() || ih->second == index_type(-1) ) return -1; 162 handle_type swap_handle = m_handles.back(); 163 index_type dead_eindex = ih->second; 160 index_type swap_handle = m_handles.back(); 161 index_type dead_eindex = ih->second; 162 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 163 { 164 m_handles[unsigned( dead_eindex )] = swap_handle; 165 m_indexes[swap_handle] = dead_eindex; 166 } 167 m_handles.pop_back(); 168 m_indexes.erase( h.index() ); 169 return dead_eindex; 170 } 171 172 index_type remove_swap( index_type dead_eindex ) 173 { 174 if ( uint32( dead_eindex ) >= m_handles.size() ) return -1; 175 index_type h = m_handles[dead_eindex]; 176 index_type swap_handle = m_handles.back(); 164 177 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 165 178 { … … 171 184 return dead_eindex; 172 185 } 173 174 // index_type remove_swap( index_type dead_eindex )175 // {176 // if ( uint32( dead_eindex ) >= m_handles.size() ) return -1;177 // handle_type h = m_handles[dead_eindex];178 // handle_type swap_handle = m_handles.back();179 // if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) )180 // {181 // m_handles[unsigned( dead_eindex )] = swap_handle;182 // m_indexes[swap_handle] = dead_eindex;183 // }184 // m_handles.pop_back();185 // m_indexes.erase( h );186 // return dead_eindex;187 // }188 186 189 187 … … 194 192 } 195 193 196 handle_type get_handle( index_type i ) const { return m_handles[unsigned( i )]; }197 198 194 uint32 size() const { return m_handles.size(); } 199 195 200 196 private: 201 197 202 vector< handle_type > m_handles;203 hash_map< handle_type, index_type > m_indexes;198 vector< index_type > m_handles; 199 hash_map< index_type, index_type > m_indexes; 204 200 }; 205 201 202 206 203 } 207 204 -
trunk/src/engine/particle_engine.cc
r534 r543 350 350 } 351 351 352 void nv::particle_engine::release( particle_system_info* info ) 353 { 354 if ( info ) 355 { 356 m_pgm->unref( info->group ); 357 delete[] info->particles; 358 } 359 } 360 352 361 void nv::particle_engine::clear() 353 362 { 354 while ( m_systems.size() > 0 ) 355 release( m_systems.get_handle( 0 ) ); 363 for ( auto& s : m_systems ) 364 release( &s ); 365 m_systems.clear(); 356 366 if ( m_pgm ) 357 367 m_pgm->reset(); … … 363 373 void nv::particle_engine::release( particle_system system ) 364 374 { 365 particle_system_info* info = m_systems.get( system ); 366 if ( info ) 367 { 368 m_pgm->unref( info->group ); 369 delete[] info->particles; 375 if ( particle_system_info* info = m_systems.get( system ) ) 376 { 377 release( info ); 370 378 m_systems.destroy( system ); 371 379 } -
trunk/src/engine/particle_group.cc
r520 r543 33 33 void particle_group_manager::release( particle_group group ) 34 34 { 35 particle_group_info* info = m_groups.get( group ); 36 if ( info ) 37 { 38 delete[] info->quads; 39 m_context->release( info->vtx_array ); 35 if ( particle_group_info* info = m_groups.get( group ) ) 36 { 37 release( info ); 40 38 m_groups.destroy( group ); 41 39 } … … 194 192 } 195 193 194 void nv::particle_group_manager::release( particle_group_info* info ) 195 { 196 if ( info ) 197 { 198 delete[] info->quads; 199 m_context->release( info->vtx_array ); 200 } 201 } 202 196 203 particle_group_manager::~particle_group_manager() 197 204 { … … 201 208 void particle_group_manager::clear() 202 209 { 203 while ( m_groups.size() > 0 ) 204 release( m_groups.get_handle( 0 ) ); 210 for ( auto& g : m_groups ) 211 release( &g ); 212 m_groups.clear(); 205 213 } 206 214 -
trunk/src/fmod/fmod_audio.cc
r406 r543 107 107 { 108 108 sound_info* info = m_sounds.get( a_sound ); 109 release( info ); 110 m_sounds.destroy( a_sound ); 111 } 112 113 void nv::fmod::audio::release( sound_info* info ) 114 { 109 115 if ( info ) 110 {111 116 FMOD_Sound_Release( static_cast<FMOD_SOUND*>( info->fmod_sound ) ); 112 m_sounds.destroy( a_sound );113 }114 117 } 115 118 … … 146 149 fmod::audio::~audio() 147 150 { 148 while ( m_sounds.size() > 0 ) 149 release( m_sounds.get_handle(0) ); 151 for ( auto& s : m_sounds ) 152 release( &s ); 153 m_sounds.clear(); 150 154 FMOD_System_Release( static_cast<FMOD_SYSTEM*>( m_system ) ); 151 155 } -
trunk/src/gl/gl_context.cc
r535 r543 97 97 void nv::gl_context::release( vertex_array va ) 98 98 { 99 gl_vertex_array_info* info = m_vertex_arrays.get( va ); 99 if ( gl_vertex_array_info* info = m_vertex_arrays.get( va ) ) 100 { 101 release( info ); 102 m_vertex_arrays.destroy( va ); 103 } 104 } 105 106 void nv::gl_context::release( gl_vertex_array_info* info ) 107 { 100 108 if ( info ) 101 109 { 102 110 for ( uint32 i = 0; i < info->count; ++i ) 103 111 { 104 if ( info->attr[i].owner ) 112 if ( info->attr[i].owner ) 105 113 release( info->attr[i].vbuffer ); 106 114 } 107 if ( info->index.is_valid() && info->index_owner ) release( info->index );115 if ( info->index.is_valid() && info->index_owner ) release( info->index ); 108 116 glDeleteVertexArrays( 1, &info->glid ); 109 m_vertex_arrays.destroy( va );110 117 } 111 118 } … … 113 120 void nv::gl_context::release( framebuffer f ) 114 121 { 115 gl_framebuffer_info* info = m_framebuffers.get( f ); 122 if ( gl_framebuffer_info* info = m_framebuffers.get( f ) ) 123 { 124 release( info ); 125 m_framebuffers.destroy( f ); 126 } 127 } 128 129 void nv::gl_context::release( gl_framebuffer_info* info ) 130 { 116 131 if ( info ) 117 132 { … … 122 137 glDeleteRenderbuffers( 1, &info->depth_rb_glid ); 123 138 glDeleteFramebuffers( 1, &info->glid ); 124 m_framebuffers.destroy( f );125 139 } 126 140 } … … 881 895 nv::gl_context::~gl_context() 882 896 { 883 while ( m_framebuffers.size() > 0)884 release( m_framebuffers.get_handle(0));885 while ( m_vertex_arrays.size() > 0)886 release( m_vertex_arrays.get_handle(0));897 for ( auto& info : m_framebuffers ) 898 release( &info ); 899 for ( auto& info : m_vertex_arrays ) 900 release( &info ); 887 901 } 888 902 -
trunk/src/gl/gl_device.cc
r535 r543 69 69 gl_device::~gl_device() 70 70 { 71 while ( m_textures.size() > 0)72 release( m_textures.get_handle(0));73 while ( m_buffers.size() > 0)74 release( m_buffers.get_handle(0));75 while ( m_programs.size() > 0)76 release( m_programs.get_handle(0));77 while ( m_shaders.size() > 0)78 release( m_shaders.get_handle( 0 ));71 for ( auto& t : m_textures ) 72 release( &t ); 73 for ( auto& b : m_buffers ) 74 release( &b ); 75 for ( auto& p : m_programs ) 76 release( &p ); 77 for ( auto& s : m_shaders ) 78 release( &s ); 79 79 } 80 80 … … 131 131 void nv::gl_device::release( texture t ) 132 132 { 133 gl_texture_info* info = m_textures.get( t ); 134 if ( info ) 135 { 136 if ( info->glid != 0 ) 137 { 138 glDeleteTextures( 1, &(info->glid) ); 139 } 133 if ( auto info = m_textures.get( t ) ) 134 { 135 release( info ); 140 136 m_textures.destroy( t ); 141 137 } 142 138 } 143 139 140 void nv::gl_device::release( gl_shader_info* s ) 141 { 142 if ( s && s->ref == 0 && s->glid != 0 ) 143 glDeleteShader( s->glid ); 144 } 145 146 void nv::gl_device::release( gl_program_info* p ) 147 { 148 if ( p && p->glid != 0 ) 149 { 150 for ( auto& i : *p->m_uniform_map ) 151 delete i.second; 152 153 gl_shader_info* vi = m_shaders.get( p->vertex ); 154 gl_shader_info* fi = m_shaders.get( p->fragment ); 155 if ( vi ) 156 { 157 glDetachShader( p->glid, vi->glid ); 158 vi->ref--; 159 release( vi ); 160 } 161 if ( fi ) 162 { 163 glDetachShader( p->glid, fi->glid ); 164 fi->ref--; 165 release( fi ); 166 } 167 glDeleteProgram( p->glid ); 168 169 delete p->m_attribute_map; 170 delete p->m_engine_uniforms; 171 delete p->m_uniform_map; 172 } 173 174 } 175 176 void nv::gl_device::release( gl_texture_info* t ) 177 { 178 if ( t && t->glid != 0 ) 179 glDeleteTextures( 1, &( t->glid ) ); 180 } 181 182 void nv::gl_device::release( gl_buffer_info* b ) 183 { 184 if ( b && b->glid != 0 ) 185 glDeleteBuffers( 1, &( b->glid ) ); 186 } 187 144 188 void nv::gl_device::release( buffer b ) 145 189 { 146 gl_buffer_info* info = m_buffers.get( b ); 147 if ( info ) 148 { 149 if ( info->glid != 0 ) 150 { 151 glDeleteBuffers( 1, &(info->glid) ); 152 } 190 if ( auto info = m_buffers.get( b ) ) 191 { 192 release( info ); 153 193 m_buffers.destroy( b ); 154 194 } … … 204 244 void nv::gl_device::release( program p ) 205 245 { 206 gl_program_info* info = m_programs.get( p ); 207 if ( info ) 208 { 209 for ( auto& i : *info->m_uniform_map ) 210 delete i.second; 211 212 detach( p, info->vertex ); 213 detach( p, info->fragment ); 214 glDeleteProgram( info->glid ); 215 216 delete info->m_attribute_map; 217 delete info->m_engine_uniforms; 218 delete info->m_uniform_map; 219 246 if ( auto info = m_programs.get( p ) ) 247 { 248 release( info ); 220 249 m_programs.destroy( p ); 221 250 } … … 224 253 void nv::gl_device::release( shader s ) 225 254 { 226 gl_shader_info* info = m_shaders.get( s ); 227 if ( info && info->ref == 0 ) 228 { 229 glDeleteShader( info->glid ); 255 if ( auto info = m_shaders.get( s ) ) 256 { 257 release( info ); 230 258 m_shaders.destroy( s ); 231 259 } -
trunk/src/sdl/sdl_audio.cc
r454 r543 111 111 nv::sdl::audio::~audio() 112 112 { 113 while ( m_sounds.size() > 0)114 release( m_sounds.get_handle(0));113 for ( auto& s : m_sounds ) 114 release( &s ); 115 115 Mix_CloseAudio(); 116 116 // TODO: should we do it here? … … 121 121 { 122 122 sound_info* info = m_sounds.get( a_sound ); 123 release( info ); 124 m_sounds.destroy( a_sound ); 125 } 126 127 void nv::sdl::audio::release( sound_info* info ) 128 { 123 129 if ( info ) 124 {125 130 Mix_FreeChunk( static_cast<Mix_Chunk*>( info->sdl_sound ) ); 126 m_sounds.destroy( a_sound );127 }128 131 } 129 132
Note: See TracChangeset
for help on using the changeset viewer.