List<Variation> vars1 = new ArrayList<Variation>();
List<Variation> vars2 = new ArrayList<Variation>();
HashMap<String, String> processed = new HashMap<String, String>();
for (int i = 0; i < pXForm1.getVariationCount(); i++) {
Variation var1 = pXForm1.getVariation(i);
String fncName = var1.getFunc().getName();
processed.put(fncName, fncName);
vars1.add(var1);
// search the same func in xForm2
Variation var2 = null;
for (int j = 0; j < pXForm2.getVariationCount(); j++) {
var2 = pXForm2.getVariation(j);
if (var2.getFunc().getName().equals(fncName)) {
break;
}
else {
var2 = null;
}
}
if (var2 != null) {
vars2.add(var2);
}
else {
vars2.add(new Variation(0.0, VariationFuncList.getVariationFuncInstance(var1.getFunc().getName(), true)));
}
}
for (int i = 0; i < pXForm2.getVariationCount(); i++) {
Variation var2 = pXForm2.getVariation(i);
String fncName = var2.getFunc().getName();
if (processed.get(fncName) == null) {
vars2.add(var2);
vars1.add(new Variation(0.0, VariationFuncList.getVariationFuncInstance(var2.getFunc().getName(), true)));
}
}
if (vars1.size() != vars2.size()) {
throw new IllegalStateException();
}
for (int i = 0; i < vars1.size(); i++) {
Variation var1 = vars1.get(i);
Variation var2 = vars2.get(i);
if (!var1.getFunc().getName().equals(var2.getFunc().getName())) {
throw new IllegalStateException();
}
// System.out.println(i + ": " + var1.getFunc().getName() + " " + var1.getAmount() + " " + var2.getAmount());
double amount = morphValue(var1.getAmount(), var2.getAmount(), pFScl);
Variation var = res.addVariation(amount, var1.getFunc());
// params
if (var.getFunc().getParameterNames() != null && var.getFunc().getParameterNames().length > 0) {
Object val[] = var.getFunc().getParameterValues();
Object val1[] = var1.getFunc().getParameterValues();
Object val2[] = var2.getFunc().getParameterValues();
for (int j = 0; j < var.getFunc().getParameterNames().length; j++) {
String name = var.getFunc().getParameterNames()[j];
if (val[j] instanceof Integer) {
int mVal = morphValue((Integer) val1[j], (Integer) val2[j], pFScl);
if (mVal == 0 && name.equals("power")) {
mVal = 1;
}
// int mVal = pFScl >= 0.5 ? (Integer) val2[j] : (Integer) val1[j];
// System.out.println(" " + name + " " + mVal + " (" + val1[j] + " " + val2[j] + ")");
var.getFunc().setParameter(name, mVal);
}
else if (val[j] instanceof Double) {
double mVal = morphValue((Double) val1[j], (Double) val2[j], pFScl);
// System.out.println(" " + name + " " + mVal + " (" + val1[j] + " " + val2[j] + ")");
var.getFunc().setParameter(name, mVal);
}
else {
throw new IllegalStateException();
}
}
}
// ressources
if (var.getFunc().getRessourceNames() != null && var.getFunc().getRessourceNames().length > 0) {
Object ress1[] = var1.getFunc().getRessourceValues();
Object ress2[] = var2.getFunc().getRessourceValues();
for (int j = 0; j < var.getFunc().getRessourceNames().length; j++) {
String name = var.getFunc().getRessourceNames()[j];
if (name.equalsIgnoreCase(SubFlameWFFunc.RESSOURCE_FLAME) && var.getFunc().getName().indexOf("subflame_wf") >= 0) {
String flame1XML = new String((byte[]) ress1[j]);
String flame2XML = new String((byte[]) ress2[j]);
try {
Flame flame1 = new FlameReader(pPrefs).readFlamesfromXML(flame1XML).get(0);
Flame flame2 = new FlameReader(pPrefs).readFlamesfromXML(flame2XML).get(0);
Flame morphedFlame = morphFlames(pPrefs, FlameMorphType.MORPH, flame1, flame2, pFrame, pFrames);
String morphedFlameXML = new FlameWriter().getFlameXML(morphedFlame);
var.getFunc().setRessource(SubFlameWFFunc.RESSOURCE_FLAME, morphedFlameXML.getBytes());
}
catch (Exception ex) {
ex.printStackTrace();
}