Random Keys and KeyValues

#VRML V2.0 utf8

NavigationInfo { type "EXAMINE" }
Viewpoint { position -1 3 10 }
Background { skyColor 1 1 1 }

DEF ROOT Group {}

DEF TIMER TimeSensor {
   cycleInterval 3
   loop TRUE
}

DEF LOADED ProximitySensor { size 1000 1000 1000 }

DEF SCRIPT Script {
   eventIn SFBool go
   eventOut MFNode newNodes
   field SFNode timer USE TIMER
   directOutput TRUE
   url "vrmlscript:

function randR(l,h) { return Math.random()*(h-l)+l; }

function go(val) {
   if(val) {
      totalNumNodes = 0;
      for(i=-5; i<5; i++) {
	 for(j=-5; j<5; j++) {
	    tx = i;  ty = 0;  tz = j;
	    sy = randR(1,5);
	    freshNodes = Browser.createVrmlFromString('Transform {' +
						      '  translation ' + tx + ' 0 ' + tz +
						      '  scale 1 ' + sy + ' 1' +
						      '  children Shape {' +
						      '    appearance Appearance {' +
						      '      material Material {}' +
						      '    }' +
						      '    geometry Box { size .9 .9 .9 }'+
						      '  }' +
						      '}');
	    transform = freshNodes[0];

	    // make interpolator
	    inodes = Browser.createVrmlFromString('PositionInterpolator {}');
	    interp = inodes[0];
	    
	    // set interpolator keys and values
	    interp.key = new MFFloat(0, .5, 1);
	    v = new MFVec3f();
	    v[0] = new SFVec3f(tx, 0, tz);
	    v[1] = new SFVec3f(tx, randR(-2,4), tz);
	    v[2] = new SFVec3f(tx, 0, tz);
	    interp.keyValue = v;

	    // wire timer to interpolator
	    Browser.addRoute(timer, 'fraction_changed', interp, 'set_fraction');

	    // wire interpolator to transform
	    Browser.addRoute(interp, 'value_changed', transform, 'translation');

	    // add interpolator node to eventOut array
	    newNodes[totalNumNodes] = interp;  ++totalNumNodes;

	    for(k=0; k<freshNodes.length; k++) {
	       newNodes[totalNumNodes+k] = freshNodes[k];
	    }
	    totalNumNodes += freshNodes.length;
	 }
      }
   }
}

"
}

ROUTE LOADED.isActive TO SCRIPT.go
ROUTE SCRIPT.newNodes TO ROOT.addChildren


mrl