X3D Model Documentation: ProjectileSliderBarPrototype.x3d

  1  <?xml version="1.0" encoding="UTF-8"?>
  2 
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
  3  <X3D profile='Immersive' version='3.0 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.0.xsd'>
  4       <head>
  5            <meta name='titlecontent='ProjectileSliderBarPrototype.x3d'/>
  6            <meta name='descriptioncontent='A generic slider bar prototype. Colors, size of the bar and name are changable.'/>
  7            <meta name='creatorcontent='Ozan APAYDIN'/>
  8            <meta name='createdcontent='1 December 2001'/>
  9            <meta name='modifiedcontent='20 October 2019'/>
 10            <meta name='identifiercontent='https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileSliderBarPrototype.x3d'/>
 11            <meta name='generatorcontent='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/>
 12            <meta name='licensecontent='../license.html'/>
 13       </head>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->

<!-- to top Index for DEF nodes: bar, BarColor, barTransform, currentValue, CurrentValueFinder, currentValueFont, currentValueText, currentValueTransform, HUDGroup, HudProx, HudTransform, pointer, PointerColor, pointerTransform, ShapeOrganizer, SliderName, sliderNameColor, sliderNameTransform, SliderShape, SliderTransform, SVPlaneSensor, valueColor

Index for Viewpoint node: Viewpoint_1

