[Irrlicht][MFC] intégration boîte de dialogue
Bonjour,
Je découvre irrlicht et voudrais tester quelques applications avec ce moteur. Je cherche à intégrer une zone d'affichage 3D dans une application MFC basée sur les boîtes de dialogue (sous vc8). Problème, en adaptant l'exemple 14.Win32Window_vc8 pour mon application, je réussi à obtenir l'affichage de la zone en 3D, mais l'animation exemple (rotation de la caméra) ne fonctionne pas :cry:
Voici le code :
header de la classe Zone3D:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
class CZone3D : public CWnd
{
DECLARE_DYNAMIC(CZone3D)
public:
CZone3D();
virtual ~CZone3D();
public:
IrrlichtDevice* device;
video::IVideoDriver* driver;
scene::ISceneManager* smgr;
scene::ICameraSceneNode* cam;
scene::ISceneNode* cube;
SIrrlichtCreationParameters param;
scene::ISceneNodeAnimator* anim;
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg void OnPaint();
afx_msg void OnDestroy();
afx_msg void OnTimer(UINT_PTR nIDEvent);
}; |
.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
int CZone3D::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Ajoutez ici votre code de création spécialisé
param.WindowId = reinterpret_cast<void*>(GetSafeHwnd());
param.DriverType = irr::video::EDT_DIRECT3D9;
device = irr::createDeviceEx(param);
driver=device->getVideoDriver();
smgr=device->getSceneManager();
//create a camera and set its target
cam = smgr->addCameraSceneNode();
cam->setTarget(core::vector3df(0,0,0));
//animation
scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(core::vector3df(0,15,0), 30.0f);
cam->addAnimator(anim);
anim->drop();
cube = smgr->addCubeSceneNode(10);
//textures
cube->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
cube->setMaterialTexture(1, driver->getTexture("../../media/water.jpg"));
cube->setMaterialFlag( video::EMF_LIGHTING, false );
cube->setMaterialType( video::EMT_REFLECTION_2_LAYER );
smgr->addSkyBoxSceneNode(
driver->getTexture("../../media/irrlicht2_up.jpg"),
driver->getTexture("../../media/irrlicht2_dn.jpg"),
driver->getTexture("../../media/irrlicht2_lf.jpg"),
driver->getTexture("../../media/irrlicht2_rt.jpg"),
driver->getTexture("../../media/irrlicht2_ft.jpg"),
driver->getTexture("../../media/irrlicht2_bk.jpg"));
//timer
SetTimer(1, 200, 0);
return 0;
}
void CZone3D::OnDestroy()
{
CWnd::OnDestroy();
device->closeDevice();
device->drop();
}
void CZone3D::OnTimer(UINT_PTR nIDEvent)
{
driver->beginScene(true, true, 0);
smgr->drawAll();
driver->endScene();
CWnd::OnTimer(nIDEvent);
} |
InitDialog de la CDialog parente :
Code:
1 2 3 4 5 6 7 8 9 10
|
BOOL CmfcirrlichtDlg::OnInitDialog()
{
CDialog::OnInitDialog();
disp=new CZone3D;
disp->Create(NULL, NULL, WS_CHILD|WS_VISIBLE|SS_NOTIFY, CRect(10,10,300,250), this, 100);
return TRUE;
} |
rendu figé :( :
http://ifmafight.free.fr/irr.gif
Je ne trouve pas d'exemples sur le net, si quelqu'un voit d'où vient le problème :p (problème de notification/ raffraîchissement ?)