<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "https://www.web3d.org/specifications/x3d-4.0.dtd">
<X3D profile='Immersive' version='4.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-4.0.xsd'>
  <head>
    <meta content='RefractiveMaterial.x3d' name='title'/>
    <meta content='X3D encodings example: create new node RefractiveMaterial for example PrototypesPlus.' name='description'/>
    <meta content='Don Brutzman and Joe Williams' name='creator'/>
    <meta content='1 June 2002' name='created'/>
    <meta content='28 September 2025' name='modified'/>
    <meta content='PrototypesPlus.x3d' name='reference'/>
    <meta content='X3D encodings, ISO/IEC 19776-1.3, Part 1: XML encoding, Annex C.7 Prototypes and alternate representations' name='specificationSection'/>
    <meta content='https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19776-1v4.0-CD/Part01/examples.html#PrototyesAndAlternateReps' name='specificationUrl'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/RefractiveMaterial.x3d' name='identifier'/>
    <meta content='X3D-Edit 4.0, https://www.web3d.org/x3d/tools/X3D-Edit' name='generator'/>
    <meta content='../license.html' name='license'/>
  </head>
  <Scene>
    <!-- Protype definition for external use -->
    <WorldInfo title='RefractiveMaterial.x3d'/>
    <ProtoDeclare name='RefractiveMaterial'>
      <ProtoInterface>
        <field accessType='inputOutput' name='ambientIntensity' type='SFFloat' value='0'/>
        <field accessType='inputOutput' name='diffuseColor' type='SFColor' value='0.5 0.5 0.5'/>
        <field accessType='inputOutput' name='specularColor' type='SFColor' value='0 0 0'/>
        <field accessType='inputOutput' name='emissiveColor' type='SFColor' value='0 0 0'/>
        <field accessType='inputOutput' name='shininess' type='SFFloat' value='0'/>
        <field accessType='inputOutput' name='transparency' type='SFFloat' value='0'/>
        <field accessType='inputOutput' name='indexOfRefraction' type='SFFloat' value='0.1'/>
      </ProtoInterface>
      <ProtoBody>
        <Material DEF='RefractiveMaterialNode'>
          <IS>
            <connect nodeField='ambientIntensity' protoField='ambientIntensity'/>
            <connect nodeField='diffuseColor' protoField='diffuseColor'/>
            <connect nodeField='specularColor' protoField='specularColor'/>
            <connect nodeField='emissiveColor' protoField='emissiveColor'/>
            <connect nodeField='shininess' protoField='shininess'/>
            <connect nodeField='transparency' protoField='transparency'/>
          </IS>
        </Material>
        <!-- after first node in ProtoDeclare, remainder of nodes do not render -->
        <Script DEF='RefractionScript'>
          <field accessType='inputOutput' name='transparencyInitial' type='SFFloat'/>
          <field accessType='inputOutput' name='indexOfRefraction' type='SFFloat'/>
          <field accessType='outputOnly' name='transparency_changed' type='SFFloat'/>
          <IS>
            <connect nodeField='transparencyInitial' protoField='transparency'/>
            <connect nodeField='indexOfRefraction' protoField='indexOfRefraction'/>
          </IS>
          <![CDATA[
ecmascript:
function initialize()
{
    // arbitary example modification of usual node properties
    
    var newTransparency = 1.0 - ((1.0 - transparencyInitial) * indexOfRefraction);
    Browser.println ('indexOfRefraction=' + indexOfRefraction +
         ', transparencyInitial=' + transparencyInitial +
         ', transparency_changed=' + newTransparency);
    transparency_changed = newTransparency;
}

function set_transparencyInitial (eventValue)
{
   // input eventValue received for inputOutput field
    transparencyInitial = eventValue;
}

function set_indexOfRefraction (eventValue)
{
   // input eventValue received for inputOutput field
    indexOfRefraction = eventValue;
}
]]>
        </Script>
        <ROUTE fromField='transparency_changed' fromNode='RefractionScript' toField='transparency' toNode='RefractiveMaterialNode'/>
      </ProtoBody>
    </ProtoDeclare>
  </Scene>
</X3D>