Changeset 547 for trunk


Ignore:
Timestamp:
02/10/17 00:48:00 (8 years ago)
Author:
epyon
Message:
  • support for recursive message dispatch
Location:
trunk/nv/ecs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/ecs/ecs.hh

    r543 r547  
    167167                                ecs& m_ecs;
    168168                        };
     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
    169177
    170178                        template < typename Component, typename Handler >
     
    253261                        }
    254262
     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
    255271                        void remove( handle_type h )
    256272                        {
     
    321337                        }
    322338
    323                 protected:
     339//              protected:
    324340
    325341                        template < typename System, typename Components, template <class...> class List, typename... Messages >
     
    334350                        typename enable_if< has_component_message< System, Components, Message >::value, void >::type
    335351                        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 )
    336374                        {
    337375                                component_interface* ci = get_interface<Components>();
     
    339377                                {
    340378                                        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
    355388                                        if ( void* c = ci->get_raw( m.entity ) )
    356389                                                s->on( m, *this, *((Components*)(c)) );
     
    434467                                m_update_handlers.push_back( handler );
    435468                        }
     469
     470                protected:
    436471
    437472                        handle_tree_manager< handle_type >          m_handles;
  • trunk/nv/ecs/message_queue.hh

    r542 r547  
    8484                        {
    8585                                message_type type;
     86                                uint32       recursive;
    8687                                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 ) ];
    8889                        };
    8990
     
    126127                        bool dispatch( Args&&... args )
    127128                        {
    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 ) };
    129138                                new( &m.payload ) Payload{ nv::forward<Args>( args )... };
    130139                                return dispatch( m );
     
    140149                        bool queue( time_type delay, Args&&... args )
    141150                        {
    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 };
    143160                                new( &m.payload ) Payload{ nv::forward<Args>( args )... };
    144161                                return queue( m );
Note: See TracChangeset for help on using the changeset viewer.