X3D Model Documentation: FlyingTextPrototype.x3d

  1  <?xml version="1.0" encoding="UTF-8"?>
  2  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
  3  <X3D profile='Immersive' version='3.3 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.3.xsd'>
  4       <head>
  5            <meta name='titlecontent=' FlyingTextPrototype.x3d '/>
  6            <meta name='descriptioncontent='Prototype definition for a flying text message. Waypoints, time intervals, cycleInterval and text message can be overridden.'/>
  7            <meta name='creatorcontent='Murat Onder and Don Brutzman'/>
  8            <meta name='createdcontent='2 June 2004'/>
  9            <meta name='modifiedcontent='28 November 2019'/>
 10            <meta name='referencecontent=' FlyingTextExample.x3d '/>
 11            <meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/FlyingTextPrototype.x3d '/>
 12            <meta name='generatorcontent='X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit'/>
 13            <meta name='licensecontent='../../license.html'/>
 14       </head>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: AnimationScript, Clock, HideTextTrigger, RevealTextTrigger, TextAnimationGroup, TextAnimator, TextMessage, TextMessageTransform, TextVisibilityGroup, TextVisibilitySwitch, Toucher

Index for ProtoDeclare definition: FlyingText
-->
 15       <Scene>
 16            <WorldInfo title='FlyingTextPrototype.x3d'/>
 17            <ProtoDeclare name='FlyingTextappinfo='Visualize message transfer between two points as flying text'>
 18                 <ProtoInterface>
 19                      <field name='waypointstype='MFVec3fvalue='0 0 0 0 1 0accessType='initializeOnly'/>
 20                      <field name='set_waypointstype='MFVec3faccessType='inputOnly'/>
 21                      <field name='timeIntervalstype='MFTimevalue='1accessType='initializeOnly'/>
 22                      <field name='set_timeIntervalstype='MFTimeaccessType='inputOnly'/>
 23                      <field name='textMessagetype='MFStringvalue='"default"accessType='initializeOnly'/>
 24                      <field name='set_textMessagetype='MFStringaccessType='inputOnly'/>
 25                      <field name='visibletype='SFBoolvalue='trueaccessType='initializeOnly'/>
 26                      <field name='set_visibletype='SFBoolaccessType='inputOnly'/>
 27                      <field name='looptype='SFBoolvalue='falseaccessType='initializeOnly'/>
 28                      <field name='axisOfRotationtype='SFVec3fvalue='0 0 0accessType='initializeOnly'/>
 29                      <field name='timeSensorEnabledtype='SFBoolvalue='trueaccessType='initializeOnly'/>
 30                      <field name='startTimetype='SFTimevalue='0accessType='inputOutput'/>
 31                      <field name='set_startTimetype='SFTimeaccessType='inputOnly'/>
 32                      <field name='stopTimetype='SFTimevalue='0accessType='inputOutput'/>
 33                      <field name='set_stopTimetype='SFTimeaccessType='inputOnly'/>
 34                      <field name='traceEnabledtype='SFBoolvalue='falseaccessType='initializeOnly'/>
 35                      <field name='textDiffuseColortype='SFColorvalue='.2 .2 .4accessType='inputOutput'/>
 36                      <field name='fontStyletype='SFNodeaccessType='inputOutput'>
 37                           <FontStyle justify='"MIDDLE" "MIDDLE"'/>
 38                      </field>
 39                 </ProtoInterface>
 40                 <ProtoBody>
 41                      <Group>
 42                           <Billboard>
 43                                <IS>
 44                                     <connect nodeField='axisOfRotationprotoField='axisOfRotation'/>
 45                                </IS>
 46 
                              <!-- ROUTE information for TextMessageTransform node:  [from TextAnimator.value_changed to set_translation ] -->
                              <Transform DEF='TextMessageTransform'>
 47 
                                   <!-- ROUTE information for TextVisibilitySwitch node:  [from HideTextTrigger.triggerValue to whichChoice ] [from RevealTextTrigger.triggerValue to whichChoice ] -->
                                   <Switch DEF='TextVisibilitySwitchwhichChoice='-1'>
 48                                          <Shape>
 49 
                                             <!-- Text TextMessage is a DEF node that has 1 USE node: USE_1 -->
                                             <Text DEF='TextMessage'>
 50                                                    <IS>
 51                                                         <connect nodeField='fontStyleprotoField='fontStyle'/>
 52                                                    </IS>
 53                                               </Text>
 54                                               <Appearance>
 55                                                    <Material>
 56                                                         <IS>
 57                                                              <connect nodeField='diffuseColorprotoField='textDiffuseColor'/>
 58                                                         </IS>
 59                                                    </Material>
 60                                               </Appearance>
 61                                          </Shape>
 62 
                                        <!-- ROUTE information for Toucher node:  [from touchTime to Clock.set_startTime ] -->
                                        <TouchSensor DEF='Toucherdescription='Touch to fly the text'/>
 63                                     </Switch>
 64                                </Transform>
 65                                <Group DEF='TextAnimationGroup'>
 66 
                                   <!-- TimeSensor Clock is a DEF node that has 1 USE node: USE_1
                                   <!-- ROUTE information for Clock node:  [from Toucher.touchTime to set_startTime ] [from fraction_changed to TextAnimator.set_fraction ] -->
                                   <TimeSensor DEF='Clock'>
 67                                          <IS>
 68                                               <connect nodeField='loopprotoField='loop'/>
 69                                               <connect nodeField='enabledprotoField='timeSensorEnabled'/>
 70                                               <connect nodeField='startTimeprotoField='startTime'/>
 71                                               <connect nodeField='set_startTimeprotoField='set_startTime'/>
 72                                               <connect nodeField='stopTimeprotoField='stopTime'/>
 73                                               <connect nodeField='set_stopTimeprotoField='set_stopTime'/>
 74                                          </IS>
 75                                     </TimeSensor>
 76                                     < ROUTE  fromNode='Toucher' fromField='touchTime' toNode='Clock' toField='set_startTime'/>
 77 
                                   <!-- PositionInterpolator TextAnimator is a DEF node that has 1 USE node: USE_1
                                   <!-- ROUTE information for TextAnimator node:  [from Clock.fraction_changed to set_fraction ] [from value_changed to TextMessageTransform.set_translation ] -->
                                   <PositionInterpolator DEF='TextAnimator'/>
 78                                     < ROUTE  fromNode='Clock' fromField='fraction_changed' toNode='TextAnimator' toField='set_fraction'/>
 79                                     < ROUTE  fromNode='TextAnimator' fromField='value_changed' toNode='TextMessageTransform' toField='set_translation'/>
 80                                </Group>
 81                           </Billboard>
 82 
                         <!-- ROUTE information for AnimationScript node:  [from hideText to HideTextTrigger.set_boolean ] [from revealText to RevealTextTrigger.set_boolean ] -->
                         <Script DEF='AnimationScriptdirectOutput='true'>
 83                                <field name='traceEnabledtype='SFBoolaccessType='initializeOnly'/>
 84                                <field name='interpolatorNodetype='SFNodeaccessType='initializeOnly'>
 85                                     <PositionInterpolator USE='TextAnimator'/>
 86                                </field>
 87                                <field name='textNodetype='SFNodeaccessType='initializeOnly'>
 88                                     <Text USE='TextMessage'/>
 89                                </field>
 90                                <field name='timeSensorNodetype='SFNodeaccessType='initializeOnly'>
 91                                     <TimeSensor USE='Clock'/>
 92                                </field>
 93                                <field name='waypointstype='MFVec3faccessType='initializeOnly'/>
 94                                <field name='set_waypointstype='MFVec3faccessType='inputOnly'/>
 95                                <field name='timeIntervalstype='MFTimeaccessType='initializeOnly'/>
 96                                <field name='set_timeIntervalstype='MFTimeaccessType='inputOnly'/>
 97                                <field name='textMessagetype='MFStringaccessType='initializeOnly'/>
 98                                <field name='set_textMessagetype='MFStringaccessType='inputOnly'/>
 99                                <field name='visibletype='SFBoolaccessType='initializeOnly'/>
