Irrlicht源码分析_1
Irrlicht一共由五个部分组成:
1 Irrlicht 框架
{
2 Irrlicht::Core : 数学库
3 Irrlicht::GUI : gui图形库
4 Irrlicht::Video : 图形设备
5 Irrcht::Scene : 场景
}
当然还有一些其他较小的部分,但一般都不在单独拿出来说:譬如 Irrlicht::OS等
最为开始过一遍整体流程:
注:我将Irrlicht这个recode了一遍,所以下面的代码不能直接应用于Irrlicht引擎中,但是整个思路是一样的。
#include "kk.h" using namespace kk; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; #include <windows.h> int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state ) { kkDevice *device= createDevice( video::EDT_DIRECT3D9, dimension2d<s32>(640, 480), 16, false, false, false, 0); device->setWindowCaption(L"Hello World! - KK Engine Demo"); IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); //guienv->addStaticText(L"Hello World! This is the DX9 renderer!", // rect<int>(10,10,260,22), true); IAnimatedMesh* mesh = smgr->getMesh("media/sydney.md2"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); ITexture* texture = driver->getTexture("media/sydney.bmp"); if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation ( scene::EMAT_STAND ); node->setMaterialTexture( 0, texture ); } kk::scene::ICameraSceneNode* cam = smgr->addCameraSceneNode(0, vector3df(30,30,-40), vector3df(10,5,10)); core::triangle3df f; f.pointA=core::vector3df(0,0,0); f.pointB=core::vector3df(1,0,0); f.pointC=core::vector3df(0,1,0); float t=0.0f; while(device->run()) { t+=0.001f; cam->setPosition(core::vector3df(50*cos(t),30,50*sin(t))); driver->beginScene(true, true, SColor(255,100,101,140)); smgr->drawAll(); driver->draw2DImage(texture,core::position2di(10,20),core::rect<s32>(0,0,100,100)); //driver->draw3DBox(core::aabbox3df(core::vector3df(-10,-10,-10),core::vector3df(10,10,10))); //driver->draw2DLine(core::position2di(0,0),core::position2di(100,100)); driver->draw3DLine(core::vector3df(0,0,0),core::vector3df(0,1,0)); //driver->draw3DTriangle(f); guienv->drawAll(); driver->endScene(); } device->drop(); return 0; }
1 创建win32设备
以及 D3D设备,driver
以及场景管理器SceneManager
2 目的是为了显示一个MD2动画,所以加入了一个IAnimatedMesh的MD2文件
3 把他加入到场景管理器中 [设置了一些参数:纹理,光照]
4 创建一个摄像机使得我们能够看到这个物体,加入到SceneManager中
5 绘制gui和Mesh[其中所有的绘制工作都是由Device完成的]
smgr->drawAll();表示绘制加入到场景管理器中的所有Mesh
guienv->drawAll();会把gui元素绘制出来[两者同时存在时容易出现Mesh透视这样的错误]