mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-02-17 04:25:39 +00:00
Fix edge case with image vertex rounding leading to texture-ImageComponent size incongruencies.
This commit is contained in:
parent
aa65a80039
commit
8d67cc1053
|
@ -160,10 +160,10 @@ void ImageComponent::render(const Eigen::Affine3f& parentTrans)
|
||||||
float yCount = mSize.y() / getTextureSize().y();
|
float yCount = mSize.y() / getTextureSize().y();
|
||||||
|
|
||||||
Renderer::buildGLColorArray(colors, (mColorShift >> 8 << 8)| (getOpacity()), 6);
|
Renderer::buildGLColorArray(colors, (mColorShift >> 8 << 8)| (getOpacity()), 6);
|
||||||
buildImageArray(0, 0, points, texs, xCount, yCount);
|
buildImageArray(points, texs, xCount, yCount);
|
||||||
}else{
|
}else{
|
||||||
Renderer::buildGLColorArray(colors, (mColorShift >> 8 << 8) | (getOpacity()), 6);
|
Renderer::buildGLColorArray(colors, (mColorShift >> 8 << 8) | (getOpacity()), 6);
|
||||||
buildImageArray(0, 0, points, texs);
|
buildImageArray(points, texs);
|
||||||
}
|
}
|
||||||
|
|
||||||
drawImageArray(points, texs, colors, 6);
|
drawImageArray(points, texs, colors, 6);
|
||||||
|
@ -176,20 +176,28 @@ void ImageComponent::render(const Eigen::Affine3f& parentTrans)
|
||||||
GuiComponent::renderChildren(trans);
|
GuiComponent::renderChildren(trans);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageComponent::buildImageArray(int posX, int posY, GLfloat* points, GLfloat* texs, float px, float py)
|
void ImageComponent::buildImageArray(GLfloat* points, GLfloat* texs, float px, float py)
|
||||||
{
|
{
|
||||||
points[0] = posX - (mSize.x() * mOrigin.x()); points[1] = posY - (mSize.y() * mOrigin.y());
|
// we go through this mess to make sure everything is properly rounded
|
||||||
points[2] = posX - (mSize.x() * mOrigin.x()); points[3] = posY + (mSize.y() * (1 - mOrigin.y()));
|
// if we just round vertices at the end, edge cases occur near sizes of 0.5
|
||||||
points[4] = posX + (mSize.x() * (1 - mOrigin.x())); points[5] = posY - (mSize.y() * mOrigin.y());
|
Eigen::Vector2f topLeft(-mSize.x() * mOrigin.x(), -mSize.y() * mOrigin.y());
|
||||||
|
Eigen::Vector2f bottomRight(mSize.x() * (1 -mOrigin.x()), mSize.y() * (1 - mOrigin.y()));
|
||||||
|
|
||||||
points[6] = posX + (mSize.x() * (1 - mOrigin.x())); points[7] = posY - (mSize.y() * mOrigin.y());
|
const float width = round(bottomRight.x() - topLeft.x());
|
||||||
points[8] = posX - (mSize.x() * mOrigin.x()); points[9] = posY + (mSize.y() * (1 - mOrigin.y()));
|
const float height = round(bottomRight.y() - topLeft.y());
|
||||||
points[10] = posX + (mSize.x() * (1 -mOrigin.x())); points[11] = posY + (mSize.y() * (1 - mOrigin.y()));
|
|
||||||
|
|
||||||
// round vertices
|
topLeft[0] = round(topLeft[0]);
|
||||||
for(int i = 0; i < 12; i++)
|
topLeft[1] = round(topLeft[1]);
|
||||||
points[i] = round(points[i]);
|
bottomRight[0] = topLeft[0] + width;
|
||||||
|
bottomRight[1] = topLeft[1] + height;
|
||||||
|
|
||||||
|
points[0] = topLeft.x(); points[1] = topLeft.y();
|
||||||
|
points[2] = topLeft.x(); points[3] = bottomRight.y();
|
||||||
|
points[4] = bottomRight.x(); points[5] = topLeft.y();
|
||||||
|
|
||||||
|
points[6] = bottomRight.x(); points[7] = topLeft.y();
|
||||||
|
points[8] = topLeft.x(); points[9] = bottomRight.y();
|
||||||
|
points[10] = bottomRight.x(); points[11] = bottomRight.y();
|
||||||
|
|
||||||
texs[0] = 0; texs[1] = py;
|
texs[0] = 0; texs[1] = py;
|
||||||
texs[2] = 0; texs[3] = 0;
|
texs[2] = 0; texs[3] = 0;
|
||||||
|
|
|
@ -68,7 +68,7 @@ private:
|
||||||
void resize();
|
void resize();
|
||||||
|
|
||||||
// Writes 12 GLfloat points and 12 GLfloat texture coordinates to a given array at a given position.
|
// Writes 12 GLfloat points and 12 GLfloat texture coordinates to a given array at a given position.
|
||||||
void buildImageArray(int x, int y, GLfloat* points, GLfloat* texs, float percentageX = 1, float percentageY = 1);
|
void buildImageArray(GLfloat* points, GLfloat* texs, float percentageX = 1, float percentageY = 1);
|
||||||
// Draws the given set of points and texture coordinates, number of coordinate pairs may be specified.
|
// Draws the given set of points and texture coordinates, number of coordinate pairs may be specified.
|
||||||
void drawImageArray(GLfloat* points, GLfloat* texs, GLubyte* colors, unsigned int count = 6);
|
void drawImageArray(GLfloat* points, GLfloat* texs, GLubyte* colors, unsigned int count = 6);
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ void SVGResource::rasterizeAt(size_t width, size_t height)
|
||||||
Eigen::Vector2i SVGResource::getImageSize() const
|
Eigen::Vector2i SVGResource::getImageSize() const
|
||||||
{
|
{
|
||||||
if(mSVGImage)
|
if(mSVGImage)
|
||||||
return Eigen::Vector2i((int)mSVGImage->width, (int)mSVGImage->height);
|
return Eigen::Vector2i((int)round(mSVGImage->width), (int)round(mSVGImage->height));
|
||||||
|
|
||||||
return Eigen::Vector2i::Zero();
|
return Eigen::Vector2i::Zero();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue