mPosition( TRANSFORM_PROPERTY_POSITION ), // Zero initialized by default
mOrientation(), // Initialized to identity by default
mScale( TRANSFORM_PROPERTY_SCALE ),
+ mUpdateSizeHint( TRANSFORM_PROPERTY_UPDATE_SIZE_HINT ),
mVisible( true ),
mCulled( false ),
mColor( Color::WHITE ),
mClippingMode( ClippingMode::DISABLED ),
mIsRoot( false ),
mIsLayer( false ),
- mPositionUsesAnchorPoint( true )
+ mPositionUsesAnchorPoint( true ),
+ mPartialUpdateAvailable( false )
{
mUniformMapChanged[0] = 0u;
mUniformMapChanged[1] = 0u;
+ mPropertyDirty = true;
#ifdef DEBUG_ENABLED
gNodeCount++;
//Initialize all the animatable properties
mPosition.Initialize( transformManager, mTransformId );
mScale.Initialize( transformManager, mTransformId );
+ mUpdateSizeHint.Initialize( transformManager, mTransformId );
mOrientation.Initialize( transformManager, mTransformId );
mSize.Initialize( transformManager, mTransformId );
mParentOrigin.Initialize( transformManager, mTransformId );
}
mRenderer.PushBack( renderer );
+ SetPropertyDirty( true );
}
+
void Node::RemoveRenderer( const Renderer* renderer )
{
+ Node *parent = mIsRoot ? NULL : GetParent();
RendererContainer::SizeType rendererCount( mRenderer.Size() );
for( RendererContainer::SizeType i = 0; i < rendererCount; ++i )
{
if( mRenderer[i] == renderer )
{
+ if( parent != NULL )
+ {
+ parent->mPropertyDirty = true;
+ }
+ SetPropertyDirty( true );
mRenderer.Erase( mRenderer.Begin()+i);
return;
}
void Node::ResetDirtyFlags( BufferIndex updateBufferIndex )
{
mDirtyFlags = NodePropertyFlags::NOTHING;
+
+ SetPropertyDirty( false );
+
}
void Node::SetParent( Node& parentNode )
mTransformManager->SetParent( mTransformId, INVALID_TRANSFORM_ID );
}
}
+void Node::SetPartialUpdateAvailable( bool value )
+{
+ mPartialUpdateAvailable = value;
+}
+
+bool Node::IsPartialUpdateAvailable() const
+{
+ return mPartialUpdateAvailable;
+}
+
+void Node::SetPropertyDirty( bool value )
+{
+ if( mPartialUpdateAvailable )
+ {
+ mPropertyDirty = value;
+
+ const NodeIter endIter = mChildren.End();
+ for ( NodeIter iter = mChildren.Begin(); iter != endIter; ++iter )
+ {
+ Node* current = *iter;
+ current->SetPropertyDirty( value );
+ }
+ }
+}
+
+bool Node::IsPropertyDirty() const
+{
+ if( mPartialUpdateAvailable )
+ {
+ if( !mPropertyDirty )
+ {
+ for( auto&& existingRenderer : mRenderer )
+ {
+ if( existingRenderer->IsDirty() )
+ {
+ return true;
+ }
+ }
+ }
+ }
+ return mPropertyDirty;
+}
} // namespace SceneGraph