#include <IRR/irrlicht.h>
class Vision3D
{
private :
irr::video::ITexture* redView;
irr::video::ITexture* blueView;
irr::scene::ISceneManager* smgr;
irr::video::IVideoDriver* driver;
int espacement;
public :
Vision3D(irr::IrrlichtDevice *device, int paramEspacement = 5)
{
driver = device->getVideoDriver();
smgr = device->getSceneManager();
//on crée des nouvelles texture pour contenir le rendu
redView = driver->addRenderTargetTexture(driver->getScreenSize(), "red", driver->getColorFormat());
blueView = driver->addRenderTargetTexture(driver->getScreenSize(), "blue", driver->getColorFormat());
//par défault l'espacement entre les deux vue est de 5
espacement = paramEspacement;
}
void drawAll()
{
//on sauvegarde la position de la cam
irr::scene::ICameraSceneNode* camera = smgr->getActiveCamera();
irr::core::vector3df posCam = camera->getPosition();
//on déplace légerement la cam
camera->setPosition(posCam + irr::core::vector3df(espacement, 0, 0));
//on imprime le rendu dans la texture
driver->setRenderTarget(blueView, true, true, irr::video::SColor(0,0,255,0));
smgr->drawAll();
//on déplace légerement la cam
camera->setPosition(posCam - irr::core::vector3df(espacement, 0, 0));
//on imprime le rendu dans la texture
driver->setRenderTarget(redView, true, true, irr::video::SColor(0,0,255,0));
smgr->drawAll();
//on remet la position de la camera et le pointeur vers la texture de rendu par default
camera->setPosition(posCam);
driver->setRenderTarget(0, true, true, 0);
//on converti les texture en image et on crée une nouvelle image pour contenir le rendu en 3D
irr::video::IImage* imageView = driver->createImage(driver->getColorFormat(), driver->getScreenSize());
irr::video::IImage* imageRed = driver->createImage(redView, irr::core::position2d<irr::s32>(0,0), driver->getScreenSize());
irr::video::IImage* imageBlue = driver->createImage(blueView, irr::core::position2d<irr::s32>(0,0), driver->getScreenSize());
//on applique le filtre de couleur
for(int x = 0; x < imageView->getDimension().Width; x++)
{
for(int y = 0; y < imageView->getDimension().Height; y++)
{
imageView->setPixel(x, y, irr::video::SColor(255, imageRed->getPixel(x, y).getAverage(), 0, imageBlue->getPixel(x, y).getAverage()));
}
}
driver->draw2DImage(driver->addTexture("__3D_view_texture__", imageView), irr::core::position2d<irr::s32>(0,0));
}
};
int main()
{
irr::IrrlichtDevice *device = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(640, 480), 16, false, false);
if (device == 0)
return 1;
irr::video::IVideoDriver* driver = device->getVideoDriver();
irr::scene::ISceneManager* smgr = device->getSceneManager();
device->getFileSystem()->addZipFileArchive("map-20kdm2.pk3");
irr::scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");
irr::scene::ISceneNode* node = 0;
Vision3D vision3D(device);
if (mesh)
node = smgr->addOctreeSceneNode(mesh->getMesh(0), 0, -1, 1024);
if (node)
node->setPosition(irr::core::vector3df(-1300,-144,-1249));
smgr->addCameraSceneNodeFPS();
device->getCursorControl()->setVisible(false);
int lastFPS = -1;
irr::video::ITexture* blueRed = driver->addRenderTargetTexture(driver->getScreenSize(), "red", driver->getColorFormat());
irr::video::ITexture* blueView = driver->addRenderTargetTexture(driver->getScreenSize(), "blue", driver->getColorFormat());
while(device->run())
{
driver->beginScene(true, true, 0);
vision3D.drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
irr::core::stringw str = L"Irrlicht Engine - 3D example [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
device->drop();
return 0;
}