// Simple applet illustrating use of add/removeChildren fields. import java.awt.*; import java.applet.*; import vrml.external.field.*; import vrml.external.Node; import vrml.external.Browser; import vrml.external.exception.*; public class AddRemoveTest extends Applet implements EventOutObserver { TextArea output = null; boolean error = false; // Browser we're using Browser browser; // Root of the scene graph (to which we add our nodes) Node root; // Shape group hierarchy Node[] shape; // EventIns of the root node EventInMFNode addChildren; EventInMFNode removeChildren; EventOutMFNode childrenChanged; public void init() { add(new Button("Add Sphere")); add(new Button("Remove Sphere")); output = new TextArea(5, 40); add(output); browser = Browser.getBrowser(this); try { // Get root node of the scene, and its EventIns root = browser.getNode("ROOT"); Node Temp[]=browser.createVrmlFromString( "PROTO RotationSocket [\n"+ "eventIn SFFloat set_path_time\n"+ "eventIn MFFloat set_position_path_keys\n"+ "eventIn MFFloat set_orientation_path_keys\n"+ "eventIn MFVec3f set_position_path_points\n"+ "eventIn MFRotation set_orientation_path_points\n"+ "eventIn SFRotation set_rotation\n"+ "eventIn SFVec3f set_position\n"+ "eventIn SFVec3f set_scale\n"+ "eventIn MFNode addChildren\n"+ "eventIn MFNode set_children\n"+ "eventIn MFNode removeChildren\n"+ "eventOut MFNode children_changed\n"+ "eventIn MFNode addGeometry\n"+ "eventIn MFNode set_geometry\n"+ "eventIn MFNode removeGeometry\n"+ "eventOut MFNode geometry_changed\n"+ "] {\n"+ "DEF T2 Transform {\n"+ "children [\n"+ "Group {\n"+ "children [\n"+ "Group {\n"+ "addChildren IS addChildren\n"+ "set_children IS set_children\n"+ "removeChildren IS removeChildren\n"+ "children_changed IS children_changed\n"+ "},\n"+ "DEF T1 Transform {\n"+ "set_scale IS set_scale\n"+ "addChildren IS addGeometry\n"+ "set_children IS set_geometry\n"+ "removeChildren IS removeGeometry\n"+ "children_changed IS geometry_changed\n"+ "}\n"+ "]\n"+ "}\n"+ "]\n"+ "}\n"+ "DEF Route_Maker Script {\n"+ "mustEvaluate TRUE\n"+ "eventIn SFFloat set_path_time IS set_path_time\n"+ "eventIn MFVec3f set_position_path IS set_position_path_points\n"+ "eventIn MFRotation set_orientation_path IS set_orientation_path_points\n"+ "eventIn SFVec3f set_position IS set_position\n"+ "eventIn SFRotation set_rotation IS set_rotation\n"+ "eventIn SFBool set_running\n"+ "eventOut SFTime path_time\n"+ "eventOut SFVec3f skip_position\n"+ "eventOut SFRotation skip_rotation\n"+ "eventOut SFTime start_time\n"+ "eventOut SFTime stop_time\n"+ "eventOut MFVec3f update_trail\n"+ "eventOut MFRotation update_spin\n"+ "eventOut SFBool running_changed\n"+ "eventOut MFFloat new_keys\n"+ "field SFBool running FALSE\n"+ "field SFBool jump TRUE\n"+ "field SFBool jumpS TRUE\n"+ "field MFFloat InitializedKeys [0.0, 1.0]\n"+ "field SFVec3f last_position 0 0 0\n"+ "field SFRotation last_rotation 0 1 0 0\n"+ "url []\n"+ "},\n"+ "DEF TIMER TimeSensor {\n"+ "enabled TRUE\n"+ "startTime -1\n"+ "stopTime 0\n"+ "cycleInterval 1\n"+ "},\n"+ "DEF INTERP PositionInterpolator {\n"+ "key [0,1]\n"+ "keyValue [0 0 0, 0 0 0]\n"+ "set_key IS set_position_path_keys\n"+ "set_keyValue IS set_position_path_points\n"+ "}\n"+ "DEF INTERPS OrientationInterpolator {\n"+ "key [0,1]\n"+ "keyValue [0 1 0 0, 0 1 0 0]\n"+ "set_key IS set_orientation_path_keys\n"+ "set_keyValue IS set_orientation_path_points\n"+ "}\n"+ "ROUTE TIMER.isActive TO Route_Maker.set_running\n"+ "ROUTE Route_Maker.start_time TO TIMER.set_startTime\n"+ "ROUTE Route_Maker.stop_time TO TIMER.set_stopTime\n"+ "ROUTE Route_Maker.skip_position TO T2.set_translation\n"+ "ROUTE Route_Maker.skip_rotation TO T2.set_rotation\n"+ "ROUTE Route_Maker.update_trail TO INTERP.set_keyValue\n"+ "ROUTE Route_Maker.update_spin TO INTERPS.set_keyValue\n"+ "ROUTE Route_Maker.new_keys TO INTERP.set_key\n"+ "ROUTE Route_Maker.new_keys TO INTERPS.set_key\n"+ "ROUTE Route_Maker.path_time TO TIMER.set_cycleInterval\n"+ "ROUTE TIMER.fraction_changed TO INTERP.set_fraction\n"+ "ROUTE TIMER.fraction_changed TO INTERPS.set_fraction\n"+ "ROUTE INTERP.value_changed TO T2.set_translation\n"+ "ROUTE INTERPS.value_changed TO T2.set_rotation\n"+ "}\n"+ "RotationSocket {}" ); addChildren = (EventInMFNode) root.getEventIn("addChildren"); addChildren.setValue(Temp); addChildren = (EventInMFNode) Temp[0].getEventIn("addChildren"); childrenChanged =(EventOutMFNode)Temp[0].getEventOut("children_changed"); childrenChanged.advise(this,childrenChanged); removeChildren = (EventInMFNode) Temp[0].getEventIn("removeChildren"); // Instantiate our ubiquitous blue sphere hierarchy } catch (InvalidNodeException e) { output.appendText("PROBLEMS!: " + e + "\n"); error = true; } catch (InvalidEventInException e) { output.appendText("PROBLEMS!: " + e + "\n"); error = true; } catch (InvalidVrmlException e) { output.appendText("PROBLEMS!: " + e + "\n"); error = true; } if (error == false) output.appendText("Ok...\n"); } public void callback(EventOut event, double time, Object data) { output.appendText("Received our callback.\n"); } public boolean action(Event event, Object what) { if (event.target instanceof Button) { Button b = (Button) event.target; if (b.getLabel() == "Add Sphere") { shape = browser.createVrmlFromString("Shape {\n" + " appearance Appearance {\n" + " material Material {\n" + " diffuseColor 0.2 0.2 0.8\n" + " }\n" + " }\n" + " geometry Sphere {}\n" + "}\n"); Node Feature[]=browser.createVrmlFromString( "PROTO RotationSocket [\n"+ "eventIn SFFloat set_path_time\n"+ "eventIn MFFloat set_position_path_keys\n"+ "eventIn MFFloat set_orientation_path_keys\n"+ "eventIn MFVec3f set_position_path_points\n"+ "eventIn MFRotation set_orientation_path_points\n"+ "eventIn SFRotation set_rotation\n"+ "eventIn SFVec3f set_position\n"+ "eventIn SFVec3f set_scale\n"+ "eventIn MFNode addChildren\n"+ "eventIn MFNode set_children\n"+ "eventIn MFNode removeChildren\n"+ "eventOut MFNode children_changed\n"+ "eventIn MFNode addGeometry\n"+ "eventIn MFNode set_geometry\n"+ "eventIn MFNode removeGeometry\n"+ "eventOut MFNode geometry_changed\n"+ "] {\n"+ "DEF T2 Transform {\n"+ "children [\n"+ "Group {\n"+ "children [\n"+ "Group {\n"+ "addChildren IS addChildren\n"+ "set_children IS set_children\n"+ "removeChildren IS removeChildren\n"+ "children_changed IS children_changed\n"+ "},\n"+ "DEF T1 Transform {\n"+ "set_scale IS set_scale\n"+ "addChildren IS addGeometry\n"+ "set_children IS set_geometry\n"+ "removeChildren IS removeGeometry\n"+ "children_changed IS geometry_changed\n"+ "}\n"+ "]\n"+ "}\n"+ "]\n"+ "}\n"+ "DEF Route_Maker Script {\n"+ "mustEvaluate TRUE\n"+ "eventIn SFFloat set_path_time IS set_path_time\n"+ "eventIn MFVec3f set_position_path IS set_position_path_points\n"+ "eventIn MFRotation set_orientation_path IS set_orientation_path_points\n"+ "eventIn SFVec3f set_position IS set_position\n"+ "eventIn SFRotation set_rotation IS set_rotation\n"+ "eventIn SFBool set_running\n"+ "eventOut SFTime path_time\n"+ "eventOut SFVec3f skip_position\n"+ "eventOut SFRotation skip_rotation\n"+ "eventOut SFTime start_time\n"+ "eventOut SFTime stop_time\n"+ "eventOut MFVec3f update_trail\n"+ "eventOut MFRotation update_spin\n"+ "eventOut SFBool running_changed\n"+ "eventOut MFFloat new_keys\n"+ "field SFBool running FALSE\n"+ "field SFBool jump TRUE\n"+ "field SFBool jumpS TRUE\n"+ "field MFFloat InitializedKeys [0.0, 1.0]\n"+ "field SFVec3f last_position 0 0 0\n"+ "field SFRotation last_rotation 0 1 0 0\n"+ "url []\n"+ "},\n"+ "DEF TIMER TimeSensor {\n"+ "enabled TRUE\n"+ "startTime -1\n"+ "stopTime 0\n"+ "cycleInterval 1\n"+ "},\n"+ "DEF INTERP PositionInterpolator {\n"+ "key [0,1]\n"+ "keyValue [0 0 0, 0 0 0]\n"+ "set_key IS set_position_path_keys\n"+ "set_keyValue IS set_position_path_points\n"+ "}\n"+ "DEF INTERPS OrientationInterpolator {\n"+ "key [0,1]\n"+ "keyValue [0 1 0 0, 0 1 0 0]\n"+ "set_key IS set_orientation_path_keys\n"+ "set_keyValue IS set_orientation_path_points\n"+ "}\n"+ "ROUTE TIMER.isActive TO Route_Maker.set_running\n"+ "ROUTE Route_Maker.start_time TO TIMER.set_startTime\n"+ "ROUTE Route_Maker.stop_time TO TIMER.set_stopTime\n"+ "ROUTE Route_Maker.skip_position TO T2.set_translation\n"+ "ROUTE Route_Maker.skip_rotation TO T2.set_rotation\n"+ "ROUTE Route_Maker.update_trail TO INTERP.set_keyValue\n"+ "ROUTE Route_Maker.update_spin TO INTERPS.set_keyValue\n"+ "ROUTE Route_Maker.new_keys TO INTERP.set_key\n"+ "ROUTE Route_Maker.new_keys TO INTERPS.set_key\n"+ "ROUTE Route_Maker.path_time TO TIMER.set_cycleInterval\n"+ "ROUTE TIMER.fraction_changed TO INTERP.set_fraction\n"+ "ROUTE TIMER.fraction_changed TO INTERPS.set_fraction\n"+ "ROUTE INTERP.value_changed TO T2.set_translation\n"+ "ROUTE INTERPS.value_changed TO T2.set_rotation\n"+ "}\n"+ "RotationSocket {}" ); addChildren.setValue(Feature); EventInMFNode t=(EventInMFNode)(Feature[0].getEventIn("set_geometry")); t.setValue(shape); shape=Feature; } else if (b.getLabel() == "Remove Sphere") { removeChildren.setValue(shape); } } return true; } }