Il y a quelque chose qui me chagrinne pas mal en ce moment. Dans l'optique d'un prochain projet, je commence
à coder quelques fonctions bien utiles dont je disposais sous DM3D.
Cherchant à faire une fonction de test de visibilité toute bête d'un mesh, j'ai donc employé les fonctions
natives d'Irrlicht, mais là, je suis un peu bloqué car cela ne fonctionne pas vraiment, tout du moins comme
je l'attendais...

Le résultat est toujours
TRUE, même quand on sort de la zone visible. Il faut vraiment presque être
derriere la camera pour enfin passer à FALSE.
Bug ou mauvaise utilisation des fonctions d'Irrlicht ?
Voici mon code de test:
#include <irrlicht.h>
#include <iostream>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#endif
// données globales
bool _bExit = false;
int main()
{
// choix driver
video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;
printf("Please select the driver you want for this example:\
"\\
" (a) Direct3D 9.0c\
(b) Direct3D 8.1\
(c) OpenGL 1.5\
"\\
" (d) Software Renderer\
(e) Burning's Software Renderer\
"\\
" (f) NullDevice\
(otherKey) exit\
\
");
char i;
std::cin >> i;
switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 0;
}
IrrlichtDevice *device = createDevice( driverType,
dimension2d<s32>(640, 480),
32,
false,
false,
true,
NULL);
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* scenegraph = device->getSceneManager();
// cube 1
ISceneNode* cube1 = scenegraph->addCubeSceneNode(2.0f, scenegraph->getRootSceneNode());
//cube1->setPosition( vector3df(10,0,0) );
// définition camera.
SKeyMap keyMap[4] =
{
{EKA_MOVE_FORWARD, KEY_UP},
{EKA_MOVE_BACKWARD, KEY_DOWN},
{EKA_STRAFE_LEFT, KEY_LEFT},
{EKA_STRAFE_RIGHT, KEY_RIGHT},
};
ICameraSceneNode* cam = scenegraph->addCameraSceneNodeFPS( scenegraph->getRootSceneNode() , 100.0f, 50.0f, -1, keyMap, 4);
cam->setPosition(core::vector3df(0,1,-10));
// boucle principale
int lastFPS = -1;
while(device->run() & !_bExit)
{
driver->beginScene(true, true, SColor(255,100,101,140));
scenegraph->drawAll();
driver->endScene();
//============================
// frustum test
//============================
const scene::SViewFrustum* frustum = cam->getViewFrustum();
bool FrustumCode = frustum->getBoundingBox().intersectsWithBox(cube1->getBoundingBox());
// info des information temps réél
int fps = driver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"Test visibilité: ";
str += FrustumCode;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
device->drop();
return 0;
}