package jadex.application.space.envsupport.observer.graphics.opengl; import jadex.application.space.envsupport.math.IVector2; import jadex.application.space.envsupport.math.Vector2Double; import jadex.application.space.envsupport.observer.graphics.drawable.DrawableCombiner; import jadex.application.space.envsupport.observer.graphics.drawable.Primitive; import jadex.application.space.envsupport.observer.graphics.drawable.Text; import jadex.javaparser.IParsedExpression; import jadex.javaparser.SimpleValueFetcher; import java.awt.Color; import java.awt.Font; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import com.sun.opengl.util.j2d.TextRenderer; public class TextGLRenderer implements IGLRenderer { /** Dummy FontRenderContext since we don't use FRCs */ private final static FontRenderContext DUMMY_FRC = new FontRenderContext(null, true, true); /** * Prepares the object for rendering to a Java2D viewport * * @param dc the DrawableCombiner drawing the object * @param primitive the primitive being drawn * @param obj the object being drawn * @param vp the viewport */ public void prepareAndExecuteDraw(DrawableCombiner dc, Primitive primitive, Object obj, ViewportJOGL vp) { IParsedExpression drawcondition = primitive.getDrawCondition(); boolean draw = drawcondition==null; if(!draw) { SimpleValueFetcher fetcher = new SimpleValueFetcher(vp.getPerspective().getObserverCenter().getSpace().getFetcher()); fetcher.setValue("$object", obj); fetcher.setValue("$perspective", vp.getPerspective()); // fetcher.setValue("$space", vp.getPerspective().getObserverCenter().getSpace()); draw = ((Boolean)drawcondition.getValue(fetcher)).booleanValue(); } if (draw) draw(dc, primitive, obj, vp); } /** * Draws the primitive. * @param dc the DrawableCombiner drawing the object * @param primitive the primitive being drawn * @param obj the object being drawn * @param vp the viewport */ public void draw(DrawableCombiner dc, Primitive primitive, Object obj, ViewportJOGL vp) { IVector2 position = ((IVector2)dc.getBoundValue(obj, primitive.getPosition(), vp)).copy(); IVector2 dcPos = Vector2Double.ZERO; if (primitive.isRelativePosition()) dcPos = (IVector2)dc.getBoundValue(obj, dc.getPosition(), vp);//SObjectInspector.getVector2(obj, dc.getPosition()); IVector2 dcScale = (IVector2)dc.getBoundValue(obj, dc.getSize(), vp); if((position == null) || (dcPos == null) || (dcScale == null)) { return; } IVector2 canvasSize = vp.getCanvasSize(); float fontscale = Text.getBasicFontScale(canvasSize, vp.getAreaSize(), vp.getSize()); if (primitive.isRelativeSize()) { position = position.copy().multiply(dcScale); // Do not scale fintsize wrt. drawable combiner size. // fontscale *= dcScale.getMean().getAsFloat(); } Text textP = (Text) primitive; Font font = textP.getBaseFont().deriveFont(textP.getBaseFont().getSize() * fontscale);; TextRenderer tr = vp.getTextRenderer(font); Color color = (Color)dc.getBoundValue(obj, primitive.getColor(), vp); tr.setColor(color); IVector2 pos = Text.getBasePosition(vp, dcPos, position, canvasSize, vp.getInvertX(), vp.getInvertY()); double xPos = pos.getXAsDouble(); double yPos = pos.getYAsDouble(); String text = Text.getReplacedText(dc, obj, textP.getText(), vp); String[] lines = text.split("(\n\r?)|(\r)"); for (int i = 0; i < lines.length; ++i) { // System.out.println("hier2"); TextLayout tl = new TextLayout(lines[i], font, DUMMY_FRC); // System.out.println("hier2.1"); if (i != 0) { // System.out.println("hier2.2"); yPos -= tl.getAscent(); } // System.out.println("hier2.3"); tr.beginRendering(canvasSize.getXAsInteger(), canvasSize.getYAsInteger()); // System.out.println("vorher: "+SUtil.arrayToString(lines[i])+", "+(xPos + textP.getAlignment(tl))+", "+yPos); tr.draw(lines[i], (int) (xPos + textP.getAlignment(tl)), (int) yPos); // System.out.println("nachher"); tr.endRendering(); // System.out.println("hier2.6"); yPos -= (tl.getDescent() + tl.getLeading()); // System.out.println("hier2.0"); } } }