im trying to build a simple irrlicht program that will load a ply file a draws the mesh from it. Im using ply just as a sample. In the future i will be providing the verticies an faces information from a different source, but for now i would like to get it work with ply as it is the format i need.
Im using CDynamicMeshBuffer( to store vertecies and faces, but i cant get the program to show the mesh. Before this, i tried using sample program (tutorial 3) to show a custum node but it didnt work with larger number of faces (50 or more).
I think there is a small problem with drawing the mesh, because the mesh is stored ok, but i cant figure out what it is.
Got the code basics from the irrlicht source files.
- cpp Code: Select all
int main()
{
// ask user for driver
video::E_DRIVER_TYPE driverType=driverChoiceConsole();
if (driverType==video::EDT_COUNT)
return 1;
// create device
IrrlichtDevice *device = createDevice(driverType,
core::dimension2d<u32>(640, 480), 16, false);
if (device == 0)
return 1; // could not create selected driver.
// create engine and camera
device->setWindowCaption(L"Custom Scene Node - Irrlicht Engine Demo");
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
smgr->addCameraSceneNode(0, core::vector3df(0,-40,0), core::vector3df(0,0,0));
std::vector<video::S3DVertex> m_verticies;
std::vector<irr::core::vector3df> m_faces;
irr::scene::CDynamicMeshBuffer *mb;
irr::scene::SAnimatedMesh* animMesh;
// loads a ply and saves to the std vectors
LoadPLY("balonek.ply", m_verticies, m_faces);
int vertCount = m_verticies.size();
mb = new irr::scene::CDynamicMeshBuffer(video::EVT_STANDARD, vertCount > 65565 ? video::EIT_32BIT : video::EIT_16BIT);
mb->getVertexBuffer().reallocate(vertCount);
mb->getIndexBuffer().reallocate(m_faces.size()*3);
mb->setHardwareMappingHint(irr::scene::EHM_STATIC);
// fills the vertex buffer
for (long i = 0; i < m_verticies.size(); i++){
mb->getVertexBuffer().push_back(m_verticies.at(0));
}
// fills the index buffer
for (long i = 0; i < m_faces.size(); i++){
mb->getIndexBuffer().push_back(m_faces.at(i).X);
mb->getIndexBuffer().push_back(m_faces.at(i).Y);
mb->getIndexBuffer().push_back(m_faces.at(i).Z);
}
mb->recalculateBoundingBox();
irr::scene::SMesh* m = new irr::scene::SMesh();
m->addMeshBuffer(mb);
m->recalculateBoundingBox();
mb->drop();
animMesh = 0;
animMesh = new irr::scene::SAnimatedMesh();
animMesh->addMesh(m);
animMesh->recalculateBoundingBox();
m->drop();
irr::scene::IAnimatedMeshSceneNode* anms = smgr->addAnimatedMeshSceneNode(animMesh);
anms->setMaterialFlag(video::EMF_LIGHTING, false);
anms->setVisible(true);
while(device->run())
{
driver->beginScene(true, true, video::SColor(0,100,100,100));
smgr->drawAll();
driver->endScene();
}
device->drop();
return 0;
}
Thanks for any help.
Jarek


