Hi,

Well if i remember well (i don't have the project here) i have used strictly
the same code that you have post on the mailing list... nothing more.

Grég

2011/6/1 Sazz Somewhere <jackthef...@hana-arashi.de>

> Seems to me that a View3D object was already added to the stage.
>
> Could you please post some code?
>
> Sazz
>
> On 31 Mai, 21:21, Grégory Lardon <gregory.lar...@gmail.com> wrote:
> > Hi,
> >
> > I see this message a little later, but it is what i was looking for.
> > I play with broomstick for some days and i'm starting to need Flex
> controls
> > :)
> > Thanks a lot !
> >
> > I have an exception when i launch the application :
> > "Error: A Stage3D instance was already assigned!
> >
> > at away3d.core.render::RendererBase/set stage3DProxy()[/Volumes/WORK/DEV
> > PERSO
> >
> FLASH/Away3DBuilder/FB4Workspace/Away3DBuilder/src/away3d/core/render/RendererBase.as:153]..."
> >
> > Did i miss something ?
> >
> > Grég
> >
> > 2011/5/29 Michael Iv <explomas...@gmail.com>> Thanks for sharing man.It
> is going to be really helpful!
> >
> > > On Sun, May 29, 2011 at 4:11 PM, Sazz Somewhere <
> > > jackthef...@hana-arashi.de> wrote:
> >
> > >> Hi,
> >
> > >> I have written Away3DCanvas which helps to integrate molehill/
> > >> broomstick engine into flex applications. It's actually an enhanced
> > >> version of some previous away3d components.
> >
> > >> Because the 3d content gets rendered behind the flex applications
> > >> display list it's a little bit tricky to get the broomstick content
> > >> into place.
> >
> > >> My approach was to mask the unwanted areas of the 3d content with four
> > >> BorderContainer objects for each side (top,left,bottom,right). The
> > >> objects gets added to the bottom of the display list so that the
> > >> molehill areas are seperated from the flex displayed objects.
> > >> Therefore only one Away3DCanvas per application is possible.
> >
> > >> All properties are data binded so if you move the Away3DCanvas the
> > >> BorderContainer objects reconfigurate themselves around the canvas
> > >> giving the illusion of an embedded 3d content.
> >
> > >> The canvas can be configured with the following properties (changes to
> > >> the properties are reflected at runtime):
> > >> Away3DCanvas.view: View3D object
> > >> Away3DCanvas.scene: Scene3D object of the view
> > >> Away3DCanvas.stats: Boolean to toggle Away3DStats
> > >> Away3DCanvas.flightMode: Boolean - added the FlightController from the
> > >> Away3D examples
> > >> Away3DCanvas.cameraX: Number - x position of the camera
> > >> Away3DCanvas.cameraY: Number - y position of the camera
> > >> Away3DCanvas.cameraZ: Number - z position of the camera
> > >> Away3DCanvas.cameraRotationX: Number - rotationX position of the
> > >> camera
> > >> Away3DCanvas.cameraRotationY: Number - rotationY position of the
> > >> camera
> > >> Away3DCanvas.cameraRotationZ: Number - rotationZ position of the
> > >> camera
> > >> Away3DCanvas.appBackgroundColor: String - the color of the application
> > >> background (used by the BorderContainers)
> >
> > >> Here's the code for the Away3DCanvas:
> >
> > >> <?xml version="1.0" encoding="utf-8"?>
> > >> <mx:UIComponent xmlns:fx="http://ns.adobe.com/mxml/2009";
> > >>                xmlns:s="library://ns.adobe.com/flex/spark"
> > >>                xmlns:mx="library://ns.adobe.com/flex/mx"
> > >> enterFrame="handleEnterFrame(event)"
> > >>                addedToStage="addedToStage(event)"
> > >> removedFromStage="removedFromStage(event)">
> > >>  <fx:Declarations>
> > >>    <s:BorderContainer id="m_topCanvas"
> > >> borderColor="{appBackgroundColor}" borderWeight="0"
> > >> backgroundColor="{appBackgroundColor}"/>
> > >>    <s:BorderContainer id="m_bottomCanvas"
> > >> borderColor="{appBackgroundColor}" borderWeight="0"
> > >> backgroundColor="{appBackgroundColor}"/>
> > >>    <s:BorderContainer id="m_leftCanvas"
> > >> borderColor="{appBackgroundColor}" borderWeight="0"
> > >> backgroundColor="{appBackgroundColor}"/>
> > >>    <s:BorderContainer id="m_rightCanvas"
> > >> borderColor="{appBackgroundColor}" borderWeight="0"
> > >> backgroundColor="{appBackgroundColor}"/>
> > >>  </fx:Declarations>
> > >>  <fx:Script>
> > >>    <![CDATA[
> > >>      import away3d.containers.Scene3D;
> > >>      import away3d.containers.View3D;
> > >>      import away3d.debug.AwayStats;
> > >>      import away3d.materials.ColorMaterial;
> >
> > >>      import mx.binding.utils.BindingUtils;
> > >>      import mx.binding.utils.ChangeWatcher;
> > >>      import mx.collections.ArrayCollection;
> > >>      import mx.core.FlexGlobals;
> > >>      import mx.core.UIComponent;
> > >>      import mx.events.PropertyChangeEvent;
> >
> > >>      [Bindable] public var view:View3D;
> > >>      [Bindable] public var stats:Boolean;
> > >>      [Bindable] public var flightMode:Boolean;
> > >>      [Bindable] public var cameraX:Number = 0;
> > >>      [Bindable] public var cameraY:Number = 0;
> > >>      [Bindable] public var cameraZ:Number = 0;
> > >>      [Bindable] public var cameraRotationX:Number = 0;
> > >>      [Bindable] public var cameraRotationY:Number = 0;
> > >>      [Bindable] public var cameraRotationZ:Number = 0;
> > >>      [Bindable] public var appBackgroundColor:String = "0xFFFFFF";
> >
> > >>      private var m_xWatcherArray:ArrayCollection = new
> > >> ArrayCollection();
> > >>      private var m_yWatcherArray:ArrayCollection = new
> > >> ArrayCollection();
> > >>      private var m_widthWatcher:ChangeWatcher;
> > >>      private var m_heightWatcher:ChangeWatcher;
> >
> > >>      private var m_application:Object;
> > >>      private var m_statsObject:AwayStats;
> > >>      private var m_flightController:FlightController;
> >
> > >>      public function get scene():Scene3D {
> > >>        return this.view.scene;
> > >>      }
> >
> > >>      protected function addedToStage(event:Event):void {
> > >>        m_application = FlexGlobals.topLevelApplication;
> > >>        m_application.addElementAt(m_topCanvas, 0);
> > >>        m_application.addElementAt(m_bottomCanvas, 0);
> > >>        m_application.addElementAt(m_leftCanvas, 0);
> > >>        m_application.addElementAt(m_rightCanvas, 0);
> > >>        init();
> > >>      }
> >
> > >>      protected function removedFromStage(event:Event):void {
> > >>      }
> >
> > >>      /**
> > >>       * Global initialise function
> > >>       */
> > >>      private function init():void {
> > >>        this.view = new View3D();
> > >>        createObjectWatch(this);
> > >>        m_widthWatcher = ChangeWatcher.watch(this, "width",
> > >> handleViewChange);
> > >>        m_heightWatcher = ChangeWatcher.watch(this, "height",
> > >> handleViewChange);
> > >>        addChild(this.view);
> > >>        ChangeWatcher.watch(this, "stats", updateStats);
> > >>        ChangeWatcher.watch(this, "flightMode", updateFlightMode);
> > >>        BindingUtils.bindProperty(view.camera, "x", this, "cameraX");
> > >>        BindingUtils.bindProperty(view.camera, "y", this, "cameraY");
> > >>        BindingUtils.bindProperty(view.camera, "z", this, "cameraZ");
> > >>        BindingUtils.bindProperty(view.camera, "rotationX", this,
> > >> "cameraRotationX");
> > >>        BindingUtils.bindProperty(view.camera, "rotationY", this,
> > >> "cameraRotationY");
> > >>        BindingUtils.bindProperty(view.camera, "rotationZ", this,
> > >> "cameraRotationZ");
> > >>        updateStats(null);
> > >>        updateFlightMode(null);
> > >>        handleViewChange(null);
> > >>      }
> >
> > >>      private function updateStats(event:PropertyChangeEvent):void {
> > >>        if ((this.stats == true) && (m_statsObject == null)) {
> > >>          m_statsObject = new AwayStats(view);
> > >>          addChild(m_statsObject);
> > >>        }
> > >>        if ((this.stats == false) && (m_statsObject != null)) {
> > >>          removeChild(m_statsObject);
> > >>          m_statsObject = null;
> > >>        }
> > >>      }
> >
> > >>      private function
> > >> updateFlightMode(event:PropertyChangeEvent):void {
> > >>        if ((this.flightMode == true) && (m_flightController == null))
> > >> {
> > >>          m_flightController = new FlightController(view.camera,
> > >> this.stage);
> > >>        }
> > >>        if ((this.flightMode == false) && (m_flightController !=
> > >> null)) {
> > >>          m_flightController.destroy();
> > >>          m_flightController = null;
> > >>        }
> > >>      }
> >
> > >>      private function
> > >> createObjectWatch(component:DisplayObjectContainer):void {
> > >>        m_xWatcherArray.addItem(ChangeWatcher.watch(component, "x",
> > >> handleViewChange));
> > >>        m_yWatcherArray.addItem(ChangeWatcher.watch(component, "y",
> > >> handleViewChange));
> > >>        if (component.parent != null) {
> > >>          createObjectWatch(component.parent);
> > >>        }
> > >>      }
> >
> > >>      private function handleViewChange(event:Event):void {
> > >>        var globalPoint:Point = this.localToGlobal(new Point(0, 0));
> > >>        var viewWidth:int = this.width;
> > >>        var viewHeight:int = this.height;
> > >>        var viewX:int = globalPoint.x;
> > >>        var viewY:int = globalPoint.y;
> >
> > >>        updatePosition(this.view, viewX, viewY, viewWidth,
> > >> viewHeight);
> > >>        updatePosition(m_leftCanvas, 0, 0, viewX,
> > >> m_application.height);
> > >>        updatePosition(m_rightCanvas, viewX + viewWidth, 0,
> > >> m_application.width - viewX - viewWidth, m_application.height);
> > >>        updatePosition(m_topCanvas, viewX, 0, viewWidth, this.view.y);
> > >>        updatePosition(m_bottomCanvas, viewX, viewY + viewHeight,
> > >> viewWidth, m_application.height - viewY - viewHeight);
> > >>      }
> >
> > >>      private function updatePosition(object:Object, x:int, y:int,
> > >> width:int, height:int):void {
> > >>        object.x = x;
> > >>        object.y = y;
> > >>        object.width = width;
> > >>        object.height = height;
> > >>      }
> >
> > >>      private function dispose():void {
> > >>        for each(var xWatcher:ChangeWatcher in m_xWatcherArray) {
> > >>          xWatcher.unwatch();
> > >>        }
> > >>        for each (var yWatcher:ChangeWatcher in m_yWatcherArray) {
> > >>          yWatcher.unwatch();
> > >>        }
> > >>        m_xWatcherArray.removeAll();
> > >>        m_yWatcherArray.removeAll();
> > >>        m_widthWatcher = unwatch(m_widthWatcher);
> > >>        m_heightWatcher = unwatch(m_heightWatcher);
> > >>      }
> >
> > >>      private function unwatch(watcher:ChangeWatcher):ChangeWatcher {
> > >>        if (watcher != null) {
> > >>          watcher.unwatch();
> > >>        }
> > >>        return null;
> > >>      }
> >
> > >>      /**
> > >>       * Render loop
> > >>       */
> > >>      private function handleEnterFrame(event:Event):void {
> > >>        if (this.view != null) {
> > >>          this.view.render();
> > >>        }
> > >>      }
> >
> > >>      override protected function
> > >> updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
> > >>        super.updateDisplayList(unscaledWidth, unscaledHeight);
> >
> > >>        if (!this.view)
> > >>          return;
> >
> > >>        if (width * .5 != this.view.x)
> > >>          this.view.x = width * .5;
> > >>        if (height * .5 != this.view.y)
> > >>          this.view.y = height * .5;
> > >>      }
> >
> > >>    ]]>
> > >>  </fx:Script>
> > >> </mx:UIComponent>
> >
> > >> Here's a little example:
> >
> > >> <?xml version="1.0" encoding="utf-8"?>
> > >> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009";
> > >>               xmlns:s="library://ns.adobe.com/flex/spark"
> > >>               xmlns:mx="library://ns.adobe.com/flex/mx"
> > >>               xmlns:ns1="*" backgroundAlpha="0"
> > >>               minWidth="955" minHeight="600"
> > >> applicationComplete="creationComplete()">
> > >>  <fx:Declarations>
> > >>  </fx:Declarations>
> > >>  <fx:Script>
> > >>    <![CDATA[
> > >>      import away3d.materials.ColorMaterial;
> > >>      import away3d.primitives.Cube;
> >
> > >>      public function creationComplete():void {
> > >>        m_canvas.scene.addChild(new Cube(new
> > >> ColorMaterial(0x003988)));
> > >>        addEventListener(Event.ENTER_FRAME, handleEnterFrame);
> > >>      }
> >
> > >>      public function handleEnterFrame(event:Event):void {
> > >>        m_canvas.scene.getChildAt(0).rotationY++;
> > >>      }
> > >>    ]]>
> > >>  </fx:Script>
> > >>  <ns1:A3DCanvas id="m_canvas" x="148" y="113" width="546"
> > >> height="298" stats="true" flightMode="true" cameraZ="-150"
> > >> cameraY="-60"/>
> > >>  <s:HSlider x="148" y="419" width="546" maximum="300" minimum="-300"
> > >> value="@{m_canvas.cameraX}"/>
> > >>  <s:VSlider x="702" y="113" height="298" maximum="300" minimum="-300"
> > >> value="@{m_canvas.cameraY}"/>
> > >>  <s:VSlider x="129" y="113" height="298" maximum="300" minimum="-300"
> > >> value="@{m_canvas.cameraZ}"/>
> > >> </s:Application>
> >
> > >> The FlightController class can be found at away3d/broomstick/Examples/
> > >> as/src/FlightController.as
> >
> > >> And don't forget to set the backgroundAlpha of your flex application
> > >> to 0 (otherwise the 3d content won't be visible)
> >
> > >> Thanks to all the people providing little snippets to help finish this
> > >> component.
> >
> > >> Have fun :)
> >
> > >> Sazz
> >
> > > --
> > > Michael Ivanov ,Programmer
> > > Neurotech Solutions Ltd.
> > > Flex|Air |3D|Unity|
> > >www.neurotechresearch.com
> > >http://blog.alladvanced.net
> > > Tel:054-4962254
> > > mich...@neurotech.co.il
> > > t...@neurotech.co.il

Reply via email to