aboutsummaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Math: AABBox + AffineTransform: Make class finalSven Göthel2024-04-252-2/+2
|
* Math: Recti::size(): Change semantics: Return true if area is zero, not if x ↵Sven Göthel2024-04-251-2/+2
| | | | and y is zero
* Math: AABBox: Fix getRayIntersection(), i.e. setting the correct resulting ↵Sven Göthel2024-04-251-4/+4
| | | | component.
* Math: Align Frustum/Matrix dependency w/ native jaulibSven Göthel2024-04-257-55/+57
|
* FloatUtil: Add IEC559_SIGN_BIT; Align API doc and implementation w/ native ↵Sven Göthel2024-04-253-76/+60
| | | | jaulib, i.e. drop 0==epsilon case for performance
* Bug 1489: Lock-Free Double-Buffered 'renderedShapes' causes data-race ↵Sven Göthel2024-02-178-86/+143
| | | | | | | | | | | | | | | between rendering & input-edt, use synchronized tripple-buffering Tripple-buffering _almost_ produces zero data-race collisions, however .. it still does rarely -> hence synchronize on the used ArrayList<>. This adds a minimal chance for blocking the input-EDT, but gives correct code & results. Double-buffered 'renderedShapes' was introduced to resolve Bug 1489 in commit 5f9fb7159fa33bc979e5050d384b6939658049bd This solution is tested by passing '-swapInterval 0' via CommandlineOptions for FontView01, UIMediaGrid01 .., i.e. rendering faster than picking and hence provoking the data-race condition.
* VectorUtil.isSelfIntersecting1(): Always use off-curve pointsSven Göthel2024-02-151-52/+8
|
* TypecastGlyph: Add complex/simple info in toString()Sven Göthel2024-02-151-2/+2
|
* TestTextRendererNEWT20: Fix fontSet override at main + add some glyph info ↵Sven Göthel2024-02-152-4/+22
| | | | in demo text
* Graph: Cleanup Loop & OutlineShape, more compact methodsSven Göthel2024-02-153-115/+81
|
* VectorUtil: Add experimental isSelfIntersecting1() with O(n*n) complexitySven Göthel2024-02-141-0/+69
| | | | This doesn't bring reliable results for Graph and also is pretty expensive.
* VectorUtil: Bring back specialized testSeg2segIntersection() w/ build-in ↵Sven Göthel2024-02-143-10/+83
| | | | | | | | FloatUtil.EPSILON epsilon and no collinear test commit 5488665474cc7b88577cedfca6416784f0fda3ba Generalize *seg2segIntersection* w/ epsilon and doCollinear caused a big performance hit about 1/3 due to added doCollinear case and manual epsilon adding branches and having the method being longer - probably not 'hotspot'ed.
* Bug 1501: Refine convex == !complex: Use 'complex' term, have env-property ↵Sven Göthel2024-02-146-79/+101
| | | | | | toggle OutlineShape's isComplex() for visibility We may use complex for other criteria than !convex, i.e. self-intersecting etc.
* VectorUtil.isConvex1(): Fix zero test and handle out-of-boundsSven Göthel2024-02-141-2/+5
|
* VectorUtil: Generalize *seg2segIntersection* w/ epsilon and doCollinearSven Göthel2024-02-143-38/+94
|
* VectorUtil: Remove double InCircleDThreshold = DoubleUtil.EPSILONSven Göthel2024-02-142-6/+7
|
* DoubleUtil: Align Epsilon ops w/ FloatUtilSven Göthel2024-02-142-14/+34
|
* FloatUtil Epsilon ops: Generalize all epsilon operations by allowing passing ↵Sven Göthel2024-02-142-24/+127
| | | | a zero epsilon value to reduce complexity in upper math layers
* Use FloatUtil.isZero(a) w/ build-in FloatUtil.EPSILON directly instead of ↵Sven Göthel2024-02-1411-23/+23
| | | | passing FloatUtil.EPSILON to explicit isZero(a, epsilon)
* Bug 1501: Graph CDTriangulator2D: Add properties to enforce convex and ↵Sven Göthel2024-02-141-2/+10
| | | | non-convex treatment to simplify debugging etc
* GraphUI Demo FontView01: Re-Enable snapshot via 's'Sven Göthel2024-02-131-6/+6
|
* Bug 1501: Apply intersection tests for non-convex shapes to reject new CCW ↵Sven Göthel2024-02-136-134/+384
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | and non-circulcircle triangulation candidates in our Delaunay tessellator <https://jogamp.org/bugzilla//show_bug.cgi?id=1501#c6> The used Delaunay tessellation works well with (almost) convex shapes. In case e.g. a glyph gets to the extremes like 'M' in FreeMono or any other complex Chinese symbol - it may just simply happen that the new non-circumcircle triangle point crosses the inner (hope) or outer boundaries of the given polygon. Applying further constraint at Loop.cut() resolves most cases by rejecting the proposed CCW and non-circumcircle triangle candidate if its new two line-segments intersects with the original polygon. This results in mostly proper rendered Chinese fonts and also FreeMono is now readable - overal remaining bugs in Glyphs is low. +++ Of course, this intersection test is costly around >= O(log(n)*n) costs, practically adding a measured ~65% processing time. E.g. for FontView01 using FreeSerif.ttf - orig total took 1430.817638ms, per-glyph 0.2236ms, glyphs 6399 - fix total took 2377.337359ms, per-glyph 0.371517ms, glyphs 6399 Pure Glyph/Shape instantiation shows > 2x costs: 750 ms 100% convex (fake) 1875 ms 0% convex (fake) 1870 ms 13% convex 824/6399 +++ Hence it is desired to either (1) Manually mark a polygon non-convex to add described intersection test for accuracy. Also may be used to just drop the additional costs despite the lack of correctness. PROVIDED (2) Determine non-convex nature of a polygon with a and overall less expensive algorithm. If considerably cheaper, this could reduce O(log(n) * n) -> O(n) or even O(log n). Added convex/non-convex classification while ignoring off-curve points, but only ~13% of FreeSerif is pure convex, hence there is no benefit with this classification type. It might be desired to attempt other classes, i.e. being rendered in non-convex mode w/o intersection tests. See - GENERALIZED DELAUNAY TRIANGULATIONS OF NON-CONVEX DOMAINS https://deepblue.lib.umich.edu/bitstream/handle/2027.42/28782/0000614.pdf;sequence=1 - https://en.wikipedia.org/wiki/List_of_self-intersecting_polygons - https://en.wikipedia.org/wiki/Complex_polygon
* Bug 1501: VectorUtil: Deprecate prev line2line intersection tests, adding ↵Sven Göthel2024-02-131-72/+476
| | | | | | | | | | | new impl; Add isConvex*() to determine whether a polyline is convex I had problems using the previous line2line intersection methods in my (and my son's) C++ gfxbox2 project, e.g. freefall01. Hence I found a different solution, also using less operations: <https://jausoft.com/cgit/cs_class/gfxbox2.git/tree/include/pixel/pixel2f.hpp#n660> While adding intersection tests for our Delaunay (Bug 1501) .. I came across this issue again and hence swapped the implementation.
* VectorUtil: Consolidate names, remove unused float prevision variants (if any)Sven Göthel2024-02-133-109/+52
|
* Bug 1501: Graph Shape: onInit(ListenerBool) -> onDraw(DrawListener) w/ added ↵Sven Göthel2024-02-135-20/+40
| | | | | | capability for code injection to render Besides the one-shot on-init functionality, this allows us to re-render the shape differently.
* Bug 1501: Graph RenderState add debug-bits, i.e. DEBUG_LINESTRIP used in ↵Sven Göthel2024-02-134-8/+40
| | | | VBORegionSPES2 to just render lines instead of the filled area -> Used in UIShapeDemo02a
* Graph RenderState/RegionRenderer: Rename isHintMaskSet()->hintBitsSet(), ↵Sven Göthel2024-02-1318-46/+47
| | | | setHintMask()->setHintBits(), clearHintMask()->clearHintBits()
* Loop.isValidNeighborDbg(): Remove DEBUG branch, always trueSven Göthel2024-02-121-8/+4
|
* VectorUtil: Remove unused isInCircleVec2f() and triAreaVec2f(), now using ↵Sven Göthel2024-02-121-34/+8
| | | | *2d() variants
* Remove unused imports ...Sven Göthel2024-02-124-10/+0
|
* Bug 1501 Graph Delaunay: Replace MaterialIconsRound-Regular.ttf with fixed ↵Sven Göthel2024-02-121-0/+0
| | | | winding direction (outer-bondary TTF CW (Graph CCW) and inner-hole TTF CCW (Graph CW)
* Bug 1501: Graph Delaunay: Use default winding outer-boundary:=CCW and ↵Sven Göthel2024-02-125-45/+77
| | | | | | | | | | | inner-hole:=CW w/o using winding determination (might be incorrect) This simplifies our code further and it has been validated that our polygon shoelace-algo for area >= 0 ? CCW doesn't produce correct results with all curves. Hence rely on given winding depending on outer-boundary and inner-hole if CDTriangulator2D.FixedWindingRule == true (default and fixed). This also removes the more costly winding shoelace calculus, hence Outline ctor only sets dirtyWinding:=true w/o calculating the winding.
* Bug 1501: Graph: Add UIShapeDemo02a test for rectangular shape provoking ↵Sven Göthel2024-02-122-0/+227
| | | | tessellation issue / or use Glyph03FreeMonoRegular_M
* Bug 1501: Graph Delaunay: Add double triAreaVec2() and isInCircleVec2() ↵Sven Göthel2024-02-124-106/+197
| | | | | | | | | | | | version, overcome float precision; Loop: Pass edgeType not Winding, simplify findClosestValidNeighbor() -> isValidNeighbor(); CDTriangulator2D.addCurve() enforces Winding.CCW on BOUNDARY null == loop case Add double version of triAreaVec2() and isInCircleVec2() in VectorUtil, overcoming float precision limits - Analysis exposed float precision limits within isInCircleVec2() Loop: Pass edgeType not Winding, simplify findClosestValidNeighbor() -> isValidNeighbor() - Enhance code clarity CDTriangulator2D.addCurve() enforces Winding.CCW on BOUNDARY null == loop case
* Graph: Outline[Shape]: Add print()Sven Göthel2024-02-112-0/+26
|
* GraphUI Demos FontView01 + UIMediaGrid01: Use FSAA 8 (GPU MSAA 8) as these ↵Sven Göthel2024-02-073-6/+10
| | | | | | | demos utilize lots of smaller resources regions ... .. and this also brings us to the next required task: Resolve AA w/o supersampling right in our shader, which is very well possible when extending the tessellated outline triangle's area.
* GraphUI MediaPlayer: Add HUDShape on time-slider @ mouse-over with ↵Sven Göthel2024-02-072-75/+171
| | | | time-string and still-images (optional) .. using HUDShape
* GraphUI: Add HUDShape, a convenient HUD shape to be exposed in the scene ↵Sven Göthel2024-02-071-0/+262
| | | | using inner object size/pos, similar like TooltipShape
* GraphUI Tooltip*: Remove unused paramter in createTip() and clarify namesSven Göthel2024-02-074-63/+102
|
* GraphUI Shape: Add MouseEvent to MoveListener; RangeSlider: Add rel obj ↵Sven Göthel2024-02-078-75/+132
| | | | position + NEWT MouseEvent to listener, renamed {Slider->Change}Listener and add PeekListener for mouse-over events
* GLMediaPlayerImpl: Adjust aid/sid to AUTO if alang/slang is givenSven Göthel2024-02-071-3/+5
|
* GLMediaPlayerImpl: Fix playing one frame after seek() @ getNextTexture(), ↵Sven Göthel2024-02-071-4/+4
| | | | requires pause state (normal at play-state)
* GraphUI RangeSlider: Fix 'activeOldMod' -> static to memberSven Göthel2024-02-051-1/+1
|
* Bug 1492: GLMediaPlayer: Add playStream(..) variant passing desired audio- ↵Sven Göthel2024-02-0512-93/+190
| | | | and subtitle language
* GraphUI: Add Shape.IO_DISCARDED and update it @ Scene/Group draw(); Prepare ↵Sven Göthel2024-02-054-5/+57
| | | | | | | | | | | for experimental occlusion-culling TreeTool's cullShapes(), actually a naive dumm occlusion test (*RENAME IT*), would need to realize whether the shape/groups actually cover shapes below, i.e. are not on same Z-Axis and transparent. Hence, this is disabled in code and we rely on the Z buffer still, just an idea ..
* Bug 1498: Refine Top-Level Widget Mode: Handle active-state by Scene, ↵Sven Göthel2024-02-053-47/+43
| | | | | | | | | | | simplify and reduce runtime costs Refines commit 43a7899fedf2a570d20b03848bf15710f30b7f26 Scene handles top-level active state via releaseActiveShape() and setActive(), now calling into setActiveTopLevel() -> dispatchActivationEvent(). Drop child's addActivationListener(forwardActivation) and isActive() override.
* GraphUI MediaPlayer: Elevate the ctrlSlider a little (and add it behind ↵Sven Göthel2024-02-051-1/+3
| | | | ctrlBlend) to remove the occlusion by the blending box
* Bug 805: GraphUI Demos: Adopt changes to FontView01 + UIMediaGrid01, ↵Sven Göthel2024-02-053-320/+43
| | | | dropping UIMediaGrid00
* Bug 805: GraphUI MediaPlayer: Add 'Aspect Ratio Crop' Button; Have Chapter ↵Sven Göthel2024-02-051-45/+109
| | | | Pre/Next Buttons; Toggle HUD head info box (full or brief)
* Bug 1498: GraphUI: Fix Picking Traversal throughout Groups in Z-Descending ↵Sven Göthel2024-02-054-197/+246
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Order, testing Children and fallback to Group if positive Picking algo in Z-Ascending order worked only by chance, as it picked up any bottom node. +++ Proper algo is in Z-Descending order to block occluded (child) nodes: for-all s : shapes p1 = testPicking(s) if ( s is Container ) { p2 = testPicking(s.childs) if( null != p2 ) { p1 = p2; // override w/ child prio } } return p1 } Further, testPicking(shape) shall only return a positive shape, if the event dispatching check (mouse-over, click, ..) signals end-of-traversal - as originally intended. Overall philosophy is to pick the 'deepest' child of a group if responding, otherwise the next higher interactive group.