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

Voici le code :
header de la classe Zone3D:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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é :

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 ?)