diff --git a/bin/assets/ee.ini b/bin/assets/ee.ini index 5c170f4c9..11bdf8a1d 100755 --- a/bin/assets/ee.ini +++ b/bin/assets/ee.ini @@ -14,5 +14,5 @@ JoystickEnabled = 0 ParticlesNum = 1000 UseShaders = 1 Music = 0 -PixelDensity = 1 +PixelDensity = 1.5 DebugUI = 0 diff --git a/include/eepp/scene/node.hpp b/include/eepp/scene/node.hpp index 7b7e337a7..940f7db8f 100644 --- a/include/eepp/scene/node.hpp +++ b/include/eepp/scene/node.hpp @@ -22,6 +22,7 @@ namespace EE { namespace Scene { class Action; class ActionManager; class SceneNode; +class NodeDrawInvalidator; }} using namespace EE::Scene; @@ -43,19 +44,21 @@ enum NODE_FLAGS_VALUES { NODE_FLAG_DRAGGING = (1<<13), NODE_FLAG_SKIN_OWNER = (1<<14), NODE_FLAG_TOUCH_DRAGGING = (1<<15), - NODE_FLAG_DISABLED_BY_MODAL_WINDOW = (1<<16), - NODE_FLAG_OWNED_BY_WINDOW = (1<<17), + NODE_FLAG_DISABLED_BY_NODE = (1<<16), + NODE_FLAG_OWNED_BY_NODE = (1<<17), NODE_FLAG_REVERSE_DRAW = (1<<18), NODE_FLAG_FRAME_BUFFER = (1<<19), NODE_FLAG_CLIP_ENABLE = (1<<20), - NODE_FLAG_SCENENODE = (1<<21), - NODE_FLAG_UISCENENODE = (1<<22), - NODE_FLAG_UINODE = (1<<24), - NODE_FLAG_WIDGET = (1<<25), - NODE_FLAG_WINDOW = (1<<26), - NODE_FLAG_REPORT_SIZE_CHANGE_TO_CHILDS = (1<<27), - NODE_FLAG_OVER_FIND_ALLOWED = (1<<28), - NODE_FLAG_FREE_USE = (1<<29) + NODE_FLAG_REPORT_SIZE_CHANGE_TO_CHILDS = (1<<21), + NODE_FLAG_OVER_FIND_ALLOWED = (1<<22), + + NODE_FLAG_SCENENODE = (1<<23), + NODE_FLAG_UISCENENODE = (1<<24), + NODE_FLAG_UINODE = (1<<25), + NODE_FLAG_WIDGET = (1<<26), + NODE_FLAG_WINDOW = (1<<27), + + NODE_FLAG_FREE_USE = (1<<28) }; class EE_API Node : public Transformable { @@ -303,6 +306,12 @@ class EE_API Node : public Transformable { SceneNode * getSceneNode(); EventDispatcher * getEventDispatcher(); + + virtual bool isDrawInvalidator(); + + virtual bool invalidated(); + + virtual void invalidate(); protected: typedef std::map< Uint32, std::map > EventsMap; friend class EE::Scene::EventDispatcher; @@ -315,6 +324,7 @@ class EE_API Node : public Transformable { UintPtr mData; Node * mParentCtrl; SceneNode * mSceneNode; + Node * mNodeDrawInvalidator; Node * mChild; //! Pointer to the first child of the node Node * mChildLast; //! Pointer to the last child added Node * mNext; //! Pointer to the next child of the father @@ -453,6 +463,10 @@ class EE_API Node : public Transformable { void clipSmartEnable( const Int32 & x, const Int32 & y, const Uint32 & Width, const Uint32 & Height ); void clipSmartDisable(); + + Node * getDrawInvalidator(); + + SceneNode * findSceneNode(); }; }} diff --git a/include/eepp/scene/scenenode.hpp b/include/eepp/scene/scenenode.hpp index 2dc5a6c26..2c61368e5 100644 --- a/include/eepp/scene/scenenode.hpp +++ b/include/eepp/scene/scenenode.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace EE { namespace Graphics { class FrameBuffer; @@ -23,24 +24,44 @@ class EE_API SceneNode : public Node { ~SceneNode(); + Node * loadLayoutFromFile( const std::string& layoutPath, Node * parent = NULL ); + + Node * loadLayoutFromString( const std::string& layoutString, Node * parent = NULL ); + + Node * loadLayoutFromMemory( const void * buffer, Int32 bufferSize, Node * parent = NULL ); + + Node * loadLayoutFromStream( IOStream& stream, Node * parent = NULL ); + + Node * loadLayoutFromPack( Pack * pack, const std::string& FilePackPath, Node * parent = NULL ); + + Node * loadLayoutNodes( pugi::xml_node node, Node * parent ); + + void setTranslator( Translator translator ); + + Translator& getTranslator(); + + String getTranslatorString( const std::string& str ); + void enableFrameBuffer(); void disableFrameBuffer(); + bool ownsFrameBuffer() const; + virtual void draw(); virtual void update( const Time& elapsed ); bool invalidated(); + void invalidate(); + void enableDrawInvalidation(); void disableDrawInvalidation(); EE::Window::Window * getWindow(); - void invalidate(); - FrameBuffer * getFrameBuffer() const; void setEventDispatcher( EventDispatcher * eventDispatcher ); @@ -89,6 +110,7 @@ class EE_API SceneNode : public Node { void setCursor( EE_CURSOR_TYPE cursor ); + virtual bool isDrawInvalidator(); protected: friend class Node; @@ -116,6 +138,10 @@ class EE_API SceneNode : public Node { virtual void matrixUnset(); + virtual void preDraw(); + + virtual void postDraw(); + void sendMsg( Node * Ctrl, const Uint32& Msg, const Uint32& Flags = 0 ); virtual void resizeControl( EE::Window::Window * win ); diff --git a/include/eepp/ui/uiwindow.hpp b/include/eepp/ui/uiwindow.hpp index 963e6ded1..635d0927b 100644 --- a/include/eepp/ui/uiwindow.hpp +++ b/include/eepp/ui/uiwindow.hpp @@ -116,6 +116,8 @@ class EE_API UIWindow : public UIWidget { bool invalidated(); FrameBuffer * getFrameBuffer() const; + + virtual bool isDrawInvalidator(); protected: class KeyboardShortcut { public: diff --git a/src/eepp/graphics/framebufferfbo.cpp b/src/eepp/graphics/framebufferfbo.cpp index 3f6dbc5d7..ad7161167 100644 --- a/src/eepp/graphics/framebufferfbo.cpp +++ b/src/eepp/graphics/framebufferfbo.cpp @@ -208,6 +208,9 @@ void FrameBufferFBO::reload() { } void FrameBufferFBO::resize( const Uint32& Width, const Uint32& Height ) { + if ( Sizei( Width, Height ) == mSize ) + return; + mSize.x = Width; mSize.y = Height; diff --git a/src/eepp/scene/node.cpp b/src/eepp/scene/node.cpp index bbb83d881..2ad5fb359 100644 --- a/src/eepp/scene/node.cpp +++ b/src/eepp/scene/node.cpp @@ -17,6 +17,7 @@ Node::Node() : mData( 0 ), mParentCtrl( NULL ), mSceneNode( NULL ), + mNodeDrawInvalidator( NULL ), mChild( NULL ), mChildLast( NULL ), mNext( NULL ), @@ -203,6 +204,7 @@ Node * Node::setParent( Node * parent ) { mParentCtrl->childRemove( this ); mParentCtrl = parent; + mNodeDrawInvalidator = getDrawInvalidator(); if ( NULL != mParentCtrl ) mParentCtrl->childAdd( this ); @@ -211,7 +213,7 @@ Node * Node::setParent( Node * parent ) { onParentChange(); - if ( mSceneNode != getSceneNode() ) + if ( mSceneNode != findSceneNode() ) onSceneChange(); return this; @@ -433,18 +435,6 @@ void Node::setNodeFlags( const Uint32& Flags ) { mNodeFlags = Flags; } -Uint32 Node::isSceneNode() { - return mNodeFlags & NODE_FLAG_SCENENODE; -} - -Uint32 Node::isUISceneNode() { - return mNodeFlags & NODE_FLAG_UISCENENODE; -} - -Uint32 Node::isUINode() { - return mNodeFlags & NODE_FLAG_UINODE; -} - void Node::drawChilds() { if ( isReverseDraw() ) { Node * ChildLoop = mChildLast; @@ -556,7 +546,8 @@ void Node::childAddAt( Node * ChildCtrl, Uint32 Pos ) { childRemove( ChildCtrl ); ChildCtrl->mParentCtrl = this; - ChildCtrl->mSceneNode = ChildCtrl->getSceneNode(); + ChildCtrl->mSceneNode = ChildCtrl->findSceneNode(); + if ( ChildLoop == NULL ) { mChild = ChildCtrl; mChildLast = ChildCtrl; @@ -774,7 +765,7 @@ Node * Node::overFind( const Vector2f& Point ) { } void Node::onSceneChange() { - mSceneNode = getSceneNode(); + mSceneNode = findSceneNode(); Node * ChildLoop = mChild; @@ -808,6 +799,18 @@ Uint32 Node::isFrameBuffer() { return mNodeFlags & NODE_FLAG_FRAME_BUFFER; } +Uint32 Node::isSceneNode() { + return mNodeFlags & NODE_FLAG_SCENENODE; +} + +Uint32 Node::isUISceneNode() { + return mNodeFlags & NODE_FLAG_UISCENENODE; +} + +Uint32 Node::isUINode() { + return mNodeFlags & NODE_FLAG_UINODE; +} + bool Node::isMeOrParentTreeRotated() { Node * Ctrl = this; @@ -998,14 +1001,16 @@ void Node::setReverseDraw( bool reverseDraw ) { } void Node::invalidateDraw() { - if ( NULL != mSceneNode ) { - mSceneNode->invalidate(); - } else if ( NULL == mParentCtrl && isSceneNode() ) { - static_cast( this )->invalidate(); + if ( NULL != mNodeDrawInvalidator ) { + mNodeDrawInvalidator->invalidate(); } } SceneNode * Node::getSceneNode() { + return mSceneNode; +} + +SceneNode * Node::findSceneNode() { Node * Ctrl = mParentCtrl; while ( Ctrl != NULL ) { @@ -1319,7 +1324,7 @@ Node * Node::getNextWidget() { } } - return mSceneNode; + return NULL; } void Node::sendParentSizeChange( const Vector2f& SizeChange ) { @@ -1394,4 +1399,31 @@ void Node::clipSmartDisable() { } } +Node* Node::getDrawInvalidator() { + Node * Ctrl = mParentCtrl; + + while ( Ctrl != NULL ) { + if ( Ctrl->isDrawInvalidator() ) + return Ctrl; + + Ctrl = Ctrl->getParent(); + } + + return isDrawInvalidator() ? this : NULL; +} + +bool Node::isDrawInvalidator() { + return false; +} + +void Node::invalidate() { + if ( mVisible && mAlpha != 0.f ) { + writeCtrlFlag( NODE_FLAG_VIEW_DIRTY, 1 ); + } +} + +bool Node::invalidated() { + return 0 != ( mNodeFlags & NODE_FLAG_VIEW_DIRTY ); +} + }} diff --git a/src/eepp/scene/scenenode.cpp b/src/eepp/scene/scenenode.cpp index 140919340..467d14c4e 100644 --- a/src/eepp/scene/scenenode.cpp +++ b/src/eepp/scene/scenenode.cpp @@ -64,6 +64,12 @@ void SceneNode::enableFrameBuffer() { void SceneNode::disableFrameBuffer() { eeSAFE_DELETE( mFrameBuffer ); + + writeCtrlFlag( NODE_FLAG_FRAME_BUFFER, 0 ); +} + +bool SceneNode::ownsFrameBuffer() const { + return 0 != ( mNodeFlags & NODE_FLAG_FRAME_BUFFER ); } void SceneNode::draw() { @@ -73,19 +79,36 @@ void SceneNode::draw() { mWindow->setView( mWindow->getDefaultView() ); - if ( mVisible ) { - if ( mNodeFlags & NODE_FLAG_POSITION_DIRTY ) - updateScreenPos(); + if ( mVisible && 0 != mAlpha ) { + updateScreenPos(); + + preDraw(); + + ClippingMask * clippingMask = GLi->getClippingMask(); + + std::list clips = clippingMask->getPlanesClipped(); + + if ( !clips.empty() ) + clippingMask->clipPlaneDisable(); matrixSet(); - clipStart(); + if ( NULL == mFrameBuffer || !usesInvalidation() || invalidated() ) { + clipStart(); - drawChilds(); + drawChilds(); - clipEnd(); + clipEnd(); + } matrixUnset(); + + if ( !clips.empty() ) + clippingMask->setPlanesClipped( clips ); + + postDraw(); + + writeCtrlFlag( NODE_FLAG_VIEW_DIRTY, 0 ); } mWindow->setView( prevView ); @@ -175,11 +198,12 @@ Sizei SceneNode::getFrameBufferSize() { } void SceneNode::createFrameBuffer() { + writeCtrlFlag( NODE_FLAG_FRAME_BUFFER, 1 ); eeSAFE_DELETE( mFrameBuffer ); Sizei fboSize( getFrameBufferSize() ); if ( fboSize.getWidth() < 1 ) fboSize.setWidth(1); if ( fboSize.getHeight() < 1 ) fboSize.setHeight(1); - mFrameBuffer = FrameBuffer::New( fboSize.getWidth(), fboSize.getHeight(), true, false, true ); + mFrameBuffer = FrameBuffer::New( fboSize.getWidth(), fboSize.getHeight(), true, false, false, 4, mWindow ); } void SceneNode::drawFrameBuffer() { @@ -361,4 +385,14 @@ void SceneNode::setCursor( EE_CURSOR_TYPE cursor ) { } } +bool SceneNode::isDrawInvalidator() { + return NULL != mFrameBuffer; +} + +void SceneNode::preDraw() { +} + +void SceneNode::postDraw() { +} + }} diff --git a/src/eepp/ui/uidropdownlist.cpp b/src/eepp/ui/uidropdownlist.cpp index 6bf90dd60..5999b4ea5 100644 --- a/src/eepp/ui/uidropdownlist.cpp +++ b/src/eepp/ui/uidropdownlist.cpp @@ -107,7 +107,7 @@ void UIDropDownList::showList() { if ( !mStyleConfig.PopUpToMainControl ) mListBox->setParent( NULL != mFriendCtrl ? mFriendCtrl->getParent() : getWindowContainer() ); else - mListBox->setParent( getSceneNode() ); + mListBox->setParent( mSceneNode ); mListBox->toFront(); diff --git a/src/eepp/ui/uilistbox.cpp b/src/eepp/ui/uilistbox.cpp index d72736e36..2d20f8cb0 100644 --- a/src/eepp/ui/uilistbox.cpp +++ b/src/eepp/ui/uilistbox.cpp @@ -991,8 +991,8 @@ void UIListBox::loadFromXmlNode(const pugi::xml_node & node) { std::string data = item.text().as_string(); if ( data.size() ) { - if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) - items.push_back( static_cast( getSceneNode() )->getTranslatorString( data ) ); + if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) + items.push_back( static_cast( mSceneNode )->getTranslatorString( data ) ); } } diff --git a/src/eepp/ui/uimenu.cpp b/src/eepp/ui/uimenu.cpp index 4562e9975..7a72b1c72 100644 --- a/src/eepp/ui/uimenu.cpp +++ b/src/eepp/ui/uimenu.cpp @@ -556,8 +556,6 @@ void UIMenu::loadFromXmlNode( const pugi::xml_node& node ) { UIWidget::loadFromXmlNode( node ); - - for ( pugi::xml_node item = node.first_child(); item; item = item.next_sibling() ) { std::string name( item.name() ); String::toLowerInPlace( name ); @@ -566,26 +564,29 @@ void UIMenu::loadFromXmlNode( const pugi::xml_node& node ) { std::string text( item.attribute("text").as_string() ); std::string icon( item.attribute("icon").as_string() ); - if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) - add( static_cast( getSceneNode() )->getTranslatorString( text ), getIconDrawable( icon ) ); + if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) + add( static_cast( mSceneNode )->getTranslatorString( text ), getIconDrawable( icon ) ); } else if ( name == "menuseparator" || name == "separator" ) { addSeparator(); } else if ( name == "menucheckbox" || name == "checkbox" ) { std::string text( item.attribute("text").as_string() ); bool active( item.attribute("active").as_bool() ); - if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) - addCheckBox( static_cast( getSceneNode() )->getTranslatorString( text ), active ); + if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) + addCheckBox( static_cast( mSceneNode )->getTranslatorString( text ), active ); } else if ( name == "menusubmenu" || name == "submenu" ) { std::string text( item.attribute("text").as_string() ); std::string icon( item.attribute("icon").as_string() ); UIPopUpMenu * subMenu = UIPopUpMenu::New(); + if ( NULL != getDrawInvalidator() ) + subMenu->setParent( getDrawInvalidator() ); + subMenu->loadFromXmlNode( item ); - if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) - addSubMenu( static_cast( getSceneNode() )->getTranslatorString( text ), getIconDrawable( icon ), subMenu ); + if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) + addSubMenu( static_cast( mSceneNode )->getTranslatorString( text ), getIconDrawable( icon ), subMenu ); } } diff --git a/src/eepp/ui/uimenusubmenu.cpp b/src/eepp/ui/uimenusubmenu.cpp index d2af58966..351fe5ce2 100644 --- a/src/eepp/ui/uimenusubmenu.cpp +++ b/src/eepp/ui/uimenusubmenu.cpp @@ -86,8 +86,8 @@ UIMenu * UIMenuSubMenu::getSubMenu() const { Uint32 UIMenuSubMenu::onMouseMove( const Vector2i &Pos, const Uint32 Flags ) { UIMenuItem::onMouseMove( Pos, Flags ); - if ( NULL != getSceneNode() && NULL != mSubMenu && !mSubMenu->isVisible() ) { - mTimeOver += getSceneNode()->getElapsed().asMilliseconds(); + if ( NULL != mSceneNode && NULL != mSubMenu && !mSubMenu->isVisible() ) { + mTimeOver += mSceneNode->getElapsed().asMilliseconds(); if ( mTimeOver >= mMaxTime ) { showSubMenu(); diff --git a/src/eepp/ui/uinode.cpp b/src/eepp/ui/uinode.cpp index d97f7b1f8..d7cd4c4da 100644 --- a/src/eepp/ui/uinode.cpp +++ b/src/eepp/ui/uinode.cpp @@ -198,29 +198,29 @@ const Sizef& UINode::getRealSize() { } void UINode::drawHighlightFocus() { - if ( NULL != getEventDispatcher() && getSceneNode()->getHighlightFocus() && getEventDispatcher()->getFocusControl() == this ) { + if ( NULL != getEventDispatcher() && mSceneNode->getHighlightFocus() && getEventDispatcher()->getFocusControl() == this ) { Primitives P; P.setFillMode( DRAW_LINE ); P.setBlendMode( getBlendMode() ); - P.setColor( getSceneNode()->getHighlightFocusColor() ); + P.setColor( mSceneNode->getHighlightFocusColor() ); P.setLineWidth( PixelDensity::dpToPxI( 1 ) ); P.drawRectangle( getScreenBounds() ); } } void UINode::drawOverNode() { - if ( NULL != getEventDispatcher() && getSceneNode()->getHighlightOver() && getEventDispatcher()->getOverControl() == this ) { + if ( NULL != getEventDispatcher() && mSceneNode->getHighlightOver() && getEventDispatcher()->getOverControl() == this ) { Primitives P; P.setFillMode( DRAW_LINE ); P.setBlendMode( getBlendMode() ); - P.setColor( getSceneNode()->getHighlightOverColor() ); + P.setColor( mSceneNode->getHighlightOverColor() ); P.setLineWidth( PixelDensity::dpToPxI( 1 ) ); P.drawRectangle( getScreenBounds() ); } } void UINode::drawDebugData() { - if ( NULL != getSceneNode() && getSceneNode()->getDrawDebugData() ) { + if ( NULL != mSceneNode && mSceneNode->getDrawDebugData() ) { if ( isWidget() ) { UIWidget * me = static_cast( this ); @@ -240,7 +240,7 @@ void UINode::drawDebugData() { } void UINode::drawBox() { - if ( NULL != getSceneNode() && getSceneNode()->getDrawBoxes() ) { + if ( NULL != mSceneNode && mSceneNode->getDrawBoxes() ) { Primitives P; P.setFillMode( DRAW_LINE ); P.setBlendMode( getBlendMode() ); @@ -698,11 +698,9 @@ Node * UINode::getWindowContainer() { while ( Ctrl != NULL ) { if ( Ctrl->isType( UI_TYPE_WINDOW ) ) { - if ( getSceneNode() == Ctrl ) { - return Ctrl; - } else { - return static_cast( Ctrl )->getContainer(); - } + return static_cast( Ctrl )->getContainer(); + } else if ( mSceneNode == Ctrl ) { + return mSceneNode; } Ctrl = Ctrl->getParent(); @@ -808,7 +806,7 @@ static void UINode_onFadeDone( Action * action, const Action::ActionType& action } Interpolation1d * UINode::startAlphaAnim( const Float& From, const Float& To, const Time& TotalTime, const bool& AlphaChilds, const Ease::Interpolation& Type, Interpolation1d::OnPathEndCallback PathEndCallback ) { - Actions::Fade * action = Actions::Fade::New( From, To, TotalTime, Type ); + Actions::Fade * action = Actions::Fade::New( From, To, TotalTime, Type, AlphaChilds ); action->getInterpolation()->setPathEndCallback( PathEndCallback ); diff --git a/src/eepp/ui/uipopupmenu.cpp b/src/eepp/ui/uipopupmenu.cpp index 9bab07822..8decb6c2c 100644 --- a/src/eepp/ui/uipopupmenu.cpp +++ b/src/eepp/ui/uipopupmenu.cpp @@ -96,8 +96,8 @@ Uint32 UIPopUpMenu::onMessage( const NodeMessage * Msg ) { if ( !Msg->getSender()->isType( UI_TYPE_MENUSUBMENU ) && ( Msg->getFlags() & EE_BUTTONS_LRM ) ) { sendCommonEvent( Event::OnHideByClick ); - if ( isVisible() && NULL != getSceneNode() ) - getSceneNode()->setFocus(); + if ( isVisible() && NULL != mSceneNode ) + mSceneNode->setFocus(); hide(); } diff --git a/src/eepp/ui/uipushbutton.cpp b/src/eepp/ui/uipushbutton.cpp index 0a11e161b..f8364329c 100644 --- a/src/eepp/ui/uipushbutton.cpp +++ b/src/eepp/ui/uipushbutton.cpp @@ -357,8 +357,8 @@ void UIPushButton::loadFromXmlNode(const pugi::xml_node & node) { String::toLowerInPlace( name ); if ( "text" == name ) { - if ( NULL != getSceneNode() ) - setText( static_cast( getSceneNode() )->getTranslatorString( ait->as_string() ) ); + if ( NULL != mSceneNode ) + setText( static_cast( mSceneNode )->getTranslatorString( ait->as_string() ) ); } else if ( "textovercolor" == name ) { setFontOverColor( Color::fromString( ait->as_string() ) ); } else if ( "icon" == name ) { diff --git a/src/eepp/ui/uitextedit.cpp b/src/eepp/ui/uitextedit.cpp index a12a18d9b..6b6c88a46 100644 --- a/src/eepp/ui/uitextedit.cpp +++ b/src/eepp/ui/uitextedit.cpp @@ -459,8 +459,8 @@ void UITextEdit::loadFromXmlNode(const pugi::xml_node & node) { String::toLowerInPlace( name ); if ( "text" == name ) { - if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) { - setText( static_cast( getSceneNode() )->getTranslatorString( ait->as_string() ) ); + if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) { + setText( static_cast( mSceneNode )->getTranslatorString( ait->as_string() ) ); } } else if ( "allowediting" == name ) { setAllowEditing( ait->as_bool() ); diff --git a/src/eepp/ui/uitextinput.cpp b/src/eepp/ui/uitextinput.cpp index ef851b626..f02e220e9 100644 --- a/src/eepp/ui/uitextinput.cpp +++ b/src/eepp/ui/uitextinput.cpp @@ -43,8 +43,8 @@ bool UITextInput::isType( const Uint32& type ) const { } void UITextInput::update( const Time& time ) { - if ( isMouseOverMeOrChilds() && NULL != getSceneNode() ) { - getSceneNode()->setCursor( EE_CURSOR_IBEAM ); + if ( isMouseOverMeOrChilds() && NULL != mSceneNode ) { + mSceneNode->setCursor( EE_CURSOR_IBEAM ); } UITextView::update( time ); @@ -295,8 +295,8 @@ Uint32 UITextInput::onMouseDoubleClick( const Vector2i& Pos, const Uint32 Flags Uint32 UITextInput::onMouseExit( const Vector2i& Pos, const Uint32 Flags ) { UINode::onMouseExit( Pos, Flags ); - if ( NULL != getSceneNode() ) - getSceneNode()->setCursor( EE_CURSOR_ARROW ); + if ( NULL != mSceneNode ) + mSceneNode->setCursor( EE_CURSOR_ARROW ); return 1; } @@ -349,8 +349,8 @@ void UITextInput::loadFromXmlNode(const pugi::xml_node & node) { String::toLowerInPlace( name ); if ( "text" == name ) { - if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) { - setText( static_cast( getSceneNode() )->getTranslatorString( ait->as_string() ) ); + if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) { + setText( static_cast( mSceneNode )->getTranslatorString( ait->as_string() ) ); } } else if ( "allowediting" == name ) { setAllowEditing( ait->as_bool() ); diff --git a/src/eepp/ui/uitextview.cpp b/src/eepp/ui/uitextview.cpp index 10b66e938..df1c85408 100644 --- a/src/eepp/ui/uitextview.cpp +++ b/src/eepp/ui/uitextview.cpp @@ -534,8 +534,8 @@ void UITextView::loadFromXmlNode(const pugi::xml_node & node) { String::toLowerInPlace( name ); if ( "text" == name ) { - if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) - setText( static_cast( getSceneNode() )->getTranslatorString( ait->as_string() ) ); + if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) + setText( static_cast( mSceneNode )->getTranslatorString( ait->as_string() ) ); } else if ( "textcolor" == name ) { setFontColor( Color::fromString( ait->as_string() ) ); } else if ( "textshadowcolor" == name ) { diff --git a/src/eepp/ui/uiwindow.cpp b/src/eepp/ui/uiwindow.cpp index 2cd5f45e3..e3525286b 100644 --- a/src/eepp/ui/uiwindow.cpp +++ b/src/eepp/ui/uiwindow.cpp @@ -64,7 +64,7 @@ UIWindow::UIWindow( UIWindow::WindowBaseContainerType type, const UIWindowStyleC } mContainer->setLayoutSizeRules( FIXED, FIXED ); - mContainer->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mContainer->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); mContainer->setParent( this ); mContainer->clipEnable(); mContainer->enableReportSizeChangeToChilds(); @@ -113,7 +113,7 @@ void UIWindow::updateWinFlags() { if ( !( mStyleConfig.WinFlags & UI_WIN_NO_BORDER ) ) { if ( NULL == mWindowDecoration ) { mWindowDecoration = UINode::New(); - mWindowDecoration->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mWindowDecoration->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); } mWindowDecoration->setParent( this ); @@ -122,7 +122,7 @@ void UIWindow::updateWinFlags() { if ( NULL == mBorderLeft ) { mBorderLeft = UINode::New(); - mBorderLeft->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mBorderLeft->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); } mBorderLeft->setParent( this ); @@ -131,7 +131,7 @@ void UIWindow::updateWinFlags() { if ( NULL == mBorderRight ) { mBorderRight = UINode::New(); - mBorderRight->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mBorderRight->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); } mBorderRight->setParent( this ); @@ -140,7 +140,7 @@ void UIWindow::updateWinFlags() { if ( NULL == mBorderBottom ) { mBorderBottom = UINode::New(); - mBorderBottom->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mBorderBottom->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); } mBorderBottom->setParent( this ); @@ -150,7 +150,7 @@ void UIWindow::updateWinFlags() { if ( mStyleConfig.WinFlags & UI_WIN_CLOSE_BUTTON ) { if ( NULL == mButtonClose ) { mButtonClose = UINode::New(); - mButtonClose->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mButtonClose->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); needsUpdate = true; } @@ -165,7 +165,7 @@ void UIWindow::updateWinFlags() { if ( isMaximizable() ) { if ( NULL == mButtonMaximize ) { mButtonMaximize = UINode::New(); - mButtonMaximize->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mButtonMaximize->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); needsUpdate = true; } @@ -180,7 +180,7 @@ void UIWindow::updateWinFlags() { if ( mStyleConfig.WinFlags & UI_WIN_MINIMIZE_BUTTON ) { if ( NULL == mButtonMinimize ) { mButtonMinimize = UINode::New(); - mButtonMinimize->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mButtonMinimize->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); needsUpdate = true; } @@ -277,13 +277,13 @@ void UIWindow::drawFrameBuffer() { } void UIWindow::drawHighlightInvalidation() { - if ( ( mNodeFlags & NODE_FLAG_VIEW_DIRTY ) && NULL != getSceneNode() && getSceneNode()->getHighlightInvalidation() ) { + if ( ( mNodeFlags & NODE_FLAG_VIEW_DIRTY ) && NULL != mSceneNode && mSceneNode->getHighlightInvalidation() ) { UIWidget::matrixSet(); Primitives P; P.setFillMode( DRAW_LINE ); P.setBlendMode( getBlendMode() ); - P.setColor( getSceneNode()->getHighlightInvalidationColor() ); + P.setColor( mSceneNode->getHighlightInvalidationColor() ); P.setLineWidth( PixelDensity::dpToPx( 2 ) ); P.drawRectangle( getScreenBounds() ); @@ -329,22 +329,22 @@ void UIWindow::drawShadow() { } Sizei UIWindow::getFrameBufferSize() { - return isResizeable() && (Node*)this != (Node*)getSceneNode() ? Sizei( Math::nextPowOfTwo( (int)mSize.getWidth() ), Math::nextPowOfTwo( (int)mSize.getHeight() ) ) : mSize.ceil().asInt(); + return isResizeable() && (Node*)this != mSceneNode ? Sizei( Math::nextPowOfTwo( (int)mSize.getWidth() ), Math::nextPowOfTwo( (int)mSize.getHeight() ) ) : mSize.ceil().asInt(); } UISceneNode *UIWindow::getUISceneNode() { - return ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) ? static_cast( getSceneNode() ) : NULL; + return ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) ? static_cast( mSceneNode ) : NULL; } void UIWindow::createModalControl() { - Node * Ctrl = getSceneNode(); + Node * Ctrl = mSceneNode; if ( NULL == Ctrl ) return; if ( NULL == mModalCtrl ) { mModalCtrl = UIWidget::New(); - mModalCtrl->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mModalCtrl->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); mModalCtrl->setParent( Ctrl )->setPosition(0,0)->setSize( Ctrl->getSize() ); mModalCtrl->setAnchors( UI_ANCHOR_LEFT | UI_ANCHOR_TOP | UI_ANCHOR_RIGHT | UI_ANCHOR_BOTTOM ); } else { @@ -360,17 +360,17 @@ void UIWindow::createModalControl() { } void UIWindow::enableByModal() { - if ( isModal() && NULL != getSceneNode() ) { - Node * CtrlChild = getSceneNode()->getFirstChild(); + if ( isModal() && NULL != mSceneNode ) { + Node * CtrlChild = mSceneNode->getFirstChild(); while ( NULL != CtrlChild ) { if ( CtrlChild != mModalCtrl && CtrlChild != this && - CtrlChild->getNodeFlags() & NODE_FLAG_DISABLED_BY_MODAL_WINDOW ) + CtrlChild->getNodeFlags() & NODE_FLAG_DISABLED_BY_NODE ) { CtrlChild->setEnabled( true ); - CtrlChild->writeCtrlFlag( NODE_FLAG_DISABLED_BY_MODAL_WINDOW, 0 ); + CtrlChild->writeCtrlFlag( NODE_FLAG_DISABLED_BY_NODE, 0 ); } CtrlChild = CtrlChild->getNextNode(); @@ -379,8 +379,8 @@ void UIWindow::enableByModal() { } void UIWindow::disableByModal() { - if ( isModal() && NULL != getSceneNode() ) { - Node * CtrlChild = getSceneNode()->getFirstChild(); + if ( isModal() && NULL != mSceneNode ) { + Node * CtrlChild = mSceneNode->getFirstChild(); while ( NULL != CtrlChild ) { @@ -389,7 +389,7 @@ void UIWindow::disableByModal() { CtrlChild->isEnabled() ) { CtrlChild->setEnabled( false ); - CtrlChild->writeCtrlFlag( NODE_FLAG_DISABLED_BY_MODAL_WINDOW, 1 ); + CtrlChild->writeCtrlFlag( NODE_FLAG_DISABLED_BY_NODE, 1 ); } CtrlChild = CtrlChild->getNextNode(); @@ -664,8 +664,8 @@ Uint32 UIWindow::onMessage( const NodeMessage * Msg ) { } case NodeMessage::WindowResize: { - if ( isModal() && NULL != mModalCtrl && NULL != getSceneNode() ) { - mModalCtrl->setSize( getSceneNode()->getSize() ); + if ( isModal() && NULL != mModalCtrl && NULL != mSceneNode ) { + mModalCtrl->setSize( mSceneNode->getSize() ); } break; @@ -995,8 +995,8 @@ bool UIWindow::hide() { setVisible( false ); } - if ( NULL != getSceneNode() ) - getSceneNode()->setFocus(); + if ( NULL != mSceneNode ) + mSceneNode->setFocus(); if ( NULL != mModalCtrl ) { mModalCtrl->setEnabled( false ); @@ -1023,14 +1023,14 @@ void UIWindow::onAlphaChange() { } void UIWindow::onChildCountChange() { - if ( NULL == mContainer || (Node*)getSceneNode() == (Node*)this ) + if ( NULL == mContainer ) return; Node * child = mChild; bool found = false; while ( NULL != child ) { - if ( !( child->getNodeFlags() & NODE_FLAG_OWNED_BY_WINDOW ) ) { + if ( !( child->getNodeFlags() & NODE_FLAG_OWNED_BY_NODE ) ) { found = true; break; } @@ -1059,7 +1059,7 @@ void UIWindow::setTitle( const String& text ) { if ( NULL == mTitle ) { mTitle = UITextView::New(); mTitle->setLayoutSizeRules( FIXED, FIXED ); - mTitle->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 ); + mTitle->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 ); mTitle->setParent( this ); mTitle->setHorizontalAlign( getHorizontalAlign() ); mTitle->setVerticalAlign( getVerticalAlign() ); @@ -1099,7 +1099,7 @@ UITextView * UIWindow::getTitleTextBox() const { } void UIWindow::maximize() { - Node * Ctrl = getSceneNode(); + Node * Ctrl = mSceneNode; if ( NULL == Ctrl ) return; @@ -1149,7 +1149,7 @@ void UIWindow::internalDraw() { matrixSet(); - if ( !ownsFrameBuffer() || ( NULL != getSceneNode() && !getSceneNode()->usesInvalidation() ) || invalidated() ) { + if ( !ownsFrameBuffer() || ( NULL != mSceneNode && !mSceneNode->usesInvalidation() ) || invalidated() ) { clipStart(); draw(); @@ -1185,6 +1185,10 @@ FrameBuffer * UIWindow::getFrameBuffer() const { return mFrameBuffer; } +bool UIWindow::isDrawInvalidator() { + return true; +} + bool UIWindow::invalidated() { return 0 != ( mNodeFlags & NODE_FLAG_VIEW_DIRTY ); } @@ -1192,7 +1196,7 @@ bool UIWindow::invalidated() { void UIWindow::matrixSet() { if ( ownsFrameBuffer() ) { if ( NULL != mFrameBuffer ) { - if ( ( NULL != getSceneNode() && !getSceneNode()->usesInvalidation() ) || invalidated() ) { + if ( ( NULL != mSceneNode && !mSceneNode->usesInvalidation() ) || invalidated() ) { mFrameBufferBound = true; mFrameBuffer->bind(); diff --git a/src/eepp/ui/uiwinmenu.cpp b/src/eepp/ui/uiwinmenu.cpp index 7b3bd1d92..20a4500e6 100644 --- a/src/eepp/ui/uiwinmenu.cpp +++ b/src/eepp/ui/uiwinmenu.cpp @@ -312,10 +312,13 @@ void UIWinMenu::loadFromXmlNode( const pugi::xml_node& node ) { UIPopUpMenu * subMenu = UIPopUpMenu::New(); + if ( NULL != getDrawInvalidator() ) + subMenu->setParent( getDrawInvalidator() ); + subMenu->loadFromXmlNode( item ); - if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) - addMenuButton( static_cast( getSceneNode() )->getTranslatorString( text ), subMenu ); + if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) + addMenuButton( static_cast( mSceneNode )->getTranslatorString( text ), subMenu ); } } diff --git a/src/test/eetest.cpp b/src/test/eetest.cpp index 9d88a1a45..fddea8e68 100644 --- a/src/test/eetest.cpp +++ b/src/test/eetest.cpp @@ -35,14 +35,14 @@ class UIBlurredWindow : public UIWindow { if ( !ownsFrameBuffer() ) return; - FrameBuffer * curFBO = FrameBufferManager::instance()->getFromName( "uimain" ); + FrameBuffer * curFBO = getSceneNode()->getFrameBuffer(); if ( NULL != curFBO && NULL != curFBO->getTexture() && NULL != mBlurShader ) { static int fboDiv = 2; if ( NULL == mFboBlur ) { mFboBlur = FrameBuffer::New( mSize.x / fboDiv, mSize.y / fboDiv ); - } else if ( mFboBlur->getSize().getWidth() != mSize.x / fboDiv || mFboBlur->getSize().getHeight() != mSize.y / fboDiv ) { + } else if ( mFboBlur->getSize().getWidth() != (int)( mSize.x / fboDiv ) || mFboBlur->getSize().getHeight() != (int)( mSize.y / fboDiv ) ) { mFboBlur->resize( mSize.x / fboDiv, mSize.y / fboDiv ); } @@ -360,7 +360,7 @@ void EETest::createBaseUI() { UIWindow * tWin = UIWindow::New(); tWin->setSize( 530, 405 )->setPosition( 320, 240 ); UIWindowStyleConfig windowStyleConfig = tWin->getStyleConfig(); - windowStyleConfig.WinFlags = UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW/*| UI_WIN_FRAME_BUFFER*/; + windowStyleConfig.WinFlags = UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW | UI_WIN_FRAME_BUFFER; windowStyleConfig.MinWindowSize = Sizef( 530, 405 ); windowStyleConfig.BaseAlpha = 200; tWin->setStyleConfig( windowStyleConfig ); @@ -588,14 +588,21 @@ void EETest::createUI() { eePRINTL( "Texture Atlas Loading Time: %4.3f ms.", TE.getElapsed().asMilliseconds() ); - /*Uint32 UI_MAN_OPS = 0; - if ( mDebugUI ) - UI_MAN_OPS = UI_MANAGER_HIGHLIGHT_FOCUS | UI_MANAGER_HIGHLIGHT_OVER | UI_MANAGER_DRAW_DEBUG_DATA | UI_MANAGER_DRAW_BOXES | UI_MANAGER_HIGHLIGHT_INVALIDATION; - UIManager::instance()->init(UI_MAN_OPS | UI_MANAGER_USE_DRAW_INVALIDATION | UI_MANAGER_MAIN_CONTROL_IN_FRAME_BUFFER); - UIManager::instance()->setTranslator( mTranslator );*/ - UISceneNode * sceneNode = UISceneNode::New(); + + sceneNode->enableDrawInvalidation(); + sceneNode->enableFrameBuffer(); + + if ( mDebugUI ) { + sceneNode->setDrawBoxes( true ); + sceneNode->setDrawDebugData( true ); + sceneNode->setHighlightFocus( true ); + sceneNode->setHighlightOver( true ); + sceneNode->setHighlightInvalidation( true ); + } + sceneNode->setTranslator( mTranslator ); + SceneManager::instance()->add( sceneNode ); eePRINTL("Node size: %d", sizeof(Node)); @@ -897,7 +904,7 @@ void EETest::createMapEditor() { UIWindow * tWin = UIWindow::New(); tWin->setSizeWithDecoration( 1024, 768 )->setPosition( 0, 0 ); UIWindowStyleConfig windowStyleConfig = tWin->getStyleConfig(); - windowStyleConfig.WinFlags = UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW/*| UI_WIN_FRAME_BUFFER*/; + windowStyleConfig.WinFlags = UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW | UI_WIN_FRAME_BUFFER; windowStyleConfig.MinWindowSize = Sizef( 1024, 768 ); tWin->setStyleConfig( windowStyleConfig ); @@ -914,7 +921,7 @@ void EETest::createETGEditor() { UIWindow * tWin = UIWindow::New(); tWin->setSizeWithDecoration( 1024, 768 )->setPosition( 0, 0 ); UIWindowStyleConfig windowStyleConfig = tWin->getStyleConfig(); - windowStyleConfig.WinFlags = UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW/*| UI_WIN_FRAME_BUFFER*/; + windowStyleConfig.WinFlags = UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW | UI_WIN_FRAME_BUFFER; windowStyleConfig.MinWindowSize = Sizef( 1024, 768 ); tWin->setStyleConfig( windowStyleConfig ); @@ -949,7 +956,7 @@ static void onWinDragStop( const Event * event ) { void EETest::createDecoratedWindow() { mUIWindow = UIBlurredWindow::New( mBlur ); - mUIWindow->setWinFlags( UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_SHADOW/*| UI_WIN_FRAME_BUFFER*/ ) + mUIWindow->setWinFlags( UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_SHADOW | UI_WIN_FRAME_BUFFER ) ->setMinWindowSize( 530, 350 )->setPosition( 200, 50 ); mUIWindow->addEventListener( Event::OnWindowClose, cb::Make1( this, &EETest::onCloseClick ) ); @@ -971,9 +978,22 @@ void EETest::createDecoratedWindow() { if ( !Event->getNode()->isType( UI_TYPE_MENUITEM ) ) return; - /*UIMenuItem* menuItem = reinterpret_cast ( Event->getNode() ); + Node * node = Event->getNode(); + UIWindow * win = NULL; + + while ( NULL != node && NULL == win ) { + if ( node->isWindow() ) { + win = static_cast( node ); + } else { + node = node->getParent(); + } + } + + if ( NULL == win ) + return; + + UIMenuItem* menuItem = reinterpret_cast ( Event->getNode() ); const String& txt = menuItem->getText(); - UIWindow * win = Event->getNode()->getOwnerWindow(); if ( "Hide Border" == txt ) { win->setWinFlags( win->getWinFlags() | UI_WIN_NO_BORDER ); @@ -983,7 +1003,7 @@ void EETest::createDecoratedWindow() { menuItem->setText( "Hide Border" ); } else if ( "Close" == txt ) { win->closeFadeOut( Milliseconds(250) ); - }*/ + } } ) ); UIPopUpMenu * PopMenu2 = UIPopUpMenu::New();