Search code examples
actionscript-3flashapache-flexflex4.6away3d

Away3D Context3D not available


I'm checking out Flash's 3D capabilities with Away3D, and I'm following the tutorial here. I've run into a major problem though. Everytime I run my project in the browser, I get this error:

Error #2044: Unhandled ErrorEvent:. text=Error #3702: Context3D not available.

I can't see where this error comes from, but it happens after my constructor function ends and before the ENTER_FRAME handler starts.

My code is like this:

package {
    import away3d.containers.View3D;
    import away3d.entities.Mesh;
    import away3d.materials.ColorMaterial;
    import away3d.primitives.SphereGeometry;
    import flash.display.Sprite;
    import flash.events.Event;

    [SWF(backgroundColor="#000000", frameRate="60", width="1024", height="768")]
    public class TestAway extends Sprite {
        private var view:View3D;

        public function TestAway() {
            view=new View3D();
            addChild(view);
            var sphereGeometry:SphereGeometry=new SphereGeometry(350);
            var sphereMaterial:ColorMaterial=new ColorMaterial(0xff0000);
            var mesh:Mesh=new Mesh(sphereGeometry, sphereMaterial);
            view.scene.addChild(mesh);
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }


        private function onEnterFrame(event:Event):void {
            view.render();
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
    }
}

Now the wierd thing is, when I run it on my browser (FP 11.2), it doesn't work (gives that error), but I can run the swf from the desktop perfectly.

Also, the example file on the tutorial page runs perfectly. What setting is missing, and how can I fix it?


Solution

  • Well, it appears you need to set wmode as direct to make use of the 3D API.

    While I had seen this bit of info, the html wrapper needs to be modified in 3 places for it to work on all configurations:

    (1) In the javascript for swfObject

    params.wmode = "direct";
    

    (2) In the <object> tag

    <param name="wmode" value="direct" />
    

    and (3) in the <object> tag for IE

     <param name="wmode" value="direct" />