#include <irrlicht.h>
#include <iostream>
using namespace irr;
using namespace irr::core;
using namespace irr::video;
void set_color(array<ITexture*> skybox, array<ITexture*> rendered, vector3df RedCoef, vector3df GreenCoef, vector3df BlueCoef, float colorCoeff)
{
for(unsigned i = 0; i<skybox.size(); ++i)
{
irr::video::SColor color;
unsigned char *src = (unsigned char*) skybox[i]->lock(ETLM_READ_ONLY);
unsigned char *dst = (unsigned char*) rendered[i]->lock(ETLM_WRITE_ONLY);
u32 pitch = skybox[i]->getPitch();
u32 bytes = video::IImage::getBitsPerPixelFromFormat(skybox[i]->getColorFormat()) / 8;
for(unsigned x = 0; x<skybox[i]->getSize().Width; ++x)
{
for(unsigned y = 0; y<skybox[i]->getSize().Height; ++y)
{
unsigned char *in = src + (y * pitch) + (x * bytes);
unsigned char *out = dst + (y * pitch) + (x * bytes);
color.setData(in, skybox[i]->getColorFormat());
float r = color.getRed() / 255.f;
float g = color.getGreen() / 255.f;
float b = color.getBlue() / 255.f;
float rsepia = r * RedCoef.X + g * RedCoef.Y + b * RedCoef.Z;
float gsepia = r * GreenCoef.X + g * GreenCoef.Y + b * GreenCoef.Z;
float bsepia = r * BlueCoef.X + g * BlueCoef.Y + b * BlueCoef.Z;
r = colorCoeff*r + (1.0-colorCoeff)*rsepia;
g = colorCoeff*g + (1.0-colorCoeff)*gsepia;
b = colorCoeff*g + (1.0-colorCoeff)*bsepia;
color.setRed(std::min(r * 225.f, 255.f));
color.setGreen(std::min(g * 225.f, 255.f));
color.setBlue(std::min(b * 225.f, 255.f));
color.getData(out, skybox[i]->getColorFormat());
}
}
rendered[i]->unlock();
skybox[i]->unlock();
}
}
int main()
{
IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<u32>(640, 480));
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment* gui = device->getGUIEnvironment();
driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);
array<ITexture*> skybox;
array<ITexture*> rendered;
skybox.push_back(driver->getTexture("../../media/irrlicht2_up.bmp"));
skybox.push_back(driver->getTexture("../../media/irrlicht2_dn.bmp"));
skybox.push_back(driver->getTexture("../../media/irrlicht2_lf.bmp"));
skybox.push_back(driver->getTexture("../../media/irrlicht2_rt.bmp"));
skybox.push_back(driver->getTexture("../../media/irrlicht2_ft.bmp"));
skybox.push_back(driver->getTexture("../../media/irrlicht2_bk.bmp"));
for(int i = 0; i<skybox.size(); ++i)
{
irr::core::stringc name = "skybox_";
name += i;
rendered.push_back(driver->addTexture(skybox[i]-> getSize(), name.c_str(), skybox[i]-> getColorFormat()));
}
smgr->addSkyBoxSceneNode(
rendered[0], rendered[1],
rendered[2], rendered[3],
rendered[4], rendered[5]
);
driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);
scene::ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS();
cam->setPosition(core::vector3df(-100,50,100));
cam->setTarget(core::vector3df(0,0,0));
device->getCursorControl()->setVisible(false);
irr::u32 time = device->getTimer()->getTime() / 1000;
while(device->run())
{
driver->beginScene(true, true, video::SColor(255,0,0,0));
smgr->drawAll();
set_color(
skybox, rendered,
vector3df(0.393, 0.769, 0.189),
vector3df(0.349, 0.686, 0.168),
vector3df(0.272, 0.534, 0.131),
sin(device->getTimer()->getTime() / 1000.0)
);
driver->endScene();
}
device->drop();
return 0;
}