Merge pull request #195 from jrassa/gui-component-enhancements

added origin and rotation support to guicomponent, exposed as theme o…
This commit is contained in:
John Rassa 2017-08-11 21:35:10 -04:00 committed by GitHub
commit 96fbc1c277
12 changed files with 179 additions and 80 deletions

View file

@ -517,6 +517,10 @@ Can be created as an extra.
- The image will be resized as large as possible so that it fits within this size and maintains its aspect ratio. Use this instead of `size` when you don't know what kind of image you're using so it doesn't get grossly oversized on one axis (e.g. with a game's image metadata).
* `origin` - type: NORMALIZED_PAIR.
- Where on the image `pos` refers to. For example, an origin of `0.5 0.5` and a `pos` of `0.5 0.5` would place the image exactly in the middle of the screen. If the "POSITION" and "SIZE" attributes are themable, "ORIGIN" is implied.
* `rotation` - type: FLOAT.
- angle in degrees that the image should be rotated. Positive values will rotate clockwise, negative values will rotate counterclockwise.
* `rotationOrigin` - type: NORMALIZED_PAIR.
- Point around which the image will be rotated. Defaults to `0.5 0.5`.
* `path` - type: PATH.
- Path to the image file. Most common extensions are supported (including .jpg, .png, and unanimated .gif).
* `tile` - type: BOOLEAN.
@ -535,6 +539,10 @@ Can be created as an extra.
- The video will be resized as large as possible so that it fits within this size and maintains its aspect ratio. Use this instead of `size` when you don't know what kind of video you're using so it doesn't get grossly oversized on one axis (e.g. with a game's video metadata).
* `origin` - type: NORMALIZED_PAIR.
- Where on the image `pos` refers to. For example, an origin of `0.5 0.5` and a `pos` of `0.5 0.5` would place the image exactly in the middle of the screen. If the "POSITION" and "SIZE" attributes are themable, "ORIGIN" is implied.
* `rotation` - type: FLOAT.
- angle in degrees that the text should be rotated. Positive values will rotate clockwise, negative values will rotate counterclockwise.
* `rotationOrigin` - type: NORMALIZED_PAIR.
- Point around which the text will be rotated. Defaults to `0.5 0.5`.
* `delay` - type: FLOAT. Default is false.
- Delay in seconds before video will start playing.
* `default` - type: PATH.
@ -556,6 +564,12 @@ Can be created as an extra.
- `0 0` - automatically size so text fits on one line (expanding horizontally).
- `w 0` - automatically wrap text so it doesn't go beyond `w` (expanding vertically).
- `w h` - works like a "text box." If `h` is non-zero and `h` <= `fontSize` (implying it should be a single line of text), text that goes beyond `w` will be truncated with an elipses (...).
* `origin` - type: NORMALIZED_PAIR.
- Where on the component `pos` refers to. For example, an origin of `0.5 0.5` and a `pos` of `0.5 0.5` would place the component exactly in the middle of the screen. If the "POSITION" and "SIZE" attributes are themable, "ORIGIN" is implied.
* `rotation` - type: FLOAT.
- angle in degrees that the text should be rotated. Positive values will rotate clockwise, negative values will rotate counterclockwise.
* `rotationOrigin` - type: NORMALIZED_PAIR.
- Point around which the text will be rotated. Defaults to `0.5 0.5`.
* `text` - type: STRING.
* `color` - type: COLOR.
* `backgroundColor` - type: COLOR;
@ -574,6 +588,8 @@ Can be created as an extra.
* `pos` - type: NORMALIZED_PAIR.
* `size` - type: NORMALIZED_PAIR.
* `origin` - type: NORMALIZED_PAIR.
- Where on the component `pos` refers to. For example, an origin of `0.5 0.5` and a `pos` of `0.5 0.5` would place the component exactly in the middle of the screen. If the "POSITION" and "SIZE" attributes are themable, "ORIGIN" is implied.
* `selectorColor` - type: COLOR.
- Color of the "selector bar."
* `selectorImagePath` - type: PATH.
@ -618,6 +634,12 @@ EmulationStation borrows the concept of "nine patches" from Android (or "9-Slice
* `pos` - type: NORMALIZED_PAIR.
* `size` - type: NORMALIZED_PAIR.
- Only one value is actually used. The other value should be zero. (e.g. specify width OR height, but not both. This is done to maintain the aspect ratio.)
* `origin` - type: NORMALIZED_PAIR.
- Where on the component `pos` refers to. For example, an origin of `0.5 0.5` and a `pos` of `0.5 0.5` would place the component exactly in the middle of the screen. If the "POSITION" and "SIZE" attributes are themable, "ORIGIN" is implied.
* `rotation` - type: FLOAT.
- angle in degrees that the rating should be rotated. Positive values will rotate clockwise, negative values will rotate counterclockwise.
* `rotationOrigin` - type: NORMALIZED_PAIR.
- Point around which the rating will be rotated. Defaults to `0.5 0.5`.
* `filledPath` - type: PATH.
- Path to the "filled star" image. Image must be square (width equals height).
* `unfilledPath` - type: PATH.

View file

@ -78,7 +78,7 @@ void DetailedGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& them
BasicGameListView::onThemeChanged(theme);
using namespace ThemeFlags;
mImage.applyTheme(theme, getName(), "md_image", POSITION | ThemeFlags::SIZE | Z_INDEX);
mImage.applyTheme(theme, getName(), "md_image", POSITION | ThemeFlags::SIZE | Z_INDEX | ROTATION);
initMDLabels();
std::vector<TextComponent*> labels = getMDLabels();
@ -109,7 +109,7 @@ void DetailedGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& them
mDescContainer.applyTheme(theme, getName(), "md_description", POSITION | ThemeFlags::SIZE | Z_INDEX);
mDescription.setSize(mDescContainer.getSize().x(), 0);
mDescription.applyTheme(theme, getName(), "md_description", ALL ^ (POSITION | ThemeFlags::SIZE | TEXT));
mDescription.applyTheme(theme, getName(), "md_description", ALL ^ (POSITION | ThemeFlags::SIZE | ThemeFlags::ORIGIN | TEXT | ROTATION));
sortChildren();
}

