package org.geogebra.common.geogebra3D.euclidian3D.openGL;
import org.geogebra.common.kernel.Matrix.Coords;
/**
* Class for "completing task" cursor
*
* @author ggb3D
*
*/
public class PlotterCompletingCursor {
public static final float START_DRAW = 0.5f;
public static final float END_DRAW = 2f;
static private float coeff = 30f, coeffCircle = 1.25f,
coeffCompleting = 1.25f;
public static final double WIDTH = 10;
private int index, indexCircle, indexCircleOut;
private Manager manager;
static private float[] u, v;
static int longitude = 32;
static {
float dt = (float) 1 / longitude;
float da = (float) (Math.PI * dt / 2);
u = new float[longitude + 1];
v = new float[longitude + 1];
for (int i = 0; i <= longitude; i++) {
u[i] = (float) Math.cos(i * da) * coeff;
v[i] = (float) Math.sin(i * da) * coeff;
}
}
/**
* common constructor
*
* @param manager
* geometry manager
*/
public PlotterCompletingCursor(Manager manager) {
this.manager = manager;
// index for completing part
index = -1;
// circle
indexCircle = manager.startNewList(-1);
manager.startGeometry(Manager.Type.TRIANGLE_STRIP);
manager.setDummyTexture();
for (int i = 0; i < longitude; i++) {
vertexStrip(u[i], v[i], coeffCircle);
}
for (int i = 0; i < longitude; i++) {
vertexStrip(-v[i], u[i], coeffCircle);
}
for (int i = 0; i < longitude; i++) {
vertexStrip(-u[i], -v[i], coeffCircle);
}
for (int i = 0; i <= longitude; i++) {
vertexStrip(v[i], -u[i], coeffCircle);
}
manager.endGeometry();
manager.endList();
// circle out
indexCircleOut = manager.startNewList(-1);
manager.startGeometry(Manager.Type.TRIANGLE_STRIP);
manager.setDummyTexture();
for (int i = 0; i < longitude; i++) {
vertexFan(u[i], v[i], coeffCircle);
}
for (int i = 0; i < longitude; i++) {
vertexFan(-v[i], u[i], coeffCircle);
}
for (int i = 0; i < longitude; i++) {
vertexFan(-u[i], -v[i], coeffCircle);
}
for (int i = 0; i <= longitude; i++) {
vertexFan(v[i], -u[i], coeffCircle);
}
manager.endGeometry();
manager.endList();
}
private void vertexStrip(float u1, float v1, float c) {
p.setX(u1);
p.setY(v1);
manager.vertex(p);
p.setX(u1 * c);
p.setY(v1 * c);
manager.vertex(p);
}
private void vertexFan(float u1, float v1, float c) {
p.setX(0);
p.setY(0);
manager.vertex(p);
p.setX(u1 * c);
p.setY(v1 * c);
manager.vertex(p);
}
private void vertexStripOrFan(float u1, float v1, float c, boolean out) {
if (out) {
vertexFan(u1, v1, c);
} else {
vertexStrip(u1, v1, c);
}
}
// ////////////////////////////////
// INDEX
// ////////////////////////////////
private Coords p = new Coords(3);
private void startGeometry() {
manager.startGeometry(Manager.Type.TRIANGLE_STRIP);
manager.setDummyTexture();
manager.color(r, g, b, a);
}
private void endGeometry() {
manager.endGeometry();
}
private static float r = 0.25f, g = 0.25f, b = 0.25f, a = 0.5f;
public void drawCircle(boolean out) {
manager.color(0.5f, 0.5f, 0.5f, 0.5f);
if (out) {
manager.draw(indexCircleOut);
} else {
manager.draw(indexCircle);
}
}
public void drawCompleting(double value, boolean out) {
if (value <= 0f) {
return;
}
int l = value > 1f ? longitude : (int) (longitude * value);
index = manager.startNewList(index);
// right up
startGeometry();
for (int i = 0; i <= l; i++) {
vertexStripOrFan(u[i], v[i], coeffCompleting, out);
}
endGeometry();
// left down
startGeometry();
for (int i = 0; i <= l; i++) {
vertexStripOrFan(-u[i], -v[i], coeffCompleting, out);
}
endGeometry();
// left up
startGeometry();
for (int i = 0; i <= l; i++) {
vertexStripOrFan(-v[i], u[i], coeffCompleting, out);
}
endGeometry();
// right down
startGeometry();
for (int i = 0; i <= l; i++) {
vertexStripOrFan(v[i], -u[i], coeffCompleting, out);
}
endGeometry();
manager.endList();
// draw it
manager.draw(index);
}
}