¿Cómo puedo rellenar una forma Java en OpenGL?
Bien, digamos que tengo la forma de una O y quiero representarla.
Ahora mi código de representación actual es este:
public void fill(Shape shape, float xOffset, float yOffset) {
AffineTransform transform = new AffineTransform();
transform.translate(xOffset, yOffset);
PathIterator pi = shape.getPathIterator(transform, 1);
int winding = pi.getWindingRule();
ShapeRenderer r = getInstance();
float[] coords = new float[6];
boolean drawing = false;
while (!pi.isDone()) {
int segment = pi.currentSegment(coords);
switch (segment) {
case PathIterator.SEG_CLOSE:
if (drawing) {
r.endPoly();
}
break;
case PathIterator.SEG_LINETO:
r.lineTo(coords);
break;
case PathIterator.SEG_MOVETO:
if (drawing) {
r.endPoly();
}
drawing = true;
r.beginPoly(winding);
r.moveTo(coords);
break;
default:
throw new IllegalArgumentException("Valor inesperado: " + segment);
}
pi.next();
}
}
ShapeRenderer:
private final Deque<><float>> vertices = new ConcurrentLinkedDeque<>();
@Override
public void beginPoly(int windingRule) {
}
@Override
public void endPoly() {
Queue<float> q;
GL11.glBegin(GL11.GL_LINE_LOOP);
while ((q = vertices.poll()) != null) {
Float x, y;
while ((x = q.poll()) != null && (y = q.poll()) != null) {
GL11.glVertex2f(x, y);
}
}
GL11.glEnd();
}
@Override
public void moveTo(float[] vertex) {
Queue<float> q = new ConcurrentLinkedQueue<>();
vertices.offer(q);
lineTo(vertex);
}
@Override
public void lineTo(float[] vertex) {
Queue<float> q = vertices.peekLast();
q.offer(vertex[0]);
q.offer(vertex[1]);
}
Entonces, digamos que quiero rellenar esa forma, al igual que lo hace Java AWT, con éxito… ¿Cómo lo haría? (Ya intenté usar GL_POLYGON, pero solo rellena toda la O y yo tengo un círculo relleno, no una O. También intenté usar partes de jogamp glu pero no se renderizó nada, sin idea de por qué)
davy.ai
Para completar la forma de una O utilizando OpenGL, puedes modificar el código de renderizado actual de la siguiente manera:
GL11.GL_LINE_LOOP
conGL11.GL_TRIANGLE_FAN
enShapeRenderer.endPoly()
. Esto dibujará un círculo relleno.ShapeRenderer.beginPoly()
, ya que solo queremos dibujar la forma de una O. Puedes hacer esto agregando el siguiente código después deGL11.glBegin(GL11.GL_TRIANGLE_FAN);
:fill(Shape shape, float xOffset, float yOffset)
para llamar aShapeRenderer.beginPoly(GL11.GL_TRIANGLE_FAN)
en lugar deShapeRenderer.beginPoly(1)
. Esto utilizará la regla de enroscamiento no cero y aplicará la lógica de omitir el centro mencionada anteriormente.Con estos cambios, deberías poder llenar la forma de una O utilizando OpenGL con la función
fill()
modificada.