/**
* Copyright soh1106c ( http://wonderfl.net/user/soh1106c )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/1aae
*/
package {
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Vector3D;
import flash.display.*;
import jiglib.geometry.*;
import jiglib.math.*;
import jiglib.physics.*;
import jiglib.physics.constraint.*;
import jiglib.plugin.papervision3d.*;
import org.papervision3d.cameras.CameraType;
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.*;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.*;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.view.BasicView;
import org.papervision3d.view.layer.ViewportLayer;
import org.papervision3d.view.layer.util.ViewportLayerSortMode;
import org.papervision3d.objects.parsers.*;
[SWF(width="800",height="600",backgroundColor="#ffffff",frameRate="60")]
public class penholder extends BasicView {
private var mylight:PointLight3D;
private var mouse3D:Mouse3D;
private var wireframeMateria:WireframeMaterial;
private var shadeMateria:GouraudMaterial;
private var onDraging:Boolean=false;
private var currDragBody:RigidBody;
private var dragConstraint:JConstraintWorldPoint;
private var startMousePos:Vector3D;
private var planeToDragOn:Plane3D;
private var physics:Papervision3DPhysics;
private var staplerSkin:DAE;
private var staplerBox:RigidBody;
private var pencilSkin:DAE;
private var pencilBox:RigidBody;
private var ground1:RigidBody;
private var ground2:RigidBody;
private var ground3:RigidBody;
private var ground4:RigidBody;
private var ground5:RigidBody;
private var boxBody1:Vector.<RigidBody>;
private var boxBody2:Vector.<RigidBody>;
private var boxBody3:Vector.<RigidBody>;
public function penholder() {
super(800, 600, true, true, CameraType.TARGET);
stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseRelease);
stage.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
init3D();
}
private function init3D():void {
var cameraTarget:DisplayObject3D=new DisplayObject3D();
cameraTarget.x=0;
cameraTarget.y=1100;
cameraTarget.z=0;
camera.target=cameraTarget;
physics=new Papervision3DPhysics(scene,8);
Mouse3D.enabled=true;
mouse3D=viewport.interactiveSceneManager.mouse3D;
viewport.containerSprite.sortMode = ViewportLayerSortMode.INDEX_SORT;
mylight=new PointLight3D(true,true);
mylight.y=0;
mylight.z=-600;
var vplObjects:ViewportLayer = new ViewportLayer(viewport,null);
vplObjects.layerIndex = 2;
vplObjects.sortMode = ViewportLayerSortMode.Z_SORT;
viewport.containerSprite.addLayer(vplObjects);
wireframeMateria=new WireframeMaterial(0xff0000,0);
wireframeMateria.interactive=true;
var materiaList = new MaterialsList();
materiaList.addMaterial(wireframeMateria,"all");
shadeMateria=new GouraudMaterial(mylight,0xeeee00);
shadeMateria.interactive=true;
var materiaList2 = new MaterialsList();
materiaList2.addMaterial(shadeMateria,"all");
//Penholder
var penholder:DAE=new DAE;
penholder.load("http://soh1106.lolipop.jp/res/bungu/penholder.DAE");
penholder.scale=6.5;
scene.addChild(penholder);
//create Stapler
boxBody1=new Vector.<RigidBody>();
for (var i:int = 0; i <2; i++) {
staplerSkin=new DAE;
staplerSkin.load("http://soh1106.lolipop.jp/res/bungu/stapler.DAE");
staplerSkin.scale=2*2.5;
scene.addChild(staplerSkin);
var staplerBox=new JBox(new Pv3dMesh(staplerSkin),140*2.5,140*2.5,500*2.5);
staplerBox.rotationX=-40;
physics.addBody(staplerBox);
boxBody1[i]=staplerBox;
boxBody1[i].moveTo(new Vector3D( 0, 6000*2.5+(i*500*2.5) , 0));
vplObjects.addDisplayObject3D(physics.getMesh(boxBody1[i]));
}
//create Pencil
boxBody3=new Vector.<RigidBody>();
for (i = 0; i <30; i++) {
pencilSkin=new DAE;
pencilSkin.load("http://soh1106.lolipop.jp/res/bungu/pencil.DAE");
pencilSkin.scale=5*1.4;
scene.addChild(pencilSkin);
var pencilBox=new JBox(new Pv3dMesh(pencilSkin),100*1.4,100*1.4,1200*1.4);
pencilBox.rotationX=0;
physics.addBody(pencilBox);
boxBody3[i]=pencilBox;
boxBody3[i].moveTo(new Vector3D( 0, 4000+(i*1600*1.4) , 0));
vplObjects.addDisplayObject3D(physics.getMesh(boxBody3[i]));
}
//create Cube(for Drag)
boxBody2=new Vector.<RigidBody>();
for (i= 0; i < 0; i++) {
boxBody2[i]=physics.createCube(materiaList2,100,100,1600);
physics.getMesh(boxBody2[i]).addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, handleMousePress);
boxBody2[i].moveTo(new Vector3D(0,1000, 0));
}
//create Ground(for Penholder)
ground1= physics.createCube(materiaList, 800, 800, 100);
ground1.y = 250;
ground1.movable = false;
ground2 = physics.createCube(materiaList,800, 100, 1300);
ground2.y = 780;
ground2.z = -400;
ground2.movable = false;
ground3 = physics.createCube(materiaList,800, 100, 1300);
ground3.y = 780;
ground3.z = 400;
ground3.movable = false;
ground4 = physics.createCube(materiaList,800, 100, 1300);
ground4.y = 780;
ground4.x = -400;
ground4.rotationY=90;
ground4.movable = false;
ground5 = physics.createCube(materiaList,800, 100, 1300);
ground5.y = 780;
ground5.x = 400;
ground5.rotationY=90;
ground5.movable = false;
camera.y=mylight.y;
camera.z=mylight.z;
startRendering();
}
//Drag
private function findSkinBody(skin:DisplayObject3D):int {
for (var i:String in PhysicsSystem.getInstance().bodies) {
if (skin==physics.getMesh(PhysicsSystem.getInstance().bodies[i])) {
return int(i);
}
}
return -1;
}
private function handleMousePress(event:InteractiveScene3DEvent):void {
onDraging=true;
startMousePos=new Vector3D(mouse3D.x,mouse3D.y,mouse3D.z);
currDragBody=PhysicsSystem.getInstance().bodies[findSkinBody(event.displayObject3D)];
planeToDragOn=new Plane3D(new Number3D(0,0,-1),new Number3D(0,0,- startMousePos.z));
var bodyPoint:Vector3D=startMousePos.subtract(currDragBody.currentState.position);
dragConstraint=new JConstraintWorldPoint(currDragBody,bodyPoint,startMousePos);
PhysicsSystem.getInstance().addConstraint(dragConstraint);
}
private function handleMouseMove(event:MouseEvent):void {
if (onDraging) {
var ray:Number3D=camera.unproject(viewport.containerSprite.mouseX,viewport.containerSprite.mouseY);
ray=Number3D.add(ray,new Number3D(camera.x,camera.y,camera.z));
var cameraVertex3D:Vertex3D=new Vertex3D(camera.x,camera.y,camera.z);
var rayVertex3D:Vertex3D=new Vertex3D(ray.x,ray.y,ray.z);
var intersectPoint:Vertex3D=planeToDragOn.getIntersectionLine(cameraVertex3D,rayVertex3D);
dragConstraint.worldPosition=new Vector3D(intersectPoint.x,intersectPoint.y,intersectPoint.z);
}
}
private function handleMouseRelease(event:MouseEvent):void {
if (onDraging) {
onDraging=false;
PhysicsSystem.getInstance().removeConstraint(dragConstraint);
currDragBody.setActive();
}
}
//Reset
private function resetBox():void
{
for (var i:int = 0; i < boxBody1.length;i++ )
{
if (boxBody1[i].currentState.position.y < 0)
{
boxBody1[i].moveTo(new Vector3D(0, 6000*2.5+(i*500*2.5), 0));
}
}
for (i = 0; i < boxBody2.length;i++ )
{
if (boxBody2[i].currentState.position.y < -1000)
{
boxBody2[i].moveTo(new Vector3D(0, 1000+(i*100), 0));
}
}
for (i = 0; i < boxBody3.length;i++ )
{
if (boxBody3[i].currentState.position.y < -1000)
{
boxBody3[i].moveTo(new Vector3D(0, 4000+(i*1200*1.4*0.3), 0));
}
}
}
//Rendering
protected override function onRenderTick(event:Event = null):void {
var rot:Number=(mouseX/stage.stageWidth)*720;
camera.x=3000*Math.sin(rot*Math.PI/180);
camera.z=3000*Math.cos(rot*Math.PI/180);
camera.y=6000*(mouseY/stage.stageHeight);
// physics.step();//dynamic timeStep
physics.engine.integrate(0.5);//static timeStep
resetBox();
super.onRenderTick(event);
}
}
}