CreateBody can't find SceneNode

mcaden

22-08-2008 04:55:34

11:31:54: OGRE EXCEPTION(5:ItemIdentityException): SceneNode 'Crate' not found. in SceneManager::getSceneNode at c:\ogre\ogremain\src\ogrescenemanager.cpp (line 784)

I'm working on a dotSceneLoader for my game project and I'm having it automatically create NxOgre actors based on userData exported from blender (I plan on posted code when it's complete).

My problem is that I can access the scene nodes, I can see the sceneNodes if I run debug and look at the variables, but NxOgre can't find the sceneNode.


Here's my function for generic objects that need physics enabled.

case( DS_NXOBTYPE_GENERIC_KINEMATIC ):
case( DS_NXOBTYPE_GENERIC_STATIC ):
LogManager::getSingleton().logMessage( "Found Generic, Kinematic Object..." );

NodeRenderableParams vp;
vp.setToDefault();
vp.mGraphicsModel = node->getMeshName();
vp.mGraphicsModelScale = NxVec3(1, 1, 1);
vp.mIdentifier = node->getName();
vp.mIdentifierUsage = vp.IU_Use;
vp.mMode = RenderableSource::RM_Interpolate;
NxOgre::Pose actorPose( 0,0,0 );

Shape* colMesh = NULL;

if( node->getColType() == node->TRIANGLE || node->getColType() == node->CONVEX )
{
Ogre::String collisionMesh;
collisionMesh = node->getMeshName() + ".nxs";
NxOgre::Resources::ResourceSystem::getSingleton()->addMesh("file://" + collisionMesh);
if( node->getColType() == node->TRIANGLE )
colMesh = new TriangleMesh(NxOgre::Resources::ResourceSystem::getSingleton()->getMesh( collisionMesh ));
else
colMesh = new Convex( NxOgre::Resources::ResourceSystem::getSingleton()->getMesh( collisionMesh ) );
}
else if( node->getColType() == node->CUBE )
{
Ogre::AxisAlignedBox charBounds = node->getAttachedObject( node->entName )->getBoundingBox();
colMesh = new Cube( charBounds.getSize() );
}
else if( node->getColType() == node->SPHERE )
{
colMesh = new NxOgre::Sphere( node->getColSize() );
}

if( colMesh != NULL )
{
try
{
if( node->getObjectType() == DS_NXOBTYPE_GENERIC_KINEMATIC )
mScene->createBody(vp.mIdentifier, colMesh, actorPose, vp, "mass: 10");
else
mScene->createBody(vp.mIdentifier, colMesh, actorPose, vp, "static: yes");
}
catch(...)
{
LogManager::getSingleton().logMessage( "-= Generic_Kinematic Object Error - Not applying physics to this object =-" );
}
}


The only thing I can think of is that I've subclassed SceneNode as follows:

class DotSceneNode : public SceneNode
{
public:
enum collisionTypes{ CUBE, SPHERE, TRIANGLE, CONVEX};

DotSceneNode( SceneManager* sceneMgr, String name );
~DotSceneNode();
//...Various other functions and variables
}


DotSceneNode::DotSceneNode( SceneManager* sceneMgr, String name ) : Ogre::SceneNode(sceneMgr, name)
{
}


But unless I'm forgetting something about pointers my DotSceneNode should still be treated like a SceneNode by any pointer there as an 'is a' relationship.

Any ideas?

Sidenote: Any suggestions on improvements?

mcaden

24-08-2008 17:23:27

Solved.

Instead of subclassing SceneNode I just made a "PhysicsNode" class with a SceneNode data member and kept a vector of physicsNodes inside the sceneLoader.

I have an XML level file that reads thus:


<scene formatVersion="1.0.0">
<nodes>
<node name="room">
<position x="-0.275034" y="-0.247135" z="0.000000"/>
<quaternion x="0.000000" y="0.000000" z="0.000000" w="1.000000"/>
<scale x="1.000000" y="1.000000" z="1.000000"/>
<entity name="room" meshFile="room.mesh"/>
<userData>
<property type="STRING" name="ObType" data="Terrain"/>
<property type="STRING" name="ColType" data="Triangle"/>
</userData>
</node>
<node name="Crate">
<position x="-24.415977" y="0.317892" z="45.257065"/>
<quaternion x="0.000000" y="0.000000" z="0.000000" w="1.000000"/>
<scale x="1.000000" y="1.000000" z="1.000000"/>
<entity name="Crate" meshFile="Crate.mesh"/>
<userData>
<property type="STRING" name="ObType" data="Generic_Kinematic"/>
<property type="STRING" name="ColType" data="Cube"/>
<property type="FLOAT" name="ColSize" data="1.0"/>
</userData>
</node>
...


This automatically loads into my DotSceneLoader into bodies with the appropriate mesh, and collision mesh settings (room is a triangle mesh named room.mesh.nxs, crate is an NxOgre::Cube).

My DotSceneLoader isn't quite finished yet. It'll have a lot more things like the ability to have mass and the other actorParams set within the userData.

Rasengan

25-08-2008 10:46:01

Nice!