/* JWildfire - an image and animation processor written in Java Copyright (C) 1995-2017 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.variation.mesh; import static org.jwildfire.base.mathlib.MathLib.sqrt; import java.util.HashMap; import java.util.Map; import org.jwildfire.create.tina.base.Layer; import org.jwildfire.create.tina.palette.RenderColor; import org.jwildfire.create.tina.variation.FlameTransformationContext; public class UVColorMapper { private RenderColor[] uvColors; private Map<RenderColor, Double> uvIdxMap = new HashMap<RenderColor, Double>(); public void initFromLayer(FlameTransformationContext context, Layer layer) { uvColors = layer.getPalette().createRenderPalette(context.getFlameRenderer().getFlame().getWhiteLevel()); } public void clear() { uvIdxMap.clear(); } public double getUVColorIdx(int pR, int pG, int pB) { RenderColor pColor = new RenderColor(pR, pG, pB); Double res = uvIdxMap.get(pColor); if (res == null) { int nearestIdx = 0; RenderColor color = uvColors[0]; double dr, dg, db; dr = (color.red - pR); dg = (color.green - pG); db = (color.blue - pB); double nearestDist = sqrt(dr * dr + dg * dg + db * db); for (int i = 1; i < uvColors.length; i++) { color = uvColors[i]; dr = (color.red - pR); dg = (color.green - pG); db = (color.blue - pB); double dist = sqrt(dr * dr + dg * dg + db * db); if (dist < nearestDist) { nearestDist = dist; nearestIdx = i; } } res = (double) nearestIdx / (double) (uvColors.length - 1); uvIdxMap.put(pColor, res); } return res; } }