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.AccessibleAWTCanvas
Nested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
-
Field Summary
Modifier and TypeFieldDescriptionprotected IAnimator
protected List<ICanvasListener>
protected boolean
set to TRUE to show in console events of the component (to debug GLUT)protected ExecutorService
protected AWTImageExporter
protected AtomicBoolean
protected double
protected Monitor
protected EmulGLPainter
protected int
protected Font
protected boolean
set to TRUE to overlay performance info on top left cornerprotected TicToc
protected List<org.jzy3d.plot3d.rendering.canvas.EmulGLCanvas.ProfileInfo>
static final boolean
Specify actual way of forcing repaint if true : manual if false : trigger component.resize event to force resize + view.render + glFlush + swap imageprotected 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
ConstructorDescriptionEmulGLCanvas
(IChartFactory factory, Scene scene, Quality quality) Initialize a canvas for rendering 3D -
Method Summary
Modifier and TypeMethodDescriptionvoid
void
addCanvasListener
(ICanvasListener listener) void
A generic interface for mouse listener to remain Windowing toolkit independant.void
A generic interface for mouse listener to remain Windowing toolkit independant.protected void
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
Can be used to update image if camera has changed position.getLabel()
double
Provide 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.int
Returns the renderer's height, i.e. the display height.int
Returns the renderer's width, i.e. the display width.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
boolean
isNative()
Return true if the canvas renders GL with GPU, false if renders GL using CPU executed Java code.boolean
protected void
monitorRenderingTime
(Monitor monitor, double mili) void
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 whileinvalid @link
{@link EmulGLCanvas#doRender().
void
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
void
This override letGLUT.processEvent(AWTEvent)
be informed ofAWTEvent
traversing this canvas (mouse, keyboard, resize).protected void
profile
(double mili) protected void
Draw a 2d text at the given positionprotected void
void
removeCanvasListener
(ICanvasListener listener) void
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
A generic interface for key listener to remain Windowing toolkit independant.protected void
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
protected void
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
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods 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: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 invokedinvalid @link
{@link this#glut_enable_events
- Overrides:
processEvent
in 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 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 ainvalid @link
ComponentEvent.COMPONENT_RESIZED
-
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 ainvalid @link
ComponentEvent.COMPONENT_RESIZED
setProfileDisplayMethod(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
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
-
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 (invalid @link
{@link #doDisplay()), so this method will only inform {@link GLUT
View
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
- Specified by:
screenshot
in interfaceICanvas
-
screenshot
- Specified by:
screenshot
in interfaceICanvas
- Throws:
IOException
-
updatePainterWithGL
protected void updatePainterWithGL()RegisterEmulGLPainter
. -
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
-
getDimension
- Specified by:
getDimension
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
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
Description copied from interface:ICanvas
Provide pixel scale as considered feasible by the JVM.- Specified by:
getPixelScaleJVM
in interfaceICanvas
-
getAnimation
- Specified by:
getAnimation
in interfaceIScreenCanvas
-
addMouseController
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
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
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
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
- Specified by:
addCanvasListener
in interfaceICanvas
-
removeCanvasListener
- Specified by:
removeCanvasListener
in interfaceICanvas
-
getCanvasListeners
- Specified by:
getCanvasListeners
in interfaceICanvas
-
firePixelScaleChanged
protected void firePixelScaleChanged(double pixelScaleX, double pixelScaleY) -
getDebugInfo
- Specified by:
getDebugInfo
in interfaceICanvas
-
paintProfileInfo
Render profile on top of an image (probably the image of the GL scene) previously collected whileinvalid @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:
getFullname
in interfaceIMonitorable
-
getLabel
- Specified by:
getLabel
in interfaceIMonitorable
-
add
- Specified by:
add
in interfaceIMonitorable
-
monitorRenderingTime
-
getExporter
-
setExporter
-
isNative
public boolean isNative()Description copied from interface:ICanvas
Return true if the canvas renders GL with GPU, false if renders GL using CPU executed Java code.
-