<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
     applicationComplete="initApp()" frameRate="24" width="100%" height="100%" viewSourceURL="srcview/index.html">
    <mx:Script>
        <![CDATA[
            import org.papervision3d.typography.Letter3D;            
            import org.papervision3d.materials.special.Letter3DMaterial;
            import org.papervision3d.typography.fonts.HelveticaBold;
            import org.papervision3d.typography.Text3D;
            import org.papervision3d.objects.DisplayObject3D;
            import org.papervision3d.objects.primitives.Sphere;
            import org.papervision3d.view.Viewport3D;
            import mx.collections.ArrayCollection;
            import org.papervision3d.render.BasicRenderEngine;
            import org.papervision3d.scenes.Scene3D;
            import org.papervision3d.cameras.Camera3D;
            import org.papervision3d.core.render.command.VectorShapeHitTest;
            import org.papervision3d.events.InteractiveScene3DEvent;
                        
            private var camera:Camera3D;
            private var scene:Scene3D;
            private var render:BasicRenderEngine;            
            private var view:Viewport3D;            
            private var primitive:Sphere;
            private var pivot:DisplayObject3D;    
            private var material:Letter3DMaterial;
            private var radius:Number = 400;
            private var wordColl:ArrayCollection;
                        
            private var xmlList:XML = 
            <root>
                <word name="Red" times="5"/>
                <word name="Yellow" times="1"/>
                <word name="Green" times="10"/>
                <word name="Blue" times="10"/>
                <word name="Purple" times="1"/>
                <word name="Grey" times="5"/>
                <word name="Pink" times="1"/>
                <word name="Lt.Green" times="10"/>
                <word name="Lt.Blue" times="10"/>
                <word name="Violet" times="1"/>
                <word name="Green-Yellow" times="5"/>
                <word name="Yellow-Green" times="1"/>
                <word name="Orange" times="10"/>
                <word name="Silver" times="10"/>
                <word name="Gold" times="1"/>            
            </root>
            
            private function initApp():void
            {
                if(pv3dStage.height > pv3dStage.width)
                {
                    radius = pv3dStage.width;
                }
                else
                {
                    radius = pv3dStage.height;
                }
                // Initialize the pv3d components
                view = new Viewport3D(this.width, this.height, false, true);
                view.interactive = true;
                //VectorShapeHitTest.instance.assignViewport(view);
                
                scene = new Scene3D();
                camera = new Camera3D();                
                render = new BasicRenderEngine();
                
                // add the viewport to the UIComponent                
                pv3dStage.addChild(view);
                
                // Create a pivot point                
                pivot = new DisplayObject3D("TagContainer");            
                
                material = new Letter3DMaterial(0xCCCCCC, 1);
                material.interactive=true;
                material.lineColor=0xCCCC66;            
                wordColl = new ArrayCollection();
                
                for each(var node:XML in xmlList..word)
                {                    
                    wordColl.addItem(new Text3D(node.@name,new HelveticaBold(),material));                    
                }
                for each(var item:Text3D in wordColl)
                {
                    var theta:Number = Math.random()*360;
                    var phi:Number = (1-2*Math.random())*radius;
                    
                    item.x = Math.sqrt(radius*radius-phi*phi)*Math.cos(theta*Math.PI/180);
                    item.y = Math.sqrt(radius*radius-phi*phi)*Math.sin(theta*Math.PI/180);
                    item.z = phi;
                    item.scale = .4;                    
                    /* makeChildInteractive(item); */
                    item.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onItemOver);
                    item.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onItemClick);                    
                    pivot.addChild(item);                    
                }
                scene.addChild(pivot);        
                //makeChildrenInteractive(pivot);                            
                addEventListener(Event.ENTER_FRAME, onEnterFrame);
                addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);
            }
            
            private function onMouseWheel(event:MouseEvent):void
            {
                camera.zoom += event.delta/2;
            }            
            private function onEnterFrame(event:Event):void
            {    
                pivot.rotationX += ((this.height/2)-mouseY)/200;                
                render.renderScene(scene, camera, view);
            }            
            private function onItemOver(event:InteractiveScene3DEvent):void
            {                
            }
            private function onItemClick(event:InteractiveScene3DEvent):void
            {                
            }
        ]]>
    </mx:Script>
    <mx:UIComponent id="pv3dStage" left="0" right="0" top="0" bottom="0"/>
</mx:Application>