public class

TextureRegion

extends BaseTextureRegion
implements ITextureRegion
package org.andengine.opengl.texture.region;

import org.andengine.opengl.texture.ITexture;

/**
 * (c) 2010 Nicolas Gramlich
 * (c) 2011 Zynga Inc.
 * 
 * @author Nicolas Gramlich
 * @since 14:29:59 - 08.03.2010
 */
public class TextureRegion extends BaseTextureRegion implements ITextureRegion {
	// ===========================================================
	// Constants
	// ===========================================================

	private static final float SCALE_DEFAULT = 1;

	// ===========================================================
	// Fields
	// ===========================================================

	protected float mTextureX;
	protected float mTextureY;
	protected float mTextureWidth;
	protected float mTextureHeight;

	protected float mU;
	protected float mU2;
	protected float mV;
	protected float mV2;

	protected final float mScale;
	protected final boolean mRotated;

	// ===========================================================
	// Constructors
	// ===========================================================

	public TextureRegion(final ITexture pTexture, final float pTextureX, final float pTextureY, final float pTextureWidth, final float pTextureHeight) {
		this(pTexture, pTextureX, pTextureY, pTextureWidth, pTextureHeight, false);
	}

	public TextureRegion(final ITexture pTexture, final float pTextureX, final float pTextureY, final float pTextureWidth, final float pTextureHeight, final boolean pRotated) {
		this(pTexture, pTextureX, pTextureY, pTextureWidth, pTextureHeight, SCALE_DEFAULT, pRotated);
	}

	public TextureRegion(final ITexture pTexture, final float pTextureX, final float pTextureY, final float pTextureWidth, final float pTextureHeight, final float pScale) {
		this(pTexture, pTextureX, pTextureY, pTextureWidth, pTextureHeight, pScale, false);
	}

	public TextureRegion(final ITexture pTexture, final float pTextureX, final float pTextureY, final float pTextureWidth, final float pTextureHeight, final float pScale, final boolean pRotated) {
		super(pTexture);

		this.mTextureX = pTextureX;
		this.mTextureY = pTextureY;

		if(pRotated) {
			this.mRotated = true;

			this.mTextureWidth = pTextureHeight;
			this.mTextureHeight = pTextureWidth;
		} else {
			this.mRotated = false;

			this.mTextureWidth = pTextureWidth;
			this.mTextureHeight = pTextureHeight;
		}

		this.mScale = pScale;

		this.updateUV();
	}

	@Override
	public TextureRegion deepCopy() {
		if(this.mRotated) {
			return new TextureRegion(this.mTexture, this.mTextureX, this.mTextureY, this.mTextureHeight, this.mTextureWidth, this.mScale, this.mRotated);
		} else {
			return new TextureRegion(this.mTexture, this.mTextureX, this.mTextureY, this.mTextureWidth, this.mTextureHeight, this.mScale, this.mRotated);
		}
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	@Override
	public float getTextureX() {
		return this.mTextureX;
	}

	@Override
	public float getTextureY() {
		return this.mTextureY;
	}

	@Override
	public void setTextureX(final float pTextureX) {
		this.mTextureX = pTextureX;

		this.updateUV();
	}

	@Override
	public void setTextureY(final float pTextureY) {
		this.mTextureY = pTextureY;

		this.updateUV();
	}

	@Override
	public void setTexturePosition(final float pTextureX, final float pTextureY) {
		this.mTextureX = pTextureX;
		this.mTextureY = pTextureY;

		this.updateUV();
	}

	@Override
	public float getWidth() {
		if(this.mRotated) {
			return this.mTextureHeight * this.mScale;
		} else {
			return this.mTextureWidth * this.mScale;
		}
	}

	@Override
	public float getHeight() {
		if(this.mRotated) {
			return this.mTextureWidth * this.mScale;
		} else {
			return this.mTextureHeight * this.mScale;
		}
	}

	@Override
	public void setTextureWidth(final float pTextureWidth) {
		this.mTextureWidth = pTextureWidth;

		this.updateUV();
	}

	@Override
	public void setTextureHeight(final float pTextureHeight) {
		this.mTextureHeight = pTextureHeight;

		this.updateUV();
	}

	@Override
	public void setTextureSize(final float pTextureWidth, final float pTextureHeight) {
		this.mTextureWidth = pTextureWidth;
		this.mTextureHeight = pTextureHeight;

		this.updateUV();
	}

	@Override
	public void set(final float pTextureX, final float pTextureY, final float pTextureWidth, final float pTextureHeight) {
		this.mTextureX = pTextureX;
		this.mTextureY = pTextureY;
		this.mTextureWidth = pTextureWidth;
		this.mTextureHeight = pTextureHeight;

		this.updateUV();
	}

	@Override
	public float getU() {
		return this.mU;
	}

	@Override
	public float getU2() {
		return this.mU2;
	}

	@Override
	public float getV() {
		return this.mV;
	}

	@Override
	public float getV2() {
		return this.mV2;
	}

	@Override
	public boolean isScaled() {
		return this.mScale != SCALE_DEFAULT;
	}

	@Override
	public float getScale() {
		return this.mScale;
	}

	@Override
	public boolean isRotated() {
		return this.mRotated;
	}

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	// ===========================================================
	// Methods
	// ===========================================================

	public void updateUV() {
		final ITexture texture = this.mTexture;
		final float textureWidth = texture.getWidth();
		final float textureHeight = texture.getHeight();

		final float x = this.getTextureX();
		final float y = this.getTextureY();

		this.mU = x / textureWidth;
		this.mU2 = (x + this.mTextureWidth) / textureWidth;

		this.mV = y / textureHeight;
		this.mV2 = (y + this.mTextureHeight) / textureHeight;

//		this.mU = (x + 0.5f) / textureWidth;
//		this.mU2 = (x + this.mTextureWidth - 0.5f) / textureWidth;
//
//		this.mV = (y + 0.5f) / textureHeight;
//		this.mV2 = (y + this.mTextureHeight - 0.5f) / textureHeight;
	}

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}