100                                <field name='set_visibletype='SFBoolaccessType='inputOnly'/>
101                                <field name='hideTexttype='SFBoolaccessType='outputOnly'/>
102                                <field name='revealTexttype='SFBoolaccessType='outputOnly'/>
103                                <field name='set_startTimetype='SFTimeaccessType='inputOnly'/>
104                                <field name='totalDurationtype='SFTimevalue='0accessType='initializeOnly'/>
105                                <IS>
106                                     <connect nodeField='traceEnabledprotoField='traceEnabled'/>
107                                     <connect nodeField='waypointsprotoField='waypoints'/>
108                                     <connect nodeField='set_waypointsprotoField='set_waypoints'/>
109                                     <connect nodeField='timeIntervalsprotoField='timeIntervals'/>
110                                     <connect nodeField='set_timeIntervalsprotoField='set_timeIntervals'/>
111                                     <connect nodeField='textMessageprotoField='textMessage'/>
112                                     <connect nodeField='set_textMessageprotoField='set_textMessage'/>
113                                     <connect nodeField='visibleprotoField='visible'/>
114                                     <connect nodeField='set_visibleprotoField='set_visible'/>
115                                     <connect nodeField='set_startTimeprotoField='set_startTime'/>
116                                </IS>
  <![CDATA[
            
ecmascript:

function initialize()
{
   if ((waypoints.length - timeIntervals.length) == 1 )
   {
     set_textMessage(textMessage);
     set_timeIntervals(timeIntervals);
     set_waypoints(waypoints);
   }
   else
   {
     alwaysPrint('timeIntervals.length=' + timeIntervals.length + ' should be one less '
                + 'than waypoints.length=' + waypoints.length);
     alwaysPrint ('timeIntervals=' + timeIntervals);
     alwaysPrint ('waypoints    =' + waypoints);
   }
   if (visible) revealText = true;
   else           hideText = true;
   tracePrint ('visible = ' + visible);
}
function set_textMessage(text)
{
   textNode.string = text;
   tracePrint ('textNode.string = ' + textNode.string);
}
function set_waypoints(waypointsArray)
{
   interpolatorNode.keyValue = waypointsArray;
   tracePrint ('interpolatorNode.keyValue = ' + interpolatorNode.keyValue);
}
function set_timeIntervals(intervals)
{
   tracePrint ('set_timeIntervals(' + timeIntervals + ')');
   totalDuration = 0;
   for(i = 0; i < timeIntervals.length; i++)
   {
      totalDuration = totalDuration + timeIntervals[i];
   }
   tracePrint ('totalDuration = ' + totalDuration);
   timeSensorNode.cycleInterval = totalDuration;

   interpolatorNode.key[0] = 0.0;
   for (j = 0; j < timeIntervals.length; j++)
   {
      interpolatorNode.key[j+1] = interpolatorNode.key[j] + timeIntervals[j]/totalDuration;
      tracePrint ('interpolatorNode.key[j] = ' + interpolatorNode.key[j]);
   }
   tracePrint ('interpolatorNode.key = ' + interpolatorNode.key);
}
function set_visible (value, timestamp)
{
	visible = value;
	if (visible) revealText = true;
	else           hideText = true;
	tracePrint ('visible = ' + visible);
}
function set_startTime (value, timestamp)
{
	tracePrint ('set_startTime = ' + value);
	set_visible (true);  // ensure visible when activated
	initialize ();       // ensure all computations up to date
}
function tracePrint(value)
{
   if (traceEnabled) alwaysPrint(value);
}
function alwaysPrint(value)
{
      if (textMessage.length > 1)
	       Browser.println ('[FlyingText ' + textMessage + '] ' + value);
      else Browser.println ('[FlyingText] ' + value);
}

          
]]>
118                           </Script>
119                           <Group DEF='TextVisibilityGroup'>
120 
                              <!-- ROUTE information for HideTextTrigger node:  [from AnimationScript.hideText to set_boolean ] [from triggerValue to TextVisibilitySwitch.whichChoice ] -->
                              <IntegerTrigger DEF='HideTextTrigger'/>
