package circdesignagui;
import processing.core.PApplet;
import processing.core.PConstants;
import processing.core.PMatrix3D;
public class MolecularDeformation implements PConstants{
private PApplet g;
public MolecularDeformation(PApplet parent){
g = parent;
}
private int state;
private double rotation;
private float pitchandroll = PI / 16;
private boolean enabled = true;
public void setEnabled(boolean enabled){
this.enabled = enabled;
}
public boolean isNullTransform(){
return rotation==0;
}
public void reset(){
state = 0;
}
public void twist(double theta){
rotation = Math.max(0,theta+rotation);
}
public void run(int ticks){
if (!enabled){
return;
}
if (ticks < 0){
state += ticks;
}
/*
if (state == 0){
g.rotateZ((float)(rotation*Math.signum(ticks)));
}
*/
float newtheta = (float)(rotation - state * pitchandroll);
if (newtheta <= 0){
//Do nothing.
} else {
g.rotateX(pitchandroll*ticks/(1+PApplet.exp(-newtheta)));
g.rotateY(pitchandroll*ticks/(1+PApplet.exp(-newtheta)));
}
if (ticks > 0){
state += ticks;
}
}
public void unrotate() {
if (!enabled){
return;
}
float scale = PApplet.sqrt(PApplet.sq(g.modelX(1,0,0)-g.modelX(0,0,0))+PApplet.sq(g.modelY(1,0,0)-g.modelY(0,0,0))+PApplet.sq(g.modelZ(1,0,0)-g.modelZ(0,0,0)));
//Remove all deformation, but keep scaling and position.
PMatrix3D m = (PMatrix3D)g.getMatrix();
m.set(1,0,0,m.m03,0,1,0,m.m13,0,0,1,m.m23,m.m30,m.m31,m.m32,m.m33);
g.setMatrix(m);
g.scale(scale);
}
}