aboutsummaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* 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.
* Bug 1498: Change Top-Level Widget Mode: Register a top-level Group in Scene, ↵Sven Göthel2024-02-056-57/+109
| | | | | | | | | | | | | | | | | | | | | | | where its zOffset gets adjusted when activated.. .. instead of having a non-working complicated callback orgy setup. This also takes away the getAdjustedZ() overloading burden (or better uglyness) etc. Hence Group's setWidgetMode(boolean) became: - enableTopLevelWidget(Scene) - disableTopLevelWidget() The forwardActivation listener is still applied to all children as well as isActive() is also still overloaded for same required behavior. However, none of the children is set in 'widget mode' as well as the Group is simply added to (or removed from) the Scene's top-level Group list - the holder. Scene's setActiveShape(Shape) and releaseActiveShape() handle the top-level Group if affected, i.e. adding or zero'ing its ZOffset.
* Bug 1498: GraphUI: Adopt RangedSlider to new picking (coming up), simplifies ↵Sven Göthel2024-02-042-46/+21
| | | | code.
* GraphUI Cleanup: Use TreeTool directly (Reduce virtl-funcs); Fix typos; Use ↵Sven Göthel2024-02-0420-284/+215
| | | | | | PointerListener for onClicked(), add onHover(); Subsequent commits will fix complete cleanup where code was changed mostly regarding other issues.
* GLMediaPlayer.Chapter: Add duration()Sven Göthel2024-02-041-0/+2
|
* GraphUI RangeSlider: Active {Page -> Knob} Color modulation now affects the ↵Sven Göthel2024-02-041-24/+22
| | | | knob for round-knob and page-size knob
* Bug 1493: Enhance Text/ASS subtitle layout: Split too wide text into ↵Sven Göthel2024-02-041-8/+36
| | | | | | | | multiple lines (max 4) fitting into box, trimming it beforehand Not always are Text/ASS subtitles well formed with newline character. Use new StringUtil to re-layout if their width doesn't fit into the box, by trimming all whitespace and splitting them into up-to 4 lines.
* GraphUI Button: Fix API doc typoSven Göthel2024-02-041-1/+1
|
* Graph Font: Pull up static functionSven Göthel2024-02-041-16/+16
|
* GraphUI: Fix func-name, rename ↵Sven Göthel2024-02-042-3/+3
| | | | TexSeqButton.use{AspectRation->ARatio}Letterbox() matching TextureSequence