Example #1
0
///fills the dataBuffer and returns the struct name (and 0 on failure)
string btCompoundShape::serialize( object dataBuffer, btSerializer* serializer )
{

	btCompoundShapeData* shapeData = (btCompoundShapeData*)dataBuffer;
	btCollisionShape::serialize( &shapeData.m_collisionShapeData, serializer );

	shapeData.m_collisionMargin = float( m_collisionMargin );
	shapeData.m_numChildShapes = m_children.Count;
	shapeData.m_childShapePtr = 0;
	if( shapeData.m_numChildShapes )
	{
		btChunk* chunk = serializer.allocate( sizeof( btCompoundShapeChildData ), shapeData.m_numChildShapes );
		btCompoundShapeChildData* memPtr = (btCompoundShapeChildData*)chunk.m_oldPtr;
		shapeData.m_childShapePtr = (btCompoundShapeChildData*)serializer.getUniquePointer( memPtr );

		for( int i = 0; i < shapeData.m_numChildShapes; i++, memPtr++ )
		{
			memPtr.m_childMargin = float( m_children[i].m_childMargin );
			memPtr.m_childShape = (btCollisionShapeData*)serializer.getUniquePointer( m_children[i].m_childShape );
			//don't serialize shapes that already have been serialized
			if( !serializer.findPointer( m_children[i].m_childShape ) )
			{
				btChunk* chunk = serializer.allocate( m_children[i].m_childShape.calculateSerializeBufferSize(), 1 );
				string structType = m_children[i].m_childShape.serialize( chunk.m_oldPtr, serializer );
				serializer.finalizeChunk( chunk, structType, BT_SHAPE_CODE, m_children[i].m_childShape );
			}

			memPtr.m_childShapeType = m_children[i].m_childShapeType;
			m_children[i].m_transform.serializeFloat( memPtr.m_transform );
		}
		serializer.finalizeChunk( chunk, "btCompoundShapeChildData", BT_ARRAY_CODE, chunk.m_oldPtr );
	}
	return "btCompoundShapeData";
}