Class EmulGLCanvas
- java.lang.Object
-
- java.awt.Component
-
- java.awt.Canvas
-
- jgl.wt.awt.GLCanvas
-
- org.jzy3d.plot3d.rendering.canvas.EmulGLCanvas
-
- All Implemented Interfaces:
ImageObserver
,MenuContainer
,Serializable
,Accessible
,IMonitorable
,ICanvas
,IScreenCanvas
public class EmulGLCanvas extends GLCanvas implements IScreenCanvas, IMonitorable
This canvas allows rendering charts with jGL as OpenGL backend which perform in CPU. The below schema depicts how this canvas does painting :- Author:
- Martin Pernollet
- See Also:
- Serialized Form
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class java.awt.Canvas
Canvas.AccessibleAWTCanvas
-
Nested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
-
-
Field Summary
Fields Modifier and Type Field Description protected IAnimator
animator
protected List<ICanvasListener>
canvasListeners
protected boolean
debugEvents
set to TRUE to show in console events of the component (to debug GLUT)protected ExecutorService
executor
protected AWTImageExporter
exporter
protected AtomicBoolean
isRenderingFlag
protected double
lastRenderingTimeMs
protected Monitor
monitor
protected EmulGLPainter
painter
protected int
profileDisplayCount
protected Font
profileDisplayFont
protected boolean
profileDisplayMethod
set to TRUE to overlay performance info on top left cornerprotected TicToc
profileDisplayTimer
protected List<org.jzy3d.plot3d.rendering.canvas.EmulGLCanvas.ProfileInfo>
profileInfo
static boolean
TO_BE_CHOOSEN_REPAINT_WITH_FLUSH
Specify actual way of forcing repaint if true : manual if false : trigger component.resize event to force resize + view.render + glFlush + swap imageprotected View
view
-
Fields inherited from class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
-
Fields inherited from interface org.jzy3d.plot3d.rendering.canvas.ICanvas
ALLOW_WATCH_PIXEL_SCALE, LAST_RENDER_TIME_UNDEFINED
-
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
-
-
Constructor Summary
Constructors Constructor Description EmulGLCanvas(IChartFactory factory, Scene scene, Quality quality)
Initialize a canvas for rendering 3D
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
add(Monitor monitor)
void
addCanvasListener(ICanvasListener listener)
void
addKeyController(Object o)
A generic interface for mouse listener to remain Windowing toolkit independant.void
addMouseController(Object o)
A generic interface for mouse listener to remain Windowing toolkit independant.protected void
checkAlphaChannelOfColorBuffer(EmulGLPainter painter)
void
display()
void
dispose()
Performs all required cleanup when destroying a Canvas.void
doMotion(int x, int y)
Handle mouse events emitted by GLUT.void
doRender()
Triggers an atomic rendering of a frame, measure rendering performance and update the status of rendering (active or not).void
doReshape(int w, int h)
Handle resize events emitted by GLUT.protected void
firePixelScaleChanged(double pixelScaleX, double pixelScaleY)
void
forceRepaint()
Can be used to update image if camera has changed position.IAnimator
getAnimation()
List<ICanvasListener>
getCanvasListeners()
String
getDebugInfo()
AWTImageExporter
getExporter()
String
getFullname()
AtomicBoolean
getIsRenderingFlag()
String
getLabel()
double
getLastRenderingTimeMs()
Coord2d
getPixelScale()
Provide pixel scale as feasible by the Hardware, OS, and JVM, independently of what was asked byICanvas.setPixelScale(float[])
.Coord2d
getPixelScaleJVM()
Provide pixel scale as considered feasible by the JVM.int
getRendererHeight()
Returns the renderer's height, i.e. the display height.int
getRendererWidth()
Returns the renderer's width, i.e. the display width.View
getView()
Returns a reference to the held view.protected void
init(int width, int height)
Equivalent to registering a Renderer3d in native canvas.protected void
initGLUT(int width, int height)
Configure GLUT callback which yield to the below flow diagramprotected void
initView()
boolean
isDebugEvents()
boolean
isNative()
Return true if the canvas renders GL with GPU, false if renders GL using CPU executed Java code.boolean
isProfileDisplayMethod()
protected void
monitorRenderingTime(Monitor monitor, double mili)
void
paint(Graphics g)
This overrides theGLCanvas
henceCanvas
methods to copy the image of the 3D scene as generated whileGL.glFlush()
.protected void
paintProfileInfo(BufferedImage glImage)
Render profile on top of an image (probably the image of the GL scene) previously collected while {@link EmulGLCanvas#doRender(). Painting profile info is synchronized on the profile info list to ensure it is not modified while drawing (which occurs if synchronization is disabled).void
printCallTrace()
void
printCallTrace(int from, String filterLine)
Print stack but drops any class.method name not containing the filter (in case it is not null)protected void
printCountGLBegin()
void
processEvent(AWTEvent e)
This override letGLUT.processEvent(AWTEvent)
be informed ofAWTEvent
traversing this canvas (mouse, keyboard, resize).protected void
profile(double mili)
protected void
profile(String message, int x, int y, Color c)
Draw a 2d text at the given positionprotected void
profileClear()
void
removeCanvasListener(ICanvasListener listener)
void
removeKeyController(Object o)
A generic interface for key listener to remain Windowing toolkit independant. * Implementation of this method should simply cast the input assuming it will correspond to canvas-compatible key listener.void
removeMouseController(Object o)
A generic interface for key listener to remain Windowing toolkit independant.protected void
resetCountGLBegin()
BufferedImage
screenshot()
void
screenshot(File file)
void
setDebugEvents(boolean debugEvents)
void
setExporter(AWTImageExporter exporter)
void
setPixelScale(float[] scale)
Defines pixel scale.void
setProfileDisplayMethod(boolean profileDisplayMethod)
protected boolean
shouldPrintEvent(AWTEvent e)
protected void
updatePainterWithGL()
RegisterEmulGLPainter
.-
Methods inherited from class jgl.wt.awt.GLCanvas
getGL, getGLU, getGLUT, getPixelScaleFromG2D, glut_enable_events, setGL, update
-
Methods inherited from class java.awt.Canvas
addNotify, createBufferStrategy, createBufferStrategy, getAccessibleContext, getBufferStrategy
-
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, deliverEvent, disable, disableEvents, dispatchEvent, doLayout, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAlignmentX, getAlignmentY, getBackground, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentAt, getComponentAt, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeys, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphics, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getListeners, getLocale, getLocation, getLocation, getLocationOnScreen, getMaximumSize, getMinimumSize, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPreferredSize, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getToolkit, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, invalidate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusCycleRoot, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isOpaque, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, layout, list, list, list, list, list, locate, location, lostFocus, minimumSize, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, paramString, postEvent, preferredSize, prepareImage, prepareImage, print, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removeNotify, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, reshape, resize, resize, revalidate, setBackground, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeys, setFocusTraversalKeysEnabled, setFont, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setMaximumSize, setMinimumSize, setMixingCutoutShape, setName, setPreferredSize, setSize, setSize, setVisible, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle, validate
-
-
-
-
Field Detail
-
TO_BE_CHOOSEN_REPAINT_WITH_FLUSH
public static final boolean TO_BE_CHOOSEN_REPAINT_WITH_FLUSH
Specify actual way of forcing repaint- if true : manual
- if false : trigger component.resize event to force resize + view.render + glFlush + swap image
- See Also:
- Constant Field Values
-
view
protected View view
-
painter
protected EmulGLPainter painter
-
animator
protected IAnimator animator
-
canvasListeners
protected List<ICanvasListener> canvasListeners
-
isRenderingFlag
protected AtomicBoolean isRenderingFlag
-
debugEvents
protected boolean debugEvents
set to TRUE to show in console events of the component (to debug GLUT)
-
profileDisplayMethod
protected boolean profileDisplayMethod
set to TRUE to overlay performance info on top left corner
-
profileDisplayTimer
protected TicToc profileDisplayTimer
-
profileDisplayFont
protected Font profileDisplayFont
-
profileDisplayCount
protected int profileDisplayCount
-
profileInfo
protected List<org.jzy3d.plot3d.rendering.canvas.EmulGLCanvas.ProfileInfo> profileInfo
-
monitor
protected Monitor monitor
-
exporter
protected AWTImageExporter exporter
-
executor
protected ExecutorService executor
-
lastRenderingTimeMs
protected double lastRenderingTimeMs
-
-
Constructor Detail
-
EmulGLCanvas
public EmulGLCanvas(IChartFactory factory, Scene scene, Quality quality)
Initialize a canvas for rendering 3D
-
-
Method Detail
-
processEvent
public void processEvent(AWTEvent e)
Description copied from class:GLCanvas
This override letGLUT.processEvent(AWTEvent)
be informed ofAWTEvent
traversing this canvas (mouse, keyboard, resize). One should registerGLUT.glutDisplayFunc(String)
to register a display callback,GLUT.glutMotionFunc(String)
to register a mouse motion callback, etc. NB : This relies on the fact the GLUT already invoked {@link this#glut_enable_events}.- Overrides:
processEvent
in classGLCanvas
-
shouldPrintEvent
protected boolean shouldPrintEvent(AWTEvent e)
-
init
protected void init(int width, int height)
Equivalent to registering a Renderer3d in native canvas.
-
initView
protected void initView()
-
initGLUT
protected void initGLUT(int width, int height)
Configure GLUT callback which yield to the below flow diagram
-
paint
public void paint(Graphics g)
This overrides theGLCanvas
henceCanvas
methods to copy the image of the 3D scene as generated whileGL.glFlush()
. It is called when the application needs to paint the canvas, which assume a rendering has already been process bydoRender()
which produce an image that the canvas can use for fast pixel swap.doRender()
on its side is triggered whenGLUT
thinks it is relevant. This may occur becauseEmulGLCanvas
triggered aComponentEvent.COMPONENT_RESIZED
event.
-
display
public void display()
- Specified by:
display
in interfaceIScreenCanvas
-
forceRepaint
public void forceRepaint()
Can be used to update image if camera has changed position. (usually called byView.shoot()
) Warning if this is invoked by a thread external to AWT, this may redraw GL while GL is already used by AWT, which would turn GL into an inconsistent state.- Specified by:
forceRepaint
in interfaceICanvas
- Overrides:
forceRepaint
in classGLCanvas
-
doRender
public void doRender()
Triggers an atomic rendering of a frame, measure rendering performance and update the status of rendering (active or not). This method is callback registered in withGLUT.glutDisplayFunc(Consumer)
which will be called when OpenGL need to update display. OpenGL updates as soon as the component that GLUT listen to (which is thisEmulGLCanvas
triggers aComponentEvent.COMPONENT_RESIZED
event. Performance measurement can be seen on screen ifsetProfileDisplayMethod(boolean)
was set to true OR can be collected by aMonitor
defined byadd(Monitor)
. This method is synchronized to prevent multiple concurrent calls to doDisplay which might make jGL get crazy with GL state consistency : GL states must be consistent during a complete rendering pass, and should not be modified by a second rendering pass in the middle of the first one. Consistency may be on drawing a complete geometry in appropriate order (glBegin, glVertex, glEnd) or in the way OpenGL 1.0 fixed pipeline is cleanly handled. In addition, the display method has aisRenderingFlag
so that external components may known that the canvas is currently rendering or not. This allows ignoring a rendering query in case the canvas is not ready for working. This is different from making use ofsynchronized
(which lead to a queue of calls to be resolved) in that one may simply not append work to do according to the status of the canvas.
-
printCallTrace
public void printCallTrace()
-
printCallTrace
public void printCallTrace(int from, String filterLine)
Print stack but drops any class.method name not containing the filter (in case it is not null)
-
getLastRenderingTimeMs
public double getLastRenderingTimeMs()
- Specified by:
getLastRenderingTimeMs
in interfaceICanvas
-
getIsRenderingFlag
public AtomicBoolean getIsRenderingFlag()
-
doReshape
public void doReshape(int w, int h)
Handle resize events emitted by GLUT.GLUT.processComponentEvent(ComponentEvent)
is calling reshape handler (this method) THEN the display handler ({@link #doDisplay()), so this method will only inform {@link GLUT} andView
that window size changed.
-
doMotion
public void doMotion(int x, int y)
Handle mouse events emitted by GLUT. Most probably not registered as mouse already handled by Jzy3D.
-
screenshot
public BufferedImage screenshot()
- Specified by:
screenshot
in interfaceICanvas
-
screenshot
public void screenshot(File file) throws IOException
- Specified by:
screenshot
in interfaceICanvas
- Throws:
IOException
-
updatePainterWithGL
protected void updatePainterWithGL()
RegisterEmulGLPainter
.
-
getView
public View getView()
Description copied from interface:ICanvas
Returns a reference to the held view.
-
getRendererWidth
public int getRendererWidth()
Description copied from interface:ICanvas
Returns the renderer's width, i.e. the display width.- Specified by:
getRendererWidth
in interfaceICanvas
-
getRendererHeight
public int getRendererHeight()
Description copied from interface:ICanvas
Returns the renderer's height, i.e. the display height.- Specified by:
getRendererHeight
in interfaceICanvas
-
dispose
public void dispose()
Description copied from interface:ICanvas
Performs all required cleanup when destroying a Canvas.
-
setPixelScale
public void setPixelScale(float[] scale)
Description copied from interface:ICanvas
Defines pixel scale. On MacOS Retina displays, a X*Y chart uses a (X*2)*(Y*2) viewport. This makes some calculation based on viewport (such asCamera.screenToModel(IPainter, org.jzy3d.maths.Coord3d)
output wrong result. When running on Retina display, those two options fixed buggy mouse selections on Retina:- setPixelScale(new float[]{0.5f,0.5f})
- setPixelScale(new float[] { ScalableSurface.IDENTITY_PIXELSCALE,
ScalableSurface.IDENTITY_PIXELSCALE })
- Specified by:
setPixelScale
in interfaceICanvas
-
getPixelScale
public Coord2d getPixelScale()
Description copied from interface:ICanvas
Provide pixel scale as feasible by the Hardware, OS, and JVM, independently of what was asked byICanvas.setPixelScale(float[])
. Hence the two functions may not be consistent together.- Specified by:
getPixelScale
in interfaceICanvas
-
getPixelScaleJVM
public Coord2d getPixelScaleJVM()
Description copied from interface:ICanvas
Provide pixel scale as considered feasible by the JVM.- Specified by:
getPixelScaleJVM
in interfaceICanvas
-
getAnimation
public IAnimator getAnimation()
- Specified by:
getAnimation
in interfaceIScreenCanvas
-
addMouseController
public void addMouseController(Object o)
Description copied from interface:ICanvas
A generic interface for mouse listener to remain Windowing toolkit independant. Implementation of this method should simply cast the input assuming it will correspond to canvas-compatible mouse listener.- Specified by:
addMouseController
in interfaceICanvas
-
removeMouseController
public void removeMouseController(Object o)
Description copied from interface:ICanvas
A generic interface for key listener to remain Windowing toolkit independant. Implementation of this method should simply cast the input assuming it will correspond to canvas-compatible key listener.- Specified by:
removeMouseController
in interfaceICanvas
-
addKeyController
public void addKeyController(Object o)
Description copied from interface:ICanvas
A generic interface for mouse listener to remain Windowing toolkit independant. Implementation of this method should simply cast the input assuming it will correspond to canvas-compatible mouse listener.- Specified by:
addKeyController
in interfaceICanvas
-
removeKeyController
public void removeKeyController(Object o)
Description copied from interface:ICanvas
A generic interface for key listener to remain Windowing toolkit independant. * Implementation of this method should simply cast the input assuming it will correspond to canvas-compatible key listener.- Specified by:
removeKeyController
in interfaceICanvas
-
addCanvasListener
public void addCanvasListener(ICanvasListener listener)
- Specified by:
addCanvasListener
in interfaceICanvas
-
removeCanvasListener
public void removeCanvasListener(ICanvasListener listener)
- Specified by:
removeCanvasListener
in interfaceICanvas
-
getCanvasListeners
public List<ICanvasListener> getCanvasListeners()
- Specified by:
getCanvasListeners
in interfaceICanvas
-
firePixelScaleChanged
protected void firePixelScaleChanged(double pixelScaleX, double pixelScaleY)
-
getDebugInfo
public String getDebugInfo()
- Specified by:
getDebugInfo
in interfaceICanvas
-
paintProfileInfo
protected void paintProfileInfo(BufferedImage glImage)
Render profile on top of an image (probably the image of the GL scene) previously collected while {@link EmulGLCanvas#doRender(). Painting profile info is synchronized on the profile info list to ensure it is not modified while drawing (which occurs if synchronization is disabled). Despite we did not observed any lag due to such rendering, it is important to keep in mind that displaying profile information requires a synchronized access to this info list which is on the other side synchronized to protect exporting rendering info of the last call todoRender()
.
-
profile
protected void profile(double mili)
-
profile
protected void profile(String message, int x, int y, Color c)
Draw a 2d text at the given position
-
profileClear
protected void profileClear()
-
isDebugEvents
public boolean isDebugEvents()
-
setDebugEvents
public void setDebugEvents(boolean debugEvents)
-
isProfileDisplayMethod
public boolean isProfileDisplayMethod()
-
setProfileDisplayMethod
public void setProfileDisplayMethod(boolean profileDisplayMethod)
-
checkAlphaChannelOfColorBuffer
protected void checkAlphaChannelOfColorBuffer(EmulGLPainter painter)
-
printCountGLBegin
protected void printCountGLBegin()
-
resetCountGLBegin
protected void resetCountGLBegin()
-
getFullname
public String getFullname()
- Specified by:
getFullname
in interfaceIMonitorable
-
getLabel
public String getLabel()
- Specified by:
getLabel
in interfaceIMonitorable
-
add
public void add(Monitor monitor)
- Specified by:
add
in interfaceIMonitorable
-
monitorRenderingTime
protected void monitorRenderingTime(Monitor monitor, double mili)
-
getExporter
public AWTImageExporter getExporter()
-
setExporter
public void setExporter(AWTImageExporter exporter)
-
-