Module gl1

Class GLDisplay

All Implemented Interfaces:
ViewComponent, RenderState, ComponentWrapper, Selectable, Disposable, ImageObserver, Runnable, EventListener, javax.media.opengl.GLEventListener
Direct Known Subclasses:
GLSLDisplay

public class GLDisplay extends ViewComponentAdapter implements javax.media.opengl.GLEventListener, RenderState, ImageObserver, Selectable
This class is responsible for drawing all visible objects in the GroIMP3D editor. It uses OpenGL to provide hardware accelerated drawing. To access OpenGL, the library JOGL has to be installed. JOGL is available from: https://jogl.dev.java.net/ Download the jogl.jar (contains the Java API for JOGL) and the jogl-natives-*.jar (contains the native library for your system). When starting GroIMP, make sure that the jogl.jar is in your classpath and the libraries (.dll or .so) from the jogl-natives-*.jar are in your search path for system libraries. Making thos files available can be done by calling GroIMP like this: \code (linux version) javaw -cp core.jar:jogl.jar -Djava.library.path=/usr/lib/jogl de.grogra.pf.boot.Main (windows version) javaw -cp core.jar;jogl.jar -Djava.library.path=c:\java\jogl de.grogra.pf.boot.Main \endcode OpenGL acts as a state machine. To provide a consistent state for every drawing function, some rules were created. There are state variables that are expected to have a certain value when a drawing function is entered. Those state variables are: - MatrixMode set to GL_MODELVIEW - ShadeModel set to GL_SMOOTH - GL_DEPTH_TEST enabled - GL_LIGHTING enabled - GL_TEXTURE_2D disabled - GL_CULL_FACE enabled - GL_COLOR_MATERIAL enabled - ColorMaterial is set to GL_FRONT_AND_BACK and GL_AMBIENT_AND_DIFFUSE - GL_NORMALIZE is enabled - PolygonMode is set to GL_FRONT_AND_BACK and GL_LINE - GL_ALPHA_TEST enabled - AlphaFunc set to GL_GREATER and 0.1f - GL_LIGHT_MODEL_TWO_SIDE is set to 0 If a drawing function changes some of those state variables, it has to reset them to their previous value upon return. Other state variables are not expected to have a defined value when a drawing function is called. Those state variables are: - all texture related state for TEXTURE UNIT 0 - the contents of the matrices MODELVIEW and TEXTURE All state variables not mentioned above should be reset to their default value as defined by OpenGL when they were changed. This class also provides an implementation of LOD (level of detail). For now lod is only applied to the sphere and frustum primitives. While the sphere uses the lod to select the appropriate display list, the frustum uses it to calculate the number of generated segments when drawing.
Author:
nmi
  • Field Details

    • optionShowPoints

      protected boolean optionShowPoints
    • optionShowGrid

      protected boolean optionShowGrid
    • optionRenderAsWireframe

      protected boolean optionRenderAsWireframe
    • optionGridDimension

      protected int optionGridDimension
    • optionGridSpacing

      protected float optionGridSpacing
    • optionGridColorR

      protected float optionGridColorR
    • optionGridColorG

      protected float optionGridColorG
    • optionGridColorB

      protected float optionGridColorB
    • optionShowAxes

      protected boolean optionShowAxes
    • optionShowDisplaySize

      protected boolean optionShowDisplaySize
    • supportsVBO

      protected boolean supportsVBO
      If the GL context supports the ARB extension GL_ARB_vertex_buffer_object this flag is set to true in the initialization function. When this flag is true, rendering of surfaces (i.e. NURBS) uses the faster vertex buffer objects.
    • LOD_LEVELS

      protected static final int LOD_LEVELS
      maximum number of levels of detail
      See Also:
    • pool

      public final Pool pool
    • visitor

      protected GLDisplay.GLVisitor visitor
    • polyCache

      protected PolygonizationCache polyCache
    • curHighlight

      protected int curHighlight
    • dlSphere

      protected int dlSphere
      Display list number for spheres. There will be display lists generated for numbers dlSphere to (dlSphere + LOD_LEVELS - 1). A value of 0 for dlSphere means, that no display list is available.
    • dlSupershape

      protected int dlSupershape
      Display list number for supershapes. There will be display lists generated for numbers dlSupershape to (dlSupershape + LOD_LEVELS - 1). A value of 0 for dlSupershape means, that no display list is available.
    • RENDER_MODE

      public static final Type RENDER_MODE
    • lineWidth

      protected final int[] lineWidth
    • gridColor

      protected final Color3f gridColor
    • startPoint

      protected final Point3f startPoint
    • endPoint

      protected final Point3f endPoint
  • Constructor Details

    • GLDisplay

      public GLDisplay()
  • Method Details

    • getObserverForRenderer

      protected ImageObserver getObserverForRenderer()
      Description copied from class: ViewComponentAdapter
      Returns an observer which receives the information about the rendered image from a Renderer. The returned observer has to manage the drawing of the (partially) rendered image on the view component.
      Specified by:
      getObserverForRenderer in class ViewComponentAdapter
      Returns:
      an observer receiving the image, or null if this is not supported by this component
    • imageUpdate

      public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height)
      This class implements the ImageObserver interface to be notified about changes of the background image.
      Specified by:
      imageUpdate in interface ImageObserver
    • makeSnapshot

      public void makeSnapshot(ObjectConsumer<? super RenderedImage> callback)
      Description copied from interface: ViewComponent
      Instructs the view component to create a snapshot. The created snapshot has to be delivered to the provided callback as an instance of RenderedImage. This may happen asynchronously, i.e., in an arbitrary thread.
      Specified by:
      makeSnapshot in interface ViewComponent
      Parameters:
      callback - callback which asynchronously receives the snapshot
    • initRender

      protected void initRender(int flags)
      Description copied from class: ViewComponentAdapter
      Performs initialization tasks in preparation for rendering. This method is invoked by ViewComponentAdapter.run() in this ViewComponent's own thread.
      Specified by:
      initRender in class ViewComponentAdapter
      Parameters:
      flags - combination of bit masks
    • invokeRender

      protected void invokeRender(int flags)
      Description copied from class: ViewComponentAdapter
      Invoked to perform rendering. This method is invoked by ViewComponentAdapter.run() in this ViewComponent's own thread. Its sole task is to invoke ViewComponentAdapter.invokeRenderSync(int) in the rendering thread (which may be this ViewComponent's thread, the AWT-thread, or another thread, depending on the implementation) in a write-protected context. The invocation has to be synchronously, i.e., if it is in another thread, the current thread has to wait until ViewComponentAdapter.invokeRenderSync(int) has completed.
      Specified by:
      invokeRender in class ViewComponentAdapter
      Parameters:
      flags - the flags to pass to ViewComponentAdapter.invokeRenderSync(int)
    • display

      public void display(javax.media.opengl.GLAutoDrawable d)
      Specified by:
      display in interface javax.media.opengl.GLEventListener
    • dispose

      public void dispose()
      Specified by:
      dispose in interface Disposable
      Overrides:
      dispose in class ViewComponentAdapter
    • getComponent

      public Object getComponent()
      Specified by:
      getComponent in interface ComponentWrapper
    • getView3D

      public View3D getView3D()
    • initView

      public void initView(View view, EventListener listener)
      Description copied from interface: ViewComponent
      Initializes this component. This method sets the view within which this view component is used to display the graph. It also sets an event listener. this has to be informed of mouse and keys events within the view component by implementations of this method.
      Specified by:
      initView in interface ViewComponent
      Overrides:
      initView in class ViewComponentAdapter
      Parameters:
      view - the containing view
      listener - mouse and key events will be reported to this listener
    • render

      protected void render(int flags) throws InterruptedException
      Render the scene graph. This function will traverse the scene graph and render all objects of it. These steps are performed:
      1. get GL
      2. if GL changed, delete textures
      3. clear the frame buffer
      4. draw background image (i.e. from povray)
      5. cleaar depth buffer
      6. set projection matrix
      7. check if the scene graph changed since last render, than remember that and perform an update of the light sources
      8. walk graph first time, visit every object, update lights if necessary
      9. if lights have changed, draw the scene again
      10. walk graph second time, visit highlighted objects
      11. disable lighting and depth buffer
      12. walk graph third time, visit tools (i.e. arrows to move objects)
      13. enable lighting and depth buffer
      Specified by:
      render in class ViewComponentAdapter
      Parameters:
      flags - combination of bit masks
      Throws:
      InterruptedException - if the rendering has been interrupted
    • init

      public void init(javax.media.opengl.GLAutoDrawable d)
      Initialise opengl state and set default values. All functions can assume those values being set upon call (i.e. MatrixMode as GL_MODELVIEW). If a function changes any of those values, it has to restore its state before calling another function or exiting.
      Specified by:
      init in interface javax.media.opengl.GLEventListener
    • reshape

      public void reshape(javax.media.opengl.GLAutoDrawable d, int x, int y, int w, int h)
      Specified by:
      reshape in interface javax.media.opengl.GLEventListener
    • displayChanged

      public void displayChanged(javax.media.opengl.GLAutoDrawable d, boolean modeChanged, boolean deviceChanged)
      Specified by:
      displayChanged in interface javax.media.opengl.GLEventListener
    • getPool

      public Pool getPool()
      Specified by:
      getPool in interface RenderState
    • getCurrentShader

      public Shader getCurrentShader()
      Specified by:
      getCurrentShader in interface RenderState
    • getCurrentHighlight

      public int getCurrentHighlight()
      Specified by:
      getCurrentHighlight in interface RenderState
    • estimateScaleAt

      public float estimateScaleAt(Tuple3f point)
      Specified by:
      estimateScaleAt in interface RenderState
    • estimateScaleAt

      public float estimateScaleAt(Tuple3f point, Matrix4d t)
      Returns the size of an object of size 1.0 (in object coordinates) on the screen (in pixels).
      Parameters:
      point -
      t -
      Returns:
    • getLOD

      protected float getLOD(Matrix4d t, float r)
      Calculate level of detail. The returned value is 0.0f for lowest detail and 1.0f for highest detail. This lod depends on global lod (i.e. decreases if the frame rate drops) and the scale (estimated size of a line of length 1.0 in pixels). The lod is calculated as: lod = globalLod * (scale - s_min) / (s_max - s_min) where s_min is the size of a line of length 1.0 in pixels for the smallest lod and s_max similar for the biggest lod, globalLod is a value from 0.0 to 1.0 Smallest scale is 5 pixels, biggest scale is 100 pixels
      Returns:
    • getWindowPos

      public boolean getWindowPos(Tuple3f origin, Tuple2f out)
      Description copied from interface: RenderState
      Computes the window coordinates in pixels of a location in the current object coordinates.
      Specified by:
      getWindowPos in interface RenderState
      Parameters:
      origin - a location in local object coordinates
      out - the computed window coordinates are placed in here
      Returns:
      true iff the window coordinates are valid (i.e., the location is in the clipping region)
    • getShader

      protected Shader getShader(Shader s)
    • getTransformation

      protected Matrix4d getTransformation(Matrix4d t)
    • drawBox

      public void drawBox(float halfWidth, float halfLength, float height, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Draw a box from -axis to +axis using the transformation matrix t.
      Specified by:
      drawBox in interface RenderState
      Parameters:
      axis - defines size of box
    • drawLamella

      public void drawLamella(float halfWidth, float halfLength, float height, float a, float b, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Specified by:
      drawLamella in interface RenderState
      a - amplitude
      b - frequency
    • drawPoint

      public void drawPoint(Tuple3f origin, int pixelSize, Tuple3f color, int highlight, Matrix4d t)
      Draw a single point with the specified pixel size and color. Although OpenGL provides a function to draw points, the point is represented by a sphere, because some graphics cards/drivers seem to have problems setting the size for the point.
      Specified by:
      drawPoint in interface RenderState
      Parameters:
      pixelSize - size of point on screen in pixels
    • drawPointCloud

      public void drawPointCloud(float[] locations, float pointSize, Tuple3f color, int highlight, Matrix4d t)
      Description copied from interface: RenderState
      Draw a set of points. The array locations contains a sequence of points given as triples of floats for x, y and z position of each point. If the same reference for the array location is passed in the implementation might assume that the contents of the array are the same as well. This is necessary for GLDisplay, for instance, to ensure a performant implementation. The class PointCloud ensures that this is the case.
      Specified by:
      drawPointCloud in interface RenderState
      Parameters:
      locations - array containing a sequence (x,y,z) of points
      pointSize - size of the point on screen
      color - color of the point
      t - transformation of the point cloud
    • drawLine

      public void drawLine(Tuple3f origin, Tuple3f end, Tuple3f color, int highlight, Matrix4d t)
      Connect the two points with a line and apply the transformation matrix.
      Specified by:
      drawLine in interface RenderState
    • drawParallelogram

      public void drawParallelogram(float length, Vector3f axis, float scaleU, float scaleV, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Specified by:
      drawParallelogram in interface RenderState
    • drawPlane

      public void drawPlane(Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Draw an x/y plane.
      Specified by:
      drawPlane in interface RenderState
    • drawSphere

      public void drawSphere(float radius, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Draw a sphere with the specified radius around the origin (0/0/0).
      Specified by:
      drawSphere in interface RenderState
    • drawSphereSegmentSolid

      public void drawSphereSegmentSolid(float radius, float theta1, float theta2, float phi, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Draw a sphere segment with the specified radius, theta1, theta2, and phi, around the origin (0/0/0).
      Specified by:
      drawSphereSegmentSolid in interface RenderState
    • drawTextBlock

      public void drawTextBlock(String caption, Font font, float depth, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Specified by:
      drawTextBlock in interface RenderState
    • drawSupershape

      public void drawSupershape(float a, float b, float m1, float n11, float n12, float n13, float m2, float n21, float n22, float n23, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Draw a supershape around the origin (0/0/0). An implementation of Johan Gielis's Superformula which was published in the American Journal of Botany 90(3): 333–338. 2003. INVITED SPECIAL PAPER A GENERIC GEOMETRIC TRANSFORMATION THAT UNIFIES A WIDE RANGE OF NATURAL AND ABSTRACT SHAPES
      Specified by:
      drawSupershape in interface RenderState
      Parameters:
      a - , b length of curves
      m - , n shape parameters
      shader -
      highlight -
      t - transformation of the point cloud
    • drawFrustum

      public void drawFrustum(float length, float baseRadius, float topRadius, boolean baseClosed, boolean topClosed, float scaleV, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Can be used to draw cylinders and the like. The frustum has a cirle at the top and bottom, which are connected with a surface. The center of the bottom circle is (0/0/0), the center of the top circle is axis. Both circles are parallel to the x/y plane.
      Specified by:
      drawFrustum in interface RenderState
    • drawWithDisplayList

      public int drawWithDisplayList(int index, javax.media.opengl.GL gl, de.grogra.glsl.DisplayListRenderable dlr, int levels, float lod)
    • drawPolygons

      public void drawPolygons(Polygonizable pz, Object obj, boolean asNode, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Specified by:
      drawPolygons in interface RenderState
    • drawRectangle

      public void drawRectangle(int x, int y, int w, int h, Tuple3f color)
      Draw a rectangle from (x/y) to (x+w/y+h) with the specified color.
      Specified by:
      drawRectangle in interface RenderState
    • fillRectangle

      public void fillRectangle(int x, int y, int w, int h, Tuple3f color)
      Draw a filled rectangle from (x/y) to (x+w/y+h) with the specified color.
      Specified by:
      fillRectangle in interface RenderState
    • drawString

      public void drawString(int x, int y, String text, Font font, Tuple3f color)
      Draw a string with the selected font and color at location (x/y).
      Specified by:
      drawString in interface RenderState
    • optionValueChanged

      protected void optionValueChanged(String name, Object value)
      Overrides:
      optionValueChanged in class ViewComponentAdapter
    • isExtensionSupported

      public static boolean isExtensionSupported(javax.media.opengl.GL gl, String extension)
    • drawAxes

      protected void drawAxes(javax.media.opengl.GL gl, Camera c)
    • drawDisplaySize

      protected void drawDisplaySize(javax.media.opengl.GL gl, Camera c)
    • drawFrustumIrregular

      public void drawFrustumIrregular(float length, int sectorCount, float[] baseRadii, float[] topRadii, boolean baseClosed, boolean topclosed, float scaleV, Shader s, int highlight, boolean asWireframe, Matrix4d t)
      Specified by:
      drawFrustumIrregular in interface RenderState
    • drawPrismRectangular

      public void drawPrismRectangular(float y, float xPos, float xNeg, float zPos, float zNeg, int highlight, boolean asWireframe, Matrix4d t)
      Specified by:
      drawPrismRectangular in interface RenderState