package org.osm2world.viewer.view;
import java.awt.Color;
import java.io.IOException;
import javax.media.opengl.GL2ES2;
import com.jogamp.graph.curve.opengl.RenderState;
import com.jogamp.graph.curve.opengl.TextRenderer;
import com.jogamp.graph.font.Font;
import com.jogamp.graph.font.FontFactory;
import com.jogamp.graph.font.FontSet;
import com.jogamp.graph.geom.opengl.SVertex;
import com.jogamp.opengl.util.glsl.ShaderState;
public class TextRendererShader implements org.osm2world.viewer.view.TextRenderer {
private TextRenderer textRenderer;
private Font textRendererFont = null;
private GL2ES2 gl;
public TextRendererShader(GL2ES2 gl) {
this.gl = gl;
try {
textRendererFont = FontFactory.getDefault().get(FontSet.FAMILY_REGULAR, FontSet.STYLE_SERIF);
} catch (IOException e) {
throw new RuntimeException(e);
}
RenderState renderState = RenderState.createRenderState(new ShaderState(), SVertex.factory());
textRenderer = TextRenderer.create(renderState, 0);
textRenderer.init(gl);
if (!textRenderer.isInitialized()) {
throw new IllegalStateException("Text renderer not initlialized.");
}
// Workaround to get shader initialized properly (fixes problems at first drawText call in some situations)
textRenderer.enable(gl, true);
textRenderer.enable(gl, false);
}
// @Override
// public void drawText(String string, Vector3D pos, Color color) {
// textRenderer.resetModelview(gl);
// textRenderer.setColorStatic(gl, color.getRed(), color.getGreen(), color.getBlue());
// float[] posF = {(float)pos.getX(), (float)pos.getY(), -(float)pos.getZ()};
// int[] texSize = {0};
// textRenderer.drawString3D(gl.getGL2ES2(), textRendererFont, string, posF, 12, texSize);
// }
@Override
public void drawText(String string, int x, int y, int screenWidth,
int screenHeight, Color color) {
textRenderer.enable(gl, true);
textRenderer.setColorStatic(gl, color.getRed(), color.getGreen(), color.getBlue());
textRenderer.resetModelview(gl);
textRenderer.reshapeOrtho(gl, screenWidth, screenHeight, -100000, 100000);
textRenderer.translate(gl, x, y, 0);
float[] posF = {0, 0, 0}; // not used in TextRendererImpl01
int[] texSize = {0};
textRenderer.drawString3D(gl, textRendererFont, string, posF, 12, texSize);
textRenderer.enable(gl, false);
}
@Override
public void destroy() {
textRenderer.destroy(gl);
textRenderer = null;
textRendererFont = null;
gl = null;
}
}