Bizarre, chez moi cela semble fonctionner sans soucis, avec ce petit code par exemple on voie
bien les changement de clipPlane...
#include <irrlicht.h>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
/*
librairies
*/
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#endif
/*
données globales
*/
bool _bExit = false;
IVideoDriver* driver;
ISceneNode* node1;
ISceneNode* node2;
ISceneNode* node3;
/*
surcharge de la classe IEventReceiver, pour la gestion
des entrés clavier dans notre cas.
*/
class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(const SEvent& event)
{
if (event.EventType == irr::EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown)
{
switch(event.KeyInput.Key)
{
case KEY_ESCAPE:
{
_bExit = true;
return true;
}
case KEY_KEY_S:
{
core::plane3df reflexion ( core::vector3df( 0 , 10 , 0 ) , core::vector3df ( 0 , 1 , 0 ) );
driver->setClipPlane( 1 , reflexion , false );
return true;
}
}
}
return false;
}
};
/*
procedure 'main', point d'entrée du programme commun à toute les
plateformes.
*/
int main()
{
static int oldTime;
// définition de notre classe dérivé, pour la gestion
// des entrées clavier
MyEventReceiver _EventReceiver;
// let user select driver type
video::E_DRIVER_TYPE driverType = EDT_DIRECT3D9;
IrrlichtDevice *device = createDevice( driverType,
dimension2d<s32>(800, 600),
32,
false,
false,
true,
&_EventReceiver);
/*
video driver, SceneManager et GUI.
*/
driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
ITimer *timer = device->getTimer();
/*
mes nodes
*/
node1 = smgr->addCubeSceneNode(15.0f);
node2 = smgr->addSphereSceneNode(7.0f);
node2->setPosition( vector3df(10,20,0));
node3 = smgr->addSphereSceneNode(7.0f);
node3->setPosition( vector3df(-10,10,0));
/*
textures et light=false
*/
if (node1)
{ node1->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
node1->setMaterialFlag ( video::EMF_LIGHTING , false ); }
if (node2)
{ node2->setMaterialTexture( 0, driver->getTexture("../../media/fire.bmp") );
node2->setMaterialFlag ( video::EMF_LIGHTING , false ); }
if (node3)
{ node3->setMaterialTexture( 0, driver->getTexture("../../media/fire.bmp") );
node3->setMaterialFlag ( video::EMF_LIGHTING , false ); }
/*
définition des touches de controle de notre futur camera.
*/
SKeyMap keyMap[4] =
{
{EKA_MOVE_FORWARD, KEY_UP},
{EKA_MOVE_BACKWARD, KEY_DOWN},
{EKA_STRAFE_LEFT, KEY_LEFT},
{EKA_STRAFE_RIGHT, KEY_RIGHT},
};
/*
nous définissons une camera, dans un mode FPS.
Nous la positionnons et ont définit la direction vers laquelle elle
va pointer.
*/
smgr->addCameraSceneNodeFPS( NULL , 100.0f, 310.0f, -1, keyMap, 4);
smgr->getActiveCamera()->setPosition(core::vector3df(0,20,-30));
smgr->getActiveCamera()->setTarget(core::vector3df(0,5,0) );
// Créer les plans de clipping
core::plane3df reflexion ( core::vector3df( 0 , 4 , 0 ) , core::vector3df ( 0 , 1 , 0 ) );
driver->setClipPlane( 1 , reflexion , false );
/*
maintenant que tout les éléments sont en place, place à la boucle
principale, pour dessiner tout cela.
Pour quiter, deux solutions, soit un petit coups de ALT+F4, ou
alors la touche ESC que nous avons définit dans notre boucle de
traitement des événements (impliquant le changement d'état de notre
flag _bExit).
*/
int lastFPS = -1;
while(device->run() & !_bExit)
{
/*
Tout ce qui doit être dessiné doit l'être entre les deux instructions
beginScene() and an endScene().
L'instruction 'beginScene' effece l'ecran avec la couleur de notre
choix.
*/
driver->beginScene(true, true, SColor(255,100,101,140));
driver->enableClipPlane ( 1 , true );
smgr->drawAll();
driver->endScene();
node1->setRotation( node1->getRotation() + vector3df(0,1.0f,0) );
// calcul du fps
int fps = driver->getFPS();
if (lastFPS != fps)
{
lastFPS = fps;
}
// affichage de quelques informations dans la barre de titre
// de la fenetre, avec timer pour éviter le scintillement.
int time = timer->getRealTime();
if((time - oldTime) >100 )
{
core::stringw str = L"Tuto 3 - Troisième essais";
str += " FPS:";
str += fps;
str += " ESC=sortir";
device->setWindowCaption(str.c_str());
oldTime = time;
}
}
/*
Une fois sortie, c'est la fin, avec la libération de toutes les
ressources créées par 'createDevice'.
*/
device->drop();
return 0;
}