| 993 | } |
| 994 | |
| 995 | Node* Node::overFind( const Vector2f& point ) { |
| 996 | Node* pOver = NULL; |
| 997 | |
| 998 | if ( ( mNodeFlags & NODE_FLAG_OVER_FIND_ALLOWED ) && mEnabled && mVisible ) { |
| 999 | updateWorldPolygon(); |
| 1000 | |
| 1001 | if ( mWorldBounds.contains( point ) && mPoly.pointInside( point ) ) { |
| 1002 | writeNodeFlag( NODE_FLAG_MOUSEOVER_ME_OR_CHILD, 1 ); |
| 1003 | mSceneNode->addMouseOverNode( this ); |
| 1004 | |
| 1005 | Node* child = mChildLast; |
| 1006 | |
| 1007 | while ( NULL != child ) { |
| 1008 | Node* childOver = child->overFind( point ); |
| 1009 | |
| 1010 | if ( NULL != childOver ) { |
| 1011 | pOver = childOver; |
| 1012 | |
| 1013 | break; // Search from top to bottom, so the first over will be the topmost |
| 1014 | } |
| 1015 | |
| 1016 | child = child->mPrev; |
| 1017 | } |
| 1018 | |
| 1019 | if ( NULL == pOver ) |
| 1020 | pOver = this; |
| 1021 | } |
| 1022 | } |
| 1023 | |
| 1024 | return pOver; |
| 1025 | } |
| 1026 | |
| 1027 | void Node::detach() { |
| 1028 | if ( mParentNode ) { |