Index for ProtoDeclare definition: ProjectileSliderBar
-->
 14       <Scene>
 15            <WorldInfo title='ProjectileSliderBarPrototype.x3d'/>
 16            <ProtoDeclare name='ProjectileSliderBar'>
 17                 <ProtoInterface>
 18                      <field name='nametype='MFStringaccessType='initializeOnly'
                     appinfo='Name of the Slider Bar. It appears on the left side of the bar.'/>
 19                      <field name='lengthtype='SFFloatvalue='1accessType='initializeOnly'
                     appinfo='Length of the Slider bar. According to given value bar will arrange itself.'/>
 20                      <field name='widthtype='SFFloatvalue='1accessType='initializeOnly'
                     appinfo='Width of the Slider bar. According to given value bar will arrange itself.'/>
 21                      <field name='maxValuetype='SFFloatvalue='1accessType='initializeOnly'
                     appinfo='Max. value of Slider Bar.It can be assigned a positive or a negative value.'/>
 22                      <field name='minValuetype='SFFloatvalue='0accessType='initializeOnly'
                     appinfo='Min. value of Slider Bar. It can be assigned a positive or a negative value.'/>
 23                      <field name='barColortype='SFColorvalue='1 0 0accessType='initializeOnly'
                     appinfo='Color of Slider Bar.'/>
 24                      <field name='pointerColortype='SFColorvalue='1 1 0accessType='initializeOnly'
                     appinfo='Pointer Color of Slider Bar.'/>
 25                      <field name='nameColortype='SFColorvalue='1 0 1accessType='initializeOnly'
                     appinfo='Slider Bar Name Color.'/>
 26                      <field name='currentValueColortype='SFColorvalue='0.2 0.8 0.2accessType='initializeOnly'
                     appinfo='Color of Current Value text.'/>
 27                      <field name='currentValueInttype='SFInt32accessType='outputOnly'
                     appinfo='If the precision is 0 current Value will be output in this eventOut field as Integer else in currentValueFloat eventOut field as Float.'/>
 28                      <field name='currentValueFloattype='SFFloataccessType='outputOnly'
                     appinfo='If the precision is NOT 0 current Value will be output in this eventOut field as Float else in currentValueInt eventOut field as Integer.'/>
 29                      <field name='precisiontype='SFInt32value='2accessType='initializeOnly'
                     appinfo='Count of the numbers after Decimal Point. Example : If precision is 2 1.562777 -> 1.56'/>
 30                      <field name='translationtype='SFVec3faccessType='initializeOnly'
                     appinfo='Translation values of Slider Bar to define its location on the screen.'/>
 31                 </ProtoInterface>
 32                 <ProtoBody>
 33                      <Group DEF='HUDGroup'>
 34                           <Collision enabled='false'>
 35 
                              <!-- ROUTE information for HudProx node:  [from position_changed to HudTransform.set_translation ] [from orientation_changed to HudTransform.set_rotation ] [self-route from position_changed to center ] -->
                              <ProximitySensor DEF='HudProxsize='1000000 1000000 1000000'/>
 36 
                              <!-- ROUTE information for HudTransform node:  [from HudProx.position_changed to set_translation ] [from HudProx.orientation_changed to set_rotation ] -->
                              <Transform DEF='HudTransform'>
 37                                     <Transform translation='0 0 -0.2'>
 38                                          <Transform DEF='SliderTransform'>
 39                                               <IS>
 40                                                    <connect nodeField='translationprotoField='translation'/>
 41                                               </IS>
 42                                               <Group DEF='SliderShape'>
 43 
                                                  <!-- Transform barTransform is a DEF node that has 1 USE node: USE_1 -->
                                                  <Transform DEF='barTransform'>
 44                                                         <Shape>
 45                                                              <Appearance>
 46                                                                   <Material DEF='BarColordiffuseColor='0 0 1'>
 47                                                                        <IS>
 48                                                                             <connect nodeField='diffuseColorprotoField='barColor'/>
 49                                                                        </IS>
 50                                                                   </Material>
 51                                                              </Appearance>
 52                                                              <Box DEF='barsize='0.05 0.001 0.000001'/>
 53                                                         </Shape>
 54                                                    </Transform>
 55 
                                                  <!-- Transform pointerTransform is a DEF node that has 1 USE node: USE_1
                                                  <!-- ROUTE information for pointerTransform node:  [from SVPlaneSensor.translation_changed to set_translation ] -->
                                                  <Transform DEF='pointerTransform'>
 56                                                         <Shape>
 57                                                              <Appearance>
 58                                                                   <Material DEF='PointerColordiffuseColor='1 1 0'>
 59                                                                        <IS>
 60                                                                             <connect nodeField='diffuseColorprotoField='pointerColor'/>
 61                                                                        </IS>
 62                                                                   </Material>
 63                                                              </Appearance>
 64                                                              <Cone DEF='pointerbottomRadius='0.0025height='0.005'/>
 65                                                         </Shape>
 66 
                                                       <!-- PlaneSensor SVPlaneSensor is a DEF node that has 2 USE nodes: USE_1, USE_2
                                                       <!-- ROUTE information for SVPlaneSensor node:  [from translation_changed to pointerTransform.set_translation ] [from translation_changed to CurrentValueFinder.updateCurrentValue ] -->
                                                       <PlaneSensor DEF='SVPlaneSensormaxPosition='0.025 0minPosition='-0.025 0'/>
 67                                                    </Transform>
 68 
                                                  <!-- Transform sliderNameTransform is a DEF node that has 1 USE node: USE_1 -->
                                                  <Transform DEF='sliderNameTransform'>
 69                                                         <Shape>
 70                                                              <Text DEF='SliderName'>
 71                                                                   <IS>
 72                                                                        <connect nodeField='stringprotoField='name'/>
 73                                                                   </IS>
 74                                                                   <FontStyle justify='"END"size='0.0085style='BOLD'/>
 75                                                              </Text>
 76                                                              <Appearance>
 77                                                                   <Material DEF='sliderNameColor'>
 78                                                                        <IS>
 79                                                                             <connect nodeField='diffuseColorprotoField='nameColor'/>
 80                                                                        </IS>
 81                                                                   </Material>
 82                                                              </Appearance>
 83                                                         </Shape>
 84                                                    </Transform>
 85 
                                                  <!-- Transform currentValueTransform is a DEF node that has 1 USE node: USE_1 -->
                                                  <Transform DEF='currentValueTransform'>
 86                                                         <Shape DEF='currentValue'>
 87 
                                                            <!-- Text currentValueText is a DEF node that has 2 USE nodes: USE_1, USE_2 -->
                                                            <Text DEF='currentValueText'>
 88                                                                   <FontStyle DEF='currentValueFontjustify='"BEGIN" "MIDDLE"size='0.0085style='BOLD'/>
 89                                                              </Text>
 90                                                              <Appearance>
 91                                                                   <Material DEF='valueColor'>
 92                                                                        <IS>
 93                                                                             <connect nodeField='diffuseColorprotoField='currentValueColor'/>
 94                                                                        </IS>
 95                                                                   </Material>
 96                                                              </Appearance>
 97                                                         </Shape>
 98                                                    </Transform>
 99                                               </Group>
