#include "IMGTexture.h" namespace IMG { Texture::Texture(): references(0) // initialize references to 0 { mTexture = 0; mWidth = 0; mHeight = 0; mMaterial = 0; mCalculatedAvgColour = false; mRectangle2D = new Ogre::Rectangle2D(true); mRectangle2D->setBoundingBox(Ogre::AxisAlignedBox(-100000.0 * Ogre::Vector3::UNIT_SCALE, 100000.0 * Ogre::Vector3::UNIT_SCALE)); mRectangle2D->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); } Texture::~Texture() { // Gametools -- BUG: 06/04/2006 //if (mRectangle2D) //{ // delete mRectangle2D; //} //if (mMaterial) //{ // delete mMaterial; //} } void Texture::debug() { unsigned char* pBufferBox = new unsigned char[mTexture->getBuffer(0, 0)->getSizeInBytes()]; // Read pixels Ogre::PixelBox pBox(mWidth, mHeight, 1, mPixelFormat, pBufferBox); mTexture->getBuffer(0, 0)->blitToMemory(pBox); if (mPixelFormat == Ogre::PF_FLOAT32_RGBA) { imdebug("rgba w=%d h=%d %p b=32f",pBox.getWidth(), pBox.getHeight(), pBox.data); } if (mPixelFormat == Ogre::PF_A8R8G8B8) { //unsigned char* pBufferDest = new unsigned char[pBox.getWidth()*pBox.getHeight()*4]; unsigned char* pBufferDest = new unsigned char[pBox.getWidth()*pBox.getHeight()*4]; Ogre::PixelBox pDest(mWidth, mHeight, 1, Ogre::PF_BYTE_RGBA, pBufferDest); Ogre::PixelUtil::bulkPixelConversion(pBox.data, mPixelFormat, pDest.data, Ogre::PF_BYTE_RGBA, pBox.getWidth()*pBox.getHeight()); imdebug("rgba w=%d h=%d %p ", pDest.getWidth(), pDest.getHeight(), pDest.data); delete [] pBufferDest; } delete [] pBufferBox; } void Texture::setRenderTargetListener(Ogre::RenderTargetListener *renderTargetListener) { mTexture->getBuffer(0, 0)->getRenderTarget()->addListener(renderTargetListener); } Ogre::Rectangle2D* Texture::getRectangle2D() { return mRectangle2D; } void Texture::setCorners(Ogre::Real left, Ogre::Real top, Ogre::Real right, Ogre::Real bottom) { mRectangle2D->setCorners(left, top, right, bottom); } void Texture::bind(Ogre::String textureName) { if (!Ogre::TextureManager::getSingleton().getByName(textureName).isNull()) { mTexture = (Ogre::Texture*) Ogre::TextureManager::getSingleton().getByName(textureName).getPointer(); mWidth = mTexture->getSrcWidth(); mHeight = mTexture->getSrcHeight(); } else { Ogre::TexturePtr tPtr = Ogre::TextureManager::getSingleton().load(textureName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); mTexture = (Ogre::Texture*) tPtr.getPointer(); mWidth = mTexture->getSrcWidth(); mHeight = mTexture->getSrcHeight(); } } void Texture::setBackgroundColour(Ogre::ColourValue colour) { mBackgroundColour = colour; } Ogre::ColourValue Texture::getBackgroundColour() { return mBackgroundColour; } Ogre::ColourValue Texture::getAvgColour() { if (mCalculatedAvgColour) { return mAvgColour; } else { calculateAvgColour(); return mAvgColour; } } void Texture::calculateAvgColour() { unsigned int cR = 0; unsigned int cG = 0; unsigned int cB = 0; unsigned int cA = 0; Ogre::Image img; img.load(mTexture->getName(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); unsigned char* data = static_cast(img.getData()); unsigned int nColorpixels = 1; for (unsigned int i = 0; i < mTexture->getWidth() * mTexture->getHeight() * 4; i=i+4) { cA = (unsigned short int)data[i+3]; if (cA != 0) { cB = cB + data[i+2]; cG = cG + data[i+1]; cR = cR + data[i]; nColorpixels++; //Ogre::LogManager::getSingleton().logMessage("(" + Ogre::StringConverter::toString(data[i]) + "," + Ogre::StringConverter::toString(data[i+1]) + "," + Ogre::StringConverter::toString(data[i+2]) + "," + Ogre::StringConverter::toString(data[i+3]) + ")"); } } cR = cR / nColorpixels; cG = cG / nColorpixels; cB = cB / nColorpixels; mAvgColour = Ogre::ColourValue(cR/255.0, cG/255.0, cB/255.0, 0.0); mCalculatedAvgColour = true; } void Texture::load(Ogre::String folderName, Ogre::String fileName) { Ogre::TextureManager::getSingleton().load(fileName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); mTexture = (Ogre::Texture*)Ogre::TextureManager::getSingleton().getByName(fileName).getPointer(); mWidth = mTexture->getSrcWidth(); mHeight = mTexture->getSrcHeight(); } void Texture::save(Ogre::String folderName, Ogre::String filename) { Ogre::HardwarePixelBufferSharedPtr readbuffer; readbuffer = mTexture->getBuffer(0, 0); unsigned char *tex = new unsigned char[readbuffer->getSizeInBytes()]; Ogre::PixelBox *pBox = new Ogre::PixelBox(mTexture->getWidth(), mTexture->getHeight(), mTexture->getDepth(), mTexture->getFormat(), tex); readbuffer->blitToMemory((*pBox)); Ogre::Image img; img = img.loadDynamicImage(tex, mTexture->getWidth(), mTexture->getHeight(), mTexture->getDepth(), mTexture->getFormat(), true, 1, 0); img.resize(mWidth, mHeight); img.save(folderName + filename); delete pBox; } void Texture::update() { mTexture->getBuffer(0, 0)->getRenderTarget()->update(); } void Texture::setWidth(unsigned int width) { mWidth = width; } unsigned int Texture::getWidth() { return mWidth; } void Texture::setHeight(unsigned int height) { mHeight = height; } unsigned int Texture::getHeight() { return mHeight; } void Texture::setTextureName(Ogre::String textureName) { mTextureName = textureName; } Ogre::String Texture::getTextureName() { return mTextureName; } void Texture::setMaterial(Ogre::Material *material) { mMaterial = material; mRectangle2D->setMaterial(mMaterial->getName()); } Ogre::Material* Texture::getMaterial() { return mMaterial; } void Texture::create(Ogre::String fileName, unsigned int width, unsigned int height, Ogre::PixelFormat pixelFormat, Ogre::Camera *camera, Ogre::ColourValue backgroundColour) { mCamera = camera; mWidth = width; mHeight = height; mPixelFormat = pixelFormat; mTexture = Ogre::TextureManager::getSingleton().createManual(fileName, "General", Ogre::TEX_TYPE_2D, mWidth, mHeight, 0, mPixelFormat, Ogre::TU_RENDERTARGET).getPointer(); mTexture->getBuffer(0, 0)->getRenderTarget(); Ogre::RenderTexture *rt = mTexture->getBuffer()->getRenderTarget(); rt->setAutoUpdated(false); Ogre::Viewport *v = rt->addViewport(mCamera); v->setClearEveryFrame(true); v->setBackgroundColour(backgroundColour); v->setOverlaysEnabled(false); v->setDimensions(0,0,1.0,1.0); Ogre::Root::getSingleton().getRenderSystem()->clearFrameBuffer(Ogre::FBT_COLOUR, Ogre::ColourValue(1.0f,1.0f,1.0f,0.0f) ); } void Texture::setCamera(Ogre::Camera *camera) { mCamera = camera; } void Texture::setFormat(Ogre::PixelFormat pixelFormat) { mPixelFormat = pixelFormat; } }