View file

@ -114,9 +114,9 @@ void VideoGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& theme)
BasicGameListView::onThemeChanged(theme);
using namespace ThemeFlags;
mMarquee.applyTheme(theme, getName(), "md_marquee", POSITION | ThemeFlags::SIZE | Z_INDEX);
mImage.applyTheme(theme, getName(), "md_image", POSITION | ThemeFlags::SIZE | Z_INDEX);
mVideo->applyTheme(theme, getName(), "md_video", POSITION | ThemeFlags::SIZE | ThemeFlags::DELAY | Z_INDEX);
mMarquee.applyTheme(theme, getName(), "md_marquee", POSITION | ThemeFlags::SIZE | Z_INDEX | ROTATION);
mImage.applyTheme(theme, getName(), "md_image", POSITION | ThemeFlags::SIZE | Z_INDEX | ROTATION);
mVideo->applyTheme(theme, getName(), "md_video", POSITION | ThemeFlags::SIZE | ThemeFlags::DELAY | Z_INDEX | ROTATION);
initMDLabels();
std::vector<TextComponent*> labels = getMDLabels();
@ -147,7 +147,7 @@ void VideoGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& theme)
mDescContainer.applyTheme(theme, getName(), "md_description", POSITION | ThemeFlags::SIZE | Z_INDEX);
mDescription.setSize(mDescContainer.getSize().x(), 0);
mDescription.applyTheme(theme, getName(), "md_description", ALL ^ (POSITION | ThemeFlags::SIZE | TEXT));
mDescription.applyTheme(theme, getName(), "md_description", ALL ^ (POSITION | ThemeFlags::SIZE | ThemeFlags::ORIGIN | TEXT | ROTATION));
sortChildren();
}

View file

