Changeset 541 for trunk


Ignore:
Timestamp:
01/31/17 14:09:44 (8 years ago)
Author:
epyon
Message:
  • lua fixes
  • ecs message_queue split
  • ecs message_cast as free function
Location:
trunk
Files:
1 added
3 edited

Legend:

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

    r540 r541  
    1 // Copyright (C) 2016-2016 ChaosForge Ltd
     1// Copyright (C) 2016-2017 ChaosForge Ltd
    22// http://chaosforge.org/
    33//
     
    2222#include <nv/stl/range.hh>
    2323#include <nv/core/types.hh>
     24#include <nv/ecs/message_queue.hh>
    2425
    2526namespace nv
     
    3536
    3637                template < typename Handle, typename Time = f32 >
    37                 class ecs
     38                class ecs : public message_queue< Handle, Time >
    3839                {
    3940                public:
    40                         typedef Time   time_type;
    41                         typedef Handle handle_type;
    42 
    43                         typedef uint32 message_type;
    44 
    45                         struct message
    46                         {
    47                                 message_type type;
    48                                 handle_type  entity;
    49                                 time_type    time;
    50                                 uint8        payload[128 - sizeof( uint32 ) - sizeof( handle_type ) - sizeof( time_type )];
    51                         };
    52 
    53                         struct message_compare_type
    54                         {
    55                                 bool operator()( const message& l, const message& r )
    56                                 {
    57                                         return l.time > r.time;
    58                                 }
    59                         };
    60 
    61                         class receiver_interface
    62                         {
    63                         public:
    64                                 virtual void update( time_type dtime ) = 0;
    65                                 virtual bool handle_message( const message& ) = 0;
    66                                 virtual void clear() = 0;
    67                         };
     41                        typedef message_queue< Handle, Time > base_class;
     42                        using base_class::time_type;
     43                        using base_class::handle_type;
     44                        using base_class::message_type;
     45                        using base_class::message;
     46                        using base_class::receiver_interface;
    6847
    6948                        class component_interface : public receiver_interface
     
    9675                        };
    9776
    98                         template < typename Payload >
    99                         static const Payload& message_cast( const message& m )
    100                         {
    101                                 static_assert( sizeof( Payload ) < sizeof( message::payload ), "Payload size over limit!" );
    102                                 NV_ASSERT( Payload::message_id == m.type, "Payload cast fail!" );
    103                                 return *reinterpret_cast<const Payload*>( &( m.payload ) );
    104                         }
    105 
    106                         void register_receiver( string_view /*name*/, receiver_interface* c )
    107                         {
    108                                 m_receivers.push_back( c );
    109                         }
    110 
    11177                        template < typename Component >
    11278                        void register_component( string_view name, component_interface* c )
     
    11884                        }
    11985
    120                         bool dispatch( const message& m )
    121                         {
    122                                 for ( auto c : m_receivers )
    123                                         c->handle_message( m );
    124                                 return true;
    125                         }
    126 
    127                         template < typename Payload, typename ...Args >
    128                         bool dispatch( handle_type h, Args&&... args )
    129                         {
    130                                 message m{ Payload::message_id, h, time_type(0) };
    131                                 new( &m.payload ) Payload{ nv::forward<Args>( args )... };
    132                                 return dispatch( m );
    133                         }
    134 
    135                         bool queue( const message& m )
    136                         {
    137                                 m_pqueue.push( m );
    138                                 return true;
    139                         }
    140 
    141                         template < typename Payload, typename ...Args >
    142                         bool queue( handle_type h, time_type delay, Args&&... args )
    143                         {
    144                                 message m{ Payload::message_id, h, m_time + delay };
    145                                 new( &m.payload ) Payload{ nv::forward<Args>( args )... };
    146                                 return queue( m );
    147                         }
    148 
    14986                        handle_type create()
    15087                        {
    15188                                return m_handles.create_handle();
    152                         }
    153 
    154                         void update( time_type dtime )
    155                         {
    156                                 if ( dtime == time_type(0) ) return;
    157                                 m_time += dtime;
    158                                 while ( !m_pqueue.empty() && m_pqueue.top().time <= m_time )
    159                                 {
    160                                         message msg = m_pqueue.top();
    161                                         m_pqueue.pop();
    162                                         dispatch( msg );
    163                                 }
    164 
    165                                 for ( auto c : m_receivers )
    166                                         c->update( dtime );
    167                         }
    168 
    169                         time_type update_step()
    170                         {
    171                                 time_type before = m_time;
    172                                 if ( !m_pqueue.empty() )
    173                                 {
    174                                         message msg = m_pqueue.top();
    175                                         m_time = msg.time;
    176                                         m_pqueue.pop();
    177                                         dispatch( msg );
    178                                         if ( before != m_time )
    179                                                 for ( auto c : m_receivers )
    180                                                         c->update( m_time - before );
    181                                 }
    182                                 return m_time;
    183                         }
    184 
    185                         time_type get_time() const { return m_time; }
    186 
    187                         bool events_pending() const
    188                         {
    189                                 return !m_pqueue.empty();
    190                         }
    191 
    192                         const message& top_event() const
    193                         {
    194                                 return m_pqueue.top();
    195                         }
    196 
    197                         void reset_events()
    198                         {
    199                                 m_pqueue.clear();
    200                                 m_time = time_type(0);
    20189                        }
    20290
     
    284172                        handle_tree_manager< handle_type >          m_handles;
    285173                        vector< component_interface* >              m_components;
    286                         vector< receiver_interface* >               m_receivers;
    287174                        hash_store< thash64, component_interface* > m_component_map;
    288175                        hash_store< shash64, component_interface* > m_component_map_by_name;
    289                         time_type                                   m_time = time_type(0);
    290                         priority_queue< message, vector< message >, message_compare_type > m_pqueue;
    291                 };
    292 
    293                 template < typename Ecs >
    294                 class receiver : public Ecs::receiver_interface
    295                 {
    296                 public:
    297                         typedef Ecs                                    ecs_type;
    298                         typedef typename ecs_type::message             message_type;
    299                         typedef typename ecs_type::handle_type         handle_type;
    300                         typedef typename ecs_type::time_type           time_type;
    301 
    302                         receiver( ecs_type& a_ecs, string_view a_name ) : m_ecs( a_ecs )
    303                         {
    304                                 m_ecs.register_receiver( a_name, this );
    305                         }
    306                         virtual void update( time_type /*dtime*/ )
    307                         {
    308                                 // no-op
    309                         }
    310 
    311                         virtual void clear()
    312                         {
    313                                 // no-op
    314                         }
    315                         virtual bool handle_message( const message_type& )
    316                         {
    317                                 return false;
    318                         }
    319                 protected:
    320                         ecs_type&        m_ecs;
    321176                };
    322177
  • trunk/src/lua/lua_proxy.cc

    r540 r541  
    9696
    9797nv::lua::temporary_proxy::temporary_proxy( state* state )
    98         : stack_proxy( state, -1 )
     98        : stack_proxy( state, lua_gettop( *state ) )
    9999{
    100100
  • trunk/src/lua/lua_state.cc

    r540 r541  
    153153                // TODO : error handling
    154154        }
    155         m_index = -1;
     155        m_index = nlua_absindex( m_state, -1 );
    156156}
    157157
     
    166166                // TODO : error handling
    167167        }
    168         m_index = -1;
     168        m_index = nlua_absindex( m_state, -1 );
    169169}
    170170
    171171lua::table_guard::~table_guard()
    172172{
    173         if ( m_index == -1 )
     173        if ( m_level != lua_gettop( m_state ) )
    174174                lua_settop( m_state, m_level );
    175175}
     
    184184{
    185185        m_level = lua_gettop( m_state );
    186         m_index = proxy.m_index;
     186        m_index = nlua_absindex( m_state, proxy.m_index );
    187187}
    188188
Note: See TracChangeset for help on using the changeset viewer.