package org.goko.tools.viewer.jogl.service.overlay; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import javax.vecmath.Color3f; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.RGBA; import org.goko.core.common.exception.GkException; import org.goko.core.common.utils.AbstractIdBean; import org.goko.tools.viewer.jogl.preferences.JoglViewerPreference; import org.goko.tools.viewer.jogl.service.JoglSceneManager; import org.goko.tools.viewer.jogl.utils.overlay.IOverlayRenderer; /** * Overlay to display the current camera * @author Psyko */ public class CameraNameOverlay extends AbstractIdBean implements IOverlayRenderer, IPropertyChangeListener { /** The jogl scene manager */ private JoglSceneManager joglSceneManager; /** The overlay font */ private Font overlayFont; /** Last frame reset timer */ private long lastFrameReset; /** The frame counter */ private int frame; /** Computed FPS */ private int fps; private RGBA textColor; /** * Constructor */ public CameraNameOverlay(JoglSceneManager joglSceneManager) { this.joglSceneManager =joglSceneManager; this.overlayFont = new Font("SansSerif", Font.TRUETYPE_FONT, 13); JoglViewerPreference.getInstance().addPropertyChangeListener(this); updateTextColor(); } /** (inheritDoc) * @see org.goko.tools.viewer.jogl.utils.overlay.IOverlayRenderer#drawOverlayData(java.awt.Graphics2D, java.awt.Rectangle) */ @Override public void drawOverlayData(Graphics2D g2d, Rectangle s) throws GkException { if(joglSceneManager.getActiveCamera() != null){ g2d.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); FontRenderContext frc = g2d.getFontRenderContext(); String cameraString = joglSceneManager.getActiveCamera().getLabel(); GlyphVector gv = getOverlayFont().createGlyphVector(frc, cameraString); Rectangle glyphBounds = gv.getPixelBounds(frc, 0, 0); int x = 5; int y = 5 + glyphBounds.height; g2d.setFont(getOverlayFont()); //Color overlayColor = new Color(0.8f,0.8f,0.8f); Color overlayColor = new Color(textColor.rgb.red, textColor.rgb.green, textColor.rgb.blue, textColor.alpha); Color transparentColor = new Color(0,0,0,0); g2d.setBackground(transparentColor); g2d.setColor(overlayColor); g2d.clearRect(0, 0, s.width, s.height); if(joglSceneManager.isEnabled()){ g2d.drawString(cameraString,x,y); }else{ g2d.drawString("Disabled",x,y); } if(isShowFps()){ this.frame += 1; if(System.currentTimeMillis() - lastFrameReset >= 500){ this.lastFrameReset = System.currentTimeMillis(); this.fps = this.frame; this.frame = 0; } g2d.setColor(new Color(0.55f,0.45f,0.28f)); g2d.drawString(String.valueOf(this.fps*2)+"fps",x,y+glyphBounds.height+4); } } } /** * Detect if FPS should be shown * @return <code>true</code> if the FPS should be displayed, <code>false</code> otherwise */ private boolean isShowFps() { return JoglViewerPreference.getInstance().isShowFps(); } /** (inheritDoc) * @see org.goko.tools.viewer.jogl.utils.overlay.IOverlayRenderer#isOverlayEnabled() */ @Override public boolean isOverlayEnabled() { return true; } /** * @return the overlayFont */ public Font getOverlayFont() { return overlayFont; } /** * @param overlayFont the overlayFont to set */ public void setOverlayFont(Font overlayFont) { this.overlayFont = overlayFont; } /** (inheritDoc) * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) */ @Override public void propertyChange(PropertyChangeEvent event) { updateTextColor(); } private void updateTextColor(){ // Display overlay text as complementary color of background Color3f color = JoglViewerPreference.getInstance().getBackgroundColor(); RGB rgbColor = new RGB( (int)(color.x * 255), (int)(color.y * 255), (int)(color.z * 255)); float[] hsb = rgbColor.getHSB(); float complementaryHue = (hsb[0] + 180 ) % 360; textColor = new RGBA(complementaryHue, 1 - hsb[1], 1 - hsb[2], 255f); } }