/* JWildfire - an image and animation processor written in Java Copyright (C) 1995-2015 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.leapmotion; import org.jwildfire.create.tina.base.Flame; import org.jwildfire.create.tina.base.Layer; import org.jwildfire.create.tina.base.XForm; import org.jwildfire.create.tina.base.motion.MotionCurve; import org.jwildfire.create.tina.transform.XFormTransformService; import org.jwildfire.create.tina.variation.Variation; public enum LeapMotionOutputChannel { XFORM_RESET_ANGLES { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { xform.setCoeff00(1.0); xform.setCoeff01(0.0); xform.setCoeff10(0.0); xform.setCoeff11(1.0); } } @Override public int getIndexCount() { return 1; } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { return null; } }, XFORM_MOVE_X { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); pProperty.setOffset(xform.getCoeff20()); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { xform.setCoeff20(pValue); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getXYCoeff20Curve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, XFORM_MOVE_Y { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); pProperty.setOffset(xform.getCoeff21()); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { xform.setCoeff21(pValue); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getXYCoeff21Curve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, XFORM_ROTATE { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { XFormTransformService.rotate(xform, pValue, false); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getXYRotateCurve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, XFORM_SCALE { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { XFormTransformService.scale(xform, pValue, true, true, false); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getXYScaleCurve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, XFORM_RESET_POST { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { xform.setPostCoeff00(1.0); xform.setPostCoeff01(0.0); xform.setPostCoeff10(0.0); xform.setPostCoeff11(1.0); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { return null; } @Override public int getIndexCount() { return 1; } }, XFORM_MOVE_X_POST { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); pProperty.setOffset(xform.getPostCoeff20()); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { xform.setPostCoeff20(pValue); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getXYPostCoeff20Curve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, XFORM_MOVE_Y_POST { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); pProperty.setOffset(xform.getPostCoeff21()); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { xform.setPostCoeff21(pValue); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getXYPostCoeff21Curve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, XFORM_ROTATE_POST { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { XFormTransformService.rotate(xform, pValue, true); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getXYPostRotateCurve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, XFORM_SCALE_POST { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { XFormTransformService.scale(xform, pValue, true, true, true); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getXYPostScaleCurve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, XFORM_WEIGHT { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { pProperty.setEnabled(true); pProperty.setOffset(xform.getWeight()); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { xform.setWeight(pValue); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { return xform.getWeightCurve(); } else { return null; } } @Override public int getIndexCount() { return 1; } }, FORMULA_AMOUNT { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { Variation var = getVariationByIndex(pProperty, pFlame); if (var != null) { pProperty.setEnabled(true); pProperty.setOffset(var.getAmount()); } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { Variation var = getVariationByIndex(pProperty, pFlame); if (var != null) { var.setAmount(pValue); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { Variation var = getVariationByIndex(pProperty, pFlame); if (var != null) { return var.getAmountCurve(); } else { return null; } } @Override public int getIndexCount() { return 2; } }, FORMULA_PARAM_AMOUNT { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { Variation var = getVariationByIndex(pProperty, pFlame); if (var != null && pProperty.getIndex3() >= 0 && pProperty.getIndex3() < var.getFunc().getParameterNames().length) { pProperty.setEnabled(true); Object value = var.getFunc().getParameterValues()[pProperty.getIndex3()]; if (value instanceof Double) { pProperty.setOffset((Double) value); } else if (value instanceof Integer) { pProperty.setOffset((Integer) value); } } else { pProperty.setEnabled(false); } } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { Variation var = getVariationByIndex(pProperty, pFlame); if (var != null && pProperty.getIndex3() >= 0 && pProperty.getIndex3() < var.getFunc().getParameterNames().length) { String paramName = var.getFunc().getParameterNames()[pProperty.getIndex3()]; var.getFunc().setParameter(paramName, pValue); } } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { Variation var = getVariationByIndex(pProperty, pFlame); if (var != null && pProperty.getIndex3() >= 0 && pProperty.getIndex3() < var.getFunc().getParameterNames().length) { String paramName = var.getFunc().getParameterNames()[pProperty.getIndex3()]; MotionCurve curve = var.getMotionCurve(paramName); if (curve == null) { curve = var.createMotionCurve(paramName); } return curve; } else { return null; } } @Override public int getIndexCount() { return 3; } }, CAM_MOVE_X { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { pProperty.setEnabled(true); pProperty.setOffset(pFlame.getCamPosX()); } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { pFlame.setCamPosX(pValue); } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { return pFlame.getCamPosXCurve(); } @Override public int getIndexCount() { return 0; } }, CAM_MOVE_Y { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { pProperty.setEnabled(true); pProperty.setOffset(pFlame.getCamPosX()); } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { pFlame.setCamPosY(pValue); } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { return pFlame.getCamPosYCurve(); } @Override public int getIndexCount() { return 0; } }, CAM_ZOOM { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { pProperty.setEnabled(true); pProperty.setOffset(pFlame.getPixelsPerUnit()); } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { pFlame.setPixelsPerUnit(pValue); } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { return pFlame.getPixelsPerUnitCurve(); } @Override public int getIndexCount() { return 0; } }, CAM_ROLL { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { pProperty.setEnabled(true); pProperty.setOffset(pFlame.getCamRoll()); } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { pFlame.setCamRoll(pValue); } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { return pFlame.getCamRollCurve(); } @Override public int getIndexCount() { return 0; } }, CAM_PITCH { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { pProperty.setEnabled(true); pProperty.setOffset(pFlame.getCamPitch()); } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { pFlame.setCamPitch(pValue); } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { return pFlame.getCamPitchCurve(); } @Override public int getIndexCount() { return 0; } }, CAM_YAW { @Override public void init(LeapMotionConnectedProperty pProperty, Flame pFlame) { pProperty.setEnabled(true); pProperty.setOffset(pFlame.getCamYaw()); } @Override public void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue) { pFlame.setCamYaw(pValue); } @Override public MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame) { return pFlame.getCamYawCurve(); } @Override public int getIndexCount() { return 0; } }; public abstract void init(LeapMotionConnectedProperty pProperty, Flame pFlame); private static Variation getVariationByIndex(LeapMotionConnectedProperty pProperty, Flame pFlame) { XForm xform = getXFormByIndex(pProperty, pFlame); if (xform != null) { if (pProperty.getIndex2() >= 0 && pProperty.getIndex2() < xform.getVariationCount()) { return xform.getVariation(pProperty.getIndex2()); } else { return null; } } else { return null; } } private static XForm getXFormByIndex(LeapMotionConnectedProperty pProperty, Flame pFlame) { Layer layer = pFlame.getFirstLayer(); if (pProperty.getIndex1() >= 0 && pProperty.getIndex1() < layer.getXForms().size()) { return layer.getXForms().get(pProperty.getIndex1()); } else if (pProperty.getIndex1() >= layer.getXForms().size() && pProperty.getIndex1() < (layer.getXForms().size() + layer.getFinalXForms().size())) { return layer.getFinalXForms().get(pProperty.getIndex1() - layer.getXForms().size()); } else { return null; } } public abstract void apply(LeapMotionConnectedProperty pProperty, Flame pFlame, double pValue); public abstract int getIndexCount(); public abstract MotionCurve getMotionCurve(LeapMotionConnectedProperty pProperty, Flame pFlame); }