#include <irrlicht.h>
#include <SPK.h>
#include <SPK_IRR.h>
using namespace std;
using namespace irr;
using namespace SPK;
using namespace SPK::IRR;
float angleY = 10.0f;
float angleX = -45.0f;
float camPosZ = 5.0f;
int deltaTime = 0;
const float PI = 3.14159265358979323846f;
const string STR_NB_PARTICLES = "NB PARTICLES : ";
const string STR_FPS = "FPS : ";
string strNbParticles = STR_NB_PARTICLES;
string strFps = STR_FPS;
System* particleSystem = NULL;
IrrlichtDevice* device = NULL;
scene::ICameraSceneNode* cam = NULL;
bool smokeEnabled = true;
class MyEventReceiver : public IEventReceiver
{
public:
MyEventReceiver() :
IEventReceiver(),
init(false)
{}
virtual bool OnEvent(const SEvent& event)
{
if(event.EventType==EET_KEY_INPUT_EVENT)
{
if(event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown==false)
{
device->closeDevice();
}
}
else if(event.EventType == EET_MOUSE_INPUT_EVENT)
{
if (init)
{
angleX += (oldMouseX - event.MouseInput.X)*0.1f;
angleY += (oldMouseY - event.MouseInput.Y)*0.1f;
if(angleY < 1.0f) angleY=1.0f;
if(angleY > 70.0f) angleY=70.0f;
camPosZ -= event.MouseInput.Wheel;
if(camPosZ < 3.0f) camPosZ=3.0f;
if(camPosZ > 18.0f) camPosZ=18.0f;
cam->setPosition(core::vector3df(camPosZ*sinf(angleX*core::DEGTORAD)*sinf((90.0f-angleY)*core::DEGTORAD),
camPosZ*cosf((90.0f-angleY)*core::DEGTORAD),camPosZ*cosf(angleX*core::DEGTORAD)*sinf((90.0f-angleY)*core::DEGTORAD)));
cam->setTarget(core::vector3df(0.f, 0.f, 0.f));
}
init = true;
oldMouseX=event.MouseInput.X;
oldMouseY=event.MouseInput.Y;
return true;
}
return false;
}
int oldMouseX,oldMouseY;
private :
bool init;
};
int main(int argc, char *argv[])
{
// IRRLICH ///////////////////////////////////////
video::E_DRIVER_TYPE chosenDriver = video::EDT_OPENGL;
MyEventReceiver* evtrcv = new MyEventReceiver;
device = createDevice(chosenDriver,
core::dimension2d<u32>(640,480),
32,
false,
false,
false,
evtrcv);
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment* guienv = device->getGUIEnvironment();
device->setWindowCaption(L"SPARK Fire Demo using Irrlicht");
device->getCursorControl()->setVisible(false);
cam = smgr->addCameraSceneNode(0,core::vector3df(camPosZ*sinf(angleX*core::DEGTORAD)*sinf((90.0f-angleY)*core::DEGTORAD),
camPosZ*cosf((90.0f-angleY)*core::DEGTORAD),camPosZ*cosf(angleX*core::DEGTORAD)*sinf((90.0f-angleY)*core::DEGTORAD)),
core::vector3df());
cam->setNearValue(0.05f);
scene::IMesh* sceneryMesh = smgr->getMesh("res/SceneFireCamp.obj");
scene::ISceneNode* sceneryNode = smgr->addMeshSceneNode(sceneryMesh);
sceneryNode->setPosition(core::vector3df(0.0f,-1.5f,0.0f));
sceneryNode->setScale(core::vector3df(0.01f,0.01f,0.01f));
smgr->setAmbientLight(video::SColorf(0.15f,0.15f,0.25f));
scene::ILightSceneNode* lightNode = smgr->addLightSceneNode();
lightNode->setLightType(video::ELT_SPOT);
video::SLight& lightData = lightNode->getLightData();
lightData.AmbientColor = video::SColorf(0.0f,0.0f,0.0f);
lightData.DiffuseColor = video::SColorf(1.0f,0.75f,0.25f);
lightData.InnerCone = 180.0f;
lightData.OuterCone = 180.0f;
lightData.Attenuation.X = 0.f;
lightData.Attenuation.Y = 0.0f;
lightData.Attenuation.Z = 20.f;
randomSeed = device->getTimer()->getRealTime();
System::setClampStep(true, 0.1f);
System::useAdaptiveStep(0.001f, 0.01f);
// smoke renderer
IRRQuadRenderer* smokeRenderer = IRRQuadRenderer::create(device);
smokeRenderer->setTexturingMode(TEXTURE_2D);
smokeRenderer->setTexture(driver->getTexture("res\\explosion.png"));
smokeRenderer->setAtlasDimensions(2,2); // uses 4 different patterns in the texture
smokeRenderer->setBlending(BLENDING_ALPHA);
smokeRenderer->enableRenderingHint(DEPTH_WRITE,false);
smokeRenderer->setShared(true);
////////////
// Models //
////////////
Interpolator* interpolator = NULL;
// smoke model
Model* smokeModel = Model::create(FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA | FLAG_SIZE | FLAG_ANGLE | FLAG_TEXTURE_INDEX,
FLAG_SIZE | FLAG_ANGLE,
FLAG_SIZE | FLAG_ANGLE | FLAG_TEXTURE_INDEX,
FLAG_ALPHA);
smokeModel->setParam(PARAM_RED,0.2f);
smokeModel->setParam(PARAM_GREEN,0.2f);
smokeModel->setParam(PARAM_BLUE,0.2f);
smokeModel->setParam(PARAM_SIZE,0.6f,0.8f,1.0f,1.4f);
smokeModel->setParam(PARAM_TEXTURE_INDEX,0.0f,4.0f);
smokeModel->setParam(PARAM_ANGLE,0.0f,PI * 0.5f,0.0f,PI * 0.5f);
smokeModel->setLifeTime(0.5f, 1.f);
smokeModel->setShared(true);
interpolator = smokeModel->getInterpolator(PARAM_ALPHA);
interpolator->addEntry(0.0f,0.0f);
interpolator->addEntry(0.4f,0.4f,0.6f);
interpolator->addEntry(0.6f,0.4f,0.6f);
interpolator->addEntry(1.0f,0.0f);
//////////////
// Emitters //
//////////////
// smoke emitter
RandomEmitter* smokeEmitter = RandomEmitter::create();
smokeEmitter->setZone(AABox::create(Vector3D(0.0f,0.0f,0.0f), Vector3D(2.f, 2.f, 0.2f)));
smokeEmitter->setFlow(350);
smokeEmitter->setForce(0.01f,0.02f);
////////////
// Groups //
////////////
// smoke group
Group* smokeGroup = Group::create(smokeModel, 350);
smokeGroup->addEmitter(smokeEmitter);
smokeGroup->setRenderer(smokeRenderer);
smokeGroup->setGravity(Vector3D(0.0f,0.05f,0.0f));
//////////////////////////////////////////////////////////////////////////////////////////////// HERE
///
//smokeGroup->setTransformOrientationLH(Vector3D(0.f, 1.f, 0.f), Vector3D(0.f, 0.f, 1.f));
//smokeGroup->setTransformOrientationLH(Vector3D(1.f, 0.f, 0.f), Vector3D(0.f, 1.f, 0.f));
//smokeGroup->setTransformOrientationLH(Vector3D(0.f, 0.f, 1.f), Vector3D(1.f, 0.f, 0.f));
smokeGroup->setTransformOrientation(Vector3D(1.f, 0.f, 0.f), 1.5f);
////////////////////////////////////////////////////////////////////////////////////////////////
particleSystem = IRRSystem::create(smgr->getRootSceneNode(),smgr);
particleSystem->addGroup(smokeGroup);
while(device->run())
{
driver->beginScene(true, true, video::SColor(0,0,0,0));
smgr->drawAll();
driver->endScene();
// clip mouse
if(device->getCursorControl()->getPosition().X < 20)
{
device->getCursorControl()->setPosition(620,device->getCursorControl()->getPosition().Y);
evtrcv->oldMouseX = 620;
}
if(device->getCursorControl()->getPosition().X > 620)
{
device->getCursorControl()->setPosition(20,device->getCursorControl()->getPosition().Y);
evtrcv->oldMouseX = 20;
}
if(device->getCursorControl()->getPosition().Y < 20)
{
device->getCursorControl()->setPosition(device->getCursorControl()->getPosition().X,460);
evtrcv->oldMouseY = 460;
}
if(device->getCursorControl()->getPosition().Y > 460)
{
device->getCursorControl()->setPosition(device->getCursorControl()->getPosition().X,20);
evtrcv->oldMouseY = 20;
}
}
SPKFactory::getInstance().destroyAll();
device->drop();
}