100                                          </Transform>
101                                     </Transform>
102                                </Transform>
103                           </Collision>
104                      </Group>
105                      <Script DEF='ShapeOrganizerdirectOutput='true'>
106                           <field name='Lengthtype='SFFloataccessType='initializeOnly'/>
107                           <field name='Widthtype='SFFloataccessType='initializeOnly'/>
108                           <field name='SliderNameTransformNodetype='SFNodeaccessType='initializeOnly'>
109                                <Transform USE='sliderNameTransform'/>
110                           </field>
111                           <field name='CurrentValueTransformNodetype='SFNodeaccessType='initializeOnly'>
112                                <Transform USE='currentValueTransform'/>
113                           </field>
114                           <field name='BarTransformNodetype='SFNodeaccessType='initializeOnly'>
115                                <Transform USE='barTransform'/>
116                           </field>
117                           <field name='PointerTransformNodetype='SFNodeaccessType='initializeOnly'>
118                                <Transform USE='pointerTransform'/>
119                           </field>
120                           <field name='CurrentValueTexttype='SFNodeaccessType='initializeOnly'>
121                                <Text USE='currentValueText'/>
122                           </field>
123                           <field name='SVPlaneSensorNodetype='SFNodeaccessType='initializeOnly'>
124                                <PlaneSensor USE='SVPlaneSensor'/>
125                           </field>
126                           <IS>
127                                <connect nodeField='LengthprotoField='length'/>
128                                <connect nodeField='WidthprotoField='width'/>
129                           </IS>
  <![CDATA[
          
ecmascript:
function initialize() {
      
   for(i = 0; i < 3; i++) { 
      BarTransformNode.scale[i] = 1;
      if(i == 2) {
         PointerTransformNode.scale[i] = 0.1; 
      }
      else {
         PointerTransformNode.scale[i] = 1;
      }
   } 
   setBarSize();
   setPointerSize();
   setCurrentValueTransform();
   setNameTransform();
}

function setBarSize() {
   BarTransformNode.scale[0] = Length * BarTransformNode.scale[0];
   BarTransformNode.scale[1] = Width * BarTransformNode.scale[1];
}

function setPointerSize() {
   PointerTransformNode.scale[0] = Width * PointerTransformNode.scale[0];
   PointerTransformNode.scale[1] = Width * PointerTransformNode.scale[1];
   SVPlaneSensorNode.minPosition[0] = Length * SVPlaneSensorNode.minPosition[0];
   SVPlaneSensorNode.maxPosition[0] = Length * SVPlaneSensorNode.maxPosition[0];
}

function setCurrentValueTransform() {
   CurrentValueTransformNode.translation[0] = (BarTransformNode.scale[0] * 0.05 / 2) + (BarTransformNode.scale[1] * 0.001 * 2);
}

function setNameTransform() {
   SliderNameTransformNode.translation[0] = -((BarTransformNode.scale[0] * 0.05 / 2) + (BarTransformNode.scale[1] * 0.001 * 2));
}

        
]]>
131                      </Script>
132 
                    <!-- ROUTE information for CurrentValueFinder node:  [from SVPlaneSensor.translation_changed to updateCurrentValue ] -->
                    <Script DEF='CurrentValueFinderdirectOutput='true'>
