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
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:
-
Nested Class Summary
Nested classes/interfaces inherited from class java.awt.Canvas
Canvas.AccessibleAWTCanvasNested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected IAnimatorprotected List<ICanvasListener>protected booleanset to TRUE to show in console events of the component (to debug GLUT)protected ExecutorServiceprotected AWTImageExporterprotected AtomicBooleanprotected doubleprotected Monitorprotected EmulGLPainterprotected intprotected Fontprotected booleanset to TRUE to overlay performance info on top left cornerprotected TicTocprotected List<org.jzy3d.plot3d.rendering.canvas.EmulGLCanvas.ProfileInfo>static final booleanSpecify actual way of forcing repaint if true : manual if false : trigger component.resize event to force resize + view.render + glFlush + swap imageprotected ViewFields inherited from class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENTFields inherited from interface org.jzy3d.plot3d.rendering.canvas.ICanvas
ALLOW_WATCH_PIXEL_SCALE, LAST_RENDER_TIME_UNDEFINEDFields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH -
Constructor Summary
ConstructorsConstructorDescriptionEmulGLCanvas(IChartFactory factory, Scene scene, Quality quality) Initialize a canvas for rendering 3D -
Method Summary
Modifier and TypeMethodDescriptionvoidvoidaddCanvasListener(ICanvasListener listener) voidA generic interface for mouse listener to remain Windowing toolkit independant.voidA generic interface for mouse listener to remain Windowing toolkit independant.protected voidvoiddisplay()voiddispose()Performs all required cleanup when destroying a Canvas.voiddoMotion(int x, int y) Handle mouse events emitted by GLUT.voiddoRender()Triggers an atomic rendering of a frame, measure rendering performance and update the status of rendering (active or not).voiddoReshape(int w, int h) Handle resize events emitted by GLUT.protected voidfirePixelScaleChanged(double pixelScaleX, double pixelScaleY) voidCan be used to update image if camera has changed position.getLabel()doubleProvide pixel scale as feasible by the Hardware, OS, and JVM, independently of what was asked byICanvas.setPixelScale(float[]).Provide pixel scale as considered feasible by the JVM.intReturns the renderer's height, i.e. the display height.intReturns the renderer's width, i.e. the display width.getView()Returns a reference to the held view.protected voidinit(int width, int height) Equivalent to registering a Renderer3d in native canvas.protected voidinitGLUT(int width, int height) Configure GLUT callback which yield to the below flow diagram
protected voidinitView()booleanbooleanisNative()Return true if the canvas renders GL with GPU, false if renders GL using CPU executed Java code.booleanprotected voidmonitorRenderingTime(Monitor monitor, double mili) voidThis overrides theGLCanvashenceCanvasmethods to copy the image of the 3D scene as generated whileGL.glFlush().protected voidpaintProfileInfo(BufferedImage glImage) Render profile on top of an image (probably the image of the GL scene) previously collected whilePainting profile info is synchronized on the profile info list to ensure it is not modified while drawing (which occurs if synchronization is disabled).invalid @link
{@link EmulGLCanvas#doRender().voidvoidprintCallTrace(int from, String filterLine) Print stack but drops any class.method name not containing the filter (in case it is not null)protected voidvoidThis override letGLUT.processEvent(AWTEvent)be informed ofAWTEventtraversing this canvas (mouse, keyboard, resize).protected voidprofile(double mili) protected voidDraw a 2d text at the given positionprotected voidvoidremoveCanvasListener(ICanvasListener listener) voidA 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.voidA generic interface for key listener to remain Windowing toolkit independant.protected voidvoidscreenshot(File file) voidsetDebugEvents(boolean debugEvents) voidsetExporter(AWTImageExporter exporter) voidsetPixelScale(float[] scale) Defines pixel scale.voidsetProfileDisplayMethod(boolean profileDisplayMethod) protected booleanprotected voidRegisterEmulGLPainter.Methods inherited from class jgl.wt.awt.GLCanvas
getGL, getGLU, getGLUT, getPixelScaleFromG2D, glut_enable_events, setGL, updateMethods inherited from class java.awt.Canvas
addNotify, createBufferStrategy, createBufferStrategy, getAccessibleContext, getBufferStrategyMethods 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, validateMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.jzy3d.plot3d.rendering.canvas.ICanvas
setPixelScale
-
Field Details
-
TO_BE_CHOOSEN_REPAINT_WITH_FLUSH
public static final boolean TO_BE_CHOOSEN_REPAINT_WITH_FLUSHSpecify actual way of forcing repaint- if true : manual
- if false : trigger component.resize event to force resize + view.render + glFlush + swap image
- See Also:
-
view
-
painter
-
animator
-
canvasListeners
-
isRenderingFlag
-
debugEvents
protected boolean debugEventsset to TRUE to show in console events of the component (to debug GLUT) -
profileDisplayMethod
protected boolean profileDisplayMethodset to TRUE to overlay performance info on top left corner -
profileDisplayTimer
-
profileDisplayFont
-
profileDisplayCount
protected int profileDisplayCount -
profileInfo
-
monitor
-
exporter
-
executor
-
lastRenderingTimeMs
protected double lastRenderingTimeMs
-
-
Constructor Details
-
EmulGLCanvas
Initialize a canvas for rendering 3D
-
-
Method Details
-
processEvent
Description copied from class:GLCanvasThis override letGLUT.processEvent(AWTEvent)be informed ofAWTEventtraversing 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}.invalid @link
{@link this#glut_enable_events- Overrides:
processEventin classGLCanvas
-
shouldPrintEvent
-
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
This overrides theGLCanvashenceCanvasmethods 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 whenGLUTthinks it is relevant. This may occur becauseEmulGLCanvastriggered aevent.invalid @link
ComponentEvent.COMPONENT_RESIZED -
display
public void display()- Specified by:
displayin 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:
forceRepaintin interfaceICanvas- Overrides:
forceRepaintin 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 thisEmulGLCanvastriggers aevent. Performance measurement can be seen on screen ifinvalid @link
ComponentEvent.COMPONENT_RESIZEDsetProfileDisplayMethod(boolean)was set to true OR can be collected by aMonitordefined 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 aisRenderingFlagso 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
Print stack but drops any class.method name not containing the filter (in case it is not null) -
getLastRenderingTimeMs
public double getLastRenderingTimeMs()- Specified by:
getLastRenderingTimeMsin interfaceICanvas
-
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 (} andinvalid @link
{@link #doDisplay()), so this method will only inform {@link GLUTViewthat 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
- Specified by:
screenshotin interfaceICanvas
-
screenshot
- Specified by:
screenshotin interfaceICanvas- Throws:
IOException
-
updatePainterWithGL
protected void updatePainterWithGL()RegisterEmulGLPainter. -
getView
Description copied from interface:ICanvasReturns a reference to the held view. -
getRendererWidth
public int getRendererWidth()Description copied from interface:ICanvasReturns the renderer's width, i.e. the display width.- Specified by:
getRendererWidthin interfaceICanvas
-
getRendererHeight
public int getRendererHeight()Description copied from interface:ICanvasReturns the renderer's height, i.e. the display height.- Specified by:
getRendererHeightin interfaceICanvas
-
getDimension
- Specified by:
getDimensionin interfaceICanvas
-
dispose
public void dispose()Description copied from interface:ICanvasPerforms all required cleanup when destroying a Canvas. -
setPixelScale
public void setPixelScale(float[] scale) Description copied from interface:ICanvasDefines 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:
setPixelScalein interfaceICanvas
-
getPixelScale
Description copied from interface:ICanvasProvide 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:
getPixelScalein interfaceICanvas
-
getPixelScaleJVM
Description copied from interface:ICanvasProvide pixel scale as considered feasible by the JVM.- Specified by:
getPixelScaleJVMin interfaceICanvas
-
getAnimation
- Specified by:
getAnimationin interfaceIScreenCanvas
-
addMouseController
Description copied from interface:ICanvasA 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:
addMouseControllerin interfaceICanvas
-
removeMouseController
Description copied from interface:ICanvasA 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:
removeMouseControllerin interfaceICanvas
-
addKeyController
Description copied from interface:ICanvasA 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:
addKeyControllerin interfaceICanvas
-
removeKeyController
Description copied from interface:ICanvasA 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:
removeKeyControllerin interfaceICanvas
-
addCanvasListener
- Specified by:
addCanvasListenerin interfaceICanvas
-
removeCanvasListener
- Specified by:
removeCanvasListenerin interfaceICanvas
-
getCanvasListeners
- Specified by:
getCanvasListenersin interfaceICanvas
-
firePixelScaleChanged
protected void firePixelScaleChanged(double pixelScaleX, double pixelScaleY) -
getDebugInfo
- Specified by:
getDebugInfoin interfaceICanvas
-
paintProfileInfo
Render profile on top of an image (probably the image of the GL scene) previously collected whilePainting 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 toinvalid @link
{@link EmulGLCanvas#doRender().doRender(). -
profile
protected void profile(double mili) -
profile
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
-
printCountGLBegin
protected void printCountGLBegin() -
resetCountGLBegin
protected void resetCountGLBegin() -
getFullname
- Specified by:
getFullnamein interfaceIMonitorable
-
getLabel
- Specified by:
getLabelin interfaceIMonitorable
-
add
- Specified by:
addin interfaceIMonitorable
-
monitorRenderingTime
-
getExporter
-
setExporter
-
isNative
public boolean isNative()Description copied from interface:ICanvasReturn true if the canvas renders GL with GPU, false if renders GL using CPU executed Java code.
-