2013-06-02 15:08:32 +00:00
|
|
|
#include "ImageComponent.h"
|
2012-08-02 01:43:55 +00:00
|
|
|
#include <iostream>
|
2012-08-09 21:19:07 +00:00
|
|
|
#include <boost/filesystem.hpp>
|
2012-09-07 21:44:07 +00:00
|
|
|
#include <math.h>
|
2013-01-04 23:31:51 +00:00
|
|
|
#include "../Log.h"
|
2013-04-08 17:40:15 +00:00
|
|
|
#include "../Renderer.h"
|
2012-08-02 01:43:55 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Vector2i ImageComponent::getTextureSize() const
|
2013-06-21 16:49:29 +00:00
|
|
|
{
|
|
|
|
if(mTexture)
|
|
|
|
return mTexture->getSize();
|
|
|
|
else
|
2013-07-10 11:29:43 +00:00
|
|
|
return Eigen::Vector2i(0, 0);
|
2013-06-21 16:49:29 +00:00
|
|
|
}
|
2012-08-09 21:19:07 +00:00
|
|
|
|
2013-08-06 13:15:20 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
ImageComponent::ImageComponent(Window* window, float offsetX, float offsetY, std::string path, float targetWidth, float targetHeight, bool allowUpscale) : GuiComponent(window),
|
2013-08-07 22:40:27 +00:00
|
|
|
mTiled(false), mAllowUpscale(allowUpscale), mFlipX(false), mFlipY(false), mOrigin(0.5, 0.5), mTargetSize(targetWidth, targetHeight), mColorShift(0xFFFFFFFF)
|
2012-08-02 01:43:55 +00:00
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
setPosition(offsetX, offsetY);
|
2012-10-07 22:25:51 +00:00
|
|
|
|
2012-08-02 01:43:55 +00:00
|
|
|
if(!path.empty())
|
|
|
|
setImage(path);
|
|
|
|
}
|
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
ImageComponent::~ImageComponent()
|
2012-08-02 01:43:55 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-06-21 16:49:29 +00:00
|
|
|
void ImageComponent::resize()
|
2012-08-09 21:19:07 +00:00
|
|
|
{
|
2013-06-21 16:49:29 +00:00
|
|
|
if(!mTexture)
|
2012-08-29 18:53:53 +00:00
|
|
|
return;
|
2012-08-29 19:22:05 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
mSize << (float)getTextureSize().x(), (float)getTextureSize().y();
|
|
|
|
|
2012-08-29 21:52:25 +00:00
|
|
|
//(we don't resize tiled images)
|
2013-07-10 11:29:43 +00:00
|
|
|
if(!mTiled && (mTargetSize.x() || mTargetSize.y()))
|
2012-08-29 21:52:25 +00:00
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Vector2f resizeScale(Eigen::Vector2f::Zero());
|
2012-08-29 21:52:25 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
if(mTargetSize.x() && (mAllowUpscale || mSize.x() > mTargetSize.x()))
|
2013-06-02 21:05:29 +00:00
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
resizeScale[0] = mTargetSize.x() / mSize.x();
|
2013-06-02 21:05:29 +00:00
|
|
|
}
|
2013-07-10 11:29:43 +00:00
|
|
|
if(mTargetSize.y() && (mAllowUpscale || mSize.y() > mTargetSize.y()))
|
2013-06-02 21:05:29 +00:00
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
resizeScale[1] = mTargetSize.y() / mSize.y();
|
2012-08-29 21:52:25 +00:00
|
|
|
}
|
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
if(resizeScale.x() && !resizeScale.y())
|
|
|
|
resizeScale[1] = resizeScale.x();
|
|
|
|
if(resizeScale[1] && !resizeScale.x())
|
|
|
|
resizeScale[0] = resizeScale.y();
|
2012-08-29 21:52:25 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
if(resizeScale.x())
|
|
|
|
mSize[0] = (mSize.x() * resizeScale.x());
|
|
|
|
if(resizeScale.y())
|
|
|
|
mSize[1] = (mSize.y() * resizeScale.y());
|
2012-08-29 21:52:25 +00:00
|
|
|
}
|
2013-06-02 22:33:49 +00:00
|
|
|
|
|
|
|
if(mTiled)
|
|
|
|
mSize = mTargetSize;
|
2012-08-13 18:32:53 +00:00
|
|
|
}
|
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
void ImageComponent::setImage(std::string path)
|
2012-08-09 21:19:07 +00:00
|
|
|
{
|
2012-08-10 02:17:48 +00:00
|
|
|
mPath = path;
|
|
|
|
|
2013-10-04 23:09:54 +00:00
|
|
|
if(mPath.empty() || !ResourceManager::getInstance()->fileExists(mPath))
|
2013-07-09 05:44:24 +00:00
|
|
|
mTexture.reset();
|
|
|
|
else
|
2013-10-04 23:09:54 +00:00
|
|
|
mTexture = TextureResource::get(mPath);
|
2013-07-09 05:44:24 +00:00
|
|
|
|
2013-06-21 16:49:29 +00:00
|
|
|
resize();
|
2012-08-02 01:43:55 +00:00
|
|
|
}
|
|
|
|
|
2013-09-20 23:55:05 +00:00
|
|
|
void ImageComponent::setImage(const char* path, size_t length)
|
|
|
|
{
|
|
|
|
mTexture.reset();
|
|
|
|
|
2013-10-04 23:09:54 +00:00
|
|
|
mTexture = TextureResource::get("");
|
2013-09-20 23:55:05 +00:00
|
|
|
mTexture->initFromMemory(path, length);
|
|
|
|
|
|
|
|
resize();
|
|
|
|
}
|
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
void ImageComponent::setOrigin(float originX, float originY)
|
2012-08-13 18:32:53 +00:00
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
mOrigin << originX, originY;
|
2012-08-13 18:32:53 +00:00
|
|
|
}
|
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
void ImageComponent::setTiling(bool tile)
|
2012-08-13 18:32:53 +00:00
|
|
|
{
|
|
|
|
mTiled = tile;
|
|
|
|
|
|
|
|
if(mTiled)
|
2013-06-02 21:05:29 +00:00
|
|
|
mAllowUpscale = false;
|
2013-06-02 22:33:49 +00:00
|
|
|
|
|
|
|
resize();
|
2012-08-13 18:32:53 +00:00
|
|
|
}
|
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
void ImageComponent::setResize(float width, float height, bool allowUpscale)
|
2012-10-05 20:04:12 +00:00
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
mTargetSize << width, height;
|
2013-06-02 21:05:29 +00:00
|
|
|
mAllowUpscale = allowUpscale;
|
2012-10-05 20:04:12 +00:00
|
|
|
resize();
|
|
|
|
}
|
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
void ImageComponent::setFlipX(bool flip)
|
2012-10-07 22:25:51 +00:00
|
|
|
{
|
|
|
|
mFlipX = flip;
|
|
|
|
}
|
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
void ImageComponent::setFlipY(bool flip)
|
2012-10-07 22:25:51 +00:00
|
|
|
{
|
|
|
|
mFlipY = flip;
|
|
|
|
}
|
|
|
|
|
2013-08-07 22:40:27 +00:00
|
|
|
void ImageComponent::setColorShift(unsigned int color)
|
|
|
|
{
|
|
|
|
mColorShift = color;
|
|
|
|
}
|
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
void ImageComponent::render(const Eigen::Affine3f& parentTrans)
|
2012-08-02 01:43:55 +00:00
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
Eigen::Affine3f trans = parentTrans * getTransform();
|
|
|
|
Renderer::setMatrix(trans);
|
|
|
|
|
2013-06-21 16:49:29 +00:00
|
|
|
if(mTexture && getOpacity() > 0)
|
2012-08-13 18:32:53 +00:00
|
|
|
{
|
2012-10-17 17:15:58 +00:00
|
|
|
GLfloat points[12], texs[12];
|
|
|
|
GLubyte colors[6*4];
|
|
|
|
|
2012-08-29 21:52:25 +00:00
|
|
|
if(mTiled)
|
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
float xCount = mSize.x() / getTextureSize().x();
|
|
|
|
float yCount = mSize.y() / getTextureSize().y();
|
2013-06-02 21:05:29 +00:00
|
|
|
|
2013-08-07 22:40:27 +00:00
|
|
|
Renderer::buildGLColorArray(colors, (mColorShift >> 8 << 8)| (getOpacity()), 6);
|
2013-06-02 19:34:50 +00:00
|
|
|
buildImageArray(0, 0, points, texs, xCount, yCount);
|
2012-08-29 21:52:25 +00:00
|
|
|
}else{
|
2013-08-07 22:40:27 +00:00
|
|
|
Renderer::buildGLColorArray(colors, (mColorShift >> 8 << 8) | (getOpacity()), 6);
|
2013-06-02 19:34:50 +00:00
|
|
|
buildImageArray(0, 0, points, texs);
|
2012-08-29 21:52:25 +00:00
|
|
|
}
|
2012-10-17 17:15:58 +00:00
|
|
|
|
|
|
|
drawImageArray(points, texs, colors, 6);
|
2012-08-29 21:52:25 +00:00
|
|
|
}
|
2013-06-02 19:34:50 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
GuiComponent::renderChildren(trans);
|
2012-08-29 21:52:25 +00:00
|
|
|
}
|
2012-08-29 18:53:53 +00:00
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
void ImageComponent::buildImageArray(int posX, int posY, GLfloat* points, GLfloat* texs, float px, float py)
|
2012-08-29 21:52:25 +00:00
|
|
|
{
|
2013-07-10 11:29:43 +00:00
|
|
|
points[0] = posX - (mSize.x() * mOrigin.x()); points[1] = posY - (mSize.y() * mOrigin.y());
|
|
|
|
points[2] = posX - (mSize.x() * mOrigin.x()); points[3] = posY + (mSize.y() * (1 - mOrigin.y()));
|
|
|
|
points[4] = posX + (mSize.x() * (1 - mOrigin.x())); points[5] = posY - (mSize.y() * mOrigin.y());
|
2012-08-29 18:53:53 +00:00
|
|
|
|
2013-07-10 11:29:43 +00:00
|
|
|
points[6] = posX + (mSize.x() * (1 - mOrigin.x())); points[7] = posY - (mSize.y() * mOrigin.y());
|
|
|
|
points[8] = posX - (mSize.x() * mOrigin.x()); points[9] = posY + (mSize.y() * (1 - mOrigin.y()));
|
|
|
|
points[10] = posX + (mSize.x() * (1 -mOrigin.x())); points[11] = posY + (mSize.y() * (1 - mOrigin.y()));
|
2012-08-29 18:53:53 +00:00
|
|
|
|
|
|
|
|
2012-09-07 21:44:07 +00:00
|
|
|
|
2012-10-10 15:26:14 +00:00
|
|
|
texs[0] = 0; texs[1] = py;
|
2012-10-10 15:21:03 +00:00
|
|
|
texs[2] = 0; texs[3] = 0;
|
2012-10-10 15:26:14 +00:00
|
|
|
texs[4] = px; texs[5] = py;
|
2012-08-29 18:53:53 +00:00
|
|
|
|
2012-10-10 15:26:14 +00:00
|
|
|
texs[6] = px; texs[7] = py;
|
2012-10-10 15:21:03 +00:00
|
|
|
texs[8] = 0; texs[9] = 0;
|
2012-10-10 15:26:14 +00:00
|
|
|
texs[10] = px; texs[11] = 0;
|
2012-10-07 22:25:51 +00:00
|
|
|
|
|
|
|
if(mFlipX)
|
|
|
|
{
|
|
|
|
for(int i = 0; i < 11; i += 2)
|
2012-10-10 15:26:14 +00:00
|
|
|
if(texs[i] == px)
|
2012-10-10 15:21:03 +00:00
|
|
|
texs[i] = 0;
|
|
|
|
else
|
2012-10-10 15:26:14 +00:00
|
|
|
texs[i] = px;
|
2012-10-07 22:25:51 +00:00
|
|
|
}
|
|
|
|
if(mFlipY)
|
|
|
|
{
|
|
|
|
for(int i = 1; i < 12; i += 2)
|
2012-10-10 15:26:14 +00:00
|
|
|
if(texs[i] == py)
|
2012-10-10 15:21:03 +00:00
|
|
|
texs[i] = 0;
|
|
|
|
else
|
2012-10-10 15:26:14 +00:00
|
|
|
texs[i] = py;
|
2012-10-07 22:25:51 +00:00
|
|
|
}
|
2012-09-07 21:44:07 +00:00
|
|
|
}
|
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
void ImageComponent::drawImageArray(GLfloat* points, GLfloat* texs, GLubyte* colors, unsigned int numArrays)
|
2012-09-07 21:44:07 +00:00
|
|
|
{
|
2013-06-21 16:49:29 +00:00
|
|
|
mTexture->bind();
|
|
|
|
|
2012-09-07 21:44:07 +00:00
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
2012-08-29 18:53:53 +00:00
|
|
|
|
2012-08-29 21:52:25 +00:00
|
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
2012-08-29 18:53:53 +00:00
|
|
|
|
2012-10-17 17:15:58 +00:00
|
|
|
if(colors != NULL)
|
|
|
|
{
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
|
|
|
|
}
|
|
|
|
|
2012-08-29 21:52:25 +00:00
|
|
|
glVertexPointer(2, GL_FLOAT, 0, points);
|
|
|
|
glTexCoordPointer(2, GL_FLOAT, 0, texs);
|
2012-08-29 18:53:53 +00:00
|
|
|
|
2012-09-07 21:44:07 +00:00
|
|
|
glDrawArrays(GL_TRIANGLES, 0, numArrays);
|
2012-08-29 18:53:53 +00:00
|
|
|
|
2012-08-29 21:52:25 +00:00
|
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
2012-08-29 18:53:53 +00:00
|
|
|
|
2012-10-17 17:15:58 +00:00
|
|
|
if(colors != NULL)
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
2012-08-29 21:52:25 +00:00
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisable(GL_BLEND);
|
2012-08-02 01:43:55 +00:00
|
|
|
}
|
2012-09-04 16:45:16 +00:00
|
|
|
|
2013-06-02 15:08:32 +00:00
|
|
|
bool ImageComponent::hasImage()
|
2012-10-10 13:51:48 +00:00
|
|
|
{
|
|
|
|
return !mPath.empty();
|
|
|
|
}
|
2013-04-08 16:52:40 +00:00
|
|
|
|
2013-06-16 21:23:04 +00:00
|
|
|
void ImageComponent::copyScreen()
|
|
|
|
{
|
2013-06-21 16:49:29 +00:00
|
|
|
mTexture.reset();
|
2013-06-16 21:23:04 +00:00
|
|
|
|
2013-10-04 23:09:54 +00:00
|
|
|
mTexture = TextureResource::get("");
|
2013-06-21 16:49:29 +00:00
|
|
|
mTexture->initFromScreen();
|
2013-06-16 21:23:04 +00:00
|
|
|
|
|
|
|
resize();
|
|
|
|
}
|