// Tiny3D -- simple example of an "authoring tool" in Java // using the VRML External Interface. // Kenneth B. Russell (kbrussel@media.mit.edu) // changes by Sylvere-Martin.Michiellot@tecfa.unige.ch import java.applet.*; import java.awt.*; import java.util.*; import vrml.external.field.*; import vrml.external.exception.*; import vrml.external.Node; import vrml.external.Browser; import TinyClump; import VbRotation; import VbVec3f; import VRMLExtractor; public class Tiny3D extends Applet { // One instance variable per slider, to tell what controls what Scrollbar transx; Scrollbar transy; Scrollbar transz; Scrollbar rotx; Scrollbar roty; Scrollbar rotz; Scrollbar scalex; Scrollbar scaley; Scrollbar scalez; Scrollbar colr; Scrollbar colg; Scrollbar colb; TextArea textarea; Label label0; Label label1; Label label2; Label label3; Label label4; Label label5; Label label6; Button buttonCube; Button buttonSphere; Button buttonCone; Button buttonCylinder; Button buttonVRML; // Browser we're using Browser browser; // Root of the scene graph (to which we add our clumps) Node root; // Array of the transform hierarchies we've added to the scene Vector clumps; int topIndex; // Current clump we're editing TinyClump curClump = null; static int transformRange = 40; public void start() { // Initialization of our instance variables clumps = new Vector(); topIndex = -1; // // Initialize connection to Cosmo Player // browser = Browser.getBrowser(this); // // Get handle to root of the scene graph // try { root = browser.getNode("ROOT"); } catch (InvalidNodeException e) { System.out.println("PROBLEMS!: " + e); } // // Build the user interface // super.start(); setLayout(null); setBackground(new Color(0xbdb9a3)); resize(515, 300); setFont(new Font("Helvetica", Font.PLAIN, 12)); // Initialize textarea add(textarea = new java.awt.TextArea()); textarea.setBackground(new Color(0xd3ceac)); textarea.setForeground(new Color(0x000000)); textarea.move(0, 200); textarea.resize(515, 100); textarea.show(true); // Initialize label0 add(label0 = new java.awt.Label()); label0.setText("Translation"); label0.setBackground(new Color(0xbdb9a3)); label0.setForeground(new Color(0x000000)); label0.move(31, 86); label0.resize(70, 25); label0.show(true); // Initialize label1 add(label1 = new java.awt.Label()); label1.setText("Rotation"); label1.setBackground(new Color(0xbdb9a3)); label1.setForeground(new Color(0x000000)); label1.move(31, 114); label1.resize(70, 25); label1.show(true); // Initialize label2 add(label2 = new java.awt.Label()); label2.setText("Scale"); label2.setBackground(new Color(0xbdb9a3)); label2.setForeground(new Color(0x000000)); label2.move(31, 142); label2.resize(70, 25); label2.show(true); // Initialize label3 add(label3 = new java.awt.Label()); label3.setText("Color(R,G,B)"); label3.setBackground(new Color(0xbdb9a3)); label3.setForeground(new Color(0x000000)); label3.move(31, 170); label3.resize(70, 25); label3.show(true); // Initialize label4 add(label4 = new java.awt.Label()); label4.setText("X"); label4.setAlignment(1); label4.setBackground(new Color(0xbdb9a3)); label4.setForeground(new Color(0x000000)); label4.move(114, 61); label4.resize(88, 25); label4.show(true); // Initialize label5 add(label5 = new java.awt.Label()); label5.setText("Y"); label5.setAlignment(1); label5.setBackground(new Color(0xbdb9a3)); label5.setForeground(new Color(0x000000)); label5.move(228, 61); label5.resize(88, 25); label5.show(true); // Initialize label6 add(label6 = new java.awt.Label()); label6.setText("Z"); label6.setAlignment(1); label6.setBackground(new Color(0xbdb9a3)); label6.setForeground(new Color(0x000000)); label6.move(344, 61); label6.resize(88, 25); label6.show(true); // Initialize transx add(transx = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, transformRange / 2, 1, 0, 40)); transx.move(114, 88); transx.resize(88, 20); transx.show(true); // Initialize transy add(transy = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, transformRange / 2, 1, 0, 40)); transy.move(228, 88); transy.resize(88, 20); transy.show(true); // Initialize transz add(transz = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, transformRange / 2, 1, 0, 40)); transz.move(344, 88); transz.resize(88, 20); transz.show(true); // Initialize rotx add(rotx = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 360)); rotx.move(114, 116); rotx.resize(88, 20); rotx.show(true); // Initialize roty add(roty = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 360)); roty.move(228, 116); roty.resize(88, 20); roty.show(true); // Initialize rotz add(rotz = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 360)); rotz.move(344, 116); rotz.resize(88, 20); rotz.show(true); // Initialize scalex add(scalex = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 10, 1, 1, 100)); scalex.move(114, 144); scalex.resize(88, 20); scalex.show(true); // Initialize scaley add(scaley = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 10, 1, 1, 100)); scaley.move(228, 144); scaley.resize(88, 20); scaley.show(true); // Initialize scalez add(scalez = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 10, 1, 1, 100)); scalez.move(344, 144); scalez.resize(88, 20); scalez.show(true); // Initialize colr add(colr = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 255)); colr.move(114, 172); colr.resize(88, 20); colr.show(true); // Initialize colg add(colg = new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 255)); colg.move(228, 172); colg.resize(88, 20); colg.show(true); // Initialize colb add(colb= new java.awt.Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 255)); colb.move(344, 172); colb.resize(88, 20); colb.show(true); // Initialize buttonCube add(buttonCube = new java.awt.Button()); buttonCube.setLabel("New Cube"); buttonCube.setBackground(new Color(0xd3ceac)); buttonCube.setForeground(new Color(0x000000)); buttonCube.move(3, 1); buttonCube.resize(100, 50); buttonCube.show(true); // Initialize buttonSphere add(buttonSphere = new java.awt.Button()); buttonSphere.setLabel("New Sphere"); buttonSphere.setBackground(new Color(0xd3ceac)); buttonSphere.setForeground(new Color(0x000000)); buttonSphere.move(148, 1); buttonSphere.resize(100, 50); buttonSphere.show(true); // Initialize buttonCone add(buttonCone = new java.awt.Button()); buttonCone.setLabel("New Cone"); buttonCone.setBackground(new Color(0xd3ceac)); buttonCone.setForeground(new Color(0x000000)); buttonCone.move(293, 1); buttonCone.resize(100, 50); buttonCone.show(true); // Initialize buttonCylinder add(buttonSphere = new java.awt.Button()); buttonSphere.setLabel("New Cylinder"); buttonSphere.setBackground(new Color(0xd3ceac)); buttonSphere.setForeground(new Color(0x000000)); buttonSphere.move(438, 1); buttonSphere.resize(100, 50); buttonSphere.show(true); // Initialize buttonVRML add(buttonCone = new java.awt.Button()); buttonCone.setLabel("VRML code"); buttonCone.setBackground(new Color(0xd3ceac)); buttonCone.setForeground(new Color(0x000000)); buttonCone.move(496, 100); buttonCone.resize(100, 50); buttonCone.show(true); } public Browser getBrowser() { return browser; } public boolean handleEvent(Event event) { if (event.target instanceof Scrollbar) { if (curClump == null) return true; // Depends on which scrollbar changed. Scrollbar bar = (Scrollbar) event.target; if ((bar == transx) || (bar == transy) || (bar == transz)) { float[] val = new float[3]; // Center about origin val[0] = (float) transx.getValue() - (float) transformRange / 2.0f; val[1] = (float) transy.getValue() - (float) transformRange / 2.0f; val[2] = (float) transz.getValue() - (float) transformRange / 2.0f; textarea.setText(textarea.getText() + "Set translation for current object x:"+val[0]+", y:"+val[1]+", z:"+val[2]+"\n"); curClump.set_translation.setValue(val); } if ((bar == scalex) || (bar == scaley) || (bar == scalez)) { float[] val = new float[3]; // Center about origin val[0] = ((float) scalex.getValue()) / 10.0f; val[1] = ((float) scaley.getValue()) / 10.0f; val[2] = ((float) scalez.getValue()) / 10.0f; textarea.setText(textarea.getText() + "Set scale for current object x:"+val[0]+", y:"+val[1]+", z:"+val[2]+"\n"); curClump.set_scale.setValue(val); } if ((bar == colr) || (bar == colg) || (bar == colb)) { float[] val = new float[3]; // Center about origin val[0] = (float) colr.getValue() / 255.0f; val[1] = (float) colg.getValue() / 255.0f; val[2] = (float) colb.getValue() / 255.0f; textarea.setText(textarea.getText() + "Set color for current object x (or Red):"+val[0]+", y (or Green):"+val[1]+", z (or Blue):"+val[2]+"\n"); curClump.set_diffuseColor.setValue(val); } if ((bar == rotx) || (bar == roty) || (bar == rotz)) { curClump.xang = rotx.getValue(); curClump.yang = roty.getValue(); curClump.zang = rotz.getValue(); VbRotation xrot = new VbRotation(new VbVec3f(1.0f, 0.0f, 0.0f), (float) curClump.xang * (float) (Math.PI / 180.0)); VbRotation yrot = new VbRotation(new VbVec3f(0.0f, 1.0f, 0.0f), (float) curClump.yang * (float) (Math.PI / 180.0)); VbRotation zrot = new VbRotation(new VbVec3f(0.0f, 0.0f, 1.0f), (float) curClump.zang * (float) (Math.PI / 180.0)); VbRotation r1 = xrot.times(yrot); VbRotation r2 = r1.times(zrot); VbVec3f axis = new VbVec3f(); float angle = r2.getValue(axis); float[] val = new float[4]; float[] axisVal = axis.getValue(); val[0] = axisVal[0]; val[1] = axisVal[1]; val[2] = axisVal[2]; val[3] = angle; textarea.setText(textarea.getText() + "Set rotation for current object x:"+val[0]+", y:"+val[1]+", z:"+val[2]+"\n"); curClump.set_rotation.setValue(val); } return true; } return super.handleEvent(event); } public boolean action(Event event, Object what) { if (event.target instanceof Button) { TinyClump newClump = null; Button b = (Button) event.target; if (b.getLabel() == "New Cube") { newClump = new TinyClump(this, TinyClump.CUBE); textarea.setText(textarea.getText() + "Create a new Cube\n"); } if (b.getLabel() == "New Sphere") { newClump = new TinyClump(this, TinyClump.SPHERE); textarea.setText(textarea.getText() + "Create a new Sphere\n"); } if (b.getLabel() == "New Cone") { newClump = new TinyClump(this, TinyClump.CONE); textarea.setText(textarea.getText() + "Create a new Cone\n"); } if (b.getLabel() == "New Cylinder") { newClump = new TinyClump(this, TinyClump.CYLINDER); textarea.setText(textarea.getText() + "Create a new Cylinder\n"); } if (b.getLabel() == "VRML code") { if (curClump != null) { textarea.setText(textarea.getText() + new VRMLExtractor(this.browser).toString()); } } // Add this clump to the end of the vector. // We really only do this to protect our clumps // from Java's garbage collector clumps.addElement(newClump); // Increment the index of the high element topIndex++; // Initialize slider's values from this clump curClump = newClump; initSlidersFromClump(); // Add clump to the scene graph try { EventInMFNode addChildren = (EventInMFNode) root.getEventIn("addChildren"); addChildren.setValue(curClump.transArray); } catch (InvalidEventInException e) { System.out.println("PROBLEMS!: " + e); } } // All other actions ignored. return true; } // Make a given clump the one we're editing public void makeCurrent(TinyClump which) { curClump = which; initSlidersFromClump(); } void initSlidersFromClump() { float[] val = curClump.scale_changed.getValue(); scalex.setValue((int) (val[0] * 10.0f)); scaley.setValue((int) (val[1] * 10.0f)); scalez.setValue((int) (val[2] * 10.0f)); val = curClump.translation_changed.getValue(); transx.setValue((int) val[0] + (transformRange / 2)); transy.setValue((int) val[1] + (transformRange / 2)); transz.setValue((int) val[2] + (transformRange / 2)); val = curClump.diffuseColor_changed.getValue(); colr.setValue((int) (val[0] * 255.0f)); colg.setValue((int) (val[1] * 255.0f)); colb.setValue((int) (val[2] * 255.0f)); rotx.setValue(curClump.xang); roty.setValue(curClump.yang); rotz.setValue(curClump.zang); } }