Changeset 545


Ignore:
Timestamp:
02/09/17 01:13:09 (8 years ago)
Author:
epyon
Message:
  • components with parent/child sorted data
  • index_table swap
  • transform != and == operators
Location:
trunk/nv
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/core/transform.hh

    r506 r545  
    109109        }
    110110
     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
    111122        template <> struct enum_to_type< TRANSFORM > { typedef transform type; };
    112123        template <> struct type_to_enum< transform > { static const datatype type = TRANSFORM; };
  • trunk/nv/ecs/component.hh

    r543 r545  
    5858                        typedef typename storage_type::const_reference  const_reference;
    5959
    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 )
    6262                        {
    6363                                m_ecs.register_component<component_type, Handler>( a_name, this );
     
    134134                                }
    135135                                m_data.pop_back();
     136                                if ( m_relational )
     137                                        relational_rebuild( dead_eindex );
    136138                        }
    137139
     
    147149                                }
    148150                                m_data.pop_back();
     151                                if ( m_relational )
     152                                        relational_rebuild( dead_eindex );
    149153                        }
    150154
     
    189193                        storage_type     m_data;
    190194                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;
    191229                        index_table_type m_index;
    192230                };
  • trunk/nv/stl/index_table.hh

    r543 r545  
    5959                }
    6060
     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               
    6171                index_type remove_swap( handle_type h )
    6272                {
     
    153163                }
    154164
     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
    155178                index_type remove_swap( handle_type h )
    156179                {
    157180                        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 );
    159183                        if ( ih == m_indexes.end() || ih->second == index_type(-1) ) return -1;
    160                         index_type swap_handle = m_handles.back();
    161184                        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 )
    173198                {
    174199                        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 );
    184210                        return dead_eindex;
    185211                }
     
    200226        };
    201227
    202 
    203228}
    204229
Note: See TracChangeset for help on using the changeset viewer.