void Widget::setSize(const IntSize& _size) { // устанавливаем новую координату а старую пускаем в расчеты IntSize old = mCoord.size(); mCoord = _size; bool show = true; // обновляем выравнивание bool margin = mParent ? _checkMargin() : false; if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // скрываем show = false; } } _setVisible(show); // передаем старую координату , до вызова, текущая координата отца должна быть новой for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); widget++) (*widget)->_setAlign(old, mIsMargin || margin); for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); skin++) (*skin)->_setAlign(old, mIsMargin || margin); // запоминаем текущее состояние mIsMargin = margin; }
void Widget::setPosition(const IntCoord& _coord) { // обновляем абсолютные координаты mAbsolutePosition += _coord.point() - mCoord.point(); for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); ++widget) (*widget)->_updateAbsolutePoint(); // устанавливаем новую координату а старую пускаем в расчеты IntCoord old = mCoord; mCoord = _coord; bool show = true; // обновляем выравнивание bool margin = mParent ? _checkMargin() : false; if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // скрываем show = false; } } _setVisible(show); // передаем старую координату , до вызова, текущая координата отца должна быть новой for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); ++widget) (*widget)->_setAlign(old, mIsMargin || margin); for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->_setAlign(old, mIsMargin || margin); // запоминаем текущее состояние mIsMargin = margin; }
void TileRect::_updateView() { bool margin = _checkMargin(); mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight())); mCurrentCoord.left = mCoord.left + mMargin.left; mCurrentCoord.top = mCoord.top + mMargin.top; mCurrentCoord.width = _getViewWidth(); mCurrentCoord.height = _getViewHeight(); // подсчитываем необходимое колличество тайлов if (!mEmptyView) { size_t count = 0; if (!mTileSize.empty()) { size_t count_x = mCoord.width / mTileSize.width; if ((mCoord.width % mTileSize.width) > 0) count_x ++; size_t count_y = mCoord.height / mTileSize.height; if ((mCoord.height % mTileSize.height) > 0) count_y ++; count = count_y * count_x * VertexQuad::VertexCount; } // нужно больше вершин if (count > mCountVertex) { mCountVertex = count + TILERECT_COUNT_VERTEX; if (nullptr != mRenderItem) mRenderItem->reallockDrawItem(this, mCountVertex); } } // вьюпорт стал битым if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // запоминаем текущее состояние mIsMargin = margin; // обновить перед выходом if (nullptr != mNode) mNode->outOfDate(mRenderItem); return; } } // запоминаем текущее состояние mIsMargin = margin; if (nullptr != mNode) mNode->outOfDate(mRenderItem); }
void Widget::_updateView() { bool margin = mParent ? _checkMargin() : false; // вьюпорт стал битым if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // запоминаем текущее состояние mIsMargin = margin; // скрываем _setVisible(false); // для тех кому нужно подправить себя при движении //for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->_updateView(); // вся иерархия должна быть проверенна for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); ++widget) (*widget)->_updateView(); return; } } else if (false == mIsMargin) { // мы не обрезаны и были нормальные // запоминаем текущее состояние //mIsMargin = margin; //_setVisible(true); // для тех кому нужно подправить себя при движении for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->_updateView(); return; } // запоминаем текущее состояние mIsMargin = margin; // если скин был скрыт, то покажем _setVisible(true); // обновляем наших детей, а они уже решат обновлять ли своих детей for (VectorWidgetPtr::iterator widget = mWidgetChild.begin(); widget != mWidgetChild.end(); ++widget) (*widget)->_updateView(); for (VectorCroppedRectanglePtr::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin) (*skin)->_updateView(); }
void TurnedSubSkin::_updateView() { //mAbsolutePosition = mCroppedParent->getAbsolutePosition() + mCoord.point(); bool margin = _checkMargin(); mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight())); mCurrentCoord.left = mCoord.left + mMargin.left; mCurrentCoord.top = mCoord.top + mMargin.top; // вьюпорт стал битым if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // запоминаем текущее состояние mIsMargin = margin; // обновить перед выходом if (nullptr != mNode) mNode->outOfDate(mRenderItem); return; } } // мы обрезаны или были обрезаны if (mIsMargin || margin) { mCurrentCoord.width = _getViewWidth(); mCurrentCoord.height = _getViewHeight(); if ((mCurrentCoord.width > 0) && (mCurrentCoord.height > 0)) { setupUV(); } } if (mIsMargin && !margin) { // мы не обрезаны, но были, ставим базовые координаты mCurrentTexture = mRectTexture; } // запоминаем текущее состояние mIsMargin = margin; if (nullptr != mNode) mNode->outOfDate(mRenderItem); }
void PolygonalSkin::_updateView() { bool margin = _checkMargin(); mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight())); mGeometryOutdated = true; mCurrentCoord.left = mCoord.left + mMargin.left; mCurrentCoord.top = mCoord.top + mMargin.top; // вьюпорт стал битым if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // запоминаем текущее состояние mIsMargin = margin; // обновить перед выходом if (nullptr != mNode) mNode->outOfDate(mRenderItem); return; } } // мы обрезаны или были обрезаны if ((mIsMargin) || (margin)) { mCurrentCoord.width = _getViewWidth(); mCurrentCoord.height = _getViewHeight(); } // запоминаем текущее состояние mIsMargin = margin; if (nullptr != mNode) mNode->outOfDate(mRenderItem); }
void SubSkin::_updateView() { //mAbsolutePosition = mCroppedParent->getAbsolutePosition() + mCoord.point(); bool margin = _checkMargin(); mEmptyView = ((0 >= _getViewWidth()) || (0 >= _getViewHeight())); mCurrentCoord.left = mCoord.left + mMargin.left; mCurrentCoord.top = mCoord.top + mMargin.top; // вьюпорт стал битым if (margin) { // проверка на полный выход за границу if (_checkOutside()) { // запоминаем текущее состояние mIsMargin = margin; // обновить перед выходом if (nullptr != mNode) mNode->outOfDate(mRenderItem); return; } } // мы обрезаны или были обрезаны if (mIsMargin || margin) { mCurrentCoord.width = _getViewWidth(); mCurrentCoord.height = _getViewHeight(); if ((mCurrentCoord.width > 0) && (mCurrentCoord.height > 0)) { // теперь смещаем текстуру float UV_lft = mMargin.left / (float)mCoord.width; float UV_top = mMargin.top / (float)mCoord.height; float UV_rgt = (mCoord.width - mMargin.right) / (float)mCoord.width; float UV_btm = (mCoord.height - mMargin.bottom) / (float)mCoord.height; float UV_sizeX = mRectTexture.right - mRectTexture.left; float UV_sizeY = mRectTexture.bottom - mRectTexture.top; float UV_lft_total = mRectTexture.left + UV_lft * UV_sizeX; float UV_top_total = mRectTexture.top + UV_top * UV_sizeY; float UV_rgt_total = mRectTexture.right - (1 - UV_rgt) * UV_sizeX; float UV_btm_total = mRectTexture.bottom - (1 - UV_btm) * UV_sizeY; mCurrentTexture.set(UV_lft_total, UV_top_total, UV_rgt_total, UV_btm_total); } } if (mIsMargin && !margin) { // мы не обрезаны, но были, ставим базовые координаты mCurrentTexture = mRectTexture; } // запоминаем текущее состояние mIsMargin = margin; if (nullptr != mNode) mNode->outOfDate(mRenderItem); }