public void SerializeTest()
        {
            var fileLoader = new BulletWorldImporter(_world);
            var objects = _world.CollisionObjectArray;

            Assert.True(fileLoader.LoadFile("data\\bsp.bullet"));
            Assert.AreEqual(127, objects.Count);
            Assert.AreEqual(127, fileLoader.NumCollisionShapes);
            Assert.True(objects.All(o => o.CollisionShape is ConvexHullShape));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\concaveCompound.bullet"));
            Assert.AreEqual(1, fileLoader.NumBvhs);
            Assert.AreEqual(6, fileLoader.NumCollisionShapes);
            Assert.AreEqual(11, objects.Count);
            Assert.AreEqual(10, objects.Count(o => o.CollisionShape is CompoundShape));
            var triangleMeshShape =
                objects.Select(o => o.CollisionShape).FirstOrDefault(s => s is BvhTriangleMeshShape) as BvhTriangleMeshShape;
            Assert.NotNull(triangleMeshShape);
            Assert.False(triangleMeshShape.OwnsBvh);
            Assert.NotNull(triangleMeshShape.OptimizedBvh);
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\constraints.bullet"));
            Assert.AreEqual(10, fileLoader.NumConstraints);
            Assert.AreEqual(10, _world.NumConstraints);
            Assert.AreEqual(17, objects.Count);
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\convex_decomposition.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\cylinders.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\multibody.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);
            /*
            Assert.True(fileLoader.LoadFile("data\\r2d2_multibody.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);
            */
            Assert.True(fileLoader.LoadFile("data\\ragdoll_6dof.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\ragdoll_conetwist.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\slope.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\spider.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);

            Assert.True(fileLoader.LoadFile("data\\testFile.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);
            /*
            Assert.True(fileLoader.LoadFile("data\\testFileFracture.bullet"));
            fileLoader.DeleteAllData();
            Assert.AreEqual(0, objects.Count);
            */
        }
        protected override void OnInitializePhysics()
        {
            // collision configuration contains default setup for memory, collision setup
            CollisionConf = new DefaultCollisionConfiguration();
            Dispatcher = new CollisionDispatcher(CollisionConf);

            Broadphase = new DbvtBroadphase();

            World = new DiscreteDynamicsWorld(Dispatcher, Broadphase, null, CollisionConf);
            World.Gravity = new Vector3(0, -10, 0);

            GImpactCollisionAlgorithm.RegisterAlgorithm(Dispatcher);

            string bulletFile;
            string[] args = Environment.GetCommandLineArgs();
            if (args.Length == 1)
            {
                bulletFile = "testFile.bullet";
            }
            else
            {
                bulletFile = args[1];
            }

            fileLoader = new CustomBulletWorldImporter(World);
            if (!fileLoader.LoadFile(bulletFile))
            {
                CollisionShape groundShape = new BoxShape(50);
                CollisionShapes.Add(groundShape);
                RigidBody ground = LocalCreateRigidBody(0, Matrix.Translation(0, -50, 0), groundShape);
                ground.UserObject = "Ground";

                // create a few dynamic rigidbodies
                float mass = 1.0f;

                Vector3[] positions = new Vector3[2] { new Vector3(0.1f, 0.2f, 0.3f), new Vector3(0.4f, 0.5f, 0.6f) };
                float[] radi = new float[2] { 0.3f, 0.4f };

                CollisionShape colShape = new MultiSphereShape(positions, radi);

                //CollisionShape colShape = new CapsuleShapeZ(1, 1);
                //CollisionShape colShape = new CylinderShapeZ(1, 1, 1);
                //CollisionShape colShape = new BoxShape(1);
                //CollisionShape colShape = new SphereShape(1);
                CollisionShapes.Add(colShape);

                Vector3 localInertia = colShape.CalculateLocalInertia(mass);

                float start_x = StartPosX - ArraySizeX / 2;
                float start_y = StartPosY;
                float start_z = StartPosZ - ArraySizeZ / 2;

                int k, i, j;
                for (k = 0; k < ArraySizeY; k++)
                {
                    for (i = 0; i < ArraySizeX; i++)
                    {
                        for (j = 0; j < ArraySizeZ; j++)
                        {
                            Matrix startTransform = Matrix.Translation(
                                2 * i + start_x,
                                2 * k + start_y,
                                2 * j + start_z
                            );

                            // using motionstate is recommended, it provides interpolation capabilities
                            // and only synchronizes 'active' objects
                            DefaultMotionState myMotionState = new DefaultMotionState(startTransform);
                            RigidBodyConstructionInfo rbInfo =
                                new RigidBodyConstructionInfo(mass, myMotionState, colShape, localInertia);
                            RigidBody body = new RigidBody(rbInfo);
                            rbInfo.Dispose();

                            // make it drop from a height
                            body.Translate(new Vector3(0, 20, 0));

                            World.AddRigidBody(body);
                        }
                    }
                }

                DefaultSerializer serializer = new DefaultSerializer();

                serializer.RegisterNameForObject(ground, "GroundName");

                for (i = 0; i < CollisionShapes.Count; i++)
                    serializer.RegisterNameForObject(CollisionShapes[i], "name" + i.ToString());

                Point2PointConstraint p2p = new Point2PointConstraint((RigidBody)World.CollisionObjectArray[2], new Vector3(0, 1, 0));
                World.AddConstraint(p2p);

                serializer.RegisterNameForObject(p2p, "constraintje");

                World.Serialize(serializer);

                BulletSharp.DataStream data = serializer.LockBuffer();
                byte[] dataBytes = new byte[data.Length];
                data.Read(dataBytes, 0, dataBytes.Length);

                FileStream file = new FileStream("testFile.bullet", FileMode.Create);
                file.Write(dataBytes, 0, dataBytes.Length);
                file.Close();
            }
        }
        /// <summary>
        /// Imports a collision shape from a .bullet file.
        /// </summary>
        /// <param name="bulletfile">Part of the filename. "media/physics/" + name + ".bullet"</param>
        /// <remarks>
        /// This only imports the first collision shape from the file. If it has multiple, they will be ignored.
        /// </remarks>
        public CollisionShape ImportCollisionShape(string bulletfile)
        {
            BulletWorldImporter importer = new BulletWorldImporter(LKernel.GetG<PhysicsMain>().World);

            string filename;
            if (bulletFiles.TryGetValue(bulletfile, out filename)) {
                // load that file
                if (importer.LoadFile(filename)) {
                    Launch.Log(string.Concat("[PhysicsMain] Importing ", bulletfile, "..."));
                    // these should only have one collision shape in them, so we'll just use that
                    return importer.GetCollisionShapeByIndex(0);
                }
                else {
                    // if the file wasn't able to be loaded, throw an exception
                    throw new IOException(bulletfile + " was unable to be imported!");
                }
            }
            else
                throw new FileNotFoundException("That .bullet file was not found!", bulletfile);
        }