@ -6,8 +6,8 @@
#include "ThemeData.h"
GuiComponent::GuiComponent(Window* window) : mWindow(window), mParent(NULL), mOpacity(255),
mPosition(Eigen::Vector3f::Zero()), mSize(Eigen::Vector2f::Zero()), mTransform(Eigen::Affine3f::Identity()),
mIsProcessing(false)
mPosition(Eigen::Vector3f::Zero()), mOrigin(Eigen::Vector2f::Zero()), mRotationOrigin(0.5, 0.5),
mSize(Eigen::Vector2f::Zero()), mTransform(Eigen::Affine3f::Identity()), mIsProcessing(false)
{
for(unsigned char i = 0; i < MAX_ANIMATIONS; i++)
mAnimationMap[i] = NULL;
@ -76,35 +76,65 @@ Eigen::Vector3f GuiComponent::getPosition() const
return mPosition;
}
void GuiComponent::setPosition(const Eigen::Vector3f& offset)
{
mPosition = offset;
onPositionChanged();
}
void GuiComponent::setPosition(float x, float y, float z)
{
mPosition << x, y, z;
onPositionChanged();
}
Eigen::Vector2f GuiComponent::getOrigin() const
{
return mOrigin;
}
void GuiComponent::setOrigin(float x, float y)
{
mOrigin << x, y;
onOriginChanged();
}
Eigen::Vector2f GuiComponent::getRotationOrigin() const
{
return mRotationOrigin;
}
void GuiComponent::setRotationOrigin(float x, float y)
{
mRotationOrigin << x, y;;
}
Eigen::Vector2f GuiComponent::getSize() const
{
return mSize;
}
void GuiComponent::setSize(const Eigen::Vector2f& size)
{
mSize = size;
onSizeChanged();
}
void GuiComponent::setSize(float w, float h)
{
mSize << w, h;
onSizeChanged();
}
float GuiComponent::getRotation() const
{
return mRotation;
}
void GuiComponent::setRotation(float rotation)
{
mRotation = rotation;
}
float GuiComponent::getScale() const
{
return mScale;
}
void GuiComponent::setScale(float scale)
{
mScale = scale;
onSizeChanged();
}
float GuiComponent::getZIndex() const
{
return mZIndex;
@ -125,6 +155,12 @@ void GuiComponent::setDefaultZIndex(float z)
mDefaultZIndex = z;
}
Eigen::Vector2f GuiComponent::getCenter() const
{
return Eigen::Vector2f(mPosition.x() - (getSize().x() * mOrigin.x()) + getSize().x() / 2,
mPosition.y() - (getSize().y() * mOrigin.y()) + getSize().y() / 2);
}
//Children stuff.
void GuiComponent::addChild(GuiComponent* cmp)
{
@ -208,6 +244,28 @@ const Eigen::Affine3f& GuiComponent::getTransform()
{
mTransform.setIdentity();
mTransform.translate(mPosition);
if (mScale != 1.0)
{
mTransform *= Eigen::Scaling(mScale);
}
if (mRotation != 0.0)
{
// Calculate offset as difference between origin and rotation origin
float xOff = (mOrigin.x() - mRotationOrigin.x()) * mSize.x();
float yOff = (mOrigin.y() - mRotationOrigin.y()) * mSize.y();
// transform to offset point
if (xOff != 0.0 || yOff != 0.0)
mTransform.translate(Eigen::Vector3f(xOff * -1, yOff * -1, 0.0f));
// apply rotation transorm
mTransform *= Eigen::AngleAxisf(mRotation, Eigen::Vector3f::UnitZ());
// Tranform back to original point
if (xOff != 0.0 || yOff != 0.0)
mTransform.translate(Eigen::Vector3f(xOff, yOff, 0.0f));
}
mTransform.translate(Eigen::Vector3f(mOrigin.x() * mSize.x() * -1, mOrigin.y() * mSize.y() * -1, 0.0f));
return mTransform;
}
@ -348,6 +406,17 @@ void GuiComponent::applyTheme(const std::shared_ptr<ThemeData>& theme, const std
if(properties & ThemeFlags::SIZE && elem->has("size"))
setSize(elem->get<Eigen::Vector2f>("size").cwiseProduct(scale));
// position + size also implies origin
if((properties & ORIGIN || (properties & POSITION && properties & ThemeFlags::SIZE)) && elem->has("origin"))
setOrigin(elem->get<Eigen::Vector2f>("origin"));
if(properties & ThemeFlags::ROTATION) {
if(elem->has("rotation"))
setRotationDegrees(elem->get<float>("rotation"));
if(elem->has("rotationOrigin"))
setRotationOrigin(elem->get<Eigen::Vector2f>("rotationOrigin"));
}
if(properties & ThemeFlags::Z_INDEX && elem->has("zIndex"))
setZIndex(elem->get<float>("zIndex"));
else

View file

@ -37,21 +37,42 @@ public:
virtual void render(const Eigen::Affine3f& parentTrans);
Eigen::Vector3f getPosition() const;
void setPosition(const Eigen::Vector3f& offset);
inline void setPosition(const Eigen::Vector3f& offset) { setPosition(offset.x(), offset.y(), offset.z()); }
void setPosition(float x, float y, float z = 0.0f);
virtual void onPositionChanged() {};
//Sets the origin as a percentage of this image (e.g. (0, 0) is top left, (0.5, 0.5) is the center)
Eigen::Vector2f getOrigin() const;
void setOrigin(float originX, float originY);
inline void setOrigin(Eigen::Vector2f origin) { setOrigin(origin.x(), origin.y()); }
virtual void onOriginChanged() {};
//Sets the rotation origin as a percentage of this image (e.g. (0, 0) is top left, (0.5, 0.5) is the center)
Eigen::Vector2f getRotationOrigin() const;
void setRotationOrigin(float originX, float originY);
inline void setRotationOrigin(Eigen::Vector2f origin) { setRotationOrigin(origin.x(), origin.y()); }
Eigen::Vector2f getSize() const;
void setSize(const Eigen::Vector2f& size);
inline void setSize(const Eigen::Vector2f& size) { setSize(size.x(), size.y()); }
void setSize(float w, float h);
virtual void onSizeChanged() {};
float getRotation() const;
void setRotation(float rotation);
inline void setRotationDegrees(float rotation) { setRotation(rotation * M_PI / 180); }
float getScale() const;
void setScale(float scale);
float getZIndex() const;
void setZIndex(float zIndex);
float getDefaultZIndex() const;
void setDefaultZIndex(float zIndex);
// Returns the center point of the image (takes origin into account).
Eigen::Vector2f getCenter() const;
void setParent(GuiComponent* parent);
GuiComponent* getParent() const;
@ -119,8 +140,13 @@ protected:
std::vector<GuiComponent*> mChildren;
Eigen::Vector3f mPosition;
Eigen::Vector2f mOrigin;
Eigen::Vector2f mRotationOrigin;
Eigen::Vector2f mSize;
float mRotation = 0.0;
float mScale = 1.0;
float mDefaultZIndex = 0;
float mZIndex = 0;

View file

@ -33,6 +33,8 @@ std::map< std::string, ElementMapType > ThemeData::sElementMap = boost::assign::
("size", NORMALIZED_PAIR)
("maxSize", NORMALIZED_PAIR)
("origin", NORMALIZED_PAIR)
("rotation", FLOAT)
("rotationOrigin", NORMALIZED_PAIR)
("path", PATH)
("tile", BOOLEAN)
("color", COLOR)
@ -40,6 +42,9 @@ std::map< std::string, ElementMapType > ThemeData::sElementMap = boost::assign::
("text", makeMap(boost::assign::map_list_of
("pos", NORMALIZED_PAIR)
("size", NORMALIZED_PAIR)
("origin", NORMALIZED_PAIR)
("rotation", FLOAT)
("rotationOrigin", NORMALIZED_PAIR)
("text", STRING)
("backgroundColor", COLOR)
("fontPath", PATH)
@ -53,6 +58,7 @@ std::map< std::string, ElementMapType > ThemeData::sElementMap = boost::assign::
("textlist", makeMap(boost::assign::map_list_of
("pos", NORMALIZED_PAIR)
("size", NORMALIZED_PAIR)
("origin", NORMALIZED_PAIR)
("selectorHeight", FLOAT)
("selectorOffsetY", FLOAT)
("selectorColor", COLOR)
@ -72,6 +78,7 @@ std::map< std::string, ElementMapType > ThemeData::sElementMap = boost::assign::
("container", makeMap(boost::assign::map_list_of
("pos", NORMALIZED_PAIR)
("size", NORMALIZED_PAIR)
("origin", NORMALIZED_PAIR)
("zIndex", FLOAT)))
("ninepatch", makeMap(boost::assign::map_list_of
("pos", NORMALIZED_PAIR)
@ -89,6 +96,9 @@ std::map< std::string, ElementMapType > ThemeData::sElementMap = boost::assign::
("rating", makeMap(boost::assign::map_list_of
("pos", NORMALIZED_PAIR)
("size", NORMALIZED_PAIR)
("origin", NORMALIZED_PAIR)
("rotation", FLOAT)
("rotationOrigin", NORMALIZED_PAIR)
("color", COLOR)
("filledPath", PATH)
("unfilledPath", PATH)
@ -106,6 +116,8 @@ std::map< std::string, ElementMapType > ThemeData::sElementMap = boost::assign::
("size", NORMALIZED_PAIR)
("maxSize", NORMALIZED_PAIR)
("origin", NORMALIZED_PAIR)
("rotation", FLOAT)
("rotationOrigin", NORMALIZED_PAIR)
("default", PATH)
("delay", FLOAT)
("zIndex", FLOAT)

View file

@ -40,7 +40,7 @@ namespace ThemeFlags
LINE_SPACING = 2048,
DELAY = 4096,
Z_INDEX = 8192,
ROTATION = 16384,
ALL = 0xFFFFFFFF
};
}

View file

@ -12,17 +12,11 @@ Eigen::Vector2i ImageComponent::getTextureSize() const
if(mTexture)
return mTexture->getSize();
else
return Eigen::Vector2i(0, 0);
}
Eigen::Vector2f ImageComponent::getCenter() const
{
return Eigen::Vector2f(mPosition.x() - (getSize().x() * mOrigin.x()) + getSize().x() / 2,
mPosition.y() - (getSize().y() * mOrigin.y()) + getSize().y() / 2);
return Eigen::Vector2i::Zero();
}
ImageComponent::ImageComponent(Window* window, bool forceLoad, bool dynamic) : GuiComponent(window),
mTargetIsMax(false), mFlipX(false), mFlipY(false), mOrigin(0.0, 0.0), mTargetSize(0, 0), mColorShift(0xFFFFFFFF),
mTargetIsMax(false), mFlipX(false), mFlipY(false), mTargetSize(0, 0), mColorShift(0xFFFFFFFF),
mForceLoad(forceLoad), mDynamic(dynamic), mFadeOpacity(0.0f), mFading(false)
{
updateColors();
@ -125,12 +119,6 @@ void ImageComponent::setImage(const std::shared_ptr<TextureResource>& texture)
resize();
}
void ImageComponent::setOrigin(float originX, float originY)
{
mOrigin << originX, originY;
updateVertices();
}
void ImageComponent::setResize(float width, float height)
{
mTargetSize << width, height;
@ -180,16 +168,8 @@ void ImageComponent::updateVertices()
// we go through this mess to make sure everything is properly rounded
// if we just round vertices at the end, edge cases occur near sizes of 0.5
Eigen::Vector2f topLeft(-mSize.x() * mOrigin.x(), -mSize.y() * mOrigin.y());
Eigen::Vector2f bottomRight(mSize.x() * (1 -mOrigin.x()), mSize.y() * (1 - mOrigin.y()));
const float width = round(bottomRight.x() - topLeft.x());
const float height = round(bottomRight.y() - topLeft.y());
topLeft[0] = floor(topLeft[0]);
topLeft[1] = floor(topLeft[1]);
bottomRight[0] = topLeft[0] + width;
bottomRight[1] = topLeft[1] + height;
Eigen::Vector2f topLeft(0.0, 0.0);
Eigen::Vector2f bottomRight(round(mSize.x()), round(mSize.y()));
mVertices[0].pos << topLeft.x(), topLeft.y();
mVertices[1].pos << topLeft.x(), bottomRight.y();
@ -236,7 +216,7 @@ void ImageComponent::updateColors()
void ImageComponent::render(const Eigen::Affine3f& parentTrans)
{
Eigen::Affine3f trans = roundMatrix(parentTrans * getTransform());
Eigen::Affine3f trans = parentTrans * getTransform();
Renderer::setMatrix(trans);
if(mTexture && mOpacity > 0)
@ -363,6 +343,13 @@ void ImageComponent::applyTheme(const std::shared_ptr<ThemeData>& theme, const s
if(properties & COLOR && elem->has("color"))
setColorShift(elem->get<unsigned int>("color"));
if(properties & ThemeFlags::ROTATION) {
if(elem->has("rotation"))
setRotationDegrees(elem->get<float>("rotation"));
if(elem->has("rotationOrigin"))
setRotationOrigin(elem->get<Eigen::Vector2f>("rotationOrigin"));
}
if(properties & ThemeFlags::Z_INDEX && elem->has("zIndex"))
setZIndex(elem->get<float>("zIndex"));
else

View file

@ -25,10 +25,6 @@ public:
void onSizeChanged() override;
void setOpacity(unsigned char opacity) override;
//Sets the origin as a percentage of this image (e.g. (0, 0) is top left, (0.5, 0.5) is the center)
void setOrigin(float originX, float originY);
inline void setOrigin(Eigen::Vector2f origin) { setOrigin(origin.x(), origin.y()); }
// Resize the image to fit this size. If one axis is zero, scale that axis to maintain aspect ratio.
// If both are non-zero, potentially break the aspect ratio. If both are zero, no resizing.
// Can be set before or after an image is loaded.
@ -51,9 +47,6 @@ public:
// Returns the size of the current texture, or (0, 0) if none is loaded. May be different than drawn size (use getSize() for that).
Eigen::Vector2i getTextureSize() const;
// Returns the center point of the image (takes origin into account).
Eigen::Vector2f getCenter() const;
bool hasImage();
void render(const Eigen::Affine3f& parentTrans) override;
@ -63,7 +56,6 @@ public:
virtual std::vector<HelpPrompt> getHelpPrompts() override;
private:
Eigen::Vector2f mTargetSize;
Eigen::Vector2f mOrigin;
bool mFlipX, mFlipY, mTargetIsMax;

View file

@ -61,7 +61,6 @@ VideoComponent::VideoComponent(Window* window) :
mDisable(false),
mScreensaverMode(false),
mTargetIsMax(false),
mOrigin(0, 0),
mTargetSize(0, 0)
{
// Setup the default configuration
@ -85,18 +84,10 @@ VideoComponent::~VideoComponent()
remove(getTitlePath().c_str());
}
void VideoComponent::setOrigin(float originX, float originY)
void VideoComponent::onOriginChanged()
{
mOrigin << originX, originY;
// Update the embeded static image
mStaticImage.setOrigin(originX, originY);
}
Eigen::Vector2f VideoComponent::getCenter() const
{
return Eigen::Vector2f(mPosition.x() - (getSize().x() * mOrigin.x()) + getSize().x() / 2,
mPosition.y() - (getSize().y() * mOrigin.y()) + getSize().y() / 2);
mStaticImage.setOrigin(mOrigin);
}
void VideoComponent::onSizeChanged()
@ -222,6 +213,13 @@ void VideoComponent::applyTheme(const std::shared_ptr<ThemeData>& theme, const s
if (elem->has("showSnapshotDelay"))
mConfig.showSnapshotDelay = elem->get<bool>("showSnapshotDelay");
if(properties & ThemeFlags::ROTATION) {
if(elem->has("rotation"))
setRotationDegrees(elem->get<float>("rotation"));
if(elem->has("rotationOrigin"))
setRotationOrigin(elem->get<Eigen::Vector2f>("rotationOrigin"));
}
if(properties & ThemeFlags::Z_INDEX && elem->has("zIndex"))
setZIndex(elem->get<float>("zIndex"));
else

View file

@ -48,10 +48,7 @@ public:
virtual void onScreenSaverDeactivate() override;
virtual void topWindow(bool isTop) override;
//Sets the origin as a percentage of this image (e.g. (0, 0) is top left, (0.5, 0.5) is the center)
void setOrigin(float originX, float originY);
inline void setOrigin(Eigen::Vector2f origin) { setOrigin(origin.x(), origin.y()); }
void onOriginChanged() override;
void onSizeChanged() override;
void setOpacity(unsigned char opacity) override;
@ -62,9 +59,6 @@ public:
virtual std::vector<HelpPrompt> getHelpPrompts() override;
// Returns the center point of the video (takes origin into account).
Eigen::Vector2f getCenter() const;
virtual void update(int deltaTime);
// Resize the video to fit this size. If one axis is zero, scale that axis to maintain aspect ratio.
@ -100,7 +94,6 @@ private:
protected:
unsigned mVideoWidth;
unsigned mVideoHeight;
Eigen::Vector2f mOrigin;
Eigen::Vector2f mTargetSize;
std::shared_ptr<TextureResource> mTexture;
float mFadeIn;

View file

@ -143,10 +143,10 @@ void VideoVlcComponent::render(const Eigen::Affine3f& parentTrans)
float x2;
float y2;
x = -(float)mSize.x() * mOrigin.x();
y = -(float)mSize.y() * mOrigin.y();
x2 = x+mSize.x();
y2 = y+mSize.y();
x = 0.0;
y = 0.0;
x2 = mSize.x();
y2 = mSize.y();
// Define a structure to contain the data for each vertex
struct Vertex