/* * JAME 6.2.1 * http://jame.sourceforge.net * * Copyright 2001, 2016 Andrea Medeghini * * This file is part of JAME. * * JAME is an application for creating fractals and other graphics artifacts. * * JAME is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JAME is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with JAME. If not, see <http://www.gnu.org/licenses/>. * */ package net.sf.jame.core.media; import java.awt.geom.AffineTransform; public final class MotionTweenSequence extends GraphicsSequence { private final AbstractGraphics object; private final Effect effect; private int frames = 0; private int frame = 0; private float rotation; private float translationx; private float translationy; private float shearx; private float sheary; private float scalex; private float scaley; private final float delta_rotation; private final float delta_translationx; private final float delta_translationy; private final float delta_shearx; private final float delta_sheary; private final float delta_scalex; private final float delta_scaley; private final float copy_rotation; private final float copy_translationx; private final float copy_translationy; private final float copy_shearx; private final float copy_sheary; private final float copy_scalex; private final float copy_scaley; private final AffineTransform transform; public MotionTweenSequence(final AbstractGraphics object, final int frames, final float rotation, final float translationx, final float translationy, final float shearx, final float sheary, final float scalex, final float scaley, final Effect effect) { this.object = object; this.effect = effect; this.frames = frames; copy_rotation = rotation; copy_translationx = translationx; copy_translationy = translationy; copy_shearx = shearx; copy_sheary = sheary; copy_scalex = scalex; copy_scaley = scaley; delta_rotation = rotation / (frames - 1); delta_translationx = translationx / (frames - 1); delta_translationy = translationy / (frames - 1); delta_shearx = shearx / (frames - 1); delta_sheary = sheary / (frames - 1); delta_scalex = scalex / (frames - 1); delta_scaley = scaley / (frames - 1); transform = (AffineTransform) object.getTransform().clone(); } @Override public Object clone() throws CloneNotSupportedException { if (effect != null) { return new MotionTweenSequence((AbstractGraphics) object.clone(), frames, copy_rotation, copy_translationx, copy_translationy, copy_shearx, copy_sheary, copy_scalex, copy_scaley, (Effect) effect.clone()); } else { return new MotionTweenSequence((AbstractGraphics) object.clone(), frames, copy_rotation, copy_translationx, copy_translationy, copy_shearx, copy_sheary, copy_scalex, copy_scaley, null); } } @Override public AbstractObject getObject() { return object; } @Override public Effect getEffect() { return effect; } @Override public int getFrames() { return frames; } @Override public int getFrame() { return frame; } @Override public boolean isFirstFrame() { return (frame == 0); } @Override public boolean isLastFrame() { return (frame == (frames - 1)); } @Override void build(final Controller controller, final Movie parent, final Layer layer) { if (object != null) { object.build(controller, parent, layer, this); } } @Override void init() { if (effect != null) { effect.init(frames); } if (object != null) { object.init(); } frame = 0; rotation = 0; translationx = 0; translationy = 0; shearx = 0; sheary = 0; scalex = 0; scaley = 0; } @Override void kill() { if (object != null) { object.kill(); } } @Override void reset() { if (effect != null) { effect.reset(); } if (object != null) { object.reset(); } frame = 0; rotation = 0; translationx = 0; translationy = 0; shearx = 0; sheary = 0; scalex = 0; scaley = 0; } @Override void setFrame(final int frame) { this.frame = frame; if ((this.frame >= 0) && (this.frame < frames)) { rotation = delta_rotation * frame; translationx = delta_translationx * frame; translationy = delta_translationy * frame; shearx = delta_shearx * frame; sheary = delta_sheary * frame; scalex = delta_scalex * frame; scaley = delta_scaley * frame; object.setTransform(transform); object.translate(translationx, translationy); object.rotate(rotation); object.shear(shearx, sheary); object.scale(1 + scalex, 1 + scaley); if (effect != null) { effect.setFrame(frame); } if (object instanceof Animate) { ((Animate) object).setFrame(frame); } } } @Override void nextFrame() { frame = frame + 1; if ((frame >= 0) && (frame < frames)) { rotation += delta_rotation; translationx += delta_translationx; translationy += delta_translationy; shearx += delta_shearx; sheary += delta_sheary; scalex += delta_scalex; scaley += delta_scaley; object.setTransform(transform); object.translate(translationx, translationy); object.rotate(rotation); object.shear(shearx, sheary); object.scale(1 + scalex, 1 + scaley); if (effect != null) { effect.nextFrame(); } if (object instanceof Animate) { ((Animate) object).nextFrame(); } } } @Override void prevFrame() { frame = frame - 1; if ((frame >= 0) && (frame < frames)) { rotation -= delta_rotation; translationx -= delta_translationx; translationy -= delta_translationy; shearx -= delta_shearx; sheary -= delta_sheary; scalex -= delta_scalex; scaley -= delta_scaley; object.setTransform(transform); object.translate(translationx, translationy); object.rotate(rotation); object.shear(shearx, sheary); object.scale(1 + scalex, 1 + scaley); if (effect != null) { effect.prevFrame(); } if (object instanceof Animate) { ((Animate) object).prevFrame(); } } } }