package
{
        import fr.seraf.wow.primitive.WOWPlane;
        import fr.seraf.wow.primitive.WSphere;

        import mx.collections.ArrayCollection;

        import org.papervision3d.materials.utils.MaterialsList;

        public class ApplicationManager
        {
                protected static const BALLS_COUNT:int = 10;
                protected static var instance:ApplicationManager = null;
                protected var balls:ArrayCollection = new ArrayCollection();

                public static function get Instance():ApplicationManager
                {
                        if (instance == null)
                        instance = new ApplicationManager();
                        return instance;
                }

                public function ApplicationManager()
                {
                }

                public function startupApplicationManager():void
                {
                        var materials2:MaterialsList = new MaterialsList();
                        materials2.addMaterial(ResourceManager.Wood_Tex, "Material01");

                        // floor
                        var boxBoundingArea:WOWPlane = new WOWPlane();
                        boxBoundingArea.setPosition(0,500,1000);
                        boxBoundingArea.fixed = true;
                        new PhysicsMeshObject().startupPhysicsMeshObject(ResourceManager.PlaneXML, materials2, boxBoundingArea);

                        createBalls();
                }

                public function createBalls():void
                {
                        var materials:MaterialsList = new MaterialsList();
                        materials.addMaterial(ResourceManager.Metal_Tex, "Material02");

                        for (var j:int = 0; j < balls.length; ++j)
                        {
                                (balls[j] as PhysicsMeshObject).shutdown();
                        }

                        balls.removeAll();

                        var x:Number, y:Number, z:Number;
                        for (var i:int = 0; i < BALLS_COUNT; ++i)
                        {
                                // doing this ensures that a shpere will drop onto another
                                // creating a more interesting effect
                                if (i % 2 == 0)
                                {
                                        x = Math.random() * -800 + 400;
                                        y = Math.random() * -800 + 200;
                                        z = Math.random() * 800 + 100;
                                }
                                else
                                {
                                        x = x + Math.random() * -60 + 30;
                                        y = y + 200;
                                        z = z + Math.random() * -60 + 30;
                                }
                                var boundingArea:WSphere = new WSphere(x, y, z, 75, true);
                                balls.addItem(new PhysicsMeshObject().startupPhysicsMeshObject(ResourceManager.BallXML, materials, boundingArea));
                        }
                }

                public function drop():void
                {
                        for (var j:int = 0; j < balls.length; ++j)
                        {
                                (balls[j] as PhysicsMeshObject).boundedArea.fixed = false;
                        }
                }

                public function shutdown():void
                {

                }
        }
}