Information technology — Computer graphics, image processing and 
	environmental representation —
 Extensible 3D (X3D) language bindings —
	    Part 1:  ECMAScript
Annex B
(informative)
Examples
This annex provides a variety of X3D examples showing ECMAScript operations.
Table B.1 lists the topics in this clause:
This example demonstrates a scripted response to a TouchSensor isOver event by changing the color of a Box from blue to red:
#X3D V3.0 utf8
PROFILE Immersive
Group {
    children [
        Shape {
            appearance Appearance {
                material DEF MAT Material { diffuseColor 0 0 1 }
            }
            geometry Box {}
        }
        DEF TS TouchSensor {}
    ]
}
DEF SC Script {
    inputOnly SFBool isOver
    outputOnly SFColor diffuseColor_changed
    url ["ecmascript:
        function initialize() { }
        function isOver(val) {
            if (val == true) {
                diffuseColor_changed = new SFColor(1,0,0);
            } else {
                diffuseColor_changed = new SFColor(0,0,1);
            }
        }
    "]
}
ROUTE TS.isOver TO SC.isOver
ROUTE SC.diffuseColor_changed TO MAT.set_diffuseColor
Click here to view this example in a 3D scene window.
This example shows using createX3DFromString to create nodes:
#X3D V3.0 utf8
PROFILE Immersive
DEF HOLDER Transform { translation -2 0 0 }
DEF SC Script {
    outputOnly MFNode children
    url ["ecmascript:
        function initialize() {
            // Create nodes directly in the parent scene
            shape = Browser.currentScene.createNode('Shape');
            box = Browser.currentScene.createNode('Box');
            shape.geometry = box;
            Browser.currentScene.RootNodes[0] = shape;
            // Create children using the createX3DFromString service
            vrmlCmd = 'PROFILE Interchange  Shape { geometry Sphere{} }'
            tmpScene = Browser.createX3DFromString(vrmlCmd);
            nodes = tmpScene.rootNodes;
            // Nodes must be removed before adding to another scene
            for(i=0; i < nodes.length; i++) {
                tmpScene.removeRootNode(nodes[i]);
            }
            children = nodes;
        }
    "]
}
ROUTE SC.children TO HOLDER.children
Click here to view this example in a 3D scene window.
This example shows how to use per frame notification to produce a frame rate annotation:
#X3D V3.0 utf8
PROFILE Immersive
DEF SC Script {
    url ["ecmascript:
        var lastStartTime;
        function initialize() {
            date = new Date();
            lastStartTime = date.getTime();
        }
        // Called each frame
        function prepareEvents() {
            date = new Date();
            frameTime = (date.getTime() - lastStartTime) / 1000.0;
            lastStartTime = date.getTime();
            fps = 1.0 / frameTime;
            Browser.println('FPS: ' + fps);
        }
    "]
}
Click here to view this example in a 3D scene window.
This example shows adding dynamic routes:
#X3D V3.0 utf8
PROFILE Immersive
DEF SC Script {
    inputOnly SFTime touchTime
    url ["ecmascript:
        function touchTime(val) {
            // Create nodes directly in the parent scene
            scene = Browser.currentScene;
            shape = scene.createNode('Shape');
            box = scene.createNode('Box');
            touchSensor = scene.createNode('TouchSensor');
            shape.geometry = box;
            // Create a Group to hold the nodes
            group = scene.createNode('Group');
            // Add the shape and sensor to the group
            group.children = new MFNode(shape, touchSensor);
            // Add the nodes to the scene
            scene.RootNodes[0] = group;
            // Add a route from the touchSensor to this script
            scene.addRoute(touchSensor, 'touchTime', Script, 'touchTime');
        }
    "]
}
Click here to view this example in a 3D scene window.
This example shows creation of nodes from a prototype:
#X3D V3.0 utf8
PROFILE Immersive
PROTO ColoredSphere [
    initializeOnly SFColor color 0 1 0
] {
    Shape {
        appearance Appearance {
            material Material {
                diffuseColor IS color
            }
        }
        geometry Sphere {}
    }
}
DEF SC Script {
    url ["ecmascript:
        function initialize() {
            // Create nodes directly in the parent scene
            scene = Browser.currentScene;
            // Look through proto declarations for ColoredSphere
            protoDecls = scene.protoDeclarations;
            var protoDecl;
            for(i=0; i < protoDecls.length; i++) {
                if (protoDecls[i].name == 'ColoredSphere')
                    protoDecl = protoDecls[i];
            }
            // Create an instance of RedSphere
            instance = protoDecl.newInstance();
            // Set the color field to Red
            instance.color = new SFColor(1,0,0);
            // Add the created proto to the scene
            scene.rootNodes[0] = instance;
        }
    "]
}
Click here to view this example in a 3D scene window.