image rotating function
parent
62908c9ef5
commit
944654f263
@ -0,0 +1,74 @@
|
||||
#include "imagerotate.hpp"
|
||||
|
||||
#include <OgreRoot.h>
|
||||
#include <OgreSceneManager.h>
|
||||
#include <OgreImage.h>
|
||||
#include <OgreTexture.h>
|
||||
#include <OgreRenderTarget.h>
|
||||
#include <OgreCamera.h>
|
||||
#include <OgreTextureUnitState.h>
|
||||
#include <OgreHardwarePixelBuffer.h>
|
||||
|
||||
using namespace Ogre;
|
||||
using namespace OEngine::Render;
|
||||
|
||||
void ImageRotate::rotate(const std::string& sourceImage, const std::string& destImage, const float angle)
|
||||
{
|
||||
Root* root = Ogre::Root::getSingletonPtr();
|
||||
|
||||
SceneManager* sceneMgr = root->createSceneManager(ST_GENERIC);
|
||||
Camera* camera = sceneMgr->createCamera("ImageRotateCamera");
|
||||
|
||||
MaterialPtr material = MaterialManager::getSingleton().create("ImageRotateMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
|
||||
material->getTechnique(0)->getPass(0)->setLightingEnabled(false);
|
||||
material->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false);
|
||||
TextureUnitState* tus = material->getTechnique(0)->getPass(0)->createTextureUnitState(sourceImage);
|
||||
Degree deg(angle);
|
||||
tus->setTextureRotate(Radian(deg.valueRadians()));
|
||||
tus->setTextureAddressingMode(TextureUnitState::TAM_BORDER);
|
||||
tus->setTextureBorderColour(ColourValue(0, 0, 0, 0));
|
||||
|
||||
Rectangle2D* rect = new Rectangle2D(true);
|
||||
rect->setCorners(-1.0, 1.0, 1.0, -1.0);
|
||||
rect->setMaterial("ImageRotateMaterial");
|
||||
// Render the background before everything else
|
||||
rect->setRenderQueueGroup(RENDER_QUEUE_BACKGROUND);
|
||||
|
||||
// Use infinite AAB to always stay visible
|
||||
AxisAlignedBox aabInf;
|
||||
aabInf.setInfinite();
|
||||
rect->setBoundingBox(aabInf);
|
||||
|
||||
// Attach background to the scene
|
||||
SceneNode* node = sceneMgr->getRootSceneNode()->createChildSceneNode();
|
||||
node->attachObject(rect);
|
||||
|
||||
// retrieve image width and height
|
||||
TexturePtr sourceTexture = TextureManager::getSingleton().getByName(sourceImage);
|
||||
unsigned int width = sourceTexture->getWidth();
|
||||
unsigned int height = sourceTexture->getHeight();
|
||||
|
||||
TexturePtr destTexture = TextureManager::getSingleton().createManual(
|
||||
"ImageRotateDestTexture",
|
||||
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
|
||||
TEX_TYPE_2D,
|
||||
width, height,
|
||||
0,
|
||||
PF_R8G8B8,
|
||||
TU_RENDERTARGET);
|
||||
|
||||
RenderTarget* rtt = destTexture->getBuffer()->getRenderTarget();
|
||||
rtt->setAutoUpdated(false);
|
||||
Viewport* vp = rtt->addViewport(camera);
|
||||
vp->setOverlaysEnabled(false);
|
||||
vp->setShadowsEnabled(false);
|
||||
|
||||
rtt->update();
|
||||
rtt->writeContentsToFile(destImage);
|
||||
|
||||
// remove all the junk we've created
|
||||
TextureManager::getSingleton().remove("ImageRotateDestTexture");
|
||||
MaterialManager::getSingleton().remove("ImageRotateMaterial");
|
||||
root->destroySceneManager(sceneMgr);
|
||||
delete rect;
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
#ifndef OENGINE_OGRE_IMAGEROTATE_HPP
|
||||
#define OENGINE_OGRE_IMAGEROTATE_HPP
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace OEngine
|
||||
{
|
||||
namespace Render
|
||||
{
|
||||
|
||||
/// Rotate an image by certain degrees and save as file, uses the GPU
|
||||
/// Make sure Ogre Root is initialised before calling
|
||||
class ImageRotate
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @param source image (file name - has to exist in an resource group)
|
||||
* @param destination image (absolute file path)
|
||||
* @param angle in degrees to turn
|
||||
*/
|
||||
static void rotate(const std::string& sourceImage, const std::string& destImage, const float angle);
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue