package { import flash.display.Bitmap; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Rectangle; import org.papervision3d.core.proto.MaterialObject3D; import org.papervision3d.core.utils.Mouse3D; import org.papervision3d.core.utils.virtualmouse.VirtualMouse; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.materials.MovieMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.view.BasicView; public class PaintCanvas3D extends BasicView { private var isDrawingEnabled:Boolean; private var materialsList:MaterialsList; private var material3D:MaterialObject3D; private var cube3D:Cube; private var virtualMouse:VirtualMouse; private var currentCanvas:Sprite; private var faceOver:String; [Embed(source="simple_texture.jpg")] private var texture:Class; public function PaintCanvas3D(viewportWidth:Number=640, viewportHeight:Number=480, scaleToStage:Boolean=true, interactive:Boolean=false, cameraType:String="Target") { super(viewportWidth, viewportHeight, scaleToStage, interactive, cameraType); virtualMouse = viewport.interactiveSceneManager.virtualMouse; Mouse3D.enabled = true; createCube(); } private function createCube():void { // Movie clip for our MovieMaterial var mc:MovieClip; var bmp:Bitmap; // ------------------------------------------------------------ // Create all the material objects for the 6 faces of the cube // ------------------------------------------------------------ // Same procedure every material // FRONT________________________________________________________ mc = new MovieClip(); // Add a listener so we know when mouse is over a specific face of the cube mc.addEventListener(MouseEvent.MOUSE_OVER, onMovieClipOver); // a name to identify the face and know where to draw mc.name = "front"; // bitmap texture of the face bmp = new Bitmap(new texture().bitmapData); // add the texture to the movie clip mc.texture = mc.addChild(bmp); // create a sprite, where we will draw colorful shit mc.canvas = mc.addChild(new Sprite() ); // disable mouse for this sprite mc.canvas.mouseEnabled = false; // create the material for this particular face, it is the same for all the // remaining 5 faces var front:MaterialObject3D = new MovieMaterial(mc, false, true, false, new Rectangle(0,0,250,250)); // make it interactive front.interactive = true; // BACK________________________________________________________ mc = new MovieClip(); mc.addEventListener(MouseEvent.MOUSE_OVER, onMovieClipOver); mc.name = "back"; bmp = new Bitmap(new texture().bitmapData); mc.texture = mc.addChild(bmp); mc.canvas = mc.addChild(new Sprite() ); mc.canvas.mouseEnabled = false; var back:MaterialObject3D = new MovieMaterial(mc, false, true, false, new Rectangle(0,0,250,250)); back.interactive = true; // TOP_______________________________________________________ mc = new MovieClip(); mc.addEventListener(MouseEvent.MOUSE_OVER, onMovieClipOver); mc.name = "top"; bmp = new Bitmap(new texture().bitmapData); mc.texture = mc.addChild(bmp); mc.canvas = mc.addChild(new Sprite() ); mc.canvas.mouseEnabled = false; var top:MaterialObject3D = new MovieMaterial(mc, false, true, false, new Rectangle(0,0,250,250)); top.interactive = true; // BOTTOM________________________________________________________ mc = new MovieClip(); mc.name = "bottom"; mc.addEventListener(MouseEvent.MOUSE_OVER, onMovieClipOver); bmp = new Bitmap(new texture().bitmapData); mc.texture = mc.addChild(bmp); mc.canvas = mc.addChild(new Sprite() ); mc.canvas.mouseEnabled = false; var bottom:MaterialObject3D = new MovieMaterial(mc, false, true, false, new Rectangle(0,0,250,250)); bottom.interactive = true; // LEFT_______________________________________________________ mc = new MovieClip(); mc.name = "left"; mc.addEventListener(MouseEvent.MOUSE_OVER, onMovieClipOver); bmp = new Bitmap(new texture().bitmapData); mc.texture = mc.addChild(bmp); mc.canvas = mc.addChild(new Sprite() ); mc.canvas.mouseEnabled = false; var left:MaterialObject3D = new MovieMaterial(mc, false, true, false, new Rectangle(0,0,250,250)); left.interactive = true; // RIGHT________________________________________________________ mc = new MovieClip(); mc.name = "right"; mc.addEventListener(MouseEvent.MOUSE_OVER, onMovieClipOver); bmp = new Bitmap(new texture().bitmapData); mc.texture = mc.addChild(bmp); mc.canvas = mc.addChild(new Sprite() ); mc.canvas.mouseEnabled = false; var right:MaterialObject3D = new MovieMaterial(mc, false, true, false, new Rectangle(0,0,250,250)); right.interactive = true; // Add our 6 new materials to the Materials List materialsList = new MaterialsList(); materialsList.addMaterial(front, "front"); materialsList.addMaterial(back, "back"); materialsList.addMaterial(top, "top"); materialsList.addMaterial(bottom, "bottom"); materialsList.addMaterial(right, "right"); materialsList.addMaterial(left, "left"); // Create the cube cube3D = new Cube(materialsList,250,250,250); cube3D.z = -400; // Some listeners to enable/disable drawing cube3D.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onObjectPress); cube3D.addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE, onObjectRelease); // Add cube to scene scene.addChild( cube3D ); // GO! startRendering(); } private function onMovieClipOver(e:MouseEvent):void { if ( faceOver != e.target.name ) { faceOver = e.target.name; currentCanvas = Sprite(e.target["canvas"]); /* if ( isDrawingEnabled && currentCanvas != null) { currentCanvas.graphics.moveTo( virtualMouse.x, virtualMouse.y ); }*/ } } private function onObjectPress(event:InteractiveScene3DEvent):void { isDrawingEnabled = true; // I used this for lines //currentCanvas.graphics.moveTo( virtualMouse.x, virtualMouse.y ); } private function onObjectRelease(event:InteractiveScene3DEvent):void { isDrawingEnabled = false; } private function doodle():void { // LINES________________________________________________________ // currentCanvas.graphics.lineStyle(5, Math.random()* 0xFFFFFF); // currentCanvas.graphics.lineTo(virtualMouse.x, virtualMouse.y); // CIRCLES______________________________________________________________ currentCanvas.graphics.beginFill(Math.random() * 0xffffff); currentCanvas.graphics.drawCircle(virtualMouse.x, virtualMouse.y, 5); currentCanvas.graphics.endFill(); } override protected function onRenderTick(event:Event=null):void { super.onRenderTick(event); if ( isDrawingEnabled ) { doodle(); } cube3D.rotationX ++; cube3D.rotationY ++; cube3D.rotationZ ++; } } }