martes, 21 de abril de 2015

Sombras en Irrlicht


Descargar Assets para este proyecto


#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 y cambiamos los valores a true para activar la sombra
 IrrlichtDevice *device = createDevice(EDT_DIRECT3D9, dimension2d<u32>(640, 480), 16, false,
  true, false, 0);

 //en caso de error
 if (!device)
  return 1;

 //Para ponerle un titulo a la ventana
 device->setWindowCaption(L"Sombras en irrlicht");

 //Creo un driver de video
 IVideoDriver *driver = device->getVideoDriver();

 //Creo un nodo para manejar la scena
 ISceneManager *sceneManager = device->getSceneManager();

 //Creo una mesh animada, este asset viene en la carpeta media de irrlicht
 IAnimatedMesh *mesh = sceneManager->getMesh("room.3ds");

 //Agrego una manipulador de mesh para el mapeo de texturas
 sceneManager->getMeshManipulator()->makePlanarTextureMapping(mesh->getMesh(0), 0.004f);

 //Creo un nodo de escena
 ISceneNode *node = 0;

 //Y le paso mi mesh
 node = sceneManager->addAnimatedMeshSceneNode(mesh);

 //Agrego una textura, este asset viene en la carpeta media de irrlicht
 node->setMaterialTexture(0, driver->getTexture("wall.jpg"));

 //Le asigno un color especular al material
 node->getMaterial(0).SpecularColor.set(0, 0, 0, 0);

 //Agrego el sombreado en la escena y sus propiedades

 //Agrego un modelado de un vikingo en la escena, estos assets vienen integrados en 
 //la carpeta media de irrlicht cuando se descargan
 IAnimatedMeshSceneNode *warrior = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("dwarf.x"));

 //propiedades
 //sombreado
 warrior->addShadowVolumeSceneNode();

 //posicion del personaje
 warrior->setPosition(vector3df(-90, 70, 30));

 //Velocidad de la animacion
 warrior->setAnimationSpeed(15);

 //Escala del personaje
 warrior->setScale(vector3df(2, 2, 2));

 //Agrego materiales
 warrior->setMaterialFlag(EMF_NORMALIZE_NORMALS, true);

 //Agrego la textura para mi personaje
 warrior->setMaterialTexture(0, driver->getTexture("dwarf.jpg"));

 //Establesco el color del sombreado de la escena
 sceneManager->setShadowColor(SColor(150, 0, 0, 0));

 //Creo una camara de tipo FPS(First Person Shooter) se maneja con las teclas de direccion del teclado
 //y el mouse Alt + f4 para salir
 ICameraSceneNode *fpsCamera = sceneManager->addCameraSceneNodeFPS(0, 80.f, 0.3f);

 //Agrego sus propiedades
 fpsCamera->setPosition(vector3df(0, 150, -250));
 fpsCamera->setTarget(vector3df(0, 0, 0));

 //Creo una luz ambiental
 sceneManager->setAmbientLight(SColor(255, 255, 80, 80));

 //Creo un luz y establesco su posicion
 ILightSceneNode *myLight = sceneManager->addLightSceneNode();
 myLight->setPosition(vector3df(0.0f, 20.0f, 0.0f));
 
 //Agrego algunas propiedades de luz, difusse color y specular color
 SLight lightData;
 lightData.DiffuseColor = SColor(255, 0, 255, 0);
 lightData.SpecularColor = SColor(255, 0, 0, 255);

 //Le agrego las propiedades a mi luz
 myLight->setLightData(lightData);

 //Gameloop
 while (device->run())
 {
   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