- Timestamp:
- 02/10/17 00:48:00 (8 years ago)
- Location:
- trunk/nv/ecs
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/ecs/ecs.hh
r543 r547 167 167 ecs& m_ecs; 168 168 }; 169 170 template< typename System > 171 void register_system( string_view name, System* c ) 172 { 173 register_handler< System >( name, (System*)( c ) ); 174 register_ecs_update< System >( (System*)( c ) ); 175 } 176 169 177 170 178 template < typename Component, typename Handler > … … 253 261 } 254 262 263 template < typename F > 264 void recursive_call( handle_type h, F&& f ) 265 { 266 f( h ); 267 for ( auto c : children( h ) ) 268 recursive_call( c, f ); 269 } 270 255 271 void remove( handle_type h ) 256 272 { … … 321 337 } 322 338 323 protected:339 // protected: 324 340 325 341 template < typename System, typename Components, template <class...> class List, typename... Messages > … … 334 350 typename enable_if< has_component_message< System, Components, Message >::value, void >::type 335 351 register_component_message( System* s ) 352 { 353 component_interface* ci = get_interface<Components>(); 354 register_callback( Message::message_id, [=] ( const message& msg ) 355 { 356 const Message& m = message_cast<Message>( msg ); 357 if ( msg.recursive ) 358 { 359 this->recursive_call( m.entity, [=] ( handle_type h ) 360 { 361 if ( void* c = ci->get_raw( h ) ) 362 s->on( m, *( (Components*)( c ) ) ); 363 } ); 364 } 365 else 366 if ( void* c = ci->get_raw( m.entity ) ) 367 s->on( m, *( (Components*)( c ) ) ); 368 } ); 369 } 370 371 template < typename System, typename Components, typename Message > 372 typename enable_if< has_ecs_component_message< this_type, System, Components, Message >::value, void >::type 373 register_ecs_component_message( System* s ) 336 374 { 337 375 component_interface* ci = get_interface<Components>(); … … 339 377 { 340 378 const Message& m = message_cast<Message>( msg ); 341 if ( void* c = ci->get_raw( m.entity ) ) 342 s->on( m, *((Components*)(c)) ); 343 } ); 344 345 } 346 347 template < typename System, typename Components, typename Message > 348 typename enable_if< has_ecs_component_message< this_type, System, Components, Message >::value, void >::type 349 register_ecs_component_message( System* s ) 350 { 351 component_interface* ci = get_interface<Components>(); 352 register_callback( Message::message_id, [=] ( const message& msg ) 353 { 354 const Message& m = message_cast<Message>( msg ); 379 if ( msg.recursive ) 380 { 381 this->recursive_call( m.entity, [=] ( handle_type h ) 382 { 383 if ( void* c = ci->get_raw( h ) ) 384 s->on( m, *this, *( (Components*)( c ) ) ); 385 } ); 386 } 387 else 355 388 if ( void* c = ci->get_raw( m.entity ) ) 356 389 s->on( m, *this, *((Components*)(c)) ); … … 434 467 m_update_handlers.push_back( handler ); 435 468 } 469 470 protected: 436 471 437 472 handle_tree_manager< handle_type > m_handles; -
trunk/nv/ecs/message_queue.hh
r542 r547 84 84 { 85 85 message_type type; 86 uint32 recursive; 86 87 time_type time; 87 uint8 payload[128 - sizeof( message_type ) - sizeof( time_type ) ];88 uint8 payload[128 - sizeof( message_type ) - sizeof( time_type ) - sizeof( uint32 ) ]; 88 89 }; 89 90 … … 126 127 bool dispatch( Args&&... args ) 127 128 { 128 message m{ Payload::message_id, time_type( 0 ) }; 129 message m{ Payload::message_id, 0, time_type( 0 ) }; 130 new( &m.payload ) Payload{ nv::forward<Args>( args )... }; 131 return dispatch( m ); 132 } 133 134 template < typename Payload, typename ...Args > 135 bool dispatch_recursive( Args&&... args ) 136 { 137 message m{ Payload::message_id, 1, time_type( 0 ) }; 129 138 new( &m.payload ) Payload{ nv::forward<Args>( args )... }; 130 139 return dispatch( m ); … … 140 149 bool queue( time_type delay, Args&&... args ) 141 150 { 142 message m{ Payload::message_id, m_time + delay }; 151 message m{ Payload::message_id, 0, m_time + delay }; 152 new( &m.payload ) Payload{ nv::forward<Args>( args )... }; 153 return queue( m ); 154 } 155 156 template < typename Payload, typename ...Args > 157 bool queue_recursive( time_type delay, Args&&... args ) 158 { 159 message m{ Payload::message_id, 1, m_time + delay }; 143 160 new( &m.payload ) Payload{ nv::forward<Args>( args )... }; 144 161 return queue( m );
Note: See TracChangeset
for help on using the changeset viewer.