サンプル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;
}