- Timestamp:
- 01/31/17 14:09:44 (8 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/ecs/ecs.hh
r540 r541 1 // Copyright (C) 2016-201 6ChaosForge Ltd1 // Copyright (C) 2016-2017 ChaosForge Ltd 2 2 // http://chaosforge.org/ 3 3 // … … 22 22 #include <nv/stl/range.hh> 23 23 #include <nv/core/types.hh> 24 #include <nv/ecs/message_queue.hh> 24 25 25 26 namespace nv … … 35 36 36 37 template < typename Handle, typename Time = f32 > 37 class ecs 38 class ecs : public message_queue< Handle, Time > 38 39 { 39 40 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; 68 47 69 48 class component_interface : public receiver_interface … … 96 75 }; 97 76 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 111 77 template < typename Component > 112 78 void register_component( string_view name, component_interface* c ) … … 118 84 } 119 85 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 149 86 handle_type create() 150 87 { 151 88 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() const188 {189 return !m_pqueue.empty();190 }191 192 const message& top_event() const193 {194 return m_pqueue.top();195 }196 197 void reset_events()198 {199 m_pqueue.clear();200 m_time = time_type(0);201 89 } 202 90 … … 284 172 handle_tree_manager< handle_type > m_handles; 285 173 vector< component_interface* > m_components; 286 vector< receiver_interface* > m_receivers;287 174 hash_store< thash64, component_interface* > m_component_map; 288 175 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_interface295 {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-op309 }310 311 virtual void clear()312 {313 // no-op314 }315 virtual bool handle_message( const message_type& )316 {317 return false;318 }319 protected:320 ecs_type& m_ecs;321 176 }; 322 177 -
trunk/src/lua/lua_proxy.cc
r540 r541 96 96 97 97 nv::lua::temporary_proxy::temporary_proxy( state* state ) 98 : stack_proxy( state, -1)98 : stack_proxy( state, lua_gettop( *state ) ) 99 99 { 100 100 -
trunk/src/lua/lua_state.cc
r540 r541 153 153 // TODO : error handling 154 154 } 155 m_index = -1;155 m_index = nlua_absindex( m_state, -1 ); 156 156 } 157 157 … … 166 166 // TODO : error handling 167 167 } 168 m_index = -1;168 m_index = nlua_absindex( m_state, -1 ); 169 169 } 170 170 171 171 lua::table_guard::~table_guard() 172 172 { 173 if ( m_ index == -1)173 if ( m_level != lua_gettop( m_state ) ) 174 174 lua_settop( m_state, m_level ); 175 175 } … … 184 184 { 185 185 m_level = lua_gettop( m_state ); 186 m_index = proxy.m_index;186 m_index = nlua_absindex( m_state, proxy.m_index ); 187 187 } 188 188
Note: See TracChangeset
for help on using the changeset viewer.