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
// ===========================================================
}