package org.geogebra.web.geogebra3D.web.euclidian3D.openGL; import java.util.ArrayList; import org.geogebra.common.geogebra3D.euclidian3D.openGL.GLBuffer; import com.googlecode.gwtgl.array.Float32Array; /** * buffers for openGL * * @author mathieu * */ public class GLBufferW implements GLBuffer { private MyFloat32Array impl; /** * constructor from float array */ public GLBufferW() { isEmpty = true; currentLength = 0; } private boolean isEmpty; private int currentLength; @Override public boolean isEmpty() { return isEmpty; } @Override public void setEmpty() { isEmpty = true; } @Override public void allocate(int length) { // allocate buffer only at start and when length change if (impl == null || impl.getLength() < length) { // This may be null in IE10 impl = (MyFloat32Array) Float32Array.create(length); } index = 0; } private int index = 0; @Override public void setLimit(int length) { currentLength = length; isEmpty = false; } @Override public void put(double value) { if (impl == null) { return; } impl.set(index, value); index++; } @Override public double get() { double ret = impl.get(index); index++; return ret; } @Override public void rewind() { index = 0; } @Override public void set(ArrayList<Double> array, int length) { allocate(length); if (impl == null) { return; } for (int i = 0; i < length; i++) { impl.set(i, array.get(i)); } setLimit(length); } @Override public int capacity() { return currentLength; } @Override public void array(float[] ret) { if (impl == null) { return; } for (int i = 0; i < ret.length; i++) { ret[i] = impl.get(i); } } /** * * @return buffer */ public Float32Array getBuffer() { return impl.subarray(0, currentLength); } }