159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.scene.plugins.blender.textures;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.ColorRGBA;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.FastMath;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image.Format;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer;
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level;
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger;
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The class that stores the pixel values of a texture.
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Marcin Roguski (Kaelthas)
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class TexturePixel implements Cloneable {
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	private static final Logger	LOGGER	= Logger.getLogger(TexturePixel.class.getName());
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/** The pixel data. */
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public float				intensity, red, green, blue, alpha;
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Copies the values from the given pixel.
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param pixel
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the pixel that we read from
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void fromPixel(TexturePixel pixel) {
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.intensity = pixel.intensity;
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red = pixel.red;
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green = pixel.green;
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue = pixel.blue;
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha = pixel.alpha;
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Copies the values from the given color.
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param colorRGBA
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the color that we read from
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void fromColor(ColorRGBA colorRGBA) {
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red = colorRGBA.r;
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green = colorRGBA.g;
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue = colorRGBA.b;
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha = colorRGBA.a;
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Copies the values from the given values.
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param a
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the alpha value
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param r
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the red value
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param g
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the green value
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param b
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the blue value
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void fromARGB8(float a, float r, float g, float b) {
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha = a;
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red = r;
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green = g;
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue = b;
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Copies the values from the given integer that stores the ARGB8 data.
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param argb8
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the data stored in an integer
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void fromARGB8(int argb8) {
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		byte pixelValue = (byte) ((argb8 & 0xFF000000) >> 24);
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		pixelValue = (byte) ((argb8 & 0xFF0000) >> 16);
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		pixelValue = (byte) ((argb8 & 0xFF00) >> 8);
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		pixelValue = (byte) (argb8 & 0xFF);
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Copies the data from the given image.
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param imageFormat
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the image format
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param data
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the image data
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param pixelIndex
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the index of the required pixel
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void fromImage(Format imageFormat, ByteBuffer data, int pixelIndex) {
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		int firstByteIndex;
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		byte pixelValue;
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		switch (imageFormat) {
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta			case ABGR8:
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				firstByteIndex = pixelIndex << 2;
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex);
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.alpha = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 1);
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.blue = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 2);
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.green = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 3);
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.red = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				break;
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta			case RGBA8:
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				firstByteIndex = pixelIndex << 2;
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex);
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.red = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 1);
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.green = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 2);
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.blue = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 3);
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.alpha = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				break;
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta			case BGR8:
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				firstByteIndex = pixelIndex * 3;
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex);
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.blue = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 1);
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.green = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 2);
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.red = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.alpha = 1.0f;
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				break;
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta			case RGB8:
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				firstByteIndex = pixelIndex * 3;
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex);
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.red = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 1);
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.green = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(firstByteIndex + 2);
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.blue = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.alpha = 1.0f;
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				break;
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta			case Luminance8:
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				pixelValue = data.get(pixelIndex);
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.intensity = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				break;
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta			default:
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				LOGGER.log(Level.FINEST, "Unknown type of texture: {0}. Black pixel used!", imageFormat);
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta				this.intensity = this.blue = this.red = this.green = this.alpha = 0.0f;
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		}
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Stores RGBA values in the given array.
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param result
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the array to store values
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void toRGBA(float[] result) {
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result[0] = this.red;
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result[1] = this.green;
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result[2] = this.blue;
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result[3] = this.alpha;
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Stores the data in the given table.
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param result
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the result table
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void toRGBA8(byte[] result) {
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result[0] = (byte) (this.red * 255.0f);
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result[1] = (byte) (this.green * 255.0f);
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result[2] = (byte) (this.blue * 255.0f);
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result[3] = (byte) (this.alpha * 255.0f);
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Stores the pixel values in the integer.
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @return the integer that stores the pixel values
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public int toARGB8() {
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		int result = 0;
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		int b = (int) (this.alpha * 255.0f);
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result |= b << 24;
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		b = (int) (this.red * 255.0f);
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result |= b << 16;
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		b = (int) (this.green * 255.0f);
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result |= b << 8;
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		b = (int) (this.blue * 255.0f);
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		result |= b;
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		return result;
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * Merges two pixels (adds the values of each color).
19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param pixel
19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the pixel we merge with
19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void merge(TexturePixel pixel) {
20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		float oneMinusAlpha = 1 - pixel.alpha;
20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red = oneMinusAlpha * this.red + pixel.alpha * pixel.red;
20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green = oneMinusAlpha * this.green + pixel.alpha * pixel.green;
20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue = oneMinusAlpha * this.blue + pixel.alpha * pixel.blue;
20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		// alpha should be always 1.0f as a result
20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * This method negates the colors.
21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void negate() {
21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red = 1.0f - this.red;
21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green = 1.0f - this.green;
21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue = 1.0f - this.blue;
21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha = 1.0f - this.alpha;
21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * This method clears the pixel values.
22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void clear() {
22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.intensity = this.blue = this.red = this.green = this.alpha = 0.0f;
22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * This method adds the calues of the given pixel to the current pixel.
22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param pixel
22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the pixel we add
23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void add(TexturePixel pixel) {
23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red += pixel.red;
23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green += pixel.green;
23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue += pixel.blue;
23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha += pixel.alpha;
23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.intensity += pixel.intensity;
23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * This method multiplies the values of the given pixel by the given value.
24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param value
24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            multiplication factor
24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void mult(float value) {
24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red *= value;
24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green *= value;
24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue *= value;
24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha *= value;
25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.intensity *= value;
25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * This method divides the values of the given pixel by the given value.
25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * ATTENTION! Beware of the zero value. This will cause you NaN's in the
25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * pixel values.
25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param value
25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            division factor
26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void divide(float value) {
26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red /= value;
26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green /= value;
26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue /= value;
26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha /= value;
26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.intensity /= value;
26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	/**
27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * This method clamps the pixel values to the given borders.
27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *
27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param min
27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the minimum value
27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 * @param max
27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 *            the maximum value
27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	 */
27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public void clamp(float min, float max) {
27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.red = FastMath.clamp(this.red, min, max);
27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.green = FastMath.clamp(this.green, min, max);
28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.blue = FastMath.clamp(this.blue, min, max);
28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.alpha = FastMath.clamp(this.alpha, min, max);
28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		this.intensity = FastMath.clamp(this.intensity, min, max);
28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	@Override
28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public Object clone() throws CloneNotSupportedException {
28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		return super.clone();
28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	@Override
29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	public String toString() {
29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta		return "[" + red + ", " + green + ", " + blue + ", " + alpha + " {" + intensity + "}]";
29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta	}
29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
295