/* 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.base; import static org.jwildfire.base.mathlib.MathLib.EPSILON; import static org.jwildfire.base.mathlib.MathLib.fabs; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.jwildfire.base.mathlib.MathLib; import org.jwildfire.create.tina.animate.AnimAware; import org.jwildfire.create.tina.base.motion.MotionCurve; import org.jwildfire.create.tina.base.motion.PostRotateMotionValueChangeHandler; import org.jwildfire.create.tina.base.motion.PostScaleMotionValueChangeHandler; import org.jwildfire.create.tina.base.motion.RotateMotionValueChangeHandler; import org.jwildfire.create.tina.base.motion.ScaleMotionValueChangeHandler; import org.jwildfire.create.tina.edit.Assignable; import org.jwildfire.create.tina.variation.FlameTransformationContext; import org.jwildfire.create.tina.variation.Variation; import org.jwildfire.create.tina.variation.VariationFunc; public final class XForm implements Assignable<XForm>, Serializable { private static final long serialVersionUID = 1L; private Layer owner; @AnimAware private double weight; private final MotionCurve weightCurve = new MotionCurve(); @AnimAware private double color; private final MotionCurve colorCurve = new MotionCurve(); @AnimAware private double colorSymmetry; private final MotionCurve colorSymmetryCurve = new MotionCurve(); @AnimAware private double material; private final MotionCurve materialCurve = new MotionCurve(); @AnimAware private double materialSpeed; private final MotionCurve materialSymmetryCurve = new MotionCurve(); @AnimAware private double modGamma; @AnimAware private double modGammaSpeed; @AnimAware private double modContrast; @AnimAware private double modContrastSpeed; @AnimAware private double modSaturation; @AnimAware private double modSaturationSpeed; @AnimAware private double modHue; @AnimAware private double modHueSpeed; @AnimAware double xyCoeff00; private final MotionCurve xyCoeff00Curve = new MotionCurve(); @AnimAware double xyCoeff01; private final MotionCurve xyCoeff01Curve = new MotionCurve(); @AnimAware double xyCoeff10; private final MotionCurve xyCoeff10Curve = new MotionCurve(); @AnimAware double xyCoeff11; private final MotionCurve xyCoeff11Curve = new MotionCurve(); @AnimAware double xyCoeff20; private final MotionCurve xyCoeff20Curve = new MotionCurve(); @AnimAware double xyCoeff21; private final MotionCurve xyCoeff21Curve = new MotionCurve(); @AnimAware double xyPostCoeff00; private final MotionCurve xyPostCoeff00Curve = new MotionCurve(); @AnimAware double xyPostCoeff01; private final MotionCurve xyPostCoeff01Curve = new MotionCurve(); @AnimAware double xyPostCoeff10; private final MotionCurve xyPostCoeff10Curve = new MotionCurve(); @AnimAware double xyPostCoeff11; private final MotionCurve xyPostCoeff11Curve = new MotionCurve(); @AnimAware double xyPostCoeff20; private final MotionCurve xyPostCoeff20Curve = new MotionCurve(); @AnimAware double xyPostCoeff21; private final MotionCurve xyPostCoeff21Curve = new MotionCurve(); boolean hasXYPostCoeffs; boolean hasXYCoeffs; @AnimAware double yzCoeff00; private final MotionCurve yzCoeff00Curve = new MotionCurve(); @AnimAware double yzCoeff01; private final MotionCurve yzCoeff01Curve = new MotionCurve(); @AnimAware double yzCoeff10; private final MotionCurve yzCoeff10Curve = new MotionCurve(); @AnimAware double yzCoeff11; private final MotionCurve yzCoeff11Curve = new MotionCurve(); @AnimAware double yzCoeff20; private final MotionCurve yzCoeff20Curve = new MotionCurve(); @AnimAware double yzCoeff21; private final MotionCurve yzCoeff21Curve = new MotionCurve(); @AnimAware double yzPostCoeff00; private final MotionCurve yzPostCoeff00Curve = new MotionCurve(); @AnimAware double yzPostCoeff01; private final MotionCurve yzPostCoeff01Curve = new MotionCurve(); @AnimAware double yzPostCoeff10; private final MotionCurve yzPostCoeff10Curve = new MotionCurve(); @AnimAware double yzPostCoeff11; private final MotionCurve yzPostCoeff11Curve = new MotionCurve(); @AnimAware double yzPostCoeff20; private final MotionCurve yzPostCoeff20Curve = new MotionCurve(); @AnimAware double yzPostCoeff21; private final MotionCurve yzPostCoeff21Curve = new MotionCurve(); boolean hasYZPostCoeffs; boolean hasYZCoeffs; @AnimAware double zxCoeff00; private final MotionCurve zxCoeff00Curve = new MotionCurve(); @AnimAware double zxCoeff01; private final MotionCurve zxCoeff01Curve = new MotionCurve(); @AnimAware double zxCoeff10; private final MotionCurve zxCoeff10Curve = new MotionCurve(); @AnimAware double zxCoeff11; private final MotionCurve zxCoeff11Curve = new MotionCurve(); @AnimAware double zxCoeff20; private final MotionCurve zxCoeff20Curve = new MotionCurve(); @AnimAware double zxCoeff21; private final MotionCurve zxCoeff21Curve = new MotionCurve(); @AnimAware double zxPostCoeff00; private final MotionCurve zxPostCoeff00Curve = new MotionCurve(); @AnimAware double zxPostCoeff01; private final MotionCurve zxPostCoeff01Curve = new MotionCurve(); @AnimAware double zxPostCoeff10; private final MotionCurve zxPostCoeff10Curve = new MotionCurve(); @AnimAware double zxPostCoeff11; private final MotionCurve zxPostCoeff11Curve = new MotionCurve(); @AnimAware double zxPostCoeff20; private final MotionCurve zxPostCoeff20Curve = new MotionCurve(); @AnimAware double zxPostCoeff21; private final MotionCurve zxPostCoeff21Curve = new MotionCurve(); boolean hasZXPostCoeffs; boolean hasZXCoeffs; private int index = -1; @AnimAware private final List<Variation> variations = new ArrayList<Variation>(); private final double modifiedWeights[] = new double[Constants.MAX_MOD_WEIGHT_COUNT]; // the same like "xaos" in Apophysis @AnimAware private double opacity = 0.0; private final MotionCurve opacityCurve = new MotionCurve(); private final XForm[] nextAppliedXFormTable = new XForm[Constants.NEXT_APPLIED_XFORM_TABLE_SIZE]; private DrawMode drawMode = DrawMode.NORMAL; private String name = ""; private final MotionCurve xyRotateCurve = new MotionCurve(RotateMotionValueChangeHandler.INSTANCE); private final MotionCurve xyScaleCurve = new MotionCurve(ScaleMotionValueChangeHandler.INSTANCE); private final MotionCurve xyPostRotateCurve = new MotionCurve(PostRotateMotionValueChangeHandler.INSTANCE); private final MotionCurve xyPostScaleCurve = new MotionCurve(PostScaleMotionValueChangeHandler.INSTANCE); private final MotionCurve yzRotateCurve = new MotionCurve(RotateMotionValueChangeHandler.INSTANCE); private final MotionCurve yzScaleCurve = new MotionCurve(ScaleMotionValueChangeHandler.INSTANCE); private final MotionCurve yzPostRotateCurve = new MotionCurve(PostRotateMotionValueChangeHandler.INSTANCE); private final MotionCurve yzPostScaleCurve = new MotionCurve(PostScaleMotionValueChangeHandler.INSTANCE); private final MotionCurve zxRotateCurve = new MotionCurve(RotateMotionValueChangeHandler.INSTANCE); private final MotionCurve zxScaleCurve = new MotionCurve(ScaleMotionValueChangeHandler.INSTANCE); private final MotionCurve zxPostRotateCurve = new MotionCurve(PostRotateMotionValueChangeHandler.INSTANCE); private final MotionCurve zxPostScaleCurve = new MotionCurve(PostScaleMotionValueChangeHandler.INSTANCE); public XForm() { xyCoeff00 = 1.0; xyCoeff11 = 1.0; xyPostCoeff00 = 1.0; xyPostCoeff11 = 1.0; yzCoeff00 = 1.0; yzCoeff11 = 1.0; yzPostCoeff00 = 1.0; yzPostCoeff11 = 1.0; zxCoeff00 = 1.0; zxCoeff11 = 1.0; zxPostCoeff00 = 1.0; zxPostCoeff11 = 1.0; for (int i = 0; i < modifiedWeights.length; i++) { modifiedWeights[i] = 1.0; } resetModColorEffects(); } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public double getColor() { return color; } public void setColor(double color) { if (color < -1.0) { color = -1.0; } else if (color > 1.0) { color = 1.0; } this.color = color; } public int getVariationCount() { return variations.size(); } public Variation getVariation(int pIdx) { return variations.get(pIdx); } public List<Variation> getVariations() { return variations; } public Variation addVariation(double pAmount, VariationFunc pVariationFunc) { Variation variation = new Variation(); variation.setAmount(pAmount); variation.setFunc(pVariationFunc); variation.setPriority(pVariationFunc.getPriority()); variations.add(variation); return variation; } public void addVariation(Variation pVariation) { variations.add(pVariation); } public void removeVariation(Variation pVariation) { variations.remove(pVariation); } public void clearVariations() { variations.clear(); } public double getColorSymmetry() { return colorSymmetry; } public void setColorSymmetry(double colorSymmetry) { if (colorSymmetry < -1.0) { colorSymmetry = -1.0; } else if (colorSymmetry > 1.0) { colorSymmetry = 1.0; } this.colorSymmetry = colorSymmetry; } double c1; double c2; double material1; double material2; double modGamma1; double modGamma2; double modContrast1; double modContrast2; double modSaturation1; double modSaturation2; double modHue1; double modHue2; public void initTransform() { // precalculate those variables to simplify the expression: // pDstPoint.color = (pSrcPoint.color + color) * 0.5 * (1 - colorSymmetry) + colorSymmetry * pSrcPoint.color; // to get: // pDstPoint.color = pSrcPoint.color * c1 + c2; c1 = (1 + colorSymmetry) * 0.5; c2 = color * (1 - colorSymmetry) * 0.5; material1 = (1 + materialSpeed) * 0.5; material2 = material * (1 - materialSpeed) * 0.5; modGamma1 = (1 + modGammaSpeed) * 0.5; modGamma2 = modGamma * (1 - modGammaSpeed) * 0.5; modContrast1 = (1 + modContrastSpeed) * 0.5; modContrast2 = modContrast * (1 - modContrastSpeed) * 0.5; modSaturation1 = (1 + modSaturationSpeed) * 0.5; modSaturation2 = modSaturation * (1 - modSaturationSpeed) * 0.5; modHue1 = (1 + modHueSpeed) * 0.5; modHue2 = modHue * (1 - modHueSpeed) * 0.5; updateHasXYCoeffs(); updateHasXYPostCoeffs(); updateHasYZCoeffs(); updateHasYZPostCoeffs(); updateHasZXCoeffs(); updateHasZXPostCoeffs(); createTransformations(); } private void updateHasXYPostCoeffs() { hasXYPostCoeffs = fabs(xyPostCoeff00 - 1.0) > MathLib.EPSILON || fabs(xyPostCoeff01) > MathLib.EPSILON || fabs(xyPostCoeff10) > MathLib.EPSILON || fabs(xyPostCoeff11 - 1.0) > MathLib.EPSILON || fabs(xyPostCoeff20) > MathLib.EPSILON || fabs(xyPostCoeff21) > MathLib.EPSILON; } private void updateHasXYCoeffs() { hasXYCoeffs = fabs(xyCoeff00 - 1.0) > MathLib.EPSILON || fabs(xyCoeff01) > MathLib.EPSILON || fabs(xyCoeff10) > MathLib.EPSILON || fabs(xyCoeff11 - 1.0) > MathLib.EPSILON || fabs(xyCoeff20) > MathLib.EPSILON || fabs(xyCoeff21) > MathLib.EPSILON; } public boolean isHasXYPostCoeffs() { return hasXYPostCoeffs; } public boolean isHasXYCoeffs() { return hasXYCoeffs; } private void updateHasYZPostCoeffs() { hasYZPostCoeffs = fabs(yzPostCoeff00 - 1.0) > MathLib.EPSILON || fabs(yzPostCoeff01) > MathLib.EPSILON || fabs(yzPostCoeff10) > MathLib.EPSILON || fabs(yzPostCoeff11 - 1.0) > MathLib.EPSILON || fabs(yzPostCoeff20) > MathLib.EPSILON || fabs(yzPostCoeff21) > MathLib.EPSILON; } private void updateHasYZCoeffs() { hasYZCoeffs = fabs(yzCoeff00 - 1.0) > MathLib.EPSILON || fabs(yzCoeff01) > MathLib.EPSILON || fabs(yzCoeff10) > MathLib.EPSILON || fabs(yzCoeff11 - 1.0) > MathLib.EPSILON || fabs(yzCoeff20) > MathLib.EPSILON || fabs(yzCoeff21) > MathLib.EPSILON; } public boolean isHasYZPostCoeffs() { return hasYZPostCoeffs; } public boolean isHasYZCoeffs() { return hasYZCoeffs; } private void updateHasZXPostCoeffs() { hasZXPostCoeffs = fabs(zxPostCoeff00 - 1.0) > MathLib.EPSILON || fabs(zxPostCoeff01) > MathLib.EPSILON || fabs(zxPostCoeff10) > MathLib.EPSILON || fabs(zxPostCoeff11 - 1.0) > MathLib.EPSILON || fabs(zxPostCoeff20) > MathLib.EPSILON || fabs(zxPostCoeff21) > MathLib.EPSILON; } private void updateHasZXCoeffs() { hasZXCoeffs = fabs(zxCoeff00 - 1.0) > MathLib.EPSILON || fabs(zxCoeff01) > MathLib.EPSILON || fabs(zxCoeff10) > MathLib.EPSILON || fabs(zxCoeff11 - 1.0) > MathLib.EPSILON || fabs(zxCoeff20) > MathLib.EPSILON || fabs(zxCoeff21) > MathLib.EPSILON; } public boolean isHasZXPostCoeffs() { return hasZXPostCoeffs; } public boolean isHasZXCoeffs() { return hasZXCoeffs; } private List<TransformationStep> t = new ArrayList<>(); private void createTransformations() { t = new ArrayList<TransformationStep>(); t.add(new TransformationInitStep(this)); if (!isHasXYCoeffs() && !isHasYZCoeffs() && !isHasZXCoeffs()) { t.add(new TransformationAffineNoneStep(this)); } else if (isHasXYCoeffs() && !isHasYZCoeffs() && !isHasZXCoeffs()) { t.add(new TransformationAffineFlatStep(this)); } else { t.add(new TransformationAffineFullStep(this)); } t.add(new TransformationPreparePreVariationsStep(this)); for (Variation variation : variations) { if (variation.getPriority() < 0) { if (variation.getFunc().getPriority() < 0) { t.add(new PreVariationTransformationStep(this, variation)); } else { t.add(new EnforcedPreVariationTransformationStep(this, variation)); } } } t.add(new TransformationPrepareVariationsStep(this)); for (Variation variation : variations) { if (variation.getPriority() == 0) { if (variation.getFunc().getPriority() == 0) { t.add(new VariationTransformationStep(this, variation)); } else { t.add(new EnforcedVariationTransformationStep(this, variation)); } } } for (Variation variation : variations) { if (variation.getPriority() > 0) { if (variation.getFunc().getPriority() > 0) { t.add(new PostVariationTransformationStep(this, variation)); } else { t.add(new EnforcedPostVariationTransformationStep(this, variation)); } } } t.add(new TransformationPreparePostAffineStep(this)); if (!isHasXYPostCoeffs() && !isHasYZPostCoeffs() && !isHasZXPostCoeffs()) { t.add(new TransformationPostAffineNoneStep(this)); } else if (isHasXYPostCoeffs() && !isHasYZPostCoeffs() && !isHasZXPostCoeffs()) { t.add(new TransformationPostAffineFlatStep(this)); } else { t.add(new TransformationPostAffineStep(this)); } } public void transformPoint(FlameTransformationContext pContext, XYZPoint pAffineT, XYZPoint pVarT, XYZPoint pSrcPoint, XYZPoint pDstPoint) { for (TransformationStep transformation : t) { transformation.transform(pContext, pAffineT, pVarT, pSrcPoint, pDstPoint); } } public double getOpacity() { return opacity; } public void setOpacity(double opacity) { this.opacity = opacity; } public double[] getModifiedWeights() { return modifiedWeights; } public XForm[] getNextAppliedXFormTable() { return nextAppliedXFormTable; } public DrawMode getDrawMode() { return drawMode; } public void setDrawMode(DrawMode drawMode) { this.drawMode = drawMode; } @Override public void assign(XForm pXForm) { weight = pXForm.weight; weightCurve.assign(pXForm.weightCurve); color = pXForm.color; colorCurve.assign(pXForm.colorCurve); colorSymmetry = pXForm.colorSymmetry; colorSymmetryCurve.assign(pXForm.colorSymmetryCurve); material = pXForm.material; materialCurve.assign(pXForm.materialCurve); materialSpeed = pXForm.materialSpeed; materialSymmetryCurve.assign(pXForm.materialSymmetryCurve); modGamma = pXForm.modGamma; modGammaSpeed = pXForm.modGammaSpeed; modContrast = pXForm.modContrast; modContrastSpeed = pXForm.modContrastSpeed; modSaturation = pXForm.modSaturation; modSaturationSpeed = pXForm.modSaturationSpeed; modHue = pXForm.modHue; modHueSpeed = pXForm.modHueSpeed; xyCoeff00 = pXForm.xyCoeff00; xyCoeff00Curve.assign(pXForm.xyCoeff00Curve); xyCoeff01 = pXForm.xyCoeff01; xyCoeff01Curve.assign(pXForm.xyCoeff01Curve); xyCoeff10 = pXForm.xyCoeff10; xyCoeff10Curve.assign(pXForm.xyCoeff10Curve); xyCoeff11 = pXForm.xyCoeff11; xyCoeff11Curve.assign(pXForm.xyCoeff11Curve); xyCoeff20 = pXForm.xyCoeff20; xyCoeff20Curve.assign(pXForm.xyCoeff20Curve); xyCoeff21 = pXForm.xyCoeff21; xyCoeff21Curve.assign(pXForm.xyCoeff21Curve); xyPostCoeff00 = pXForm.xyPostCoeff00; xyPostCoeff00Curve.assign(pXForm.xyPostCoeff00Curve); xyPostCoeff01 = pXForm.xyPostCoeff01; xyPostCoeff01Curve.assign(pXForm.xyPostCoeff01Curve); xyPostCoeff10 = pXForm.xyPostCoeff10; xyPostCoeff10Curve.assign(pXForm.xyPostCoeff10Curve); xyPostCoeff11 = pXForm.xyPostCoeff11; xyPostCoeff11Curve.assign(pXForm.xyPostCoeff11Curve); xyPostCoeff20 = pXForm.xyPostCoeff20; xyPostCoeff20Curve.assign(pXForm.xyPostCoeff20Curve); xyPostCoeff21 = pXForm.xyPostCoeff21; xyPostCoeff21Curve.assign(pXForm.xyPostCoeff21Curve); yzCoeff00 = pXForm.yzCoeff00; yzCoeff00Curve.assign(pXForm.yzCoeff00Curve); yzCoeff01 = pXForm.yzCoeff01; yzCoeff01Curve.assign(pXForm.yzCoeff01Curve); yzCoeff10 = pXForm.yzCoeff10; yzCoeff10Curve.assign(pXForm.yzCoeff10Curve); yzCoeff11 = pXForm.yzCoeff11; yzCoeff11Curve.assign(pXForm.yzCoeff11Curve); yzCoeff20 = pXForm.yzCoeff20; yzCoeff20Curve.assign(pXForm.yzCoeff20Curve); yzCoeff21 = pXForm.yzCoeff21; yzCoeff21Curve.assign(pXForm.yzCoeff21Curve); yzPostCoeff00 = pXForm.yzPostCoeff00; yzPostCoeff00Curve.assign(pXForm.yzPostCoeff00Curve); yzPostCoeff01 = pXForm.yzPostCoeff01; yzPostCoeff01Curve.assign(pXForm.yzPostCoeff01Curve); yzPostCoeff10 = pXForm.yzPostCoeff10; yzPostCoeff10Curve.assign(pXForm.yzPostCoeff10Curve); yzPostCoeff11 = pXForm.yzPostCoeff11; yzPostCoeff11Curve.assign(pXForm.yzPostCoeff11Curve); yzPostCoeff20 = pXForm.yzPostCoeff20; yzPostCoeff20Curve.assign(pXForm.yzPostCoeff20Curve); yzPostCoeff21 = pXForm.yzPostCoeff21; yzPostCoeff21Curve.assign(pXForm.yzPostCoeff21Curve); zxCoeff00 = pXForm.zxCoeff00; zxCoeff00Curve.assign(pXForm.zxCoeff00Curve); zxCoeff01 = pXForm.zxCoeff01; zxCoeff01Curve.assign(pXForm.zxCoeff01Curve); zxCoeff10 = pXForm.zxCoeff10; zxCoeff10Curve.assign(pXForm.zxCoeff10Curve); zxCoeff11 = pXForm.zxCoeff11; zxCoeff11Curve.assign(pXForm.zxCoeff11Curve); zxCoeff20 = pXForm.zxCoeff20; zxCoeff20Curve.assign(pXForm.zxCoeff20Curve); zxCoeff21 = pXForm.zxCoeff21; zxCoeff21Curve.assign(pXForm.zxCoeff21Curve); zxPostCoeff00 = pXForm.zxPostCoeff00; zxPostCoeff00Curve.assign(pXForm.zxPostCoeff00Curve); zxPostCoeff01 = pXForm.zxPostCoeff01; zxPostCoeff01Curve.assign(pXForm.zxPostCoeff01Curve); zxPostCoeff10 = pXForm.zxPostCoeff10; zxPostCoeff10Curve.assign(pXForm.zxPostCoeff10Curve); zxPostCoeff11 = pXForm.zxPostCoeff11; zxPostCoeff11Curve.assign(pXForm.zxPostCoeff11Curve); zxPostCoeff20 = pXForm.zxPostCoeff20; zxPostCoeff20Curve.assign(pXForm.zxPostCoeff20Curve); zxPostCoeff21 = pXForm.zxPostCoeff21; zxPostCoeff21Curve.assign(pXForm.zxPostCoeff21Curve); xyRotateCurve.assign(pXForm.xyRotateCurve); xyScaleCurve.assign(pXForm.xyScaleCurve); xyPostRotateCurve.assign(pXForm.xyPostRotateCurve); xyPostScaleCurve.assign(pXForm.xyPostScaleCurve); yzRotateCurve.assign(pXForm.yzRotateCurve); yzScaleCurve.assign(pXForm.yzScaleCurve); yzPostRotateCurve.assign(pXForm.yzPostRotateCurve); yzPostScaleCurve.assign(pXForm.yzPostScaleCurve); zxRotateCurve.assign(pXForm.zxRotateCurve); zxScaleCurve.assign(pXForm.zxScaleCurve); zxPostRotateCurve.assign(pXForm.zxPostRotateCurve); zxPostScaleCurve.assign(pXForm.zxPostScaleCurve); hasXYPostCoeffs = pXForm.hasXYPostCoeffs; hasXYCoeffs = pXForm.hasXYCoeffs; hasYZPostCoeffs = pXForm.hasYZPostCoeffs; hasYZCoeffs = pXForm.hasYZCoeffs; hasZXPostCoeffs = pXForm.hasZXPostCoeffs; hasZXCoeffs = pXForm.hasZXCoeffs; variations.clear(); for (Variation var : pXForm.variations) { Variation newVar = new Variation(); newVar.assign(var); variations.add(newVar); } System.arraycopy(pXForm.modifiedWeights, 0, modifiedWeights, 0, pXForm.modifiedWeights.length); opacity = pXForm.opacity; opacityCurve.assign(pXForm.opacityCurve); drawMode = pXForm.drawMode; name = pXForm.name; } @Override public XForm makeCopy() { XForm res = new XForm(); res.assign(this); return res; } @Override public boolean isEqual(XForm pSrc) { if ((fabs(weight - pSrc.weight) > EPSILON) || !weightCurve.isEqual(pSrc.weightCurve) || (fabs(color - pSrc.color) > EPSILON) || !colorCurve.isEqual(pSrc.colorCurve) || (fabs(colorSymmetry - pSrc.colorSymmetry) > EPSILON) || !colorSymmetryCurve.isEqual(pSrc.colorSymmetryCurve) || (fabs(material - pSrc.material) > EPSILON) || !materialCurve.isEqual(pSrc.materialCurve) || (fabs(materialSpeed - pSrc.materialSpeed) > EPSILON) || !materialSymmetryCurve.isEqual(pSrc.materialSymmetryCurve) || (fabs(modGamma - pSrc.modGamma) > EPSILON) || (fabs(modGammaSpeed - pSrc.modGammaSpeed) > EPSILON) || (fabs(modContrast - pSrc.modContrast) > EPSILON) || (fabs(modContrastSpeed - pSrc.modContrastSpeed) > EPSILON) || (fabs(modSaturation - pSrc.modSaturation) > EPSILON) || (fabs(modSaturationSpeed - pSrc.modSaturationSpeed) > EPSILON) || (fabs(modHue - pSrc.modHue) > EPSILON) || (fabs(modHueSpeed - pSrc.modHueSpeed) > EPSILON) || (fabs(xyCoeff00 - pSrc.xyCoeff00) > EPSILON) || !xyCoeff00Curve.isEqual(pSrc.xyCoeff00Curve) || (fabs(xyCoeff01 - pSrc.xyCoeff01) > EPSILON) || !xyCoeff01Curve.isEqual(pSrc.xyCoeff01Curve) || (fabs(xyCoeff10 - pSrc.xyCoeff10) > EPSILON) || !xyCoeff10Curve.isEqual(pSrc.xyCoeff10Curve) || (fabs(xyCoeff11 - pSrc.xyCoeff11) > EPSILON) || !xyCoeff11Curve.isEqual(pSrc.xyCoeff11Curve) || (fabs(xyCoeff20 - pSrc.xyCoeff20) > EPSILON) || !xyCoeff20Curve.isEqual(pSrc.xyCoeff20Curve) || (fabs(xyCoeff21 - pSrc.xyCoeff21) > EPSILON) || !xyCoeff21Curve.isEqual(pSrc.xyCoeff21Curve) || (fabs(xyPostCoeff00 - pSrc.xyPostCoeff00) > EPSILON) || !xyPostCoeff00Curve.isEqual(pSrc.xyPostCoeff00Curve) || (fabs(xyPostCoeff01 - pSrc.xyPostCoeff01) > EPSILON) || !xyPostCoeff01Curve.isEqual(pSrc.xyPostCoeff01Curve) || (fabs(xyPostCoeff10 - pSrc.xyPostCoeff10) > EPSILON) || !xyPostCoeff10Curve.isEqual(pSrc.xyPostCoeff10Curve) || (fabs(xyPostCoeff11 - pSrc.xyPostCoeff11) > EPSILON) || !xyPostCoeff11Curve.isEqual(pSrc.xyPostCoeff11Curve) || (fabs(xyPostCoeff20 - pSrc.xyPostCoeff20) > EPSILON) || !xyPostCoeff20Curve.isEqual(pSrc.xyPostCoeff20Curve) || (fabs(xyPostCoeff21 - pSrc.xyPostCoeff21) > EPSILON) || !xyPostCoeff21Curve.isEqual(pSrc.xyPostCoeff21Curve) || (fabs(yzCoeff00 - pSrc.yzCoeff00) > EPSILON) || !yzCoeff00Curve.isEqual(pSrc.yzCoeff00Curve) || (fabs(yzCoeff01 - pSrc.yzCoeff01) > EPSILON) || !yzCoeff01Curve.isEqual(pSrc.yzCoeff01Curve) || (fabs(yzCoeff10 - pSrc.yzCoeff10) > EPSILON) || !yzCoeff10Curve.isEqual(pSrc.yzCoeff10Curve) || (fabs(yzCoeff11 - pSrc.yzCoeff11) > EPSILON) || !yzCoeff11Curve.isEqual(pSrc.yzCoeff11Curve) || (fabs(yzCoeff20 - pSrc.yzCoeff20) > EPSILON) || !yzCoeff20Curve.isEqual(pSrc.yzCoeff20Curve) || (fabs(yzCoeff21 - pSrc.yzCoeff21) > EPSILON) || !yzCoeff21Curve.isEqual(pSrc.yzCoeff21Curve) || (fabs(yzPostCoeff00 - pSrc.yzPostCoeff00) > EPSILON) || !yzPostCoeff00Curve.isEqual(pSrc.yzPostCoeff00Curve) || (fabs(yzPostCoeff01 - pSrc.yzPostCoeff01) > EPSILON) || !yzPostCoeff01Curve.isEqual(pSrc.yzPostCoeff01Curve) || (fabs(yzPostCoeff10 - pSrc.yzPostCoeff10) > EPSILON) || !yzPostCoeff10Curve.isEqual(pSrc.yzPostCoeff10Curve) || (fabs(yzPostCoeff11 - pSrc.yzPostCoeff11) > EPSILON) || !yzPostCoeff11Curve.isEqual(pSrc.yzPostCoeff11Curve) || (fabs(yzPostCoeff20 - pSrc.yzPostCoeff20) > EPSILON) || !yzPostCoeff20Curve.isEqual(pSrc.yzPostCoeff20Curve) || (fabs(yzPostCoeff21 - pSrc.yzPostCoeff21) > EPSILON) || !yzPostCoeff21Curve.isEqual(pSrc.yzPostCoeff21Curve) || (fabs(zxCoeff00 - pSrc.zxCoeff00) > EPSILON) || !zxCoeff00Curve.isEqual(pSrc.zxCoeff00Curve) || (fabs(zxCoeff01 - pSrc.zxCoeff01) > EPSILON) || !zxCoeff01Curve.isEqual(pSrc.zxCoeff01Curve) || (fabs(zxCoeff10 - pSrc.zxCoeff10) > EPSILON) || !zxCoeff10Curve.isEqual(pSrc.zxCoeff10Curve) || (fabs(zxCoeff11 - pSrc.zxCoeff11) > EPSILON) || !zxCoeff11Curve.isEqual(pSrc.zxCoeff11Curve) || (fabs(zxCoeff20 - pSrc.zxCoeff20) > EPSILON) || !zxCoeff20Curve.isEqual(pSrc.zxCoeff20Curve) || (fabs(zxCoeff21 - pSrc.zxCoeff21) > EPSILON) || !zxCoeff21Curve.isEqual(pSrc.zxCoeff21Curve) || (fabs(zxPostCoeff00 - pSrc.zxPostCoeff00) > EPSILON) || !zxPostCoeff00Curve.isEqual(pSrc.zxPostCoeff00Curve) || (fabs(zxPostCoeff01 - pSrc.zxPostCoeff01) > EPSILON) || !zxPostCoeff01Curve.isEqual(pSrc.zxPostCoeff01Curve) || (fabs(zxPostCoeff10 - pSrc.zxPostCoeff10) > EPSILON) || !zxPostCoeff10Curve.isEqual(pSrc.zxPostCoeff10Curve) || (fabs(zxPostCoeff11 - pSrc.zxPostCoeff11) > EPSILON) || !zxPostCoeff11Curve.isEqual(pSrc.zxPostCoeff11Curve) || (fabs(zxPostCoeff20 - pSrc.zxPostCoeff20) > EPSILON) || !zxPostCoeff20Curve.isEqual(pSrc.zxPostCoeff20Curve) || (fabs(zxPostCoeff21 - pSrc.zxPostCoeff21) > EPSILON) || !zxPostCoeff21Curve.isEqual(pSrc.zxPostCoeff21Curve) || !xyRotateCurve.isEqual(pSrc.xyRotateCurve) || !xyScaleCurve.isEqual(pSrc.xyScaleCurve) || !xyPostRotateCurve.isEqual(pSrc.xyPostRotateCurve) || !xyPostScaleCurve.isEqual(pSrc.xyPostScaleCurve) || !yzRotateCurve.isEqual(pSrc.yzRotateCurve) || !yzScaleCurve.isEqual(pSrc.yzScaleCurve) || !yzPostRotateCurve.isEqual(pSrc.yzPostRotateCurve) || !yzPostScaleCurve.isEqual(pSrc.yzPostScaleCurve) || !zxRotateCurve.isEqual(pSrc.zxRotateCurve) || !zxScaleCurve.isEqual(pSrc.zxScaleCurve) || !zxPostRotateCurve.isEqual(pSrc.zxPostRotateCurve) || !zxPostScaleCurve.isEqual(pSrc.zxPostScaleCurve) || (fabs(opacity - pSrc.opacity) > EPSILON) || !opacityCurve.isEqual(pSrc.opacityCurve) || ((drawMode != null && pSrc.drawMode == null) || (drawMode == null && pSrc.drawMode != null) || (drawMode != null && pSrc.drawMode != null && !drawMode.equals(pSrc.drawMode))) || !name.equals(pSrc.name) || (modifiedWeights.length != pSrc.modifiedWeights.length) || (variations.size() != pSrc.variations.size())) { return false; } for (int i = 0; i < modifiedWeights.length; i++) { if (fabs(modifiedWeights[i] - pSrc.modifiedWeights[i]) > EPSILON) { return false; } } for (int i = 0; i < variations.size(); i++) { if (!variations.get(i).isEqual(pSrc.variations.get(i))) { return false; } } return true; } // only because of script-compatiblity @Deprecated public void setAntialiasAmount(double antialiasAmount) { // this.antialiasAmount = antialiasAmount; } // only because of script-compatiblity @Deprecated public void setAntialiasRadius(double antialiasRadius) { // this.antialiasRadius = antialiasRadius; } public String getName() { return name; } public void setName(String name) { this.name = name != null ? name : ""; } public boolean hasVariation(String pName) { for (Variation var : variations) { if (var.getFunc().getName().equalsIgnoreCase(pName)) { return true; } } return false; } public MotionCurve getXYRotateCurve() { return xyRotateCurve; } public MotionCurve getXYScaleCurve() { return xyScaleCurve; } public MotionCurve getXYPostRotateCurve() { return xyPostRotateCurve; } public MotionCurve getXYPostScaleCurve() { return xyPostScaleCurve; } public double getModGamma() { return modGamma; } public void setModGamma(double modGamma) { this.modGamma = modGamma; } public double getModGammaSpeed() { return modGammaSpeed; } public void setModGammaSpeed(double modGammaSpeed) { this.modGammaSpeed = modGammaSpeed; } public double getModContrast() { return modContrast; } public void setModContrast(double modContrast) { this.modContrast = modContrast; } public double getModContrastSpeed() { return modContrastSpeed; } public void setModContrastSpeed(double modContrastSpeed) { this.modContrastSpeed = modContrastSpeed; } public double getModSaturation() { return modSaturation; } public void setModSaturation(double modSaturation) { this.modSaturation = modSaturation; } public double getModSaturationSpeed() { return modSaturationSpeed; } public void setModSaturationSpeed(double modSaturationSpeed) { this.modSaturationSpeed = modSaturationSpeed; } public void randomizeModColorEffects() { randomizeModGamma(); randomizeModContrast(); randomizeModSaturation(); randomizeModHue(); } public void randomizeModGamma() { modGamma = 1.0 - 2.0 * Math.random(); modGammaSpeed = Math.random() < 0.33 ? 1.0 - 2.0 * Math.random() : 0; } public void randomizeModContrast() { modContrast = 1.0 - 2.0 * Math.random(); modContrastSpeed = Math.random() < 0.33 ? 1.0 - 2.0 * Math.random() : 0; } public void randomizeModSaturation() { modSaturation = 1.0 - 2.0 * Math.random(); modSaturationSpeed = Math.random() < 0.33 ? 1.0 - 2.0 * Math.random() : 0; } public void randomizeModHue() { modHue = 1.0 - 2.0 * Math.random(); modHueSpeed = Math.random() < 0.33 ? 1.0 - 2.0 * Math.random() : 0; } public void resetModColorEffects() { modGamma = 0.0; modGammaSpeed = 0.0; modContrast = 0.0; modContrastSpeed = 0.0; modSaturation = 0.0; modSaturationSpeed = 0.0; modHue = 0.0; modHueSpeed = 0.0; } public double getXYCoeff00() { return xyCoeff00; } public void setXYCoeff00(double xyCoeff00) { this.xyCoeff00 = xyCoeff00; updateHasXYCoeffs(); } public double getXYCoeff01() { return xyCoeff01; } public void setXYCoeff01(double xyCoeff01) { this.xyCoeff01 = xyCoeff01; updateHasXYCoeffs(); } public double getXYCoeff10() { return xyCoeff10; } public void setXYCoeff10(double xyCoeff10) { this.xyCoeff10 = xyCoeff10; updateHasXYCoeffs(); } public double getXYCoeff11() { return xyCoeff11; } public void setXYCoeff11(double xyCoeff11) { this.xyCoeff11 = xyCoeff11; updateHasXYCoeffs(); } public double getXYCoeff20() { return xyCoeff20; } public void setXYCoeff20(double xyCoeff20) { this.xyCoeff20 = xyCoeff20; updateHasXYCoeffs(); } public double getXYCoeff21() { return xyCoeff21; } public void setXYCoeff21(double xyCoeff21) { this.xyCoeff21 = xyCoeff21; updateHasXYCoeffs(); } public double getXYPostCoeff00() { return xyPostCoeff00; } public void setXYPostCoeff00(double xyPostCoeff00) { this.xyPostCoeff00 = xyPostCoeff00; updateHasXYPostCoeffs(); } public double getXYPostCoeff01() { return xyPostCoeff01; } public void setXYPostCoeff01(double xyPostCoeff01) { this.xyPostCoeff01 = xyPostCoeff01; updateHasXYPostCoeffs(); } public double getXYPostCoeff10() { return xyPostCoeff10; } public void setXYPostCoeff10(double xyPostCoeff10) { this.xyPostCoeff10 = xyPostCoeff10; updateHasXYPostCoeffs(); } public double getXYPostCoeff11() { return xyPostCoeff11; } public void setXYPostCoeff11(double xyPostCoeff11) { this.xyPostCoeff11 = xyPostCoeff11; updateHasXYPostCoeffs(); } public double getXYPostCoeff20() { return xyPostCoeff20; } public void setXYPostCoeff20(double xyPostCoeff20) { this.xyPostCoeff20 = xyPostCoeff20; updateHasXYPostCoeffs(); } public double getXYPostCoeff21() { return xyPostCoeff21; } public void setXYPostCoeff21(double xyPostCoeff21) { this.xyPostCoeff21 = xyPostCoeff21; updateHasXYPostCoeffs(); } public double getYZCoeff00() { return yzCoeff00; } public void setYZCoeff00(double yzCoeff00) { this.yzCoeff00 = yzCoeff00; updateHasYZCoeffs(); } public double getYZCoeff01() { return yzCoeff01; } public void setYZCoeff01(double yzCoeff01) { this.yzCoeff01 = yzCoeff01; updateHasYZCoeffs(); } public double getYZCoeff10() { return yzCoeff10; } public void setYZCoeff10(double yzCoeff10) { this.yzCoeff10 = yzCoeff10; updateHasYZCoeffs(); } public double getYZCoeff11() { return yzCoeff11; } public void setYZCoeff11(double yzCoeff11) { this.yzCoeff11 = yzCoeff11; updateHasYZCoeffs(); } public double getYZCoeff20() { return yzCoeff20; } public void setYZCoeff20(double yzCoeff20) { this.yzCoeff20 = yzCoeff20; updateHasYZCoeffs(); } public double getYZCoeff21() { return yzCoeff21; } public void setYZCoeff21(double yzCoeff21) { this.yzCoeff21 = yzCoeff21; updateHasYZCoeffs(); } public double getYZPostCoeff00() { return yzPostCoeff00; } public void setYZPostCoeff00(double yzPostCoeff00) { this.yzPostCoeff00 = yzPostCoeff00; updateHasYZPostCoeffs(); } public double getYZPostCoeff01() { return yzPostCoeff01; } public void setYZPostCoeff01(double yzPostCoeff01) { this.yzPostCoeff01 = yzPostCoeff01; updateHasYZPostCoeffs(); } public double getYZPostCoeff10() { return yzPostCoeff10; } public void setYZPostCoeff10(double yzPostCoeff10) { this.yzPostCoeff10 = yzPostCoeff10; updateHasYZPostCoeffs(); } public double getYZPostCoeff11() { return yzPostCoeff11; } public void setYZPostCoeff11(double yzPostCoeff11) { this.yzPostCoeff11 = yzPostCoeff11; updateHasYZPostCoeffs(); } public double getYZPostCoeff20() { return yzPostCoeff20; } public void setYZPostCoeff20(double yzPostCoeff20) { this.yzPostCoeff20 = yzPostCoeff20; updateHasYZPostCoeffs(); } public double getYZPostCoeff21() { return yzPostCoeff21; } public void setYZPostCoeff21(double yzPostCoeff21) { this.yzPostCoeff21 = yzPostCoeff21; updateHasYZPostCoeffs(); } public double getZXCoeff00() { return zxCoeff00; } public void setZXCoeff00(double zxCoeff00) { this.zxCoeff00 = zxCoeff00; updateHasZXCoeffs(); } public double getZXCoeff01() { return zxCoeff01; } public void setZXCoeff01(double zxCoeff01) { this.zxCoeff01 = zxCoeff01; updateHasZXCoeffs(); } public double getZXCoeff10() { return zxCoeff10; } public void setZXCoeff10(double zxCoeff10) { this.zxCoeff10 = zxCoeff10; updateHasZXCoeffs(); } public double getZXCoeff11() { return zxCoeff11; } public void setZXCoeff11(double zxCoeff11) { this.zxCoeff11 = zxCoeff11; updateHasZXCoeffs(); } public double getZXCoeff20() { return zxCoeff20; } public void setZXCoeff20(double zxCoeff20) { this.zxCoeff20 = zxCoeff20; updateHasZXCoeffs(); } public double getZXCoeff21() { return zxCoeff21; } public void setZXCoeff21(double zxCoeff21) { this.zxCoeff21 = zxCoeff21; updateHasZXCoeffs(); } public double getZXPostCoeff00() { return zxPostCoeff00; } public void setZXPostCoeff00(double zxPostCoeff00) { this.zxPostCoeff00 = zxPostCoeff00; updateHasZXPostCoeffs(); } public double getZXPostCoeff01() { return zxPostCoeff01; } public void setZXPostCoeff01(double zxPostCoeff01) { this.zxPostCoeff01 = zxPostCoeff01; updateHasZXPostCoeffs(); } public double getZXPostCoeff10() { return zxPostCoeff10; } public void setZXPostCoeff10(double zxPostCoeff10) { this.zxPostCoeff10 = zxPostCoeff10; updateHasZXPostCoeffs(); } public double getZXPostCoeff11() { return zxPostCoeff11; } public void setZXPostCoeff11(double zxPostCoeff11) { this.zxPostCoeff11 = zxPostCoeff11; updateHasZXPostCoeffs(); } public double getZXPostCoeff20() { return zxPostCoeff20; } public void setZXPostCoeff20(double zxPostCoeff20) { this.zxPostCoeff20 = zxPostCoeff20; updateHasZXPostCoeffs(); } public double getZXPostCoeff21() { return zxPostCoeff21; } public void setZXPostCoeff21(double zxPostCoeff21) { this.zxPostCoeff21 = zxPostCoeff21; updateHasZXPostCoeffs(); } private EditPlane getEditPlane() { if (owner == null || owner.getOwner() == null) { System.out.println("EditPlane NULL"); return EditPlane.XY; } else { return owner.getOwner().getEditPlane(); } } public double getCoeff00() { switch (getEditPlane()) { case XY: return xyCoeff00; case YZ: return yzCoeff00; default: return zxCoeff00; } } public double getCoeff01() { switch (getEditPlane()) { case XY: return xyCoeff01; case YZ: return yzCoeff01; default: return zxCoeff01; } } public double getCoeff10() { switch (getEditPlane()) { case XY: return xyCoeff10; case YZ: return yzCoeff10; default: return zxCoeff10; } } public double getCoeff11() { switch (getEditPlane()) { case XY: return xyCoeff11; case YZ: return yzCoeff11; default: return zxCoeff11; } } public double getCoeff20() { switch (getEditPlane()) { case XY: return xyCoeff20; case YZ: return yzCoeff20; default: return zxCoeff20; } } public double getCoeff21() { switch (getEditPlane()) { case XY: return xyCoeff21; case YZ: return yzCoeff21; default: return zxCoeff21; } } public double getPostCoeff00() { switch (getEditPlane()) { case XY: return xyPostCoeff00; case YZ: return yzPostCoeff00; default: return zxPostCoeff00; } } public double getPostCoeff01() { switch (getEditPlane()) { case XY: return xyPostCoeff01; case YZ: return yzPostCoeff01; default: return zxPostCoeff01; } } public double getPostCoeff10() { switch (getEditPlane()) { case XY: return xyPostCoeff10; case YZ: return yzPostCoeff10; default: return zxPostCoeff10; } } public double getPostCoeff11() { switch (getEditPlane()) { case XY: return xyPostCoeff11; case YZ: return yzPostCoeff11; default: return zxPostCoeff11; } } public double getPostCoeff20() { switch (getEditPlane()) { case XY: return xyPostCoeff20; case YZ: return yzPostCoeff20; default: return zxPostCoeff20; } } public double getPostCoeff21() { switch (getEditPlane()) { case XY: return xyPostCoeff21; case YZ: return yzPostCoeff21; default: return zxPostCoeff21; } } public void setCoeff00(double coeff00) { switch (getEditPlane()) { case XY: setXYCoeff00(coeff00); break; case YZ: setYZCoeff00(coeff00); break; default: setZXCoeff00(coeff00); break; } } public void setCoeff01(double coeff01) { switch (getEditPlane()) { case XY: setXYCoeff01(coeff01); break; case YZ: setYZCoeff01(coeff01); break; default: setZXCoeff01(coeff01); break; } } public void setCoeff10(double coeff10) { switch (getEditPlane()) { case XY: setXYCoeff10(coeff10); break; case YZ: setYZCoeff10(coeff10); break; default: setZXCoeff10(coeff10); break; } } public void setCoeff11(double coeff11) { switch (getEditPlane()) { case XY: setXYCoeff11(coeff11); break; case YZ: setYZCoeff11(coeff11); break; default: setZXCoeff11(coeff11); break; } } public void setCoeff20(double coeff20) { switch (getEditPlane()) { case XY: setXYCoeff20(coeff20); break; case YZ: setYZCoeff20(coeff20); break; default: setZXCoeff20(coeff20); break; } } public void setCoeff21(double coeff21) { switch (getEditPlane()) { case XY: setXYCoeff21(coeff21); break; case YZ: setYZCoeff21(coeff21); break; default: setZXCoeff21(coeff21); break; } } public void setPostCoeff00(double postCoeff00) { switch (getEditPlane()) { case XY: setXYPostCoeff00(postCoeff00); break; case YZ: setYZPostCoeff00(postCoeff00); break; default: setZXPostCoeff00(postCoeff00); break; } } public void setPostCoeff01(double postCoeff01) { switch (getEditPlane()) { case XY: setXYPostCoeff01(postCoeff01); break; case YZ: setYZPostCoeff01(postCoeff01); break; default: setZXPostCoeff01(postCoeff01); break; } } public void setPostCoeff10(double postCoeff10) { switch (getEditPlane()) { case XY: setXYPostCoeff10(postCoeff10); break; case YZ: setYZPostCoeff10(postCoeff10); break; default: setZXPostCoeff10(postCoeff10); break; } } public void setPostCoeff11(double postCoeff11) { switch (getEditPlane()) { case XY: setXYPostCoeff11(postCoeff11); break; case YZ: setYZPostCoeff11(postCoeff11); break; default: setZXPostCoeff11(postCoeff11); break; } } public void setPostCoeff20(double postCoeff20) { switch (getEditPlane()) { case XY: setXYPostCoeff20(postCoeff20); break; case YZ: setYZPostCoeff20(postCoeff20); break; default: setZXPostCoeff20(postCoeff20); break; } } public void setPostCoeff21(double postCoeff21) { switch (getEditPlane()) { case XY: setXYPostCoeff21(postCoeff21); break; case YZ: setYZPostCoeff21(postCoeff21); break; default: setZXPostCoeff21(postCoeff21); break; } } public Layer getOwner() { return owner; } public void setOwner(Layer owner) { this.owner = owner; } public MotionCurve getXYCoeff00Curve() { return xyCoeff00Curve; } public MotionCurve getXYCoeff01Curve() { return xyCoeff01Curve; } public MotionCurve getXYCoeff10Curve() { return xyCoeff10Curve; } public MotionCurve getXYCoeff11Curve() { return xyCoeff11Curve; } public MotionCurve getXYCoeff20Curve() { return xyCoeff20Curve; } public MotionCurve getXYCoeff21Curve() { return xyCoeff21Curve; } public MotionCurve getXYPostCoeff00Curve() { return xyPostCoeff00Curve; } public MotionCurve getXYPostCoeff01Curve() { return xyPostCoeff01Curve; } public MotionCurve getXYPostCoeff10Curve() { return xyPostCoeff10Curve; } public MotionCurve getXYPostCoeff11Curve() { return xyPostCoeff11Curve; } public MotionCurve getXYPostCoeff20Curve() { return xyPostCoeff20Curve; } public MotionCurve getXYPostCoeff21Curve() { return xyPostCoeff21Curve; } public MotionCurve getWeightCurve() { return weightCurve; } public MotionCurve getColorCurve() { return colorCurve; } public double getModHue() { return modHue; } public void setModHue(double modHue) { this.modHue = modHue; } public double getModHueSpeed() { return modHueSpeed; } public void setModHueSpeed(double modHueSpeed) { this.modHueSpeed = modHueSpeed; } public double getMaterial() { return material; } public void setMaterial(double material) { this.material = material; } public double getMaterialSpeed() { return materialSpeed; } public void setMaterialSpeed(double materialSpeed) { this.materialSpeed = materialSpeed; } }