121                                < ROUTE  fromNode='AnimationScript' fromField='hideText' toNode='HideTextTrigger' toField='set_boolean'/>
122                                < ROUTE  fromNode='HideTextTrigger' fromField='triggerValue' toNode='TextVisibilitySwitch' toField='whichChoice'/>
123 
                              <!-- ROUTE information for RevealTextTrigger node:  [from AnimationScript.revealText to set_boolean ] [from triggerValue to TextVisibilitySwitch.whichChoice ] -->
                              <IntegerTrigger DEF='RevealTextTriggerintegerKey='0'/>
124                                < ROUTE  fromNode='AnimationScript' fromField='revealText' toNode='RevealTextTrigger' toField='set_boolean'/>
125                                < ROUTE  fromNode='RevealTextTrigger' fromField='triggerValue' toNode='TextVisibilitySwitch' toField='whichChoice'/>
126                           </Group>
127                      </Group>
128                 </ProtoBody>
129            </ProtoDeclare>
130            <!-- ============================ -->
131            <Anchor description='FlyingText Exampleparameter='"target=_blank"'   url=' "../../../Savage/Tools/Animation/FlyingTextExample.x3d" "https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/FlyingTextExample.x3d" "../../../Savage/Tools/Animation/FlyingTextExample.wrl" "https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/FlyingTextExample.wrl" '>
132                 <Shape>
133                      <Text string='"FlyingTextPrototype" "defines a prototype" "" "Click text to see example scene" "" "(Text has Billboard style)"'>
134                           <FontStyle justify='"MIDDLE" "MIDDLE"size='0.7'/>
135                      </Text>
136                      <Appearance>
137                           <Material diffuseColor='.8 .7 0.2'/>
138                      </Appearance>
139                 </Shape>
140            </Anchor>
141       </Scene>
142  </X3D>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: AnimationScript, Clock, HideTextTrigger, RevealTextTrigger, TextAnimationGroup, TextAnimator, TextMessage, TextMessageTransform, TextVisibilityGroup, TextVisibilitySwitch, Toucher

