<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.1//EN"   "http://www.web3d.org/specifications/x3d-3.1.dtd">
<X3D profile='Immersiveversion='3.1xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation=' http://www.web3d.org/specifications/x3d-3.1.xsd '>
<head>
<meta name='titlecontent='MaterialModulator.x3d'/>
<meta name='descriptioncontent='Mimic a Material node and modulate fields as an animation effect'/>
<meta name='creatorcontent='Don Brutzman'/>
<meta name='createdcontent='10 March 2008'/>
<meta name='modifiedcontent='3 August 2008'/>
<meta name='subjectcontent='X3D prototype requiring Script inputOutput fields'/>
<meta name='imagecontent='MaterialModulator.png'/>
<meta name='identifiercontent=' http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14-Prototypes/MaterialModulator.x3d '/>
<meta name='generatorcontent='X3D-Edit 3.2, https://savage.nps.edu/X3D-Edit'/>
<meta name='licensecontent='../../license.html'/>
</head>
<!--

Index for ProtoDeclare definition: MaterialModulator
Index for DEF nodes: MaterialModulatorScript, MaterialNode, ModulationClock
-->
<Scene>
<ProtoDeclare name='MaterialModulatorappinfo='mimic a Material node and modulate fields as an animation effect'>
<ProtoInterface>
<field name='enabledtype='SFBoolvalue='trueaccessType='inputOutput'/>
<field name='diffuseColortype='SFColorvalue='0.8 0.8 0.8accessType='inputOutput'/>
<field name='emissiveColortype='SFColorvalue='0 0 0accessType='inputOutput'/>
<field name='specularColortype='SFColorvalue='0 0 0accessType='inputOutput'/>
<field name='transparencytype='SFFloatvalue='0.0accessType='inputOutput'/>
<field name='shininesstype='SFFloatvalue='0.2accessType='inputOutput'/>
<field name='ambientIntensitytype='SFFloatvalue='0.2accessType='inputOutput'/>
</ProtoInterface>
<ProtoBody>
<!-- MaterialNode ROUTE:  [from MaterialModulatorScript.newColor to diffuseColor ] -->
<Material DEF='MaterialNode'>
<IS>
<connect nodeField='diffuseColorprotoField='diffuseColor'/>
<connect nodeField='emissiveColorprotoField='emissiveColor'/>
<connect nodeField='specularColorprotoField='specularColor'/>
<connect nodeField='transparencyprotoField='transparency'/>
<connect nodeField='shininessprotoField='shininess'/>
<connect nodeField='ambientIntensityprotoField='ambientIntensity'/>
</IS>
</Material>
<!-- Only first node (the node type) is renderable, others are along for the ride -->
<!-- MaterialModulatorScript ROUTEs:  [from ModulationClock.cycleTime to clockTrigger ] [from newColor to MaterialNode.diffuseColor ] -->
<Script DEF='MaterialModulatorScript'>
<field name='enabledtype='SFBoolaccessType='inputOutput'/>
<field name='diffuseColortype='SFColoraccessType='inputOutput'/>
<field name='newColortype='SFColoraccessType='outputOnly'/>
<field name='clockTriggertype='SFTimeaccessType='inputOnly'/>
<IS>
<connect nodeField='enabledprotoField='enabled'/>
<connect nodeField='diffuseColorprotoField='diffuseColor'/>
</IS>
<![CDATA[
          
ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}

function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;
    
    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);   
    Browser.print ('diffuseColor=(' + red +',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
}

        
]]>
</Script>
<ROUTE fromNode='MaterialModulatorScriptfromField='newColortoNode='MaterialNodetoField='diffuseColor'/>
<!-- ModulationClock ROUTE:  [from cycleTime to MaterialModulatorScript.clockTrigger ] -->
<TimeSensor DEF='ModulationClockcycleInterval='0.05loop='true'/>
<ROUTE fromNode='ModulationClockfromField='cycleTimetoNode='MaterialModulatorScripttoField='clockTrigger'/>
</ProtoBody>
</ProtoDeclare>
<!-- Rendered geometry follows prototype declaration -->
<Shape>
<Sphere/>
<Appearance>
<ProtoInstance name='MaterialModulatorcontainerField='material'>
<fieldValue name='enabledvalue='true'/>
<fieldValue name='diffuseColorvalue='0.5 0.1 0.1'/>
</ProtoInstance>
</Appearance>
</Shape>
</Scene>
</X3D>
<!--

Index for ProtoDeclare definition: MaterialModulator
Index for DEF nodes: MaterialModulatorScript, MaterialNode, ModulationClock
-->

<!-- Tag color codes: <Node DEF='idName' attribute='value'/> <Prototype name='ProtoName'> <field name='fieldName'/> </Prototype> -->