package org.mt4j.input.gestureAction;
import org.mt4j.components.MTComponent;
import org.mt4j.components.interfaces.IMTComponent3D;
import org.mt4j.components.visibleComponents.shapes.MTPolygon;
import org.mt4j.input.inputProcessors.IGestureEventListener;
import org.mt4j.input.inputProcessors.MTGestureEvent;
import org.mt4j.input.inputProcessors.componentProcessors.rotate3DProcessor.Cluster3DExt;
import org.mt4j.input.inputProcessors.componentProcessors.rotate3DProcessor.Rotate3DEvent;
import processing.core.PApplet;
public class Rotate3DAction implements IGestureEventListener,ICollisionAction {
private IMTComponent3D target;
private boolean gestureAborted = false;
private PApplet pApplet;
private Rotate3DEvent lastRotateEvent;
private boolean registered = false;
private boolean drawAble = false;
public Rotate3DAction(PApplet pApplet,IMTComponent3D target)
{
this.target = target;
this.pApplet = pApplet;
}
public boolean processGestureEvent(MTGestureEvent ge) {
if(ge instanceof Rotate3DEvent)
{
Rotate3DEvent rotateEvent = (Rotate3DEvent)ge;
this.drawAble = true;
lastRotateEvent = rotateEvent;
switch (rotateEvent.getId()) {
case MTGestureEvent.GESTURE_STARTED:
if (target instanceof MTComponent){
((MTComponent)target).sendToFront();
if(!(target instanceof Cluster3DExt))
{
target.rotateZGlobal(rotateEvent.getRotationPoint(), rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesZ());
target.rotateXGlobal(rotateEvent.getRotationPoint(),rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesX());
target.rotateYGlobal(rotateEvent.getRotationPoint(),rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesY());
}else
{
Cluster3DExt clu = (Cluster3DExt)target;
for(MTComponent comp : clu.getChildren())
{
//only move children, not cluster itself
//cause it should stay on the floor
if(!(comp instanceof MTPolygon))
{
comp.rotateZGlobal(rotateEvent.getRotationPoint(), rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesZ());
comp.rotateXGlobal(rotateEvent.getRotationPoint(),rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesX());
comp.rotateYGlobal(rotateEvent.getRotationPoint(),rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesY());
}
}
}
}
break;
case MTGestureEvent.GESTURE_UPDATED:
if(!(target instanceof Cluster3DExt))
{
// System.out.println("Rotating: " + target + "\n RotationPoint: " + rotateEvent.getRotationPoint() + " ZrotDeg: " + rotateEvent.getRotationDegreesZ() + " XrotDeg: " + rotateEvent.getRotationDegreesX() + " YrotDeg: " + rotateEvent.getRotationDegreesY());
target.rotateZGlobal(rotateEvent.getRotationPoint(), rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesZ());
target.rotateXGlobal(rotateEvent.getRotationPoint(),rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesX());
target.rotateYGlobal(rotateEvent.getRotationPoint(),rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesY());
}else
{
Cluster3DExt clu = (Cluster3DExt)target;
for(MTComponent comp : clu.getChildren())
{
//only move children, not cluster itself
//cause it should stay on the floor
if(!(comp instanceof MTPolygon))
{
comp.rotateZGlobal(rotateEvent.getRotationPoint(), rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesZ());
comp.rotateXGlobal(rotateEvent.getRotationPoint(),rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesX());
comp.rotateYGlobal(rotateEvent.getRotationPoint(),rotateEvent.getRotationDirection()*rotateEvent.getRotationDegreesY());
}
}
}
break;
case MTGestureEvent.GESTURE_ENDED:
break;
case MTGestureEvent.GESTURE_CANCELED:
break;
default:
break;
}
return true;
}
return false;
}
public void draw()
{
/*
if(lastRotateEvent!=null)
{
//Tools3D.beginGL(pApplet);
GL gl = Tools3D.getGL(pApplet);
gl.glPointSize(5.0f);
gl.glLineWidth(100.0f);
gl.glColor3f(255.0f,0.0f,0.0f);
gl.glBegin(GL.GL_POINTS);
System.out.println(lastRotateEvent.getRotationPoint());
gl.glVertex3f(lastRotateEvent.getRotationPoint().x,lastRotateEvent.getRotationPoint().y,lastRotateEvent.getRotationPoint().z);
gl.glEnd();
gl.glBegin(GL.GL_LINES);
Vector3D rotPoint = Tools3D.projectPointToPlane(lastRotateEvent.getRotationPoint(), ((MTApplication)pApplet).getScenes()[0].getSceneCam().getFrustum(), ((MTApplication)pApplet).getScenes()[0].getSceneCam().getFrustum().getZValueOfNearPlane()-0.001f, (MTApplication)pApplet);
gl.glVertex3f(rotPoint.x,rotPoint.y,rotPoint.z);
Vector3D axisAdded = rotPoint.getAdded(lastRotateEvent.getRotationAxis());
//axisAdded.scaleLocal(20.0f);
gl.glVertex3f(axisAdded.x, axisAdded.y, axisAdded.z);
gl.glVertex3f(300.0f,400.0f,((MTApplication)pApplet).getScenes()[0].getSceneCam().getFrustum().getZValueOfNearPlane()-1.0f);
gl.glVertex3f(400.0f,300.0f,((MTApplication)pApplet).getScenes()[0].getSceneCam().getFrustum().getZValueOfNearPlane()-1.0f);
gl.glEnd();
//Tools3D.endGL(pApplet);*/
//}
}
public boolean gestureAborted() {
return this.gestureAborted;
}
public void setGestureAborted(boolean aborted) {
this.gestureAborted = aborted;
}
public void setDrawAble(boolean drawAble) {
this.drawAble = drawAble;
}
public boolean isDrawAble() {
return drawAble;
}
public MTGestureEvent getLastEvent() {
return this.lastRotateEvent;
}
}