/** * @author shanejohnson * {@link http://www.ultravisual.co.uk} * created on 27 Apr 2009 */ package { import fr.seraf.wow.constraint.WSpringConstraint; import fr.seraf.wow.core.WOWEngine; import fr.seraf.wow.core.data.WVector; import fr.seraf.wow.primitive.WParticle; import org.papervision3d.core.geom.renderables.Vertex3D; import org.papervision3d.core.math.Number3D; import org.papervision3d.core.math.Plane3D; import org.papervision3d.core.utils.Mouse3D; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.materials.BitmapMaterial; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.BasicView; import flash.display.Bitmap; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.DropShadowFilter; [SWF(width="550", height="400", frameRate="31")] public class WOW_Cloth_Main extends BasicView { [Embed(source="assets/rug.jpg")] public var image:Class; private var drop:DropShadowFilter = new DropShadowFilter(100, 25, 0x333333, .6, 30, 30, 1, 2); private var rug:Plane; private var rugMat:BitmapMaterial; private var pVerts:Array; private var pvVertex:Vertex3D; private var wowEngine:WOWEngine; private var wowVerts:Array; private var isDragging:Boolean = false; private var clickedVert:WParticle; private var segWidth:int = 8; private var segHeight:int = 4; private var i:int; public var plane:Plane3D; private var stiffNess:Number = .95; public function WOW_Cloth_Main():void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.quality = StageQuality.LOW; initMats(); } private function initMats():void { rugMat = new BitmapMaterial(Bitmap(new image()).bitmapData, true); rugMat.doubleSided = true; rugMat.precise = true; rugMat.interactive = true; PV3Dinit(); } private function PV3Dinit():void { viewport.containerSprite.buttonMode = true; viewport.interactive = true; viewport.filters = [drop]; this.addChild(viewport); camera.z = -100; camera.x = 0; camera.zoom = 10; rug = new Plane(rugMat, 200, 100, segWidth, segHeight); rug.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, dragRug); pVerts = rug.geometry.vertices; rug.moveUp(100); scene.addChild(rug); plane = new Plane3D(); plane.setNormalAndPoint(new Number3D(0, 1, 0), new Number3D(0, 0, 0)); initWOW(); } private function initWOW():void { wowEngine = new WOWEngine(.3); wowEngine.addMasslessForce(new WVector(0, 30, 0)); wowVerts = new Array(); for(i = 0; i< pVerts.length; i++) { var wp:WParticle = new WParticle(pVerts[i].x, -pVerts[i].y, pVerts[i].z, false, 10); wp.elasticity = 0; wp.friction = 0; wowEngine.addParticle(wp); wowVerts.push(wp); } wowVerts.reverse(); wowVerts[0].fixed = true; wowVerts[(segHeight+1)*segWidth].fixed = true; for(i = 0; i(segHeight+1)) { wowEngine.addConstraint(new WSpringConstraint(wowVerts[i], wowVerts[i-segHeight-1], stiffNess)); } if((i+1)%(segHeight+1) != 0) { wowEngine.addConstraint(new WSpringConstraint(wowVerts[i], wowVerts[i+1], stiffNess)); } if(i % (segHeight+1) != 0) { wowEngine.addConstraint(new WSpringConstraint(wowVerts[i], wowVerts[i-1], stiffNess)); } } addEventListener(Event.ENTER_FRAME, loop); } private function dragRug(event:InteractiveScene3DEvent):void { rug.removeEventListener(InteractiveScene3DEvent.OBJECT_PRESS, dragRug); this.stage.addEventListener(MouseEvent.MOUSE_UP, releaseRug); pvVertex = event.face3d.vertices[1]; for(i = 0; i < wowVerts.length; i++) { if((wowVerts[i].px == pvVertex.x) && (wowVerts[i].py == -pvVertex.y) && (wowVerts[i].pz == pvVertex.z)) { wowVerts[i].fixed = true; clickedVert = wowVerts[i]; } } isDragging = true; } private function releaseRug(event:MouseEvent):void { clickedVert.fixed = false; rug.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, dragRug); this.stage.removeEventListener(MouseEvent.MOUSE_UP, releaseRug); isDragging = false; } private function loop(event:Event):void { if(isDragging) { var point:Number3D = new Number3D(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY, 100-(viewport.containerSprite.mouseY/4)); pvVertex.x = -point.x; pvVertex.y = -point.y; pvVertex.z = -point.z; clickedVert.px = point.x; clickedVert.py = point.y; clickedVert.pz = point.z; trace("Z : " + point.z); } wowEngine.step(); for(i = 0; i < pVerts.length; i++) { pVerts[i].x = wowVerts[i].px; pVerts[i].y = -wowVerts[i].py; pVerts[i].z = wowVerts[i].pz; } singleRender(); } } }