void GUIButtonBase::updateRenderElementsInternal() { mImageDesc.width = mLayoutData.area.width; mImageDesc.height = mLayoutData.area.height; const HSpriteTexture& activeTex = getActiveTexture(); if (SpriteTexture::checkIsLoaded(activeTex)) mImageDesc.texture = activeTex.getInternalPtr(); else mImageDesc.texture = nullptr; mImageDesc.borderLeft = _getStyle()->border.left; mImageDesc.borderRight = _getStyle()->border.right; mImageDesc.borderTop = _getStyle()->border.top; mImageDesc.borderBottom = _getStyle()->border.bottom; mImageDesc.color = getTint(); mImageSprite->update(mImageDesc, (UINT64)_getParentWidget()); mTextSprite->update(getTextDesc(), (UINT64)_getParentWidget()); if(mContentImageSprite != nullptr) { Rect2I contentBounds = getCachedContentBounds(); HSpriteTexture image = mContent.getImage(mActiveState); UINT32 contentWidth = image->getWidth(); UINT32 contentHeight = image->getHeight(); UINT32 contentMaxWidth = std::min((UINT32)contentBounds.width, contentWidth); UINT32 contentMaxHeight = std::min((UINT32)contentBounds.height, contentHeight); float horzRatio = contentMaxWidth / (float)contentWidth; float vertRatio = contentMaxHeight / (float)contentHeight; if (horzRatio < vertRatio) { contentWidth = Math::roundToInt(contentWidth * horzRatio); contentHeight = Math::roundToInt(contentHeight * horzRatio); } else { contentWidth = Math::roundToInt(contentWidth * vertRatio); contentHeight = Math::roundToInt(contentHeight * vertRatio); } IMAGE_SPRITE_DESC contentImgDesc; contentImgDesc.texture = image.getInternalPtr(); contentImgDesc.width = contentWidth; contentImgDesc.height = contentHeight; contentImgDesc.color = getTint(); mContentImageSprite->update(contentImgDesc, (UINT64)_getParentWidget()); } GUIElement::updateRenderElementsInternal(); }
void GUICanvas::buildImageElement(const CanvasElement& element) { assert(element.type == CanvasElementType::Image); const ImageElementData& imageData = mImageData[element.dataId]; IMAGE_SPRITE_DESC desc; desc.width = imageData.area.width; desc.height = imageData.area.height; desc.transparent = true; desc.color = element.color; Vector2I textureSize; if (SpriteTexture::checkIsLoaded(imageData.texture)) { desc.texture = imageData.texture.getInternalPtr(); textureSize.x = desc.texture->getWidth(); textureSize.y = desc.texture->getHeight(); } Vector2I destSize(mLayoutData.area.width, mLayoutData.area.height); desc.uvScale = ImageSprite::getTextureUVScale(textureSize, destSize, element.scaleMode); element.imageSprite->update(desc, (UINT64)_getParentWidget()); }
void GUICanvas::updateRenderElementsInternal() { mNumRenderElements = 0; for(auto& element : mElements) { switch(element.type) { case CanvasElementType::Image: buildImageElement(element); element.renderElemStart = mNumRenderElements; element.renderElemEnd = element.renderElemStart + element.imageSprite->getNumRenderElements(); break; case CanvasElementType::Text: buildTextElement(element); element.renderElemStart = mNumRenderElements; element.renderElemEnd = element.renderElemStart + element.textSprite->getNumRenderElements(); break; case CanvasElementType::Line: case CanvasElementType::Triangle: element.renderElemStart = mNumRenderElements; element.renderElemEnd = element.renderElemStart + 1; mTriangleElementData[element.dataId].matInfo.groupId = (UINT64)_getParentWidget(); // Actual mesh build happens when reading from it, because the mesh size varies due to clipping rectangle/offset break; } mNumRenderElements = element.renderElemEnd; } GUIElement::updateRenderElementsInternal(); }
void GUIElement::_refreshStyle() { const GUIElementStyle* newStyle = nullptr; if(_getParentWidget() != nullptr && !mStyleName.empty()) newStyle = _getParentWidget()->getSkin().getStyle(mStyleName); else newStyle = &GUISkin::DefaultStyle; if(newStyle != mStyle) { mStyle = newStyle; mDimensions.updateWithStyle(mStyle); styleUpdated(); _markLayoutAsDirty(); } }
void GUIColor::updateRenderElementsInternal() { Color color = mValue * getTint(); mColorImageDesc.color = color; mColorImageDesc.color.a = 1.0f; mAlphaImageDesc.color = Color::White * color.a; mAlphaImageDesc.color.a = 1.0f; mColorImageDesc.width = (UINT32)(mLayoutData.area.width * ALPHA_SPLIT_POSITION); mColorImageDesc.height = mLayoutData.area.height; mAlphaImageDesc.width = mLayoutData.area.width - mColorImageDesc.width; mAlphaImageDesc.height = mLayoutData.area.height; mColorSprite->update(mColorImageDesc, (UINT64)_getParentWidget()); mAlphaSprite->update(mAlphaImageDesc, (UINT64)_getParentWidget()); GUIElement::updateRenderElementsInternal(); }
void GUICanvas::buildTextElement(const CanvasElement& element) { assert(element.type == CanvasElementType::Text); const TextElementData& textData = mTextData[element.dataId]; TEXT_SPRITE_DESC desc; desc.font = textData.font; desc.fontSize = element.size; desc.text = textData.string; desc.color = element.color; element.textSprite->update(desc, (UINT64)_getParentWidget()); }
void GUIScrollBar::updateRenderElementsInternal() { IMAGE_SPRITE_DESC desc; if(_getStyle()->normal.texture != nullptr && _getStyle()->normal.texture.isLoaded()) desc.texture = _getStyle()->normal.texture.getInternalPtr(); desc.width = mLayoutData.area.width; desc.height = mLayoutData.area.height; desc.color = getTint(); mImageSprite->update(desc, (UINT64)_getParentWidget()); GUIElement::updateRenderElementsInternal(); }
void GUIElementBase::_setParent(GUIElementBase* parent) { if(mParentElement != parent) { mParentElement = parent; _updateAUParents(); if (parent != nullptr) { if (_getParentWidget() != parent->_getParentWidget()) _changeParentWidget(parent->_getParentWidget()); } else _changeParentWidget(nullptr); } }
bool GUIFloatField::_mouseEvent(const GUIMouseEvent& event) { GUIElementContainer::_mouseEvent(event); Rect2I draggableArea; if(mLabel != nullptr) draggableArea = mLabel->_getLayoutData().area; if(event.getType() == GUIMouseEventType::MouseDragStart) { if (!_isDisabled()) { if (draggableArea.contains(event.getDragStartPosition())) { mLastDragPos = event.getPosition().x; mIsDragging = true; } } return true; } else if(event.getType() == GUIMouseEventType::MouseDrag) { if (!_isDisabled()) { if (mIsDragging) { INT32 xDiff = event.getPosition().x - mLastDragPos; INT32 jumpAmount = 0; Rect2I viewArea = _getParentWidget()->getTarget()->getPixelArea(); if (event.getPosition().x <= 0) { Vector2I cursorScreenPos = Cursor::instance().getScreenPosition(); jumpAmount = viewArea.width - event.getPosition().x - 1; cursorScreenPos.x += jumpAmount; Cursor::instance().setScreenPosition(cursorScreenPos); } else if (event.getPosition().x >= (INT32)viewArea.width) { Vector2I cursorScreenPos = Cursor::instance().getScreenPosition(); jumpAmount = -(INT32)viewArea.width - (event.getPosition().x - (INT32)viewArea.width) + 1; cursorScreenPos.x += jumpAmount; Cursor::instance().setScreenPosition(cursorScreenPos); } float oldValue = getValue(); float newValue = oldValue + xDiff * DRAG_SPEED; mLastDragPos = event.getPosition().x + jumpAmount; if (oldValue != newValue) valueChanged(newValue); } } return true; } else if(event.getType() == GUIMouseEventType::MouseDragEnd) { if (!_isDisabled()) mIsDragging = false; return true; } return false; }
bool GUIIntField::_mouseEvent(const GUIMouseEvent& event) { GUIElementContainer::_mouseEvent(event); Rect2I draggableArea; if(mLabel != nullptr) draggableArea = mLabel->_getLayoutData().area; if(event.getType() == GUIMouseEventType::MouseDragStart) { if (!_isDisabled()) { if (draggableArea.contains(event.getDragStartPosition())) { mLastDragPos = event.getPosition().x; mIsDragging = true; } } return true; } else if(event.getType() == GUIMouseEventType::MouseDrag) { if (!_isDisabled()) { if (mIsDragging) { INT32 xDiff = event.getPosition().x - mLastDragPos; INT32 jumpAmount = 0; if (event.getPosition().x < 0) { Vector2I cursorScreenPos = Cursor::instance().getScreenPosition(); cursorScreenPos.x += _getParentWidget()->getTarget()->getWidth(); jumpAmount = _getParentWidget()->getTarget()->getWidth(); Cursor::instance().setScreenPosition(cursorScreenPos); } else if (event.getPosition().x >= _getParentWidget()->getTarget()->getWidth()) { Vector2I cursorScreenPos = Cursor::instance().getScreenPosition(); cursorScreenPos.x -= _getParentWidget()->getTarget()->getWidth(); jumpAmount = -_getParentWidget()->getTarget()->getWidth(); Cursor::instance().setScreenPosition(cursorScreenPos); } INT32 oldValue = getValue(); INT32 newValue = oldValue; if (xDiff >= DRAG_SPEED) { while (xDiff >= DRAG_SPEED) { newValue++; xDiff -= DRAG_SPEED; } } else if (xDiff <= -DRAG_SPEED) { while (xDiff <= -DRAG_SPEED) { newValue--; xDiff += DRAG_SPEED; } } mLastDragPos += (newValue - oldValue) * DRAG_SPEED + jumpAmount; if (oldValue != newValue) valueChanged(newValue); } } return true; } else if(event.getType() == GUIMouseEventType::MouseDragEnd) { if (!_isDisabled()) mIsDragging = false; return true; } return false; }