/*
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.SMALL_EPSILON;
import static org.jwildfire.base.mathlib.MathLib.atan2;
import static org.jwildfire.base.mathlib.MathLib.fabs;
import static org.jwildfire.base.mathlib.MathLib.sqrt;
import java.io.Serializable;
import org.jwildfire.create.tina.edit.Assignable;
public final class XYZPoint implements Serializable, Assignable<XYZPoint> {
private static final long serialVersionUID = 1L;
public double x;
public double y;
public double z;
public double color;
public double modGamma;
public double modContrast;
public double modSaturation;
public double modHue;
// custom RGB colors
public boolean rgbColor;
public double redColor;
public double greenColor;
public double blueColor;
// material index for solid rendering
public double material;
public boolean receiveOnlyShadows;
// supress sample from drawing
public boolean doHide;
// often (but not always) used properties, calculation only if needed
protected double sumsq;
protected boolean validSumsq;
protected double sqrt;
protected boolean validSqrt;
protected double atan;
protected boolean validAtan;
protected double atanYX;
protected boolean validAtanYX;
protected double sinA;
protected boolean validSinA;
protected double cosA;
protected boolean validCosA;
public XYZPoint() {
}
public XYZPoint(XYZPoint p) {
assign(p);
}
@Override
public void assign(XYZPoint p) {
x = p.x;
y = p.y;
z = p.z;
color = p.color;
material = p.material;
receiveOnlyShadows = p.receiveOnlyShadows;
modGamma = p.modGamma;
modContrast = p.modContrast;
modSaturation = p.modSaturation;
modHue = p.modHue;
sumsq = p.sumsq;
validSumsq = p.validSumsq;
sqrt = p.sqrt;
validSqrt = p.validSqrt;
atan = p.atan;
validAtan = p.validAtan;
atanYX = p.atanYX;
validAtanYX = p.validAtanYX;
sinA = p.sinA;
validSinA = p.validSinA;
cosA = p.cosA;
validCosA = p.validCosA;
rgbColor = p.rgbColor;
redColor = p.redColor;
greenColor = p.greenColor;
blueColor = p.blueColor;
doHide = p.doHide;
}
@Override
public XYZPoint makeCopy() {
XYZPoint res = new XYZPoint();
res.assign(this);
return res;
}
public void invalidate() {
validSumsq = validSqrt = validAtan = validAtanYX = validSinA = validCosA = false;
}
public void clear() {
rgbColor = doHide = false;
redColor = greenColor = blueColor = 0.0;
x = y = z = color = material = modGamma = modContrast = modSaturation = modHue = 0.0;
sumsq = sqrt = atan = atanYX = sinA = cosA = 0.0;
validSumsq = validSqrt = validAtan = validAtanYX = validSinA = validCosA = receiveOnlyShadows = false;
}
public double getPrecalcSumsq() {
if (!validSumsq) {
sumsq = x * x + y * y;
validSumsq = true;
}
return sumsq;
}
public double getPrecalcSqrt() {
if (!validSqrt) {
sqrt = sqrt(x * x + y * y) + SMALL_EPSILON;
validSqrt = true;
}
return sqrt;
}
public double getPrecalcAtan() {
if (!validAtan) {
atan = atan2(x, y);
validAtan = true;
}
return atan;
}
public double getPrecalcAtanYX() {
if (!validAtanYX) {
atanYX = atan2(y, x);
validAtanYX = true;
}
return atanYX;
}
public double getPrecalcSinA() {
if (!validSinA) {
sinA = x / getPrecalcSqrt();
validSinA = true;
}
return sinA;
}
public double getPrecalcCosA() {
if (!validCosA) {
cosA = y / getPrecalcSqrt();
validCosA = true;
}
return cosA;
}
@Override
public boolean isEqual(XYZPoint pSrc) {
if (fabs(x - pSrc.x) > EPSILON || fabs(y - pSrc.y) > EPSILON ||
fabs(z - pSrc.z) > EPSILON || fabs(color - pSrc.color) > EPSILON ||
fabs(modGamma - pSrc.modGamma) > EPSILON ||
fabs(modContrast - pSrc.modContrast) > EPSILON ||
fabs(modSaturation - pSrc.modSaturation) > EPSILON ||
fabs(modHue - pSrc.modHue) > EPSILON ||
rgbColor != pSrc.rgbColor || fabs(redColor - pSrc.redColor) > EPSILON ||
fabs(greenColor - pSrc.greenColor) > EPSILON || fabs(blueColor - pSrc.blueColor) > EPSILON ||
doHide != pSrc.doHide || fabs(material - pSrc.material) > EPSILON || receiveOnlyShadows != pSrc.receiveOnlyShadows) {
return false;
}
return true;
}
public boolean isNaN() {
return Double.isNaN(x) || Double.isNaN(y) || Double.isNaN(z);
}
public boolean isInfinite() {
return Double.isInfinite(x) || Double.isInfinite(y) || Double.isInfinite(z);
}
}