{ "X3D": {
    "encoding":"UTF-8",
    "@profile":"Immersive",
    "@version":"3.0",
    "@xsd:noNamespaceSchemaLocation":"https://www.web3d.org/specifications/x3d-3.0.xsd",
    "JSON schema":"https://www.web3d.org/specifications/x3d-4.0-JSONSchema.autogenerated.json",
    "head": {
        "meta": [
          {
            "@name":"title",
            "@content":"AcousticTransmissionCylinderPrototype.x3d"
          },
          {
            "@name":"description",
            "@content":"An acoustic transmission cylinder has a moving inner radius and a constant (maximum) outer radius, visualizing the pulse width of cylindrical propagation."
          },
          {
            "@name":"creator",
            "@content":"Don Brutzman and Oliver Tan"
          },
          {
            "@name":"created",
            "@content":"11 May 2004"
          },
          {
            "@name":"modified",
            "@content":"20 October 2019"
          },
          {
            "@name":"subject",
            "@content":"Acoustic transmission"
          },
          {
            "@name":"identifier",
            "@content":"https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderPrototype.x3d"
          },
          {
            "@name":"generator",
            "@content":"X3D-Edit 3.2, https://www.web3d.org/x3d/tools/X3D-Edit"
          },
          {
            "@name":"license",
            "@content":"../../license.html"
          },
          {
            "@name":"translated",
            "@content":"21 April 2026"
          },
          {
            "@name":"generator",
            "@content":"X3dToJson.xslt, https://www.web3d.org/x3d/stylesheets/X3dToJson.html"
          },
          {
            "@name":"reference",
            "@content":"X3D JSON encoding: https://www.web3d.org/wiki/index.php/X3D_JSON_Encoding"
          }
        ]
    },
    "Scene": {
        "-children":[
          { "ProtoDeclare":
            {
              "@name":"AcousticTransmissionCylinder",
              "@appinfo":"AcousticTransmissionCylinder visualizes the pulse width of cylindrical propagation with has a receding inner radius and a (maximum outer radius .",
              "ProtoInterface": {
                  "field": [
                    {
                      "@name":"startTransmission",
                      "@accessType":"inputOnly",
                      "@appinfo":"Upon receipt of a boolean true event start a single (not continuous) transmission",
                      "@type":"SFBool"
                    },
                    {
                      "@name":"startContinuousTransmissions",
                      "@accessType":"inputOnly",
                      "@appinfo":"Upon receipt of a boolean true event start continuous transmissions",
                      "@type":"SFBool"
                    },
                    {
                      "@name":"set_range",
                      "@accessType":"inputOnly",
                      "@appinfo":"Propagation range in meters",
                      "@type":"SFFloat"
                    },
                    {
                      "@name":"defaultRange",
                      "@accessType":"initializeOnly",
                      "@appinfo":"Default propagation range in meters",
                      "@type":"SFFloat",
                      "@value":2
                    },
                    {
                      "@name":"transmissionPropagationSpeed",
                      "@accessType":"initializeOnly",
                      "@appinfo":"Speed in meters / second",
                      "@type":"SFFloat",
                      "@value":1500
                    },
                    {
                      "@name":"set_transmissionDuration",
                      "@accessType":"inputOnly",
                      "@appinfo":"Duration in seconds",
                      "@type":"SFFloat"
                    },
                    {
                      "@name":"transmissionDuration",
                      "@accessType":"initializeOnly",
                      "@appinfo":"Duration in seconds",
                      "@type":"SFFloat",
                      "@value":5
                    },
                    {
                      "@name":"set_beamCount",
                      "@accessType":"inputOnly",
                      "@appinfo":"Number of segmented sections in 360-degree cylindrical beam",
                      "@type":"SFInt32"
                    },
                    {
                      "@name":"beamCount",
                      "@accessType":"initializeOnly",
                      "@appinfo":"number of segmented sections in 360-degree cylindrical beam",
                      "@type":"SFInt32",
                      "@value":0
                    },
                    {
                      "@name":"height",
                      "@accessType":"initializeOnly",
                      "@appinfo":"Height of cylinder in meters",
                      "@type":"SFFloat",
                      "@value":2
                    },
                    {
                      "@name":"set_color",
                      "@accessType":"inputOnly",
                      "@appinfo":"Color of cylinder",
                      "@type":"SFColor"
                    },
                    {
                      "@name":"color",
                      "@accessType":"initializeOnly",
                      "@appinfo":"Default color of cylinder",
                      "@type":"SFColor",
                      "@value":[1,1,0.2]
                    },
                    {
                      "@name":"traceEnabled",
                      "@accessType":"initializeOnly",
                      "@type":"SFBool",
                      "@value":false
                    }
                  ]
              },
              "ProtoBody": {
                  "-children":[
                    { "Group":
                      {
                        "-children":[
                          { "Shape":
                            {
                              "-geometry":
                                { "Extrusion":
                                  {
                                    "@DEF":"TransmissionProfile",
                                    "@beginCap":false,
                                    "@convex":false,
                                    "@creaseAngle":3.14,
                                    "@endCap":false
                                  }
                                },
                              "-appearance":
                                { "Appearance":
                                  {
                                    "-material":
                                      { "Material":
                                        {
                                          "@DEF":"TransmissionProfileMaterial"
                                        }
                                      }
                                  }
                                }
                            }
                          },
                          { "TimeSensor":
                            {
                              "@DEF":"AnimationClock"
                            }
                          },
                          { "TimeSensor":
                            {
                              "@DEF":"RestartClock"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"cycleTime",
                              "@fromNode":"RestartClock",
                              "@toField":"set_startTime",
                              "@toNode":"AnimationClock"
                            }
                          },
                          { "Script":
                            {
                              "@DEF":"TransmissionPropagationScript",
                              "@directOutput":true,
                              "field": [
                                {
                                  "@name":"startTransmission",
                                  "@accessType":"inputOnly",
                                  "@type":"SFBool"
                                },
                                {
                                  "@name":"startContinuousTransmissions",
                                  "@accessType":"inputOnly",
                                  "@type":"SFBool"
                                },
                                {
                                  "@name":"set_range",
                                  "@accessType":"inputOnly",
                                  "@type":"SFFloat"
                                },
                                {
                                  "@name":"defaultRange",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFFloat"
                                },
                                {
                                  "@name":"transmissionPropagationSpeed",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFFloat"
                                },
                                {
                                  "@name":"set_transmissionDuration",
                                  "@accessType":"inputOnly",
                                  "@appinfo":"Duration in seconds",
                                  "@type":"SFFloat"
                                },
                                {
                                  "@name":"transmissionDuration",
                                  "@accessType":"initializeOnly",
                                  "@appinfo":"Duration in seconds",
                                  "@type":"SFFloat"
                                },
                                {
                                  "@name":"outerRadius",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFFloat",
                                  "@value":0
                                },
                                {
                                  "@name":"innerRadius",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFFloat",
                                  "@value":0
                                },
                                {
                                  "@name":"height",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFFloat"
                                },
                                {
                                  "@name":"set_fraction",
                                  "@accessType":"inputOnly",
                                  "@type":"SFFloat"
                                },
                                {
                                  "@name":"animationDuration",
                                  "@accessType":"outputOnly",
                                  "@type":"SFTime"
                                },
                                {
                                  "@name":"restartClockDuration",
                                  "@accessType":"outputOnly",
                                  "@type":"SFTime"
                                },
                                {
                                  "@name":"loopAnimation",
                                  "@accessType":"outputOnly",
                                  "@type":"SFBool"
                                },
                                {
                                  "@name":"position",
                                  "@accessType":"initializeOnly",
                                  "@type":"MFVec2f",
                                  "-children":[
                                    {
                                      "#comment":"no initialization value, use default"
                                    }
                                  ]
                                },
                                {
                                  "@name":"set_beamCount",
                                  "@accessType":"inputOnly",
                                  "@appinfo":"Number of segmented sections in 360-degree cylindrical beam",
                                  "@type":"SFInt32"
                                },
                                {
                                  "@name":"beamCount",
                                  "@accessType":"initializeOnly",
                                  "@appinfo":"number of segmented sections in 360-degree cylindrical beam",
                                  "@type":"SFInt32"
                                },
                                {
                                  "@name":"newSpine",
                                  "@accessType":"initializeOnly",
                                  "@appinfo":"holding variable for intermediate computations",
                                  "@type":"MFVec3f"
                                },
                                {
                                  "@name":"spine",
                                  "@accessType":"initializeOnly",
                                  "@appinfo":"horizontal circular spine along central perimeter of rectangular transmission boundaries for each beam",
                                  "@type":"MFVec3f",
                                  "@value":[1.00,0.00,0.00,0.92,0.00,-0.38,0.71,0.00,-0.71,0.38,0.00,-0.92,0.00,0.00,-1.00,-0.38,0.00,-0.92,-0.71,0.00,-0.71,-0.92,0.00,-0.38,-1.00,0.00,-0.00,-0.92,0.00,0.38,-0.71,0.00,0.71,-0.38,0.00,0.92,0.00,0.00,1.00,0.38,0.00,0.92,0.71,0.00,0.71,0.92,0.00,0.38,1.00,0.00,0.00]
                                },
                                {
                                  "@name":"crossSection",
                                  "@accessType":"initializeOnly",
                                  "@appinfo":"vertical rectangular outline from inner radius to outer radius",
                                  "@type":"MFVec2f",
                                  "-children":[
                                    {
                                      "#comment":"no initialization value, use default"
                                    }
                                  ]
                                },
                                {
                                  "@name":"set_color",
                                  "@accessType":"inputOnly",
                                  "@type":"SFColor"
                                },
                                {
                                  "@name":"color",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFColor"
                                },
                                {
                                  "@name":"transparency",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFFloat",
                                  "@value":0
                                },
                                {
                                  "@name":"animationStartTime",
                                  "@accessType":"outputOnly",
                                  "@type":"SFTime"
                                },
                                {
                                  "@name":"loopStartTime",
                                  "@accessType":"outputOnly",
                                  "@type":"SFTime"
                                },
                                {
                                  "@name":"crossSection_changed",
                                  "@accessType":"outputOnly",
                                  "@type":"MFVec2f"
                                },
                                {
                                  "@name":"spine_changed",
                                  "@accessType":"outputOnly",
                                  "@type":"MFVec3f"
                                },
                                {
                                  "@name":"transparency_changed",
                                  "@accessType":"outputOnly",
                                  "@type":"SFFloat"
                                },
                                {
                                  "@name":"signalProfileMaterial",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFNode",
                                  "-children":[
                                    { "Material":
                                      {
                                        "@USE":"TransmissionProfileMaterial"
                                      }
                                    }
                                  ]
                                },
                                {
                                  "@name":"traceEnabled",
                                  "@accessType":"initializeOnly",
                                  "@type":"SFBool"
                                }
                              ],
                              "IS": {
                                  "connect": [
                                    {
                                      "@nodeField":"startTransmission",
                                      "@protoField":"startTransmission"
                                    },
                                    {
                                      "@nodeField":"startContinuousTransmissions",
                                      "@protoField":"startContinuousTransmissions"
                                    },
                                    {
                                      "@nodeField":"set_range",
                                      "@protoField":"set_range"
                                    },
                                    {
                                      "@nodeField":"defaultRange",
                                      "@protoField":"defaultRange"
                                    },
                                    {
                                      "@nodeField":"transmissionPropagationSpeed",
                                      "@protoField":"transmissionPropagationSpeed"
                                    },
                                    {
                                      "@nodeField":"set_transmissionDuration",
                                      "@protoField":"set_transmissionDuration"
                                    },
                                    {
                                      "@nodeField":"transmissionDuration",
                                      "@protoField":"transmissionDuration"
                                    },
                                    {
                                      "@nodeField":"set_beamCount",
                                      "@protoField":"set_beamCount"
                                    },
                                    {
                                      "@nodeField":"beamCount",
                                      "@protoField":"beamCount"
                                    },
                                    {
                                      "@nodeField":"height",
                                      "@protoField":"height"
                                    },
                                    {
                                      "@nodeField":"set_color",
                                      "@protoField":"set_color"
                                    },
                                    {
                                      "@nodeField":"color",
                                      "@protoField":"color"
                                    },
                                    {
                                      "@nodeField":"traceEnabled",
                                      "@protoField":"traceEnabled"
                                    }
                                  ]
                              },
                              "#sourceCode":[
"",
"",
"ecmascript:",
"",
"function initialize()",
"{",
"\touterRadius = -1.0;",
"\tinnerRadius = -1.0;",
"",
"\tanimationDuration = defaultRange / transmissionPropagationSpeed + transmissionDuration;",
"",
"\ttracePrint('beamCount = ' + beamCount);",
"\ttracePrint('defaultRange = ' + defaultRange);",
"\ttracePrint('animationDuration=' + animationDuration);",
"\ttracePrint('transmissionPropagationSpeed=' + transmissionPropagationSpeed);",
"",
"\tcomputeSpine(beamCount);",
"",
"    updateCrossSection(0);",
"",
"\tupdateExtrusionShape(crossSection, spine, color);",
"}",
"function updateRadii(fraction)",
"{",
"\t_transmissionPropagationDuration = defaultRange / transmissionPropagationSpeed;",
"\t_animationDuration = _transmissionPropagationDuration + transmissionDuration;",
"\t_spineRadius = 1;",
"\t",
"\touterRadius = fraction * _animationDuration * transmissionPropagationSpeed - _spineRadius;",
"",
"\tif (outerRadius > (defaultRange - _spineRadius)) {",
"\t\touterRadius = defaultRange - _spineRadius;",
"\t}",
"",
"\tif ((fraction * _animationDuration) > (_transmissionPropagationDuration + transmissionDuration * 7/8)) ",
"\t{",
"\t\ttransparency_changed = ( (fraction * _animationDuration) - (_transmissionPropagationDuration + transmissionDuration * 7/8) ) / (transmissionDuration * 1/8);",
"\t}",
"",
"\tif ((fraction * _animationDuration) <= transmissionDuration)",
"\t{",
"\t\tinnerRadius = -_spineRadius;",
"\t} else {",
"\t\tinnerRadius = ((fraction * _animationDuration) - transmissionDuration) * transmissionPropagationSpeed - _spineRadius;",
"\t\tif (innerRadius > defaultRange) {",
"\t\t\tinnerRadius = defaultRange;",
"\t\t}",
"\t}",
"",
"\ttracePrint('fraction = ' + fraction);",
"\ttracePrint('outerRadius = ' + outerRadius);",
"\ttracePrint('innerRadius = ' + innerRadius);",
"}",
"function set_beamCount (beamCount)",
"{",
"    alwaysPrint('set_beamCount(' + beamCount + '), beam spacing=' + (360/beamCount) + ' degrees');",
"    computeSpine(beamCount);",
"}",
"function computeSpine (beamCount)",
"{",
"\tif (beamCount < 3)",
"    {",
"        alwaysPrint('** insufficient beamCount=' + beamCount + ', ignored, spine not recomputed');",
"        return;",
"    }",
"    newSpine = new MFVec3f ();",
"    for (index = 0; index <= beamCount; index++)",
"\t{",
"\t\tangle = 2.0 * Math.PI * index / beamCount;",
"        newSpine[index] = new SFVec3f (Math.sin(angle), 0.0, Math.cos(angle));",
"\t}",
"    newSpine[beamCount] = newSpine[0]; // ensure beginning point matches end point",
"    spine = newSpine;",
"\ttracePrint('spine.length=' + spine.length + ', spine=' + spine);",
"}",
"function updateCrossSection(fraction)",
"{",
"\tupdateRadii(fraction);",
"",
"\t_spineRadius = 1;",
"\t_outerHeight = Math.abs((outerRadius + _spineRadius) * Math.tan(Math.PI/6));",
"",
"\tif (_outerHeight > height)",
"\t{",
"\t\t_outerHeight = height;",
"\t}",
"",
"\t_innerHeight = Math.abs((innerRadius + _spineRadius) * Math.tan(Math.PI/6));",
"",
"\tif (_innerHeight > height)",
"\t{",
"\t\t_innerHeight = height;",
"\t}",
"",
"\tindex = 0;",
"\tposition[index]     = new SFVec2f(outerRadius, _outerHeight/2);",
"\tcrossSection[index] = new SFVec2f(position[index].x, position[index].y);",
"\tindex++;",
"\t",
"\tposition[index]     = new SFVec2f(innerRadius, _innerHeight/2);",
"\tcrossSection[index] = new SFVec2f(position[index].x, position[index].y);",
"\tindex++;",
"",
"\tposition[index]     = new SFVec2f(innerRadius, -_innerHeight/2);",
"\tcrossSection[index] = new SFVec2f(position[index].x, position[index].y);",
"\tindex++;",
"",
"\tposition[index]     = new SFVec2f(outerRadius, -_outerHeight/2);",
"\tcrossSection[index] = new SFVec2f(position[index].x, position[index].y);",
"\tindex++;",
"",
"\tposition[index]     = new SFVec2f(outerRadius, _outerHeight/2);",
"\tcrossSection[index] = new SFVec2f(position[index].x, position[index].y);",
"\t",
"\ttracePrint('position     = ' + position);",
"\ttracePrint('crossSection = ' + crossSection);",
"}",
"function startTransmission(value, timeStamp)",
"{",
"\tif (value == true)",
"\t{",
"\t\tloopAnimation = false;",
"\t\tloopStartTime = -1;",
"\t\tanimationStartTime = timeStamp;",
"\t\ttracePrint('startTransmission ()');",
"\t}",
"}",
"function startContinuousTransmissions(value, timeStamp)",
"{",
"\tif (value == true)",
"\t{",
"\t\tloopAnimation = true;",
"\t\tloopStartTime = timeStamp;",
"\t\tanimationStartTime = timeStamp;",
"\t\ttracePrint('startContinuousTransmissions ()');",
"\t}",
"}",
"function set_range(value, timeStamp)",
"{",
"\tif (value >= 0)",
"\t{",
"\t\tdefaultRange = value;",
"\t\ttracePrint('defaultRange = ' + defaultRange);",
"\t}",
"\telse tracePrint('set_range (' + value + '); // no response, negative');",
"}",
"function set_color(value, timeStamp)",
"{",
"\tcolor = value;",
"\ttracePrint('color = ' + color);",
"}",
"function set_transmissionDuration(value, timeStamp)",
"{",
"\tif (value >= 0) ",
"\t{",
"\t\ttransmissionDuration = value;",
"\t\tanimationDuration = defaultRange / transmissionPropagationSpeed + transmissionDuration;",
"\t\trestartClockDuration = 2 * animationDuration;",
"\t\ttracePrint('transmissionDuration = ' + transmissionDuration);",
"\t\ttracePrint('animationDuration    = ' + animationDuration);",
"\t\ttracePrint('restartClockDuration = ' + restartClockDuration);",
"\t}",
"\telse tracePrint('set_transmissionDuration (' + value + '); // no response, negative');",
"}",
"function set_fraction(value, timeStamp)",
"{",
"\tupdateCrossSection(value);",
"",
"\tupdateExtrusionShape(crossSection, spine, color);",
"}",
"function updateExtrusionShape(crossSection, spine, color)",
"{",
"\t// emissiveColor appears unaffected by transparency, unfortunately",
"\tsignalProfileMaterial.diffuseColor = color;",
"\tsignalProfileMaterial.transparency = transparency;",
"",
"\ttracePrint('Updating crossSection:');",
"\ttracePrint('  crossSection = ' + crossSection);",
"\ttracePrint('  spine = ' + spine);",
"\ttracePrint('  transparency = ' + transparency);",
"",
"\tcrossSection_changed = crossSection;",
"\tspine_changed = spine;",
"}",
"function tracePrint(value)",
"{",
"  if (traceEnabled) alwaysPrint (value);",
"}",
"function alwaysPrint(value)",
"{",
"\tBrowser.println ('[AcousticTransmissionCylinderPrototype] ' + value);",
"}",
"",
""
]
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"fraction_changed",
                              "@fromNode":"AnimationClock",
                              "@toField":"set_fraction",
                              "@toNode":"TransmissionPropagationScript"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"crossSection_changed",
                              "@fromNode":"TransmissionPropagationScript",
                              "@toField":"set_crossSection",
                              "@toNode":"TransmissionProfile"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"spine_changed",
                              "@fromNode":"TransmissionPropagationScript",
                              "@toField":"set_spine",
                              "@toNode":"TransmissionProfile"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"transparency_changed",
                              "@fromNode":"TransmissionPropagationScript",
                              "@toField":"transparency",
                              "@toNode":"TransmissionProfileMaterial"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"animationDuration",
                              "@fromNode":"TransmissionPropagationScript",
                              "@toField":"set_cycleInterval",
                              "@toNode":"AnimationClock"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"restartClockDuration",
                              "@fromNode":"TransmissionPropagationScript",
                              "@toField":"set_cycleInterval",
                              "@toNode":"RestartClock"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"loopAnimation",
                              "@fromNode":"TransmissionPropagationScript",
                              "@toField":"loop",
                              "@toNode":"RestartClock"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"animationStartTime",
                              "@fromNode":"TransmissionPropagationScript",
                              "@toField":"set_startTime",
                              "@toNode":"AnimationClock"
                            }
                          },
                          { "ROUTE":
                            {
                              "@fromField":"loopStartTime",
                              "@fromNode":"TransmissionPropagationScript",
                              "@toField":"set_startTime",
                              "@toNode":"RestartClock"
                            }
                          }
                        ]
                      }
                    }
                  ]
              }
            }
          },
          {
            "#comment":"Viewable geometry for this scene is anchored text that links to an example showing ExternProtoDeclare usage of AcousticTransmissionCylinder"
          },
          { "WorldInfo":
            {
              "@info":["Produce acoustic transmission cylinders"],
              "@title":"AcousticTransmissionCylinderPrototype"
            }
          },
          { "Viewpoint":
            {
              "@description":"Acoustic Transmission Cylinder",
              "@position":[0,0,15]
            }
          },
          { "Anchor":
            {
              "@description":"Acoustic Transmission Cylinder Example",
              "@url":["AcousticTransmissionCylinderExample.x3d","../../CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderExample.x3d","https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderExample.x3d","AcousticTransmissionCylinderExample.wrl","../../CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderExample.wrl","https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderExample.wrl"],
              "-children":[
                { "Shape":
                  {
                    "-appearance":
                      { "Appearance":
                        {
                          "-material":
                            { "Material":
                              {
                                "@diffuseColor":[0,1,1],
                                "@emissiveColor":[0,1,1]
                              }
                            }
                        }
                      },
                    "-geometry":
                      { "Text":
                        {
                          "@string":["AcousticTransmissionCylinderPrototype","is a Prototype definition file","To see an example scene","click this text and view","AcousticTransmissionCylinderExample"],
                          "-fontStyle":
                            { "FontStyle":
                              {
                                "@justify":["MIDDLE","MIDDLE"]
                              }
                            }
                        }
                      }
                  }
                }
              ]
            }
          }
        ]
    }
  }
}