///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"; }