package org.geogebra.common.geogebra3D.euclidian3D.draw; import org.geogebra.common.awt.GFont; import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D; import org.geogebra.common.geogebra3D.euclidian3D.Hits3D; import org.geogebra.common.geogebra3D.euclidian3D.Hitting; import org.geogebra.common.geogebra3D.euclidian3D.openGL.Renderer; import org.geogebra.common.geogebra3D.euclidian3D.openGL.Renderer.PickingType; import org.geogebra.common.kernel.Matrix.Coords; import org.geogebra.common.kernel.geos.GeoText; import org.geogebra.common.kernel.kernelND.GeoPointND; public class DrawText3D extends Drawable3DCurves { private boolean wasLaTeX; public DrawText3D(EuclidianView3D a_view3d, GeoText text) { super(a_view3d, text); wasLaTeX = text.isLaTeX(); ((DrawLabel3DForText) label).setGeo(text); setPickingType(PickingType.POINT_OR_CURVE); } @Override protected DrawLabel3D newDrawLabel3D(EuclidianView3D view3D) { return new DrawLabel3DForText(view3D, this); } @Override protected void updateForView() { // no change on zoom / rotate } @Override protected boolean updateForItSelf() { // setLabelWaitForUpdate(); return true; } @Override public void drawGeometry(Renderer renderer) { // see drawlabel } @Override protected void updateLabel() { GeoText text = (GeoText) getGeoElement(); if (wasLaTeX != text.isLaTeX()) { label.setWaitForReset(); } wasLaTeX = text.isLaTeX(); label.update(text.getTextString(), getFont(), getGeoElement().getBackgroundColor(), getGeoElement().getObjectColor(), getLabelPosition(), getLabelOffsetX(), -getLabelOffsetY()); } @Override protected void updateLabelPosition() { label.updatePosition(getView3D().getRenderer()); } private GFont getFont() { GeoText text = (GeoText) getGeoElement(); // text's font size is relative to the global font size int newFontSize = (int) Math.max(4, getView3D().getFontSize() * text.getFontSizeMultiplier()); int newFontStyle = text.getFontStyle(); boolean newSerifFont = text.isSerifFont(); /* * if (textFont.canDisplayUpTo(text.getTextString()) != -1 || fontSize * !=newFontSize || fontStyle != newFontStyle || newSerifFont != * serifFont) { super.updateFontSize(); * * fontSize = newFontSize; fontStyle = newFontStyle; serifFont = * newSerifFont; */ // if (isLaTeX) { // //setEqnFontSize(); // } else { GFont textFont = getView3D().getApplication().getFontCanDisplay( text.getTextString(), newSerifFont, newFontStyle, newFontSize); // } return textFont; } // private boolean isLocationDefined; @Override protected boolean isLabelVisible() { return isVisible();// && isLocationDefined; } @Override public Coords getLabelPosition() { // isLocationDefined = true; GeoText text = (GeoText) getGeoElement(); // compute location of text if (text.isAbsoluteScreenLocActive()) { return new Coords(text.getAbsoluteScreenLocX(), text.getAbsoluteScreenLocY(), 0, 1); } GeoPointND loc = text.getStartPoint(); if (loc == null) { // return new // Coords(getView3D().getXZero(),getView3D().getYZero(),0,1); return new Coords(0, 0, 0, 1); } if (!loc.isDefined()) { // isLocationDefined = false; return null; } return loc.getInhomCoordsInD3(); } @Override public int getPickOrder() { return DRAW_PICK_ORDER_TEXT; } @Override public boolean hit(Hitting hitting) { if (hitting.hitLabel(label)) { setZPick(label.getDrawZ(), label.getDrawZ()); return true; } return false; } @Override protected boolean hitLabel(Hitting hitting, Hits3D hits) { return false; // no label } @Override public void addToDrawable3DLists(Drawable3DLists lists) { addToDrawable3DLists(lists, DRAW_TYPE_TEXTS); } @Override public void removeFromDrawable3DLists(Drawable3DLists lists) { removeFromDrawable3DLists(lists, DRAW_TYPE_TEXTS); } public void drawNotAbsolutePosition(Renderer renderer) { GeoText text = (GeoText) getGeoElement(); if (!text.isAbsoluteScreenLocActive()) { drawLabel(renderer); } } public void drawAbsolutePosition(Renderer renderer) { GeoText text = (GeoText) getGeoElement(); if (text.isAbsoluteScreenLocActive()) { drawLabel(renderer); } } }