feat: phased progressive GI scheduling and Wavefront OBJ loading
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 27 Sep 2026 19:02:50 +0000 (22:02 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 27 Sep 2026 19:02:50 +0000 (22:02 +0300)
commit9ca140487324ef91a0bf02bb64ea2e40f4195ab5
tree58fd93e7f7d1ca7ce01802ccab00a1f7cdf49e77
parentfb35e84abbdbff4a52b57025915993a699eb9727
feat: phased progressive GI scheduling and Wavefront OBJ loading

Replace the flat round-robin GI scheduler with a three-phase
progressive pipeline ordered near-to-far from the camera: phase A
stamps ambient + direct light at polygon centroids so the scene
lights up as a visible wave; phase B converges multi-bounce
indirect light at centroids scene-wide; phase C refines lightmaps
per texel. Phases B and C run on a bounded 256-entry active window
that graduates calm entries, re-sorting pending work when the
camera moves more than 25 world units. Graduated lightmaps keep
recompositing through a display-freeze tail so no centroid-stamp
bias survives as visible seams. The legacy scheduler stays
available via -De3d.gi.phases=false. ViewPanel now feeds the
camera position into the GI system, and a torn-read guard prevents
converging partial snapshots.

Add a Wavefront OBJ loader (ObjLoader/ObjModel/ObjMaterial):
vertices, faces in all index forms including negative and forward
references, usemtl/mtllib resolution, and MTL Kd diffuse color
with d/Tr opacity. Faces become SolidPolygons inside an ObjModel
composite, so shading, culling and transforms work as for any
composite.

Extend Transform with a uniform scale applied before rotation
(negative values mirror geometry and flip winding; zero and
non-finite values are rejected). TransformStack bakes the scale
into the composed matrix at push time, so per-vertex render cost
is unchanged and unscaled scenes render bit-identically.

Light two-sided polygons per side: SolidPolygon computes a
reverse-side shaded color from the negated normal, and
LightmappedCompositeShape emits a reversed solid back triangle for
unculled polygons so undersides no longer show the front side's
light.

Add udev rules for RayNeo XR glasses and the 3Dconnexion
SpaceNavigator, tests for transform scaling and OBJ loading, and
documentation pages for octree ray tracing, GUI components,
SpaceMouse input, configuration and subpixel culling.
40 files changed:
AGENTS.org
Documentation/Configuration/Atomic write.svg [new file with mode: 0644]
Documentation/Configuration/Config precedence.svg [new file with mode: 0644]
Documentation/Configuration/index.org [new file with mode: 0644]
Documentation/GUI components/Event dispatch.svg [new file with mode: 0644]
Documentation/GUI components/Focus model.svg [new file with mode: 0644]
Documentation/GUI components/Texture UV picking.svg [new file with mode: 0644]
Documentation/GUI components/index.org [new file with mode: 0644]
Documentation/Global illumination/index.org
Documentation/Octree ray tracing/Cell pool.svg [new file with mode: 0644]
Documentation/Octree ray tracing/Octree subdivision.svg [new file with mode: 0644]
Documentation/Octree ray tracing/Ray traversal.svg [new file with mode: 0644]
Documentation/Octree ray tracing/index.org [new file with mode: 0644]
Documentation/Rendering loop/index.org
Documentation/SpaceMouse 6DOF/SpaceMouse gestures.svg [new file with mode: 0644]
Documentation/SpaceMouse 6DOF/SpaceMouse.png [new file with mode: 0644]
Documentation/SpaceMouse 6DOF/index.org [new file with mode: 0644]
Documentation/Stereoscopic rendering/Head tracking.svg [new file with mode: 0644]
Documentation/Stereoscopic rendering/Stereo per eye.svg
Documentation/Stereoscopic rendering/index.org
Documentation/Subpixel culling/Culling ladder.svg [new file with mode: 0644]
Documentation/Subpixel culling/Verdict epoch.svg [new file with mode: 0644]
Documentation/Subpixel culling/index.org [new file with mode: 0644]
Documentation/index.org
src/main/java/eu/svjatoslav/aukio/e3d/gui/ViewPanel.java
src/main/java/eu/svjatoslav/aukio/e3d/math/Transform.java
src/main/java/eu/svjatoslav/aukio/e3d/math/TransformStack.java
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/gi/GlobalIllumination.java
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/gi/Lightmap.java
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/gi/TriangleBvh.java
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/shapes/basic/solidpolygon/SolidPolygon.java
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/shapes/composite/LightmappedCompositeShape.java
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/shapes/composite/obj/ObjLoader.java [new file with mode: 0644]
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/shapes/composite/obj/ObjMaterial.java [new file with mode: 0644]
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/shapes/composite/obj/ObjModel.java [new file with mode: 0644]
src/main/java/eu/svjatoslav/aukio/e3d/renderer/raster/shapes/composite/obj/package-info.java [new file with mode: 0644]
src/test/java/eu/svjatoslav/aukio/e3d/math/TransformStackTest.java
src/test/java/eu/svjatoslav/aukio/e3d/renderer/raster/shapes/composite/obj/ObjLoaderTest.java [new file with mode: 0644]
udev/99-rayneo-glasses.rules [new file with mode: 0644]
udev/99-spacenavigator.rules [new file with mode: 0644]