CollisionTreeSerializer problem

Gucman

16-01-2007 16:42:05

Hi.
I am trying to use the serializer/deserializer however I had stuck with this problem. Every time I try to serialize the CollisionTree I get the 0 bytes size file and the program crashes.

Here how I use it:

if(ResourceGroupManager::getSingleton().resourceExists("General",Ogre::StringConverter::toString(i)+".col"))
{
tc=new OgreNewt::CollisionPrimitives::TreeCollision(mWorld);
DataStreamPtr ptr = ResourceGroupManager::getSingleton().openResource(Ogre::StringConverter::toString(i)+".col");
serializer->importTreeCollision(ptr,tc);
ptr.getPointer()->close();
}
else
{
tc=new OgreNewt::CollisionPrimitives::TreeCollision(mWorld,node,false);
serializer->exportTreeCollision(tc,"..\\data\\colldata\\"+Ogre::StringConverter::toString(i)+".col");
}

When I have already generated file with serialized treecollision everything loads properly. Only serialization fails. I am sure that there is an entity attached to node. The node is not scaled, rotated, it is just translated. Entity is in <0,0,0> position within the node. World is created properly. I am not using optimization becouse geometry is quite complex and weird things happened when I turned optimization.
Is the way I use this mechanism correct?
It happens only in release mode, in debug program don't crashes but I am ending up with 0 sized files (about half of files is that size from up to 80 files total). I build as multi threaded app. I use lib from sdk\lib_mt now but the same happend when I was using sdk\dll.

Gucman

16-01-2007 17:25:19

I forgot to post the line that causes all the problems :(

void TreeCollisionSerializer::importTreeCollision(Ogre::DataStreamPtr& stream, CollisionPrimitives::TreeCollision* pDest)
{
NewtonCollision* col=NewtonCreateTreeCollisionFromSerialization(pDest->getWorld()->getNewtonWorld(), NULL, &TreeCollisionSerializer::_newtonDeserializeCallback, &stream);
pDest->m_col=col;
}


void TreeCollisionSerializer::_newtonSerializeCallback(void* serializeHandle, const void* buffer, size_t size)
{
TreeCollisionSerializer* me=(static_cast<TreeCollisionSerializer*>(serializeHandle));
Ogre::LogManager::getSingleton().logMessage(Ogre::StringConverter::toString(me));
Ogre::LogManager::getSingleton().logMessage(Ogre::StringConverter::toString(buffer));
Ogre::LogManager::getSingleton().logMessage(Ogre::StringConverter::toString(size));
me->writeData(buffer,1,size); //// <<<<< THIS IS HERE <<<<<
}


And with following logMessages i got something like:

18:14:10: D3D9 : Loading 2D Texture, image name : 'zdob-01.dds' with 2147483647 mip map levels
18:14:10: D3D9 : Loading 2D Texture, image name : 'zdob-01_n.dds' with 2147483647 mip map levels
18:14:10: Texture: syg_11.jpg: Loading 1 faces(PF_B8G8R8,800x600x1) with 9 generated mipmaps from Image. Internal format is PF_X8R8G8B8,800x600x1.
18:14:12: saving file ..\data\colldata\1.col
18:14:12: true
18:14:12: true
18:14:12: 4

it ends like this. Thus the pointer to buffer is not null and serializer object is passed correctly. Every time there is 4 bytes to write but it fails.

Gucman

16-01-2007 17:59:04

The really weird thing ;(
look at it:

void TreeCollisionSerializer::exportTreeCollision(const CollisionPrimitives::TreeCollision* collision, const Ogre::String& filename)
{
mpfFile=fopen(filename.c_str(),"wb");
if (!mpfFile)
{
OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, "Unable to open file " + filename + " for writing","TreeCollisionSerializer::exportTreeCollision");
}
Ogre::LogManager::getSingleton().logMessage("saving file "+filename);
NewtonTreeCollisionSerialize(collision->m_col,&TreeCollisionSerializer::_newtonSerializeCallback,this);
Ogre::LogManager::getSingleton().logMessage("done");
fclose(mpfFile); //// <---- Closing the file
}


....


void TreeCollisionSerializer::_newtonSerializeCallback(void* serializeHandle, const void* buffer, size_t size)
{
TreeCollisionSerializer* me=(static_cast<TreeCollisionSerializer*>(serializeHandle));
Ogre::LogManager::getSingleton().logMessage(Ogre::StringConverter::toString(me));
Ogre::LogManager::getSingleton().logMessage(Ogre::StringConverter::toString(buffer));
Ogre::LogManager::getSingleton().logMessage(Ogre::StringConverter::toString(size));
Ogre::LogManager::getSingleton().logMessage((const char*)buffer);
//me->writeData(buffer,1,size);
fwrite(buffer,1,size,me->mpfFile); //// <--- writting to file
}


The code above works perfectly. But why me->writeData(buffer,1,size); does not work?
Could you try to check why it is like that Walaber