After the release of JogAmp 2.6.0 and the launch of Gamp earlier with its initial Graph code, I need to recapitulate the existing Graph and GraphUI code base within Jogl to evaluate our next steps including its Gamp implementation.
JogAmp‘s Jogl contains the Java code-base of GraphUI and Gamp shall evolve into its native C++ companion. Both are considered cross-platform, while only Gamp is able to be fully compiled down to the metal and executed w/o virtual machine while still capable of serving web browser via WebAssembly (yes, this involves a virtual machine again).
Jogl’s current Graph Implementation
- Resolution independent NURBS curves rendering via GPU shader (the base), including
- OutlineShape w/ quadratic curves and lines
 - Delaunay tessellation
 - GPU vertex- and texture-coordinate pipeline of OutlineShapes into Region objects
 - GPU shader management for various use-cases
- Monochrome, colorchannel, (streaming) textures, per-pixel clipping, ..
 - Antialiasing 2nd pass using a multisample framebuffer object per region of a OutlineShapes
 
 
 - Font support
- Typecast TTF font parser, developed by David Schweinsberg and patched (enhanced tables, bug fixes)
 - Streaming in TTF font files
 - Single Glyph to OutlineShape conversion
 
 - Text shaping, i.e. layout unicode text string to a list of OutlineShapes (Glyph Data)
- This includes kerning, orientation, etc and rudimentary output validation
 - Implementation is focused on performance, i.e. reuses pre-processed tessellated OutlineShapes, which will be scaled and translated via the usual model-matrix into world- or any other sub-space.
 
 
Jogl’s current GraphUI Implementation
GraphUI’s code base has been designed and implemented in a test- or design-driven manner, step by step – and is subject to be changed.
A Shape represents the basic node, independent from Graph, while GraphShape is its Graph derivation.
A Shape holds its pointer and keyboard listener and owns its dedicated translation, scale, rotation and zoom parameters as well its cached 4×4 counterpart matrix.
- Simple DAG scenegraph w/ Shape and Group within a Scene
- The usual setup, however, it uses a simple projection + model-view matrix combo instead of a dedicated camera view-matrix (TODO?).
 - Ray picking
 - Pointer/Mouse event propagation inside out w/ coordinate transformation
 - Shapes are reusable (DAG) and the OutlineShape data is cached for re-usage for performance
 - Lacks cached world-matrix or model-view matrix for e.g. picking (TODO)
 
 - Layout (w/ CSS semantics)
- BoxLayout
 - GridLayout
 - Alignment, Gap, Margin and Padding
 
 - Shape and (layout) Group implementations
- Label, a text string label
 - Button, a multi-state w/ text for each
 - ImageButton, a single texture button
 - TexSeqButton, a texture streaming button
 - MediaButton, a streaming video texture button
 - GLButton, a full GLEventListener button to embed OpenGL visuals
 - HUDShape, a head-up-display shape usable for custom tool-tip implementations
 
 - Widgets, i.e. Shape/Group w/ complex controls (interaction)
- MediaPlayer a MediaButton with UI, subtitles and controls
 - RangedGroup clipped (grid) Group w/ slider
 - RangeSlider a scroll-slider
 
 
Graph Enhancements
The following items are earmarked (but not funded) to be implemented for Graph.
- Tessellation
- Used Delaunay tessellation works for most shapes, however, certain corner cases still exist w/ wrong results
 - Alternative traditional GLU tessellation could be utilized as an optional fallback
- Performance impact might be limited due to the caching within OutlineShape
 
 
 - Antialiasing (AA)
- Current state
- Use full scene multisampling (MSAA), e.g. 2x – 4x gives good results, or
 - use our internal framebuffer based OutlineShape region multisampling on low DPI, e.g. 4x gives good results, or
 - use a high resolution monitor >= 200 DPI (?)
 
 - Enhancement: Single pass AA by Graph shader
- Widen shader area of lines and curve segments, model-based (performance, reused)
- otherwise, AA gradient would reduce the actual model representation mass
 
 - Pass original line coordinates (approximated texture coords) to render similar to curves
 - Find appropriate gradient stepping for AA
 
 - Widen shader area of lines and curve segments, model-based (performance, reused)
 
 - Current state
 

Potential Gamp Implementation of Graph/GraphUI
So far, I have simply translated the existing Java code into C++20 while also flattened certain internal data representations.
The currently existing shape demos demonstrate non-curve glutess tessellation using floats (sub-module) as well as line and curve capable Graph tessellation using Delaunay. This was a first approach to potentially use glutess as an alternative in the next steps forward.
As you can see above, the biggest code-base on the TODO list is the font/type parsing, text and GraphUI segment.
Font/Type Parsing
- Translate our enhance Typecast Java codebase (see above) to C++
 - Use stb‘s TTF implementation
 - Use HarfBuzz‘s OpenType implementation (?, not fully compatible w/ TrueType?)
 
Test Shaping (Layout)
- Translate our text layout Java codebase (see above) to C++ (small, good enough?)
 - Use HarfBuzz‘s implementation (?, bigger)
 
Java to C++ Source Compiler
I will also double check for a good Java to C++ source code translator (not bytecode), i.e. soothing the typing a little.
However, so far the few existing ones were not sufficient as they either used a bytecode approach, obfuscated the C++ target making the result unreadable really.
It is C++’s high expressiveness which probably simply must be done by hand.
Of course, I used a few sed scripts to shortcut the usual naming replacements.
Conclusion so far…
Lots to do, get something done – day by day.
Funding & Contracting
To continue JogAmp to support its wide range of user applications and to potentially further Gamp, I seek contracting work (best in a related project) or direct project funding by companies and institutions. Please contact me sgothel at jausoft dot com.
