package org.andengine.entity.shape;
import org.andengine.engine.camera.Camera;
import org.andengine.entity.Entity;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.shader.ShaderProgram;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.util.GLState;
import org.andengine.opengl.vbo.IVertexBufferObject;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 11:51:27 - 13.03.2010
*/
public abstract class Shape extends Entity implements IShape {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
protected int mBlendFunctionSource = IShape.BLENDFUNCTION_SOURCE_DEFAULT;
protected int mBlendFunctionDestination = IShape.BLENDFUNCTION_DESTINATION_DEFAULT;
protected boolean mBlendingEnabled = false;
protected ShaderProgram mShaderProgram;
// ===========================================================
// Constructors
// ===========================================================
public Shape(final float pX, final float pY, final ShaderProgram pShaderProgram) {
super(pX, pY);
this.mShaderProgram = pShaderProgram;
}
// ===========================================================
// Getter & Setter
// ===========================================================
@Override
public boolean isBlendingEnabled() {
return this.mBlendingEnabled;
}
@Override
public void setBlendingEnabled(final boolean pBlendingEnabled) {
this.mBlendingEnabled = pBlendingEnabled;
}
@Override
public int getBlendFunctionSource() {
return this.mBlendFunctionSource;
}
@Override
public void setBlendFunctionSource(final int pBlendFunctionSource) {
this.mBlendFunctionSource = pBlendFunctionSource;
}
@Override
public int getBlendFunctionDestination() {
return this.mBlendFunctionDestination;
}
@Override
public void setBlendFunctionDestination(final int pBlendFunctionDestination) {
this.mBlendFunctionDestination = pBlendFunctionDestination;
}
@Override
public void setBlendFunction(final int pBlendFunctionSource, final int pBlendFunctionDestination) {
this.mBlendFunctionSource = pBlendFunctionSource;
this.mBlendFunctionDestination = pBlendFunctionDestination;
}
@Override
public ShaderProgram getShaderProgram() {
return this.mShaderProgram;
}
@Override
public void setShaderProgram(final ShaderProgram pShaderProgram) {
this.mShaderProgram = pShaderProgram;
}
@Override
public VertexBufferObjectManager getVertexBufferObjectManager() {
return this.getVertexBufferObject().getVertexBufferObjectManager();
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
protected abstract void onUpdateVertices();
@Override
protected void preDraw(final GLState pGLState, final Camera pCamera) {
if(this.mBlendingEnabled) {
pGLState.enableBlend();
pGLState.blendFunction(this.mBlendFunctionSource, this.mBlendFunctionDestination);
}
}
@Override
protected void postDraw(final GLState pGLState, final Camera pCamera) {
if(this.mBlendingEnabled) {
pGLState.disableBlend();
}
}
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
return false;
}
@Override
public void reset() {
super.reset();
this.mBlendFunctionSource = IShape.BLENDFUNCTION_SOURCE_DEFAULT;
this.mBlendFunctionDestination = IShape.BLENDFUNCTION_DESTINATION_DEFAULT;
}
@Override
public void dispose() {
super.dispose();
final IVertexBufferObject vertexBufferObject = this.getVertexBufferObject();
if((vertexBufferObject != null) && vertexBufferObject.isAutoDispose() && !vertexBufferObject.isDisposed()) {
vertexBufferObject.dispose();
}
}
// ===========================================================
// Methods
// ===========================================================
protected void initBlendFunction(final ITextureRegion pTextureRegion) {
this.initBlendFunction(pTextureRegion.getTexture());
}
protected void initBlendFunction(final ITexture pTexture) {
this.initBlendFunction(pTexture.getTextureOptions());
}
protected void initBlendFunction(final TextureOptions pTextureOptions) {
if(pTextureOptions.mPreMultiplyAlpha) {
this.setBlendFunction(IShape.BLENDFUNCTION_SOURCE_PREMULTIPLYALPHA_DEFAULT, IShape.BLENDFUNCTION_DESTINATION_PREMULTIPLYALPHA_DEFAULT);
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}