More effective way of updating bounding boxes. IsCached() method made public. Removed some of unused fields from the layer description structure.

This commit is contained in:
Maciej Suminski 2013-09-04 16:23:26 +02:00
parent 000f1122b1
commit bf3690d841
2 changed files with 40 additions and 23 deletions

View File

@ -98,9 +98,9 @@ void VIEW::Add( VIEW_ITEM* aItem )
for( int i = 0; i < layers_count; i++ ) for( int i = 0; i < layers_count; i++ )
{ {
VIEW_LAYER* l = &m_layers[layers[i]]; VIEW_LAYER& l = m_layers[layers[i]];
l->items->Insert( aItem ); l.items->Insert( aItem );
l->dirtyExtents.Merge( aItem->ViewBBox() ); l.isDirty = true;
} }
if( m_dynamic ) if( m_dynamic )
@ -386,7 +386,7 @@ struct VIEW::updateItemsColor
void VIEW::UpdateLayerColor( int aLayer ) void VIEW::UpdateLayerColor( int aLayer )
{ {
// There is no point in updating non-cached layers // There is no point in updating non-cached layers
if( !isCached( aLayer ) ) if( !IsCached( aLayer ) )
return; return;
BOX2I r; BOX2I r;
@ -409,7 +409,7 @@ void VIEW::UpdateAllLayersColor()
VIEW_LAYER* l = &( ( *i ).second ); VIEW_LAYER* l = &( ( *i ).second );
// There is no point in updating non-cached layers // There is no point in updating non-cached layers
if( !isCached( l->id ) ) if( !IsCached( l->id ) )
continue; continue;
updateItemsColor visitor( l->id, m_painter, m_gal ); updateItemsColor visitor( l->id, m_painter, m_gal );
@ -441,7 +441,7 @@ struct VIEW::changeItemsDepth
void VIEW::ChangeLayerDepth( int aLayer, int aDepth ) void VIEW::ChangeLayerDepth( int aLayer, int aDepth )
{ {
// There is no point in updating non-cached layers // There is no point in updating non-cached layers
if( !isCached( aLayer ) ) if( !IsCached( aLayer ) )
return; return;
BOX2I r; BOX2I r;
@ -564,6 +564,7 @@ void VIEW::redrawRect( const BOX2I& aRect )
m_gal->SetLayerDepth( l->renderingOrder ); m_gal->SetLayerDepth( l->renderingOrder );
l->items->Query( aRect, drawFunc ); l->items->Query( aRect, drawFunc );
} }
l->isDirty = false; l->isDirty = false;
} }
} }
@ -571,7 +572,7 @@ void VIEW::redrawRect( const BOX2I& aRect )
void VIEW::draw( VIEW_ITEM* aItem, int aLayer, bool aImmediate ) const void VIEW::draw( VIEW_ITEM* aItem, int aLayer, bool aImmediate ) const
{ {
if( isCached( aLayer ) && !aImmediate ) if( IsCached( aLayer ) && !aImmediate )
{ {
// Draw using cached information or create one // Draw using cached information or create one
int group = aItem->getGroup( aLayer ); int group = aItem->getGroup( aLayer );
@ -697,6 +698,7 @@ void VIEW::Clear()
{ {
VIEW_LAYER* l = &( ( *i ).second ); VIEW_LAYER* l = &( ( *i ).second );
unlinkItem v; unlinkItem v;
if( m_dynamic ) if( m_dynamic )
l->items->Query( r, v ); l->items->Query( r, v );
@ -789,6 +791,9 @@ void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags )
int layers[VIEW_MAX_LAYERS], layers_count; int layers[VIEW_MAX_LAYERS], layers_count;
aItem->getLayers( layers, layers_count ); aItem->getLayers( layers, layers_count );
if( aUpdateFlags & VIEW_ITEM::GEOMETRY )
updateBbox( aItem );
// Iterate through layers used by the item and recache it immediately // Iterate through layers used by the item and recache it immediately
for( int i = 0; i < layers_count; i++ ) for( int i = 0; i < layers_count; i++ )
{ {
@ -796,12 +801,8 @@ void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags )
if( aUpdateFlags & VIEW_ITEM::GEOMETRY ) if( aUpdateFlags & VIEW_ITEM::GEOMETRY )
{ {
// Reinsert item in order to update bounding box if( IsCached( layerId ) )
Remove( aItem ); updateItemGeometry( aItem, layerId );
Add( aItem );
if( isCached( layerId ) )
updateItemGeometry( aItem, layerId ); /// TODO is it still necessary?
} }
else if( aUpdateFlags & VIEW_ITEM::COLOR ) else if( aUpdateFlags & VIEW_ITEM::COLOR )
{ {
@ -860,6 +861,21 @@ void VIEW::updateItemGeometry( VIEW_ITEM* aItem, int aLayer )
} }
void VIEW::updateBbox( VIEW_ITEM* aItem )
{
int layers[VIEW_MAX_LAYERS], layers_count;
aItem->ViewGetLayers( layers, layers_count );
for( int i = 0; i < layers_count; i++ )
{
VIEW_LAYER& l = m_layers[layers[i]];
l.items->Remove( aItem );
l.items->Insert( aItem );
l.isDirty = true;
}
}
bool VIEW::areRequiredLayersEnabled( int aLayerId ) const bool VIEW::areRequiredLayersEnabled( int aLayerId ) const
{ {
wxASSERT( (unsigned) aLayerId < m_layers.size() ); wxASSERT( (unsigned) aLayerId < m_layers.size() );
@ -893,7 +909,7 @@ void VIEW::RecacheAllItems( bool aImmediately )
{ {
VIEW_LAYER* l = &( ( *i ).second ); VIEW_LAYER* l = &( ( *i ).second );
if( isCached( l->id ) ) if( IsCached( l->id ) )
{ {
m_gal->SetTarget( l->target ); m_gal->SetTarget( l->target );
m_gal->SetLayerDepth( l->renderingOrder ); m_gal->SetLayerDepth( l->renderingOrder );

View File

@ -423,6 +423,13 @@ public:
m_dirtyTargets[aTarget] = true; m_dirtyTargets[aTarget] = true;
} }
/// Returns true if the layer is cached
inline bool IsCached( int aLayer ) const
{
return ( m_layers.at( aLayer ).target == TARGET_CACHED );
}
static const int VIEW_MAX_LAYERS = 128; ///* maximum number of layers that may be shown static const int VIEW_MAX_LAYERS = 128; ///* maximum number of layers that may be shown
private: private:
@ -432,11 +439,8 @@ private:
bool isDirty; ///* does it contain any dirty items (updated since last redraw) bool isDirty; ///* does it contain any dirty items (updated since last redraw)
bool displayOnly; ///* is the layer display only? bool displayOnly; ///* is the layer display only?
VIEW_RTREE* items; ///* R-tree indexing all items on this layer. VIEW_RTREE* items; ///* R-tree indexing all items on this layer.
std::vector<VIEW_ITEM*> dirtyItems; ///* set of dirty items collected since last redraw
int renderingOrder; ///* rendering order of this layer int renderingOrder; ///* rendering order of this layer
int id; ///* layer ID int id; ///* layer ID
BOX2I extents; ///* sum of bboxes of all items on the layer
BOX2I dirtyExtents; ///* sum of bboxes of all dirty items on the layer
RenderTarget target; ///* where the layer should be rendered RenderTarget target; ///* where the layer should be rendered
std::set<int> requiredLayers; ///* layers that are required to be enabled to show the layer std::set<int> requiredLayers; ///* layers that are required to be enabled to show the layer
}; };
@ -515,6 +519,9 @@ private:
/// Updates all informations needed to draw an item /// Updates all informations needed to draw an item
void updateItemGeometry( VIEW_ITEM* aItem, int aLayer ); void updateItemGeometry( VIEW_ITEM* aItem, int aLayer );
/// Updates bounding box of an item
void updateBbox( VIEW_ITEM* aItem );
/// Determines rendering order of layers. Used in display order sorting function. /// Determines rendering order of layers. Used in display order sorting function.
static bool compareRenderingOrder( VIEW_LAYER* i, VIEW_LAYER* j ) static bool compareRenderingOrder( VIEW_LAYER* i, VIEW_LAYER* j )
{ {
@ -524,12 +531,6 @@ private:
/// Checks if every layer required by the aLayerId layer is enabled. /// Checks if every layer required by the aLayerId layer is enabled.
bool areRequiredLayersEnabled( int aLayerId ) const; bool areRequiredLayersEnabled( int aLayerId ) const;
/// Returns true if the layer is cached
inline bool isCached( int aLayer ) const
{
return ( m_layers.at( aLayer ).target == TARGET_CACHED );
}
///* Whether to use rendering order modifier or not ///* Whether to use rendering order modifier or not
bool m_enableOrderModifier; bool m_enableOrderModifier;