Display many 3d objects from 1 file...

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
cyberion
Posts: 30
Joined: Tue Oct 23, 2007 5:53 pm

Display many 3d objects from 1 file...

Post by cyberion »

Welcome everyone !

I have read all the topics about remove() drop() and meshcache but I could not find the best way in my

projects on which I am working on. I have got one FILE.3ds and I wanna make an instance or something like

'checkpoints' ( when I go through FILE.3ds it disappear from the scene ). I want to display some ( about

10-15 objects 3D into my scene from FILE.3ds. I don't want to do somethnig like this :

Code: Select all

scene::IAnimatedMesh* deer = smgr->getMesh("media/FILE.3ds");
   scene::IAnimatedMesh* deer1 = smgr->getMesh("media/FILE1.3ds");
   scene::IAnimatedMesh* deer2 = smgr->getMesh("media/FILE2.3ds");
   ISceneNode* node_deer; // = {0};
because of the resources ...

The code below let me go to check if my camera's positionis near the object 3D :

Code: Select all

bool zone(vector3df& pos, float size, ICameraSceneNode* cam, ISceneNode* node_deer) // y=0
{
	const core::vector3df& kamera = cam->getPosition();
	if ( abs_(kamera.X-pos.X)<size && abs_(kamera.Z-pos.Z)<size ) 
	{
		node_deer->remove();
	      //node_deer->setVisible(); // ?????????????????
		return true;
	}
 else return false;
}

(... part of the code ...)
I load FILE.3ds like this below :

Code: Select all

scene::IAnimatedMesh* deer = smgr->getMesh("media/FILE.3ds");
ISceneNode* node_deer = 0;

  if (deer)
   {
	   node_deer=smgr->addMeshSceneNode(deer->getMesh(0));
	   node_deer->setScale(vector3df(4,4,4));
	   node_deer->setPosition(core::vector3df(100,5,2000));
	/* should I setID ? to each node_deer ?? */	
       //  node_deer->getID();
       // node_deer->drop();
   }
the function :

Code: Select all

bool zone(vector3df& pos, float size, ICameraSceneNode* cam, ISceneNode* node_deer)
is located in main loop :

Code: Select all

while(intro->run() && fin1==false) 
   { 
      if (intro->isWindowActive()) 
      { 
	    driver->beginScene(true, true, video::SColor(0,0,0,0)); 
            smgr->drawAll();
            zone(vector3df(100,5,2000),1,camera,node_deer);
	    env->drawAll();
            driver->endScene();
	} 
   }
So far the code works fine, but after ALT + F4 shut down the compiler ( I am using Visual Studio 2005

Professional ) shows me that stack of node_deer is corupted and suggest me to look on the return 0; on

the last code line. I tried something like these examples below :

Code: Select all

scene::IAnimatedMesh* deer = smgr->getMesh("media/FILE1.3ds");
ISceneNode* node_deer[3];
if (deer)
{
node_deer[1]=smgr->addMeshSceneNode(deer->getMesh(0));
node_deer[1]->setScale(vector3df(4,4,4));
node_deer[1]->setPosition(core::vector3df(40,5,2000));
}
and after in loop I removed meshes in this way :

Code: Select all

for (int i=0; i<=3; ++i);
node_deer[i]->remove();
This code also worked fine, but after ALT + F4 the compiler showed me the stack node_deer[] is corrupted

as I wrote above.

I really appreciate your help :D
Last edited by cyberion on Fri Mar 28, 2008 4:44 pm, edited 1 time in total.
hybrid
Admin
Posts: 14143
Joined: Wed Apr 19, 2006 9:20 pm
Location: Oldenburg(Oldb), Germany
Contact:

Post by hybrid »

I really don't understand what you want to do. Do you want to implement some ressource handling based on zones?
cyberion
Posts: 30
Joined: Tue Oct 23, 2007 5:53 pm

Post by cyberion »

In short :

I have a FILE.3ds and I want to display it on my scene.irr ( for example from 10 to 15 the same 3D object from 1 file) and go throught the 3D objects like 'checkpoint' and after that the 1 mesh should be deleted, setVisible(false); or removed from the scene in fact that I went throught that object.
Last edited by cyberion on Fri Mar 28, 2008 4:45 pm, edited 1 time in total.
hybrid
Admin
Posts: 14143
Joined: Wed Apr 19, 2006 9:20 pm
Location: Oldenburg(Oldb), Germany
Contact:

Post by hybrid »

Well, the full code in proper order might help more, but from what I understood is that you simply remove the nodes several times. Simply make sure you only remove existing scene nodes. Also, just making them invisible should also work and not have too much impact on the performance.
cyberion
Posts: 30
Joined: Tue Oct 23, 2007 5:53 pm

Post by cyberion »

On start the scene is loaded and on the screen below : (top view)

Image

the green is area and if the cameraFPS is on the green field (zone) the mesh is removed or hidden on the scene ... and how can I remove the ONE 3D object when the cameraFPS is on the zone.

That function:

Code: Select all

bool zone(vector3df& pos, float size, ICameraSceneNode* cam, ISceneNode* node_deer)
pos - position of the each 3D object, size is the green area, cam is camera, and node_deer is ISceneNode* node_deer = 0;
JP
Posts: 4526
Joined: Tue Sep 13, 2005 2:56 pm
Location: UK
Contact:

Post by JP »

you need to know how to code the 'zone' function?

All you have to do to know if the camera is in the zone is check the camera's distance from the desired zone (probably checking it against every zone, every frame). If the distance is less than the radius in the zone then you're in the zone, simple as that!
Image Image Image
cyberion
Posts: 30
Joined: Tue Oct 23, 2007 5:53 pm

Post by cyberion »

Here you are :

Code: Select all

#ifdef WIN32
#include <windows.h>
#include <conio.h>
inline void sleepSomeTime() { Sleep(100); }
#endif

#include <irrlicht.h> 
#include <iostream>
#include <stdlib.h>

#pragma comment(lib, "Irrlicht.lib")

using namespace irr; 
using namespace irr::core; 
using namespace irr::scene;
using namespace irr::gui;
using namespace irr::video;

//#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")

irr::IrrlichtDevice *device = 0; 
video::IVideoDriver* driver = 0; 
scene::ISceneManager* smgr; 
scene::IMetaTriangleSelector* metaSelector; 
scene::ISceneNodeAnimatorCollisionResponse* anim; 
scene::ICameraSceneNode* camera = 0;

/*
class MyEventReceiver : public IEventReceiver
{
public:
	virtual bool OnEvent(const SEvent& event)
	{
		if(event.EventType==EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown)
		{
			switch(event.KeyInput.Key)
			{
				case KEY_ESCAPE:
				{
					Beep(200,500); break;
				}
    		}
			return false;
		}
	}
}
eventreceiver; */

	
bool fin1;

void recursiveFillMetaSelector(scene::ISceneNode* node, scene::IMetaTriangleSelector* meta ) 
{ 
  // the following if is basically the same as ISceneNode_assignTriangleSelector 
  printf ("Node name is: %s \n",node->getName()); 
  printf ("Node id is: %d \n",node->getID()); 
  printf ("Node type:"); 
  //  printf ("Node type: %s=",smgr->getSceneNodeTypeName()); 
  if (node->getType() ==   ESNT_UNKNOWN) printf("Unknown mesh type \n\n"); 
  if (node->getType() ==   ESNT_MESH) printf("Standard Mesh \n\n"); 
  if (node->getType() ==   ESNT_ANIMATED_MESH) printf("Animated Mesh! \n\n"); 
  if (node->getType() ==   ESNT_SKY_BOX) printf("SkyBox! \n\n"); 
  if (node->getType() ==   ESNT_CAMERA_FPS) printf("Fps Camera! \n\n"); 
  if (node->getType() ==   ESNT_CAMERA_MAYA ) printf("Maya Camera! \n\n"); 
  if (node->getType() ==   ESNT_CAMERA ) 
  { printf("STD Camera! \n"); 
   printf ("The current position of this camera is: %f,%f,%f\n\n",node->getPosition().X,      node->getPosition().Y,node->getPosition().Z); 
   camera->setPosition(node->getPosition()); 
  } 
  if (node->getType() ==   ESNT_PARTICLE_SYSTEM ) printf("Particles! \n\n"); 
  if (node->getType() ==   ESNT_LIGHT  ) printf("Light! \n\n"); 
  if (node->getType() ==   ESNT_OCT_TREE) 
  { 
      // Occ Trees are for land 
      printf("Occtree! \n"); 
      io::IAttributes* attribs = device->getFileSystem()->createEmptyAttributes(); 
      if (attribs) 
        {// get the mesh name out 
         node->serializeAttributes(attribs); 
         core::stringc name = attribs->getAttributeAsString("Mesh"); 
         attribs->drop(); 
         // get the animated mesh for the object 
         scene::IAnimatedMesh* mesh = smgr->getMesh(name.c_str()); 
         if (mesh) 
         { 
            scene::ITriangleSelector* selector = 
            smgr->createOctTreeTriangleSelector(mesh->getMesh(0), node, 128); 
            node->setTriangleSelector(selector); 
            metaSelector->addTriangleSelector(selector); 
            selector->drop(); 
         } 
     } 
  }  
  // now recurse on children... 
  core::list<scene::ISceneNode*>::ConstIterator begin = node->getChildren().begin(); 
  core::list<scene::ISceneNode*>::ConstIterator end   = node->getChildren().end(); 

  for (; begin != end; ++begin) 
    recursiveFillMetaSelector(*begin, meta); 
}

bool zone(vector3df& pos, float size, ICameraSceneNode* cam, ISceneNode* node_deer)// y=0
{
	const core::vector3df& kamera = cam->getPosition();
	
	if (abs_(kamera.X-pos.X)<size && abs_(kamera.Z-pos.Z)<size)
	{
		//node_deer->setVisible(false);*/
		//node_deer->remove();
		//switch ( node_deer->getID() )
	    //case '1' : node_deer->setVisible(false);
		//if (node_deer->getID()==1) node_deer->setVisible(false);
        //if (node_deer->getID()==2) node_deer->setVisible(false);
       //node_deer[0]->setVisible(false);
       //node_deer[1]->setVisible(false);
		node_deer->drop();
		return true;
	}
 else return false;
}

int main() 
{ 
    int nWidth = GetSystemMetrics(0);
    int nHeight = GetSystemMetrics(1);

	device = createDevice(video::EDT_DIRECT3D9, core::dimension2d<s32>(800, 600), 32, false, true, true); 
    driver = device->getVideoDriver(); 
    smgr = device->getSceneManager();


    SKeyMap keyMap[9]; 
   keyMap[0].Action = EKA_MOVE_FORWARD; 
   keyMap[0].KeyCode = KEY_UP; 
   keyMap[1].Action = EKA_MOVE_FORWARD; 
   keyMap[1].KeyCode = KEY_KEY_W; 

   keyMap[2].Action = EKA_MOVE_BACKWARD; 
   keyMap[2].KeyCode = KEY_DOWN; 
   keyMap[3].Action = EKA_MOVE_BACKWARD; 
   keyMap[3].KeyCode = KEY_KEY_S; 

   keyMap[4].Action = EKA_STRAFE_LEFT; 
   keyMap[4].KeyCode = KEY_LEFT; 
   keyMap[5].Action = EKA_STRAFE_LEFT; 
   keyMap[5].KeyCode = KEY_KEY_A; 

   keyMap[6].Action = EKA_STRAFE_RIGHT; 
   keyMap[6].KeyCode = KEY_RIGHT; 
   keyMap[7].Action = EKA_STRAFE_RIGHT; 
   keyMap[7].KeyCode = KEY_KEY_D; 

   keyMap[8].Action = EKA_JUMP_UP; 
   keyMap[8].KeyCode = KEY_SPACE ; 

   driver->setFog(video::SColor(255,255,255,255), true, 20, 200, 0.1f, true); 
   device->getFileSystem()->addZipFileArchive("media/media.zip"); 
   smgr->loadScene("bud.irr");
   camera = smgr->addCameraSceneNodeFPS(0, 120.0f, 120.0f, -1, keyMap, 9, true,0.25f); 
   camera->setFarValue(11000.0); 
   camera->setAspectRatio(16/10); 
   camera->setFOV( (const f32) 3.14/2.5);
   metaSelector = smgr->createMetaTriangleSelector(); 
   recursiveFillMetaSelector( smgr->getRootSceneNode(), metaSelector ); 
   anim = smgr->createCollisionResponseAnimator(  metaSelector, camera, core::vector3df(10,10,10), 
	  core::vector3df(0,-1.0f,0), 
      core::vector3df(0,24,0));
   camera->setPosition(vector3df(0,4,0));
   camera->addAnimator(anim);
   anim->drop(); 
   metaSelector->drop();
  
   scene::IAnimatedMesh* deer = smgr->getMesh("media/Deer.3ds");
   ISceneNode* node_deer; // = {0};

  if (deer) 
  {
	  node_deer=smgr->addMeshSceneNode(deer->getMesh(0));
	   node_deer->setScale(vector3df(1,1,1));
	   node_deer->setPosition(core::vector3df(100,5,2000));
	   node_deer->setMaterialFlag(video::EMF_LIGHTING,false);
	   //SceneManager->getMeshCache()->removeMesh(AnimatedMesh);
  }


device->getCursorControl()->setVisible(false);
		

    while(device->run() && fin1==false) 
   { 
      if (device->isWindowActive()) 
      { 
	    driver->beginScene(true, true, video::SColor(0,0,0,0)); 
        smgr->drawAll();
		zone(vector3df(115.5,0,2026.5),10,camera,node_deer);
		env->drawAll();
        driver->endScene();
		}
   }
		
	   smgr->getMeshCache()->removeMesh(deer1);
	   node_deer->removeAll();

	//smgr->getMeshCache()->removeMesh(deer);
	smgr->drop();
	device->closeDevice();
	//driver->drop();
	//device->drop();
	return 0;
}
cyberion
Posts: 30
Joined: Tue Oct 23, 2007 5:53 pm

Post by cyberion »

@JP

Yes I know how it works !

But my problem is how to remove each mesh after I go throught it ?

// EDITED: I don't wanna see compiler bug that stack node_deer is corrupted.
Last edited by cyberion on Fri Mar 28, 2008 4:45 pm, edited 1 time in total.
JP
Posts: 4526
Joined: Tue Sep 13, 2005 2:56 pm
Location: UK
Contact:

Post by JP »

I would say that deer_node->remove() should do the trick, what happens if you just do that in the zone function?

Personally i've had problems where remove does absolutely nothing, is that what you're getting?
Image Image Image
cyberion
Posts: 30
Joined: Tue Oct 23, 2007 5:53 pm

Post by cyberion »

As you suggest : "deer_node->remove();" it also after closing aplications I could see that node_deer i corupted :( I modyfied the code many times, but nothing change :( So I write here on the forum...

// EDITED: How can I remove a 3D object loaded before from 1 file ?
Post Reply