Combi Mirror Tweak Custom Variation

Created by Brad Stefanov

Learn how to use Custom Variations here

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
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:
package org.jwildfire.create.tina.variation;
import org.jwildfire.create.tina.base.XForm;
import org.jwildfire.create.tina.base.XYZPoint;
import org.jwildfire.base.mathlib.Complex;
import static org.jwildfire.base.mathlib.MathLib.fmod;
Combination of vertical, horizontal and point mirror
All parameter works in range of 0..1
by Thomas Michels
public class Combimirror_Func extends VariationFunc {
private static final long serialVersionUID = 1L;
private static final String PARAM_VMIRROR = vmirror;
private static final String PARAM_VMOVE = vmove;
private static final String PARAM_HMIRROR = hmirror;
private static final String PARAM_HMOVE = hmove;
private static final String PARAM_ZMIRROR = zmirror;
private static final String PARAM_ZMOVE = zmove;
private static final String PARAM_POINT = pmirror;
private static final String PARAM_POINTX = pmovex;
private static final String PARAM_POINTY = pmovey;
private static final String PARAM_VCOLORSHIFT = vcolorshift;
private static final String PARAM_HCOLORSHIFT = hcolorshift;
private static final String PARAM_ZCOLORSHIFT = zcolorshift;
private static final String PARAM_PCOLORSHIFT = pcolorshift;
private static final String[] paramNames = { PARAM_VMIRROR, PARAM_VMOVE, PARAM_HMIRROR,
private double mv1 = 1.0;
private double mv2 = 0.0;
private double mh1 = 0.0;
private double mh2 = 0.0;
private double mz1 = 0.0;
private double mz2 = 0.0;
private double mp = 0.0;
private double mpx = 0.0;
private double mpy = 0.0;
private double vcolorshift = 0.0;
private double hcolorshift = 0.0;
private double zcolorshift = 0.0;
private double pcolorshift = 0.0;
public void transform(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) {
Complex z = new Complex(pAffineTP.x, pAffineTP.y);
Complex z2 = new Complex(pAffineTP.z, pAffineTP.y);
pVarTP.x =;
pVarTP.y =;
pVarTP.z =;
//Mirror around center point
if (pContext.random() > mp/2){
pVarTP.x = -pVarTP.x + mpx;
pVarTP.y = -pVarTP.y + mpy;
pVarTP.color = fmod(pVarTP.color + pcolorshift, 1.0);
//Mirror along vertical axis
if (pContext.random() < mv1/2){
pVarTP.x = -pVarTP.x + mv2;
pVarTP.color = fmod(pVarTP.color + vcolorshift, 1.0);
//Mirror along horizontal axis
if (pContext.random() < mh1/2){
pVarTP.y = -pVarTP.y + mh2;
pVarTP.color = fmod(pVarTP.color + hcolorshift, 1.0);
//Mirror along Z axis
if (pContext.random() < mz1){
pVarTP.z = -pVarTP.z + mz2;
pVarTP.color = fmod(pVarTP.color + zcolorshift, 1.0);
//if (pContext.isPreserveZCoordinate()) {
//pVarTP.z += pAmount * pAffineTP.z;
public String[] getParameterNames() {
return paramNames;
public Object[] getParameterValues() {
return new Object[] {mv1, mv2, mh1, mh2, mz1, mz2, mp, mpx, mpy, vcolorshift, hcolorshift, zcolorshift, pcolorshift};
public void setParameter(String pName, double pValue) {
if (PARAM_VMIRROR.equalsIgnoreCase(pName))
mv1 = pValue;
else if (PARAM_VMOVE.equalsIgnoreCase(pName))
mv2 = pValue;
else if (PARAM_HMIRROR.equalsIgnoreCase(pName))
mh1 = pValue;
else if (PARAM_HMOVE.equalsIgnoreCase(pName))
mh2 = pValue;
else if (PARAM_ZMIRROR.equalsIgnoreCase(pName))
mz1 = pValue;
else if (PARAM_ZMOVE.equalsIgnoreCase(pName))
mz2 = pValue;
else if (PARAM_POINT.equalsIgnoreCase(pName))
mp = pValue;
else if (PARAM_POINTX.equalsIgnoreCase(pName))
mpx = pValue;
else if (PARAM_POINTY.equalsIgnoreCase(pName))
mpy = pValue;
else if (PARAM_VCOLORSHIFT.equalsIgnoreCase(pName))
vcolorshift = pValue;
else if (PARAM_HCOLORSHIFT.equalsIgnoreCase(pName))
hcolorshift = pValue;
else if (PARAM_ZCOLORSHIFT.equalsIgnoreCase(pName))
zcolorshift = pValue;
else if (PARAM_PCOLORSHIFT.equalsIgnoreCase(pName))
pcolorshift = pValue;
throw new IllegalArgumentException(pName);
public String getName() {
return combimirror;


Download Summary

Sample image

Please credit and or link to this resource if you use them to create your images. For more information please read this
[bg_collapse view="button-blue" color="#f7f7f7" icon="eye" expand_text="Custom Variation Instructions" collapse_text="Hide Instructions" ]You'll need to either add a custom_wf or load the java file please see how to sdd custom variations.


Leave a Comment