<?xml version="1.0" encoding="UTF-8"?>
<X3D profile="Immersive"  version="3.1">
  <Transform>
    <MetadataSet name='Template'>
      <MetadataString containerField='value' name='TemplateID' value='"TextEffectScrollTemplate"'/>
      <MetadataInteger containerField='value' name='TemplateKind' value='3'/>
      <MetadataString containerField='value' name='TimeDependentNode' value='""'/>
    </MetadataSet>

    <!--OUT properties -->
    <Transform>
      <MetadataSet DEF='OutSockets'>
        <MetadataSet containerField='value' name='OutSocket'>
          <MetadataString containerField='value' name='socketName' value='"textTransform"'/>
          <MetadataFloat containerField='value' name='socketCompatibilitySet' value='1.0'/>
          <MetadataString containerField='value' name='socketParentDEF' value='"TextTransform"'/>
          <MetadataString containerField='value' name='socketChildNodeDEF' value='"TextEffectTransform"'/>
          <MetadataString containerField='value' name='socketConnectToExtent' value='"current"'/>
        </MetadataSet>
      </MetadataSet>
    </Transform>

    <!--IN sockets -->
    <Transform>
      <MetadataSet DEF='InSockets'>
        <MetadataSet containerField='value' name='InSocket'>
          <MetadataString containerField='value' name='socketName' value='"EffectTimer"'/>
          <MetadataFloat containerField='value' name='socketCompatibilitySet' value='1.0'/>
          <MetadataString containerField='value' name='socketParentDEF' value='"TextScrollInterpolator"'/>
          <MetadataString containerField='value' name='socketConnectAttribute' value='"set_fraction"'/>
        </MetadataSet>
      </MetadataSet>
    </Transform>

    <!--Socket Nodes scratch pad (only nodes with def's are injected)-->

    <Transform DEF='TextEffectTransform'>
      <Transform DEF='TextEffectInnerTransform'>
        <Shape DEF='TextEffectShape'>
          <Appearance DEF='TextEffectAppearance'>
            <Material DEF='TextEffectMaterial' transparency ='0' ambientIntensity='0.200' shininess='0.200' diffuseColor='1 0 0'>
              <MetadataSet name='BPSet'>
                <MetadataString containerField='value' name='color' value='"diffuseColor"'/>
                <MetadataString containerField='value' name='transparency' value='"transparency"'/>
                <MetadataString containerField='value' name='automatic' value='"false"' reference='Custom'/>
              </MetadataSet>
            </Material>

          </Appearance>

          <Text DEF='TextEffectText' containerField='geometry' string='""'>
            <MetadataSet name='BPSet'>
              <MetadataString containerField='value' name='string' value='"string"'/>
              <MetadataString containerField='value' name='length' value='"length"' />
              <MetadataString containerField='value' name='maxExtent' value='"maxExtent"'/>
            </MetadataSet>
            <FontStyle DEF='TextEffectFontStyle' containerField='fontStyle' family='"Arial" "Trebuchet"'
                horizontal='true' justify='"MIDDLE" "END"' language='""' size='1.000'
                spacing='1.1' style='PLAIN' topToBottom='true'>
              <MetadataSet name='BPSet'>
                <MetadataString containerField='value' name='family' value='"family"'/>
                <MetadataString containerField='value' name='horizontal' value='"horizontal"'/>
                <MetadataString containerField='value' name='size' value='"size"'/>
                <MetadataString containerField='value' name='style' value='"style"'/>
                <MetadataString containerField='value' name='justify' value='"justify"'/>
              </MetadataSet>
            </FontStyle>
          </Text>
        </Shape>
      </Transform>
      <MathVector DEF='TextMathTransform'>
        <MetadataSet name='BPSet'>
          <MetadataString containerField='value' name='position' value='"Vec3"'/>
        </MetadataSet>
      </MathVector>
    </Transform>

    <!--All nodes in this set are injected-->

    <Transform DEF='InjectSet'>
      <ScalarInterpolator DEF='TextScrollInterpolator' key='0 1' keyValue='0 1'/>
      <PositionInterpolator DEF='TextScrollPositionInterpolator' key='0 1' keyValue='0 -3 0, 0 0 0'/>
      <ROUTE fromNode='TextScrollInterpolator' fromField='value_changed' toNode='TextScrollPositionInterpolator' toField='set_fraction'/>
      <ROUTE fromNode="TextScrollPositionInterpolator" fromField="value_changed" toNode="TextEffectTransform" toField="translation" />

      <!-- Translate by the user-selected X position, but ignore Y -->
      <ROUTE fromNode='TextMathTransform' fromField='ComponentX' toNode='TextInnerTransformInterpolator' toField='set_fraction'/>     <!-- Extract the X component -->
      <PositionInterpolator DEF='TextInnerTransformInterpolator' key='-10 10' keyValue='-10 0 0.025, 10 0 0.025'/>
      <ROUTE fromNode="TextInnerTransformInterpolator" fromField="value_changed" toNode="TextEffectInnerTransform" toField="translation" />

      <!-- Vertical scroll -->
      <MathVector DEF='TextMathNode'/>
      <ROUTE fromNode='TextEffectText' fromField='TextBounds' toNode='TextMathNode' toField='Vec2'/>  <!-- Get the size of the text object -->
      <MathScalar DEF='MathNegAdd3' Multiplier='-1' Addend='3' />
      <ROUTE fromNode='TextMathNode' fromField='ComponentY' toNode='MathNegAdd3' toField='Operand'/> <!-- Extract the Y component, negate and add 3 -->
      <ROUTE fromNode='MathNegAdd3' fromField='ProdSum' toNode='TextScrollTopPositionInterpolator' toField='set_fraction'/>
      <PositionInterpolator DEF='TextScrollTopPositionInterpolator' key='-100 100' keyValue='0 -100 0, 0 100 0'/>   <!-- convert Y into Vec3f(0, Y, 0) -->
      <ROUTE fromNode='TextScrollTopPositionInterpolator' fromField='value_changed' toNode='TextScrollPositionInterpolator' toField='keyValue' toIndex='1'/> 

    </Transform>

  </Transform>
  </X3D>