133                           <field name='SVPlaneSensorNodetype='SFNodeaccessType='initializeOnly'>
134                                <PlaneSensor USE='SVPlaneSensor'/>
135                           </field>
136                           <field name='MaxValuetype='SFFloataccessType='initializeOnly'/>
137                           <field name='MinValuetype='SFFloataccessType='initializeOnly'/>
138                           <field name='CurrentValueTextNodetype='SFNodeaccessType='initializeOnly'>
139                                <Text USE='currentValueText'/>
140                           </field>
141                           <field name='updateCurrentValuetype='SFVec3faccessType='inputOnly'/>
142                           <field name='CurrentValueInttype='SFInt32accessType='outputOnly'/>
143                           <field name='CurrentValueFloattype='SFFloataccessType='outputOnly'/>
144                           <field name='Precisiontype='SFInt32accessType='initializeOnly'/>
145                           <IS>
146                                <connect nodeField='MaxValueprotoField='maxValue'/>
147                                <connect nodeField='MinValueprotoField='minValue'/>
148                                <connect nodeField='CurrentValueIntprotoField='currentValueInt'/>
149                                <connect nodeField='CurrentValueFloatprotoField='currentValueFloat'/>
150                                <connect nodeField='PrecisionprotoField='precision'/>
151                           </IS>
  <![CDATA[
          
ecmascript:

var totalLength;

function initialize() {
   realValue = (MaxValue + MinValue) / 2;
   realValue = roundOff(realValue, Precision);
   CurrentValueFloat = realValue;
   CurrentValueInt = Math.round(realValue);
   totalLength = SVPlaneSensorNode.maxPosition[0] - SVPlaneSensorNode.minPosition[0];
   updateCurrentValueText(realValue.toString()); 
}

//Map pointer translation value to the real value
function updateCurrentValue(translation, timeEvent) {
   var displayString;
   var curPositionOnBar = translation[0] + totalLength / 2;
   var x = (MaxValue - MinValue) * curPositionOnBar / totalLength;
   
   var realValue = MinValue + x;

   if(Precision == 0) { //If 
      CurrentValueInt = Math.round(realValue);
      displayString = CurrentValueInt.toString();
   }
   else {
      CurrentValueFloat = roundOff(realValue, Precision);       
      displayString = CurrentValueFloat.toString();
   } 
      
   updateCurrentValueText(displayString);
}


function updateCurrentValueText(dispStr) {
   CurrentValueTextNode.string[0] = dispStr;
}

//A function to round the values regarding to given precision.
function roundOff(value, precision) {

   var result;
   var isNegative = false;
   var wholeInt = Math.round(value * Math.pow(10, precision));
 
   //Negative numbers creates exceptional condition, therefor they are converted
   //to positive values.
   if(wholeInt < 0) {
      wholeInt = -wholeInt;
      isNegative = true;
   }

   var whole = wholeInt.toString();
   
   var decPoint = whole.length - precision;
   
   //Exception when precision is bigger than the string length   
   if(decPoint < 0) {
      i = -decPoint;
      for(i; i > 0; i--) {  
         whole ='0' + whole;
      }

      //Calculate decPoint according to new string expanded with 0s      
      decPoint = whole.length - precision;
   }

   if(whole !='0') {
      //Put the decimal point on the appropriate place
      result = whole.substring(0, decPoint);
      result +='.';
      result += whole.substring(decPoint, whole.length);
   }
   else { //If the string is'0', then result is'0'
      result = whole;
   }
   
   //Negative numbers are altered.
   if(isNegative) {
      result ='-' + result;
   }
   //Convert the String value to Float.
   resultFloat = parseFloat(result); 
  
  
   return resultFloat;
  
}

        
]]>
153                      </Script>
154                      < ROUTE  fromNode='HudProx' fromField='position_changed' toNode='HudTransform' toField='set_translation'/>
155                      < ROUTE  fromNode='HudProx' fromField='orientation_changed' toNode='HudTransform' toField='set_rotation'/>
156                      < ROUTE  fromNode='HudProx' fromField='position_changed' toNode='HudProx' toField='center'/>
157                      < ROUTE  fromNode='SVPlaneSensor' fromField='translation_changed' toNode='pointerTransform' toField='set_translation'/>
158                      < ROUTE  fromNode='SVPlaneSensor' fromField='translation_changed' toNode='CurrentValueFinder' toField='updateCurrentValue'/>
159                 </ProtoBody>
160            </ProtoDeclare>
161            <Viewpoint description='Slider barposition='0 0 5'/>
162            <ProtoInstance name='ProjectileSliderBar'>
163                 <fieldValue name='namevalue='"AFAA"'/>
164                 <fieldValue name='lengthvalue='1.5'/>
165                 <fieldValue name='widthvalue='1'/>
166                 <fieldValue name='maxValuevalue='10'/>
167                 <fieldValue name='minValuevalue='-2'/>
168            </ProtoInstance>
169       </Scene>
170  </X3D>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->

<!-- to top Index for DEF nodes: bar, BarColor, barTransform, currentValue, CurrentValueFinder, currentValueFont, currentValueText, currentValueTransform, HUDGroup, HudProx, HudTransform, pointer, PointerColor, pointerTransform, ShapeOrganizer, SliderName, sliderNameColor, sliderNameTransform, SliderShape, SliderTransform, SVPlaneSensor, valueColor

Index for Viewpoint node: Viewpoint_1

Index for ProtoDeclare definition: ProjectileSliderBar
-->
X3D Tooltips element index: Appearance, Box, Collision, Cone, connect, field, fieldValue, FontStyle, Group, head, IS, Material, meta, PlaneSensor, ProtoBody, ProtoDeclare, ProtoInstance, ProtoInterface, ProximitySensor, ROUTE, Scene, Script, Shape, Text, Transform, Viewpoint, WorldInfo, X3D, accessType and type, XML data types, field types

Event Graph ROUTE Table entries with 5 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.

      CurrentValueFinder
Script
No ROUTE connection found for output events from this node.
Contains SFNode fields with direct access to another node. 

ShapeOrganizer
Script
No ROUTE connection found for output events from this node.
Contains SFNode fields with direct access to another node. 

HudProx
ProximitySensor
position_changed
SFVec3f

ROUTE
event to
(1)
HudTransform
Transform
set_translation
SFVec3f
HudProx
ProximitySensor
orientation_changed
SFRotation

ROUTE
event to
(1)
HudTransform
Transform
set_rotation
SFRotation


ProtoInstance
ProjectileSliderBar
No ROUTE connection found for output events from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declarations with
direct access to other nodes, and thus has potential to produce run-time animation. 

SVPlaneSensor
PlaneSensor
translation_changed
SFVec3f

ROUTE
event to
(1)
pointerTransform
Transform
set_translation
SFVec3f
SVPlaneSensor
PlaneSensor
translation_changed
SFVec3f

ROUTE
event to
(1)
CurrentValueFinder
Script
updateCurrentValue
SFVec3f
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/Basic/StudentProjects/ProjectileSliderBarPrototypeIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileSliderBarPrototype.x3d -->

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

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