Changeset 545
- Timestamp:
- 02/09/17 01:13:09 (8 years ago)
- Location:
- trunk/nv
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/core/transform.hh
r506 r545 109 109 } 110 110 111 inline bool operator==( const transform& lhs, const transform& rhs ) 112 { 113 return lhs.get_position() == rhs.get_position() && lhs.get_orientation() == rhs.get_orientation(); 114 } 115 116 inline bool operator!=( const transform& lhs, const transform& rhs ) 117 { 118 return !( lhs == rhs ); 119 } 120 121 111 122 template <> struct enum_to_type< TRANSFORM > { typedef transform type; }; 112 123 template <> struct type_to_enum< transform > { static const datatype type = TRANSFORM; }; -
trunk/nv/ecs/component.hh
r543 r545 58 58 typedef typename storage_type::const_reference const_reference; 59 59 60 component( ecs_type& a_ecs, string_view a_name, uint32 reserve = 0 )61 : m_ecs( a_ecs ) 60 component( ecs_type& a_ecs, string_view a_name, bool relational = false, uint32 reserve = 0 ) 61 : m_ecs( a_ecs ), m_relational( relational ) 62 62 { 63 63 m_ecs.register_component<component_type, Handler>( a_name, this ); … … 134 134 } 135 135 m_data.pop_back(); 136 if ( m_relational ) 137 relational_rebuild( dead_eindex ); 136 138 } 137 139 … … 147 149 } 148 150 m_data.pop_back(); 151 if ( m_relational ) 152 relational_rebuild( dead_eindex ); 149 153 } 150 154 … … 189 193 storage_type m_data; 190 194 private: 195 void swap( handle_type a, handle_type b ) 196 { 197 index_type ai = m_index.get( a ); 198 index_type bi = m_index.get( b ); 199 m_index.swap( a, b ); 200 value_type t = nv::move( m_data[ai] ); 201 m_data[ai] = nv::move( m_data[bi] ); 202 m_data[bi] = nv::move( t ); 203 } 204 205 handle_type extract_owner( index_type i ) 206 { 207 return *(handle_type*)( &( m_data[i] ) ); 208 } 209 210 void relational_remove( handle_type a ) 211 { 212 index_type i = m_index.get( a ); 213 remove( a ); 214 relational_rebuild( i ); 215 } 216 217 void relational_rebuild( index_type i ) 218 { 219 handle_type h = extract_owner( i ); 220 handle_type p = m_ecs.get_parent( h ); 221 if ( !p ) return; 222 if ( i < m_index.get( p ) ) 223 { 224 swap( h, p ); 225 relational_rebuild( i ); 226 } 227 } 228 bool m_relational; 191 229 index_table_type m_index; 192 230 }; -
trunk/nv/stl/index_table.hh
r543 r545 59 59 } 60 60 61 void swap( handle_type a, handle_type b ) 62 { 63 if ( a.is_nil() || a.index() >= m_indexes.size() || m_indexes[a.index()] == -1 ) return; 64 if ( b.is_nil() || b.index() >= m_indexes.size() || m_indexes[b.index()] == -1 ) return; 65 index_type a_idx = m_indexes[a.index()]; 66 index_type b_idx = m_indexes[b.index()]; 67 nv::swap( m_indexes[a.index()], m_indexes[b.index()] ); 68 nv::swap( m_handles[a_idx], m_handles[b_idx] ); 69 } 70 61 71 index_type remove_swap( handle_type h ) 62 72 { … … 153 163 } 154 164 165 void swap( handle_type a, handle_type b ) 166 { 167 if ( a.is_nil() || b.is_nil() ) return; 168 auto ai = m_indexes.find( a.index() ); 169 auto bi = m_indexes.find( b.index() ); 170 if ( ai == m_indexes.end() || bi == m_indexes.end() ) return; 171 index_type a_idx = ai->second; 172 index_type b_idx = bi->second; 173 ai->second = b_idx; 174 bi->second = a_idx; 175 nv::swap( m_handles[a_idx], m_handles[b_idx] ); 176 } 177 155 178 index_type remove_swap( handle_type h ) 156 179 { 157 180 if ( h.is_nil() ) return -1; 158 auto ih = m_indexes.find( h.index() ); 181 index_type dead_h_index = h.index(); 182 auto ih = m_indexes.find( dead_h_index ); 159 183 if ( ih == m_indexes.end() || ih->second == index_type(-1) ) return -1; 160 index_type swap_handle = m_handles.back();161 184 index_type dead_eindex = ih->second; 162 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 163 { 164 m_handles[unsigned( dead_eindex )] = swap_handle; 165 m_indexes[swap_handle] = dead_eindex; 166 } 167 m_handles.pop_back(); 168 m_indexes.erase( h.index() ); 169 return dead_eindex; 170 } 171 172 index_type remove_swap( index_type dead_eindex ) 185 186 index_type swap_handle = m_handles.back(); 187 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 188 { 189 m_handles[unsigned( dead_eindex )] = swap_handle; 190 m_indexes[swap_handle] = dead_eindex; 191 } 192 m_handles.pop_back(); 193 m_indexes.erase( dead_h_index ); 194 return dead_eindex; 195 } 196 197 index_type remove_swap_by_index( index_type dead_eindex ) 173 198 { 174 199 if ( uint32( dead_eindex ) >= m_handles.size() ) return -1; 175 index_type h = m_handles[dead_eindex]; 176 index_type swap_handle = m_handles.back(); 177 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 178 { 179 m_handles[unsigned( dead_eindex )] = swap_handle; 180 m_indexes[swap_handle] = dead_eindex; 181 } 182 m_handles.pop_back(); 183 m_indexes.erase( h ); 200 index_type dead_h_index = m_handles[dead_eindex]; 201 202 index_type swap_handle = m_handles.back(); 203 if ( dead_eindex != static_cast<index_type>( m_handles.size() - 1 ) ) 204 { 205 m_handles[unsigned( dead_eindex )] = swap_handle; 206 m_indexes[swap_handle] = dead_eindex; 207 } 208 m_handles.pop_back(); 209 m_indexes.erase( dead_h_index ); 184 210 return dead_eindex; 185 211 } … … 200 226 }; 201 227 202 203 228 } 204 229
Note: See TracChangeset
for help on using the changeset viewer.