Index for ProtoDeclare definition: FlyingText
-->
X3D Tooltips element index: Anchor, Appearance, Billboard, connect, field, FontStyle, Group, head, IntegerTrigger, IS, Material, meta, PositionInterpolator, ProtoBody, ProtoDeclare, ProtoInterface, ROUTE, Scene, Script, Shape, Switch, Text, TimeSensor, TouchSensor, Transform, WorldInfo, X3D, plus documentation for accessType definitions, type definitions, XML data types, and field types

Event Graph ROUTE Table entries with 7 ROUTE connections total, showing X3D event-model relationships for this scene.

Each row shows an event cascade that may occur during a single timestamp interval between frame renderings, as part of the X3D execution model.

Toucher
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Clock
TimeSensor
set_startTime
SFTime
then
 
 
 
Clock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
TextAnimator
PositionInterpolator
set_fraction
SFFloat
then
 
 
 
TextAnimator
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
TextMessageTransform
Transform
set_translation
SFVec3f

AnimationScript
Script
hideText
SFBool

ROUTE
event to
(1)
HideTextTrigger
IntegerTrigger
set_boolean
SFBool
then
 
 
 
HideTextTrigger
IntegerTrigger
triggerValue
SFInt32

ROUTE
event to
(2)
TextVisibilitySwitch
Switch
whichChoice
SFInt32
AnimationScript
Script
revealText
SFBool

ROUTE
event to
(1)
RevealTextTrigger
IntegerTrigger
set_boolean
SFBool
then
 
 
 
RevealTextTrigger
IntegerTrigger
triggerValue
SFInt32

ROUTE
event to
(2)
TextVisibilitySwitch
Switch
whichChoice
SFInt32

line 131
Anchor
description='FlyingText Example' 
User-interaction hint for this node. 

Additional guidance on X3D animation can be found in the 10-Step Animation Design Process and Event Tracing hint sheets. Have fun with X3D! 😀

-->
<!-- Online at
https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/FlyingTextPrototypeIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Savage/Tools/Animation/FlyingTextPrototype.x3d -->

<!-- Color-coding legend: X3D terminology <X3dNode  DEF='idNamefield='value'/> matches XML terminology <XmlElement  DEF='idNameattribute='value'/>
(Light-blue background: event-based behavior node or statement) (Grey background inside box: inserted documentation) (Magenta background: X3D Extensibility)
    <ProtoDeclare name='ProtoName'> <field name='fieldName'/> </ProtoDeclare> -->

to top <!-- For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints. -->