/*
JWildfire - an image and animation processor written in Java
Copyright (C) 1995-2011 Andreas Maschke
This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This software 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this software;
if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jwildfire.create.tina.dance.motion;
import java.util.List;
import org.jwildfire.create.tina.base.Flame;
import org.jwildfire.create.tina.dance.DancingFlame;
import org.jwildfire.create.tina.dance.DancingFlameProject;
import org.jwildfire.create.tina.dance.model.AnimationModelService;
public class DanceFlameTransformer {
private final DancingFlameProject project;
public DanceFlameTransformer(DancingFlameProject pProject) {
project = pProject;
}
public Flame createTransformedFlame(DancingFlame pFlame, short pFFTData[], long pTime, int pFPS) {
Flame res = pFlame.getFlame().makeCopy();
List<Motion> motions = project.getMotions(res);
Flame refFlame = res.makeCopy();
for (FlamePreprocessor preprocessor : project.getPreprocessors()) {
if (preprocessor.isActive(pTime, pFPS)) {
res = preprocessor.preprocessFlame(project, res).makeCopy();
if (preprocessor instanceof FlameMotionPreprocessor) {
motions = ((FlameMotionPreprocessor) preprocessor).preprocessMotions(project, motions);
refFlame = res.makeCopy();
}
}
}
for (Motion motion : motions) {
if (motion.getParent() == null && motion.isActive(pTime, pFPS)) {
double value = 0.0;
int iter = 0;
Motion currMotion = motion;
while (currMotion != null) {
value += currMotion.computeValue(pFFTData, pTime, pFPS);
Motion refMotion = currMotion;
currMotion = null;
for (Motion nextMotion : motions) {
if (nextMotion.isActive(pTime, pFPS) && nextMotion.getParent() == refMotion) {
currMotion = nextMotion;
break;
}
}
iter++;
if (iter > 100) {
throw new RuntimeException("Probably endless loop detected");
}
}
for (MotionLink link : motion.getMotionLinks()) {
if (link.getProperyPath().getFlame().isEqual(refFlame)) {
AnimationModelService.setFlameProperty(res, link.getProperyPath(), value);
}
}
}
}
return res;
}
}