package org.andengine.opengl.vbo.attribute;
import org.andengine.util.adt.DataConstants;
import org.andengine.util.exception.AndEngineRuntimeException;
import org.andengine.util.system.SystemUtils;
import android.opengl.GLES20;
import android.os.Build;
/**
 * (c) Zynga 2011
 *
 * @author Nicolas Gramlich <ngramlich@zynga.com>
 * @since 13:58:05 - 15.08.2011
 */
public class VertexBufferObjectAttributesBuilder {
	// ===========================================================
	// Constants
	// ===========================================================
	/** Android issue 8931. */
	private static final boolean WORAROUND_GLES2_GLVERTEXATTRIBPOINTER_MISSING;
	static {
		WORAROUND_GLES2_GLVERTEXATTRIBPOINTER_MISSING = SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO);
	}
	// ===========================================================
	// Fields
	// ===========================================================
	private int mIndex;
	private final VertexBufferObjectAttribute[] mVertexBufferObjectAttributes;
	private int mOffset;
	// ===========================================================
	// Constructors
	// ===========================================================
	public VertexBufferObjectAttributesBuilder(final int pCount) {
		this.mVertexBufferObjectAttributes = new VertexBufferObjectAttribute[pCount];
	}
	// ===========================================================
	// Getter & Setter
	// ===========================================================
	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================
	// ===========================================================
	// Methods
	// ===========================================================
	public VertexBufferObjectAttributesBuilder add(final int pLocation, final String pName, final int pSize, final int pType, final boolean pNormalized) {
		if(VertexBufferObjectAttributesBuilder.WORAROUND_GLES2_GLVERTEXATTRIBPOINTER_MISSING) {
			this.mVertexBufferObjectAttributes[this.mIndex] = new VertexBufferObjectAttributeFix(pLocation, pName, pSize, pType, pNormalized, this.mOffset);
		} else {
			this.mVertexBufferObjectAttributes[this.mIndex] = new VertexBufferObjectAttribute(pLocation, pName, pSize, pType, pNormalized, this.mOffset);
		}
		switch(pType) {
			case GLES20.GL_FLOAT:
				this.mOffset += pSize * DataConstants.BYTES_PER_FLOAT;
				break;
			case GLES20.GL_UNSIGNED_BYTE:
				this.mOffset += pSize * DataConstants.BYTES_PER_BYTE;
				break;
			default:
				throw new IllegalArgumentException("Unexpected pType: '" + pType + "'.");
		}
		this.mIndex++;
		return this;
	}
	public VertexBufferObjectAttributes build() {
		if(this.mIndex != this.mVertexBufferObjectAttributes.length) {
			throw new AndEngineRuntimeException("Not enough " + VertexBufferObjectAttribute.class.getSimpleName() + "s added to this " + this.getClass().getSimpleName() + ".");
		}
		return new VertexBufferObjectAttributes(this.mOffset, this.mVertexBufferObjectAttributes);
	}
	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}