[x3d-public] [...] detection of event loops in HTML documentation for WinterAndSpring/Leif.x3d
Brutzman, Donald (Don) (CIV)
brutzman at nps.edu
Sat Feb 17 16:17:43 PST 2024
Joe, following up with improved diagnostics, here is some specific detail on some of the harder scenes with loops.
Conversion to html documentation for Leif, Lily, and Tufani (also *Animated) versions are all producing similar error reports. Each form is also pretty big (around 11MB). Here is conversion of Leif.x3d model to Leif.html documentation:
* X3D Example Archives: Humanoid Animation, Winter And Spring, Leif
* Humanoid model of a grandchild
* https://www.web3d.org/x3d/content/examples/HumanoidAnimation/WinterAndSpring/LeifIndex.html
The main problem with these models is that the geometry seems ridiculously over-detailed, making the file sizes much bigger than needed.
Meanwhile you have a huge number of ROUTE declarations, which are producing ROUTE loops in the event graph. Am thinking it would be good to diagnose and get rid of the ROUTE loops.
If you can discern some fixes in one, that should enable similar fixes in the other models. Good luck sir.
ant -f C:\\x3d-code\\www.web3d.org\\x3d\\content\\examples\\HumanoidAnimation processScenes.htmlPrettyPrintPages
get.web3d.saxon.check:
found C:\x3d-code\www.web3d.org\x3d\content\examples\HumanoidAnimation\lib/saxon-he-12.1.jar: true
get.web3d.saxon:
processScenes.htmlPrettyPrintPages:
C:\x3d-code\www.web3d.org\x3d\content\examples\HumanoidAnimation/WinterAndSpring//Leif.x3d processing with X3dToXhtml stylesheet for pretty-print .html
[info] total # ROUTE statements = 475, event-cascade table-column maxROUTEdepth=8
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_humanoid_root' set_translation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_humanoid_root' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_carpometacarpal_1' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_elbow' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_hip' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_knee' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_metatarsophalangeal_2' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_radiocarpal' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_shoulder' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_sternoclavicular' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_l_talocrural' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_carpometacarpal_1' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_elbow' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_hip' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_knee' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_metatarsophalangeal_2' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_radiocarpal' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_shoulder' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_sternoclavicular' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_r_talocrural' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Run011Timer' set_enabled
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Run011Timer' set_startTime
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_sacroiliac' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_sacroiliac' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_sacroiliac' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_sacroiliac' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Skip014Timer' set_enabled
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Skip014Timer' set_startTime
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_skullbase' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: BooleanFilter DEF='Leif_Stand010SPLITTERBooleanFilter' set_boolean
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Stand010Timer' set_enabled
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Stand010Timer' set_startTime
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Stand015Timer' set_enabled
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Stand015Timer' set_startTime
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Stand016Timer' set_enabled
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Stand016Timer' set_startTime
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Turn012Timer' set_enabled
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Turn012Timer' set_startTime
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_vc4' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_vl2' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: HAnimJoint DEF='Leif_vl5' set_rotation
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Walk013Timer' set_enabled
*** Multiple event fan-in to same node/@field (from different source ROUTEs) may have varying, nondeterministic delivery order: TimeSensor DEF='Leif_Walk013Timer' set_startTime
[diagnostic] $maxROUTEdepth=8 but found that node TimeSensor DEF='Leif_Run011Timer' has IncomingRoutes=5, OutgoingRoutes=28, SelfRoutes=0
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Turn012Timer.stopTime_changed TO Leif_Walk013Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Turn012Timer.stopTime_changed TO Leif_Walk013Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Run011Timer.stopTime_changed TO Leif_Turn012Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Turn012Timer.isActive TO Leif_Walk013NEGATERBooleanFilter.set_boolean;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Run011Timer.stopTime_changed TO Leif_Turn012Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Turn012NEGATERBooleanFilter.inputNegate TO Leif_Run011BooleanSequencer.next;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Run011Timer.isActive TO Leif_Turn012NEGATERBooleanFilter.set_boolean;' at $nodeDepth=1
[diagnostic] $maxROUTEdepth=8 but found that node TimeSensor DEF='Leif_Skip014Timer' has IncomingRoutes=5, OutgoingRoutes=19, SelfRoutes=0
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand015Timer.stopTime_changed TO Leif_Stand016Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand015Timer.stopTime_changed TO Leif_Stand016Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Skip014Timer.stopTime_changed TO Leif_Stand015Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand015Timer.isActive TO Leif_Stand016NEGATERBooleanFilter.set_boolean;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Skip014Timer.stopTime_changed TO Leif_Stand015Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand015NEGATERBooleanFilter.inputNegate TO Leif_Skip014BooleanSequencer.next;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Skip014Timer.isActive TO Leif_Stand015NEGATERBooleanFilter.set_boolean;' at $nodeDepth=1
[diagnostic] $maxROUTEdepth=8 but found that node TimeSensor DEF='Leif_Stand010Timer' has IncomingRoutes=6, OutgoingRoutes=31, SelfRoutes=0
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Run011Timer.stopTime_changed TO Leif_Turn012Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Run011Timer.stopTime_changed TO Leif_Turn012Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand010Timer.stopTime_changed TO Leif_Run011Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Run011Timer.isActive TO Leif_Turn012NEGATERBooleanFilter.set_boolean;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand010Timer.stopTime_changed TO Leif_Run011Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Run011NEGATERBooleanFilter.inputNegate TO Leif_Stand010BooleanSequencer.next;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand010Timer.isActive TO Leif_Run011NEGATERBooleanFilter.set_boolean;' at $nodeDepth=1
[diagnostic] $maxROUTEdepth=8 but found that node TimeSensor DEF='Leif_Stand015Timer' has IncomingRoutes=5, OutgoingRoutes=31, SelfRoutes=0
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand016Timer.stopTime_changed TO Leif_Stand010Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand016Timer.stopTime_changed TO Leif_Stand010Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand015Timer.stopTime_changed TO Leif_Stand016Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand016Timer.isActive TO Leif_Stand010NEGATERBooleanFilter.set_boolean;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand015Timer.stopTime_changed TO Leif_Stand016Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand016NEGATERBooleanFilter.inputNegate TO Leif_Stand015BooleanSequencer.next;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand015Timer.isActive TO Leif_Stand016NEGATERBooleanFilter.set_boolean;' at $nodeDepth=1
[diagnostic] $maxROUTEdepth=8 but found that node TimeSensor DEF='Leif_Stand016Timer' has IncomingRoutes=5, OutgoingRoutes=31, SelfRoutes=0
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand010Timer.stopTime_changed TO Leif_Run011Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand010Timer.stopTime_changed TO Leif_Run011Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand016Timer.stopTime_changed TO Leif_Stand010Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand010Timer.isActive TO Leif_Run011NEGATERBooleanFilter.set_boolean;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand016Timer.stopTime_changed TO Leif_Stand010Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand010NEGATERBooleanFilter.inputNegate TO Leif_Stand016BooleanSequencer.next;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Stand016Timer.isActive TO Leif_Stand010NEGATERBooleanFilter.set_boolean;' at $nodeDepth=1
[diagnostic] $maxROUTEdepth=8 but found that node TimeSensor DEF='Leif_Turn012Timer' has IncomingRoutes=5, OutgoingRoutes=28, SelfRoutes=0
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Walk013Timer.stopTime_changed TO Leif_Skip014Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Walk013Timer.stopTime_changed TO Leif_Skip014Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Turn012Timer.stopTime_changed TO Leif_Walk013Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Walk013Timer.isActive TO Leif_Skip014NEGATERBooleanFilter.set_boolean;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Turn012Timer.stopTime_changed TO Leif_Walk013Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Walk013NEGATERBooleanFilter.inputNegate TO Leif_Turn012BooleanSequencer.next;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Turn012Timer.isActive TO Leif_Walk013NEGATERBooleanFilter.set_boolean;' at $nodeDepth=1
[diagnostic] $maxROUTEdepth=8 but found that node TimeSensor DEF='Leif_Walk013Timer' has IncomingRoutes=5, OutgoingRoutes=30, SelfRoutes=0
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Skip014Timer.stopTime_changed TO Leif_Stand015Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Skip014Timer.stopTime_changed TO Leif_Stand015Timer.set_startTime;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Walk013Timer.stopTime_changed TO Leif_Skip014Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Skip014Timer.isActive TO Leif_Stand015NEGATERBooleanFilter.set_boolean;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Walk013Timer.stopTime_changed TO Leif_Skip014Timer.set_startTime;' at $nodeDepth=1
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Skip014NEGATERBooleanFilter.inputNegate TO Leif_Walk013BooleanSequencer.next;' at $nodeDepth=2
*** [check-event-chain-loop] *detected event loop* repeating ROUTE 'Leif_Walk013Timer.isActive TO Leif_Skip014NEGATERBooleanFilter.set_boolean;' at $nodeDepth=1
C:\x3d-code\www.web3d.org\x3d\content\examples\HumanoidAnimation/WinterAndSpring//Leif.x3d processing with X3dExtrusionCrossSectionToSvg stylesheet for SVG diagrams (if Extrusion found)
echo.timestamp:
timestamp 16:14:25 on 17 February 2024
processScenes.htmlPrettyPrintPages complete.
BUILD SUCCESSFUL (total time: 24 seconds)
all the best, Don
--
Don Brutzman Naval Postgraduate School, Code USW/Br brutzman at nps.edu
Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA +1.831.656.2149
X3D graphics, virtual worlds, navy robotics https://faculty.nps.edu/brutzman
From: Brutzman, Donald (Don) (CIV)
Sent: Friday, February 16, 2024 12:03 AM
To: X3D Public Mailing List (x3d-public at web3d.org) <x3d-public at web3d.org>
Cc: brutzman at nps.edu; brutzman at nps.edu
Subject: X3D Examples: addition links on model pages, detection of event loops in HTML documentation
Am happy to report some useful progress.
1. Thanks to suggestions from Nicholas Polys for improving some of the links provided on each index page.
* Three-column layout for better readability
* In-browser model editing using X_ITE Playground and X3DOM Editor are top center.
* html annotated documentation easier to find.
* Link for reporting comments/problems/improvements to x3d-public mailing list.
* Link for SourceForge version control and also tickets (i.e. issue list) to facilitate problem reporting.
Problem reports, improvements, and candidate additions are welcome. We are “walking the walk.”
2. X3dToXhtml.xslt stylesheet to produce html annotated documentation can now identify when ROUTE loops occur, which is helpful for improving performance and avoiding errors. Screenshot attached, example at
* X3D Example Archives: X3D4AM, X3D for Advanced Modeling, Animation, Event Graph Loop Test
* Diagnostic scene for tools to test event-graph loop detection
* https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/Animation/EventGraphLoopTestIndex.html
* https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/Animation/EventGraphLoopTest.html#EventGraph
3. It was difficult to get the loop-test working with XSLT recursion, some fine tuning is continuing, hopefully it is now OK. This updated capability will be included in next release of X3D-Edit.
Am thinking it would be a good practice for browsers to report on console the first time an event loop occurs, motivated to assist authors. This seems like a mostly undetected class of errors since we haven’t had quality assurance tests for these before.
4. These improvements have been applied to all 4000+ X3D Examples Archives, all maintained in public version control under an open-source license.
* X3D Resources, X3D Examples: Scene Archives for X3D
* The X3D Examples Archives demonstrate how X3D nodes and scenes work. Thousands of scenes are provided in all X3D encodings. You can browse them individually online or download fully complete, separately installable .zip archives.
* https://www.web3d.org/x3d/content/examples/X3dResources.html#Examples
* https://www.web3d.org/x3d/content/examples/license.html
Have fun with improved X3D4 documentation and diagnostics in HTML! 😊
all the best, Don
--
Don Brutzman Naval Postgraduate School, Code USW/Br brutzman at nps.edu
Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA +1.831.656.2149
X3D graphics, virtual worlds, navy robotics https://faculty.nps.edu/brutzman
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20240218/0c9f8e10/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5464 bytes
Desc: not available
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20240218/0c9f8e10/attachment-0001.p7s>
More information about the x3d-public
mailing list