- Timestamp:
- 06/03/16 16:24:49 (9 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/ecs/ecs.hh
r497 r498 104 104 }; 105 105 106 107 106 108 template < typename HANDLE = handle<> > 107 109 class ecs … … 110 112 typedef HANDLE handle_type; 111 113 112 template < typename COMPONENT, typename MANAGER > 113 void register_component( string_view /*name*/, MANAGER* /*manager*/ ) 114 { 115 116 } 117 118 handle_type create_handle() 114 typedef uint32 message_type; 115 116 struct message 117 { 118 message_type type; 119 handle_type entity; 120 uint8 payload[128 - sizeof( uint32 ) - sizeof( handle_type )]; 121 }; 122 123 class component_interface 124 { 125 public: 126 virtual bool handle_message( const message& ) = 0; 127 virtual void clear() = 0; 128 virtual void remove( handle_type h ) = 0; 129 }; 130 131 template < typename Payload > 132 static const Payload& message_cast( const message& m ) 133 { 134 static_assert( sizeof( Payload ) < sizeof( message::payload ), "Payload size over limit!" ); 135 NV_ASSERT( Payload::message_id == m.type, "Payload cast fail!" ); 136 return *reinterpret_cast<const Payload*>( &( m.payload ) ); 137 } 138 139 template < typename COMPONENT > 140 void register_component( string_view /*name*/, component_interface* c ) 141 { 142 m_components.push_back( c ); 143 } 144 145 bool dispatch( const message& m ) 146 { 147 for ( auto c : m_components ) 148 c->handle_message( m ); 149 return true; 150 } 151 152 template < typename Payload, typename ...Args > 153 bool dispatch( handle_type h, Args&&... args ) 154 { 155 message m{ Payload::message_id, h }; 156 new( &m.payload ) Payload{ nv::forward<Args>( args )... }; 157 return dispatch( m ); 158 } 159 160 handle_type create() 119 161 { 120 162 return m_handles.create_handle(); 121 163 } 122 164 123 void free_handle( handle_type h ) 124 { 165 void clear() 166 { 167 for ( auto c : m_components ) 168 c->clear(); 169 m_handles.clear(); 170 } 171 172 void remove( handle_type h ) 173 { 174 for ( auto c : m_components ) 175 c->remove( h ); 125 176 m_handles.free_handle( h ); 126 177 } … … 133 184 protected: 134 185 handle_manager< handle_type > m_handles; 186 vector< component_interface* > m_components; 135 187 }; 136 188 137 189 template < typename ECS, typename COMPONENT > 138 class component 190 class component : public ECS::component_interface 139 191 { 140 192 public: 141 193 typedef ECS ecs_type; 194 typedef typename ecs_type::message message_type; 142 195 typedef typename ecs_type::handle_type handle_type; 143 196 typedef index_table< handle_type > index_table_type; … … 169 222 } 170 223 224 template < typename ...Args > 225 value_type& insert( handle_type h, Args&&... args ) 226 { 227 /*index_type i = */m_index.insert( h ); 228 //NV_ASSERT( i == m_data.size(), "Fail!" ); 229 m_data.emplace_back( nv::forward<Args>( args )... ); 230 return m_data.back(); 231 } 232 171 233 bool exists( handle_type h ) 172 234 { … … 174 236 } 175 237 176 v oid clear()238 virtual void clear() 177 239 { 178 240 m_index.clear(); … … 192 254 } 193 255 194 v oid remove( handle_type h )256 virtual void remove( handle_type h ) 195 257 { 196 258 index_type dead_eindex = m_index.remove_swap( h ); … … 202 264 m_data.pop_back(); 203 265 } 266 267 virtual bool handle_message( const message_type& ) 268 { 269 return true; 270 } 271 204 272 205 273 handle_type get_handle( index_type i ) const { return m_index.get_handle( i ); } -
trunk/nv/stl/handle.hh
r497 r498 115 115 const index_entry& entry = m_entries[h.index()]; 116 116 return entry.next_free == USED && entry.counter == hop::get_counter( h ); 117 } 118 119 void clear() 120 { 121 m_first_free = NONE; 122 m_last_free = NONE; 123 m_entries.clear(); 117 124 } 118 125 … … 385 392 void resize_to( index_type i ) 386 393 { 387 index_type size = index_type( m_ indexes.size() );394 index_type size = index_type( m_handles.size() ); 388 395 if ( i >= size ) 389 396 { -
trunk/nv/stl/memory.hh
r472 r498 191 191 inline void construct_object( T* object, Args&&... params ) 192 192 { 193 new ( object )T ( ::nv::forward<Args>( params )... );193 new ( object )T{ ::nv::forward<Args>( params )... }; 194 194 } 195 195 -
trunk/src/engine/material_manager.cc
r491 r498 28 28 { 29 29 gpu_material* result = new gpu_material; 30 sampler smp( sampler::LINEAR , sampler::REPEAT );30 sampler smp( sampler::LINEAR_MIPMAP_LINEAR, sampler::REPEAT ); 31 31 for ( uint32 i = 0; i < size( mat->paths ); ++i ) 32 32 if ( !mat->paths[i].empty() ) -
trunk/src/gl/gl_device.cc
r493 r498 109 109 110 110 // Detect if mipmapping was requested 111 if ( gl_type == GL_TEXTURE_2D && gl_enum != GL_RED_INTEGER && asampler.filter_min != sampler::LINEAR && asampler.filter_min != sampler::NEAREST )112 {113 // TODO: This should not be done if we use framebuffers!114 glTexParameteri( gl_type, GL_GENERATE_MIPMAP, GL_TRUE);115 }111 // if ( gl_type == GL_TEXTURE_2D && gl_enum != GL_RED_INTEGER && asampler.filter_min != sampler::LINEAR && asampler.filter_min != sampler::NEAREST ) 112 // { 113 // // TODO: This should not be done if we use framebuffers! 114 // glTexParameteri( gl_type, GL_GENERATE_MIPMAP, GL_TRUE); 115 // } 116 116 117 117 if ( asampler.filter_max != sampler::NEAREST ) … … 154 154 else 155 155 glTexImage2DMultisample( gl_type, 4, gl_internal, size.x, size.y, 1 ); 156 157 if ( gl_type == GL_TEXTURE_2D && gl_enum != GL_RED_INTEGER && asampler.filter_min != sampler::LINEAR && asampler.filter_min != sampler::NEAREST ) 158 { 159 // TODO: This should not be done if we use framebuffers! 160 glGenerateMipmap( gl_type ); 161 } 162 156 163 157 164 glBindTexture( gl_type, 0 );
Note: See TracChangeset
for help on using the changeset viewer.