mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-14 16:14:38 +00:00
correct element gui resizing drift
add minimal padding to counteract floating point flurrer when rounding due to changes in parent element scale revisit the aspect maintining resizer math to correct a few failures with live editing the values.
This commit is contained in:
parent
12dddd07b5
commit
7d72d38ae0
1 changed files with 27 additions and 39 deletions
|
|
@ -1382,6 +1382,8 @@ void GuiControl::parentResized(const RectI &oldParentRect, const RectI &newParen
|
||||||
|
|
||||||
S32 deltaX = newParentRect.extent.x - oldParentRect.extent.x;
|
S32 deltaX = newParentRect.extent.x - oldParentRect.extent.x;
|
||||||
S32 deltaY = newParentRect.extent.y - oldParentRect.extent.y;
|
S32 deltaY = newParentRect.extent.y - oldParentRect.extent.y;
|
||||||
|
F32 nudgeX = (deltaX > 0) ? -0.001f : 0.001f;
|
||||||
|
F32 nudgeY = (deltaY > 0) ? -0.001f : 0.001f;
|
||||||
|
|
||||||
if (mHorizSizing == horizResizeCenter)
|
if (mHorizSizing == horizResizeCenter)
|
||||||
newPosition.x = (newParentRect.extent.x - getWidth()) >> 1;
|
newPosition.x = (newParentRect.extent.x - getWidth()) >> 1;
|
||||||
|
|
@ -1391,40 +1393,34 @@ void GuiControl::parentResized(const RectI &oldParentRect, const RectI &newParen
|
||||||
newPosition.x += deltaX;
|
newPosition.x += deltaX;
|
||||||
else if (mHorizSizing == horizResizeRelative && oldParentRect.extent.x != 0)
|
else if (mHorizSizing == horizResizeRelative && oldParentRect.extent.x != 0)
|
||||||
{
|
{
|
||||||
S32 newLeft = mRoundToNearest( ( F32( newPosition.x ) / F32( oldParentRect.extent.x ) ) * F32( newParentRect.extent.x ) );
|
S32 newLeft = mRoundToNearest( ( F32( newPosition.x ) / F32( oldParentRect.extent.x ) ) * F32( newParentRect.extent.x ) + nudgeX);
|
||||||
S32 newWidth = mRoundToNearest( ( F32( newExtent.x ) / F32( oldParentRect.extent.x ) ) * F32( newParentRect.extent.x ) );
|
S32 newWidth = mRoundToNearest( ( F32( newExtent.x ) / F32( oldParentRect.extent.x ) ) * F32( newParentRect.extent.x ) + nudgeX);
|
||||||
|
|
||||||
newPosition.x = newLeft;
|
newPosition.x = newLeft;
|
||||||
newExtent.x = newWidth;
|
newExtent.x = newWidth;
|
||||||
}
|
}
|
||||||
else if (mHorizSizing == horizResizeAspectLeft && oldParentRect.extent.x != 0)
|
else if (mHorizSizing == horizResizeAspectLeft && oldParentRect.extent.x != 0)
|
||||||
{
|
{
|
||||||
S32 newLeft = mRoundToNearest((F32(newPosition.x) / F32(oldParentRect.extent.x)) * F32(newParentRect.extent.x));
|
F32 heightRatio = F32(newParentRect.extent.y) / F32(oldParentRect.extent.y);
|
||||||
S32 newWidth = mRoundToNearest((F32(newExtent.x) / F32(oldParentRect.extent.y)) * F32(newParentRect.extent.y));
|
S32 newWidth = mRoundToNearest(F32(newExtent.x) * heightRatio + nudgeX);
|
||||||
|
|
||||||
newPosition.x = newLeft;
|
S32 newRight = newPosition.x + newExtent.x + deltaX;
|
||||||
|
newPosition.x = newRight - newWidth;
|
||||||
newExtent.x = newWidth;
|
newExtent.x = newWidth;
|
||||||
}
|
}
|
||||||
else if (mHorizSizing == horizResizeAspectRight && oldParentRect.extent.x != 0)
|
else if (mHorizSizing == horizResizeAspectRight && oldParentRect.extent.x != 0)
|
||||||
{
|
{
|
||||||
S32 newLeft = mRoundToNearest((F32(newPosition.x) / F32(oldParentRect.extent.x)) * F32(newParentRect.extent.x));
|
F32 heightRatio = F32(newParentRect.extent.y) / F32(oldParentRect.extent.y);
|
||||||
S32 newWidth = mRoundToNearest((F32(newExtent.x) / F32(oldParentRect.extent.y)) * F32(newParentRect.extent.y)); //origional aspect ratio corrected width
|
S32 newWidth = mRoundToNearest(F32(newExtent.x) * heightRatio + nudgeX);
|
||||||
S32 rWidth = mRoundToNearest((F32(newExtent.x) / F32(oldParentRect.extent.x)) * F32(newParentRect.extent.x)); //parent aspect ratio relative width
|
|
||||||
|
|
||||||
S32 offset = rWidth - newWidth; // account for change in relative width
|
|
||||||
newLeft += offset;
|
|
||||||
newPosition.x = newLeft;
|
|
||||||
newExtent.x = newWidth;
|
newExtent.x = newWidth;
|
||||||
}
|
}
|
||||||
else if (mHorizSizing == horizResizeAspectCenter && oldParentRect.extent.x != 0)
|
else if (mHorizSizing == horizResizeAspectCenter && oldParentRect.extent.x != 0)
|
||||||
{
|
{
|
||||||
S32 newLeft = mRoundToNearest((F32(newPosition.x) / F32(oldParentRect.extent.x)) * F32(newParentRect.extent.x));
|
F32 heightRatio = F32(newParentRect.extent.y) / F32(oldParentRect.extent.y);
|
||||||
S32 newWidth = mRoundToNearest((F32(newExtent.x) / F32(oldParentRect.extent.y)) * F32(newParentRect.extent.y)); //origional aspect ratio corrected width
|
S32 newWidth = mRoundToNearest(F32(newExtent.x) * heightRatio + nudgeX);
|
||||||
S32 rWidth = mRoundToNearest((F32(newExtent.x) / F32(oldParentRect.extent.x)) * F32(newParentRect.extent.x)); //parent aspect ratio relative width
|
S32 center = newPosition.x + (newExtent.x >> 1);
|
||||||
|
center += deltaX >> 1;
|
||||||
S32 offset = rWidth - newWidth; // account for change in relative width
|
newPosition.x = center - (newWidth >> 1);
|
||||||
newLeft += offset/2;
|
|
||||||
newPosition.x = newLeft;
|
|
||||||
newExtent.x = newWidth;
|
newExtent.x = newWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1436,40 +1432,32 @@ void GuiControl::parentResized(const RectI &oldParentRect, const RectI &newParen
|
||||||
newPosition.y += deltaY;
|
newPosition.y += deltaY;
|
||||||
else if(mVertSizing == vertResizeRelative && oldParentRect.extent.y != 0)
|
else if(mVertSizing == vertResizeRelative && oldParentRect.extent.y != 0)
|
||||||
{
|
{
|
||||||
S32 newTop = mRoundToNearest( ( F32( newPosition.y ) / F32( oldParentRect.extent.y ) ) * F32( newParentRect.extent.y ) );
|
S32 newHeight = mRoundToNearest( ( F32( newExtent.y ) / F32( oldParentRect.extent.y ) ) * F32( newParentRect.extent.y ) + nudgeY );
|
||||||
S32 newHeight = mRoundToNearest( ( F32( newExtent.y ) / F32( oldParentRect.extent.y ) ) * F32( newParentRect.extent.y ) );
|
S32 newTop = mRoundToNearest( ( F32( newPosition.y ) / F32( oldParentRect.extent.y ) ) * F32( newParentRect.extent.y ) + nudgeY );
|
||||||
|
|
||||||
newPosition.y = newTop;
|
newPosition.y = newTop;
|
||||||
newExtent.y = newHeight;
|
newExtent.y = newHeight;
|
||||||
}
|
}
|
||||||
else if (mVertSizing == vertResizeAspectTop && oldParentRect.extent.y != 0)
|
else if (mVertSizing == vertResizeAspectTop && oldParentRect.extent.y != 0)
|
||||||
{
|
{
|
||||||
S32 newTop = mRoundToNearest((F32(newPosition.y) / F32(oldParentRect.extent.y)) * F32(newParentRect.extent.y));
|
F32 widthRatio = F32(newParentRect.extent.x) / F32(oldParentRect.extent.x);
|
||||||
S32 newHeight = mRoundToNearest((F32(newExtent.y) / F32(oldParentRect.extent.x)) * F32(newParentRect.extent.x));
|
S32 newHeight = mRoundToNearest(F32(newExtent.y) * widthRatio + nudgeY);
|
||||||
|
newPosition.y += deltaY;
|
||||||
newPosition.y = newTop;
|
|
||||||
newExtent.y = newHeight;
|
newExtent.y = newHeight;
|
||||||
}
|
}
|
||||||
else if (mVertSizing == vertResizeAspectBottom && oldParentRect.extent.y != 0)
|
else if (mVertSizing == vertResizeAspectBottom && oldParentRect.extent.y != 0)
|
||||||
{
|
{
|
||||||
S32 newTop = mRoundToNearest((F32(newPosition.y) / F32(oldParentRect.extent.y)) * F32(newParentRect.extent.y));
|
F32 widthRatio = F32(newParentRect.extent.x) / F32(oldParentRect.extent.x);
|
||||||
S32 newHeight = mRoundToNearest((F32(newExtent.y) / F32(oldParentRect.extent.x)) * F32(newParentRect.extent.x)); //origional aspect ratio corrected hieght
|
S32 newHeight = mRoundToNearest(F32(newExtent.y) * widthRatio + nudgeY);
|
||||||
S32 rHeight = mRoundToNearest((F32(newExtent.y) / F32(oldParentRect.extent.y)) * F32(newParentRect.extent.y)); //parent aspect ratio relative hieght
|
|
||||||
|
|
||||||
S32 offset = rHeight - newHeight; // account for change in relative hieght
|
|
||||||
newTop += offset;
|
|
||||||
newPosition.y = newTop;
|
|
||||||
newExtent.y = newHeight;
|
newExtent.y = newHeight;
|
||||||
}
|
}
|
||||||
else if (mVertSizing == vertResizeAspectCenter && oldParentRect.extent.y != 0)
|
else if (mVertSizing == vertResizeAspectCenter && oldParentRect.extent.y != 0)
|
||||||
{
|
{
|
||||||
S32 newTop = mRoundToNearest((F32(newPosition.y) / F32(oldParentRect.extent.y)) * F32(newParentRect.extent.y));
|
F32 widthRatio = F32(newParentRect.extent.x) / F32(oldParentRect.extent.x);
|
||||||
S32 newHeight = mRoundToNearest((F32(newExtent.y) / F32(oldParentRect.extent.x)) * F32(newParentRect.extent.x)); //origional aspect ratio corrected hieght
|
S32 newHeight = mRoundToNearest(F32(newExtent.y) * widthRatio + nudgeY);
|
||||||
S32 rHeight = mRoundToNearest((F32(newExtent.y) / F32(oldParentRect.extent.y)) * F32(newParentRect.extent.y)); //parent aspect ratio relative hieght
|
S32 center = newPosition.y + (newExtent.y >> 1);
|
||||||
|
center += deltaY >> 1;
|
||||||
S32 offset = rHeight - newHeight; // account for change in relative hieght
|
newPosition.y = center - (newHeight >> 1);
|
||||||
newTop += offset / 2;
|
|
||||||
newPosition.y = newTop;
|
|
||||||
newExtent.y = newHeight;
|
newExtent.y = newHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue