package org.geogebra.desktop.geogebra3D.euclidian3D.opengl;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import org.geogebra.common.geogebra3D.euclidian3D.openGL.GLBuffer;
/**
* buffers for openGL
*
* @author Mathieu
*
*/
public class GLBufferD implements GLBuffer {
private FloatBuffer impl;
/**
* constructor from float array
*/
public GLBufferD() {
isEmpty = true;
}
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.capacity() < length) {
impl = FloatBuffer.allocate(length);
} else {
impl.rewind();
}
impl.limit(length);
}
@Override
public void setLimit(int length) {
impl.limit(length);
currentLength = length;
impl.rewind();
isEmpty = false;
}
@Override
public void put(double value) {
impl.put((float) value);
}
@Override
public double get() {
return impl.get();
}
@Override
public void rewind() {
impl.rewind();
}
@Override
public void set(ArrayList<Double> array, int length) {
allocate(length);
for (int i = 0; i < length; i++) {
put(array.get(i));
}
setLimit(length);
}
@Override
public int capacity() {
return currentLength;
}
@Override
public void array(float[] ret) {
impl.rewind();
for (int i = 0; i < ret.length; i++) {
ret[i] = impl.get();
}
}
/**
*
* @return buffer
*/
public FloatBuffer getBuffer() {
return impl;
}
}