109 lines
3.3 KiB
C++
109 lines
3.3 KiB
C++
// Copyright (C) 2008-2009 Christian Stehno, Colin MacDonald
|
|
// No rights reserved: this software is in the public domain.
|
|
|
|
#include "testUtils.h"
|
|
|
|
using namespace irr;
|
|
using namespace core;
|
|
using namespace scene;
|
|
using namespace video;
|
|
using namespace io;
|
|
using namespace gui;
|
|
|
|
//! Tests rendering RTTs with draw2DImage
|
|
/** This test is very special in its setup, problematic situation was found by stefbuet. */
|
|
static bool testWith2DImage(E_DRIVER_TYPE driverType)
|
|
{
|
|
IrrlichtDevice *device = createDevice (driverType, core::dimension2d < u32 > (128, 128));
|
|
if (!device)
|
|
return true; // No error if device does not exist
|
|
|
|
device->setWindowCaption (L"Irrlicht - RTT Bug report");
|
|
IVideoDriver *driver = device->getVideoDriver ();
|
|
ISceneManager *smgr = device->getSceneManager ();
|
|
|
|
ITexture *image = driver->getTexture ("../media/irrlichtlogo2.png");
|
|
ITexture *RTT_texture = driver->addRenderTargetTexture (core::dimension2d < u32 > (128, 128));
|
|
|
|
smgr->addCameraSceneNode (0, core::vector3df (100, 100, 100),
|
|
core::vector3df (0, 0, 0));
|
|
|
|
/*to reproduce the bug :
|
|
-draw the image : it's normal
|
|
-apply an RTT texture to a model
|
|
-remove the model
|
|
-draw the image again : it's flipped
|
|
*/
|
|
|
|
SColor colors[4]={0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff};
|
|
//draw the image :
|
|
driver->beginScene (true, true, video::SColor (255, 200, 200, 200));
|
|
driver->draw2DImage (image,
|
|
core::rect < s32 >
|
|
(64 - image->getSize ().Width / 2,
|
|
64 - image->getSize ().Height / 2,
|
|
64 + image->getSize ().Width / 2,
|
|
64 + image->getSize ().Height / 2),
|
|
core::rect < s32 > (0, 0, image->getSize ().Width,
|
|
image->getSize ().Height), 0, colors,
|
|
true);
|
|
driver->endScene ();
|
|
|
|
//then create a model and apply to it the RTT Texture
|
|
//rendering the model is important, if not rendered 1 time, bug won't appear.
|
|
//after the render, we remove the node : important, if not done, bug won't appear too.
|
|
IMesh *modelMesh = smgr->getMesh ("../media/earth.x");
|
|
ISceneNode *modelNode = smgr->addMeshSceneNode(modelMesh);
|
|
modelNode->setMaterialTexture (0, RTT_texture);
|
|
driver->beginScene (true, true, video::SColor (255, 200, 200, 200));
|
|
smgr->drawAll ();
|
|
driver->endScene ();
|
|
|
|
modelNode->remove ();
|
|
|
|
//then we render the image normaly
|
|
//it's now fliped...
|
|
for (u32 i=0; i<10; ++i)
|
|
{
|
|
driver->beginScene (true, true, video::SColor (255, 200, 200, 200));
|
|
|
|
//draw img
|
|
driver->draw2DImage (image,
|
|
core::rect < s32 >
|
|
(64 - image->getSize ().Width / 2,
|
|
64 - image->getSize ().Height / 2,
|
|
64 + image->getSize ().Width / 2,
|
|
64 + image->getSize ().Height / 2),
|
|
core::rect < s32 > (0, 0, image->getSize ().Width,
|
|
image->getSize ().Height), 0,
|
|
colors, true);
|
|
|
|
//call this is important :
|
|
//if not called, the bug won't appear
|
|
smgr->drawAll ();
|
|
|
|
driver->endScene ();
|
|
}
|
|
|
|
bool result = takeScreenshotAndCompareAgainstReference(driver, "-rttWith2DImage.png", 99.91f);
|
|
|
|
device->drop();
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
bool renderTargetTexture(void)
|
|
{
|
|
bool passed = true;
|
|
|
|
passed &= testWith2DImage(EDT_OPENGL);
|
|
passed &= testWith2DImage(EDT_SOFTWARE);
|
|
passed &= testWith2DImage(EDT_BURNINGSVIDEO);
|
|
passed &= testWith2DImage(EDT_DIRECT3D9);
|
|
passed &= testWith2DImage(EDT_DIRECT3D8);
|
|
|
|
return passed;
|
|
}
|
|
|