サンプル03の改造
ISceneNodeを継承する方法ではなく、独自にSMeshを構築してaddMeshSceneNodeするサンプル。はじめはIMeshSceneNodeを継承したクラスを作っていたのだが、弄っている間に継承無しのこの形になった。
#include <irrlicht.h> int main() { using namespace irr; // create device IrrlichtDevice *device = createDevice(video::EDT_OPENGL, core::dimension2d<u32>(640, 480), 16, false); if(device==0){ return 1; // could not create selected driver. } device->setWindowCaption(L"Custom Scene Node - Irrlicht Engine Demo"); video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* smgr = device->getSceneManager(); // camera { scene::ICameraSceneNode *camera=smgr->addCameraSceneNodeMaya(); camera->setTarget(core::vector3df(0, 0, 0)); } // custom node { // create SMeshBuffer //////////////////////////////////////////////////////////// scene::SMeshBuffer *meshBuffer=new scene::SMeshBuffer; // vertices video::S3DVertex Vertices[4]; Vertices[0] = video::S3DVertex(0,0,10, 1,1,0, video::SColor(255,0,255,255), 0, 1); Vertices[1] = video::S3DVertex(10,0,-10, 1,0,0, video::SColor(255,255,0,255), 1, 1); Vertices[2] = video::S3DVertex(0,20,0, 0,1,1, video::SColor(255,255,255,0), 1, 0); Vertices[3] = video::S3DVertex(-10,0,-10, 0,0,1, video::SColor(255,0,255,0), 0, 0); // indices u16 Indices[] = { 0,2,3, 2,1,3, 1,0,3, 2,0,1 }; // append meshBuffer->append(Vertices, 4, Indices, 12); meshBuffer->recalculateBoundingBox(); // create SMesh //////////////////////////////////////////////////////////// scene::SMesh *mesh=new scene::SMesh; mesh->addMeshBuffer(meshBuffer); meshBuffer->drop(); mesh->recalculateBoundingBox(); scene::IMeshSceneNode *myNode =smgr->addMeshSceneNode(mesh); mesh->drop(); // set material myNode->getMaterial(0).Wireframe = false; myNode->getMaterial(0).Lighting = false; scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(core::vector3df(0.8f, 0, 0.8f)); if(anim) { myNode->addAnimator(anim); anim->drop(); anim = 0; } } // main loop //////////////////////////////////////////////////////////// u32 frames=0; while(device->run()) { driver->beginScene(true, true, video::SColor(0,100,100,100)); smgr->drawAll(); driver->endScene(); // udpate fps count if (++frames==100) { core::stringw str = L"Irrlicht Engine ["; str += driver->getName(); str += L"] FPS: "; str += (s32)driver->getFPS(); device->setWindowCaption(str.c_str()); frames=0; } } device->drop(); return 0; }