#include <irrlicht.h>
//los namespace para definir funciones de irrlicht
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif
int main()
{
//define un device para la pantalla
IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d<u32>(640, 480), 16, false,
false, false, 0);
//en caso de error
if (!device)
return 1;
//Para ponerle un titulo a la ventana
device->setWindowCaption(L"Manejando Camara FPS en irrlicht");
//Creo un driver de video
IVideoDriver *driver = device->getVideoDriver();
//Creo un nodo para manejar la escena
ISceneManager *sceneManager = device->getSceneManager();
//Agrego un cubo a la escena
IMeshSceneNode *cube = sceneManager->addCubeSceneNode();
//En caso de error
if (!cube)
{
return 1;
}
//Si es correcto le agrego la textura y un material
if (cube)
{
cube->setMaterialFlag(EMF_LIGHTING, false);
cube->setMaterialTexture(0, driver->getTexture("wall.bmp"));
}
//Creo una camara FPS se maneja con el mouse y las flechas de direccion, alt f4 para salir
ICameraSceneNode *fpsCamera = sceneManager->addCameraSceneNodeFPS(0, 80.f, 0.3f);
//Establesco las propiedades
fpsCamera->setPosition(vector3df(0, 15, -25));
fpsCamera->setTarget(vector3df(0, 0, 0));
//Creo un pointLight y su posicion
ILightSceneNode *myPointLight = sceneManager->addLightSceneNode();
myPointLight->setPosition(vector3df(0.0f, 20.0f, 0.0f));
//Creo un nodo de animacion
ISceneNodeAnimator *animator = sceneManager->createFlyCircleAnimator(vector3df(0, 0, 0), 50.f, 0.005f);
//Le agrego la animacion a la pointLight
myPointLight->addAnimator(animator);
animator->drop();
//Agregamos un billboard para pasarle la pointlight a la escena
ISceneNode *pointLightBillboard = sceneManager->addBillboardSceneNode(myPointLight,
dimension2d<f32>(20, 20));
//Agrego algunas propiedades al billboard como material, tipo y textura
pointLightBillboard->setMaterialFlag(EMF_LIGHTING, false);
pointLightBillboard->setMaterialType(EMT_TRANSPARENT_ADD_COLOR);
pointLightBillboard->setMaterialTexture(0, driver->getTexture("portal1.bmp"));
//Agrego algunas propiedades de luz, difusse color y specular color
SLight pointLightData;
pointLightData.DiffuseColor = SColor(255, 0, 255, 0);
pointLightData.SpecularColor = SColor(255, 0, 0, 255);
//Le agrego las propiedades a mi pointLight
myPointLight->setLightData(pointLightData);
//Ahora agrego un spotLight a la escena y su posicion
ILightSceneNode *mySpotLight = sceneManager->addLightSceneNode();
mySpotLight->setPosition(vector3df(0.0f, 10.0f, 0.0f));
//Agrego propiedades de spotLight
SLight spotLightData;
spotLightData.Type = ELT_SPOT;
spotLightData.DiffuseColor = SColor(255, 255, 0, 0);
spotLightData.OuterCone = 100;
spotLightData.InnerCone = 10;
//Le paso las propiedades a mi spotLight
mySpotLight->setLightData(spotLightData);
//Agrego una rotacion a mi cubo
vector3df cubeRotation = vector3df(0.0f, 0.0f, 0.0f);
//Gameloop
while (device->run())
{
//Aplico la rotacion y que se incremente
cube->setRotation( cubeRotation );
cubeRotation += 0.2f;
//Pasando cierto limite en la rotacion en x se reinician los valores
if (cubeRotation.X >= 360.0f)
{
cubeRotation.X = 0.0f;
cubeRotation.Y = 0.0f;
cubeRotation.Z = 0.0f;
}
//Le paso mi rotacion a mi spotLight
mySpotLight->setRotation(cubeRotation);
driver->beginScene(true, true, SColor(255, 100, 101, 140));
//Dibujo todo del sceneManager
sceneManager->drawAll();
driver->endScene();
}
//cerrar device
device->drop();
return 0;
}
No hay comentarios:
Publicar un comentario