// Java 3D Test Applet // MaterialTest.java // Copyright (c) 1999 ENDO Yasuyuki // mailto:yasuyuki@javaopen.org // http://www.javaopen.org/j3dbook/index.html import java.applet.*; import java.awt.*; import java.awt.event.*; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.SimpleUniverse; import com.sun.j3d.utils.geometry.Sphere; public class MaterialTest extends Applet { private Material material = new Material(); private AmbientLight ambientLight = new AmbientLight(); public MaterialTest() { this.setLayout(new BorderLayout()); Panel uppanel = new Panel(); uppanel.setLayout(new GridLayout(3, 2)); this.add(uppanel, BorderLayout.NORTH); Panel[] uppanels = new Panel[6]; for (int i=0; i<6; i++) { uppanels[i] = new Panel(); uppanels[i].setLayout(new BorderLayout()); uppanel.add(uppanels[i]); } final TextField drfield = new TextField("0.0"); final Scrollbar drbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); drfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getDiffuseColor(color); color.x = value; material.setDiffuseColor(color); drbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); uppanels[0].add(drfield, BorderLayout.WEST); drbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getDiffuseColor(color); color.x = value; material.setDiffuseColor(color); drfield.setText(Float.toString(value)); } }); uppanels[0].add(drbar, BorderLayout.CENTER); final TextField dgfield = new TextField("0.0"); final Scrollbar dgbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); dgfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getDiffuseColor(color); color.y = value; material.setDiffuseColor(color); dgbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); uppanels[2].add(dgfield, BorderLayout.WEST); dgbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getDiffuseColor(color); color.y = value; material.setDiffuseColor(color); dgfield.setText(Float.toString(value)); } }); uppanels[2].add(dgbar, BorderLayout.CENTER); final TextField dbfield = new TextField("1.0"); final Scrollbar dbbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); dbbar.setValue(1000); dbfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getDiffuseColor(color); color.z = value; material.setDiffuseColor(color); dbbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); uppanels[4].add(dbfield, BorderLayout.WEST); dbbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getDiffuseColor(color); color.z = value; material.setDiffuseColor(color); dbfield.setText(Float.toString(value)); } }); uppanels[4].add(dbbar, BorderLayout.CENTER); final TextField erfield = new TextField("0.0"); final Scrollbar erbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); erfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getEmissiveColor(color); color.x = value; material.setEmissiveColor(color); erbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); uppanels[1].add(erfield, BorderLayout.WEST); erbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getEmissiveColor(color); color.x = value; material.setEmissiveColor(color); erfield.setText(Float.toString(value)); } }); uppanels[1].add(erbar, BorderLayout.CENTER); final TextField egfield = new TextField("0.0"); final Scrollbar egbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); egfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getEmissiveColor(color); color.y = value; material.setEmissiveColor(color); egbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); uppanels[3].add(egfield, BorderLayout.WEST); egbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getEmissiveColor(color); color.y = value; material.setEmissiveColor(color); egfield.setText(Float.toString(value)); } }); uppanels[3].add(egbar, BorderLayout.CENTER); final TextField ebfield = new TextField("0.0"); final Scrollbar ebbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); ebfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getEmissiveColor(color); color.z = value; material.setEmissiveColor(color); ebbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); uppanels[5].add(ebfield, BorderLayout.WEST); ebbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getEmissiveColor(color); color.z = value; material.setEmissiveColor(color); ebfield.setText(Float.toString(value)); } }); uppanels[5].add(ebbar, BorderLayout.CENTER); Panel downpanel = new Panel(); downpanel.setLayout(new GridLayout(4, 2)); this.add(downpanel, BorderLayout.SOUTH); Panel[] downpanels = new Panel[7]; for (int i=0; i<7; i++) { downpanels[i] = new Panel(); downpanels[i].setLayout(new BorderLayout()); downpanel.add(downpanels[i]); } final TextField srfield = new TextField("1.0"); final Scrollbar srbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); srbar.setValue(1000); srfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getSpecularColor(color); color.x = value; material.setSpecularColor(color); srbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); downpanels[0].add(srfield, BorderLayout.WEST); srbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getSpecularColor(color); color.x = value; material.setSpecularColor(color); srfield.setText(Float.toString(value)); } }); downpanels[0].add(srbar, BorderLayout.CENTER); final TextField sgfield = new TextField("1.0"); final Scrollbar sgbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); sgbar.setValue(1000); sgfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getSpecularColor(color); color.y = value; material.setSpecularColor(color); sgbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); downpanels[2].add(sgfield, BorderLayout.WEST); sgbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getSpecularColor(color); color.y = value; material.setSpecularColor(color); sgfield.setText(Float.toString(value)); } }); downpanels[2].add(sgbar, BorderLayout.CENTER); final TextField sbfield = new TextField("1.0"); final Scrollbar sbbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); sbbar.setValue(1000); sbfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getSpecularColor(color); color.z = value; material.setSpecularColor(color); sbbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); downpanels[4].add(sbfield, BorderLayout.WEST); sbbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getSpecularColor(color); color.z = value; material.setSpecularColor(color); sbfield.setText(Float.toString(value)); } }); downpanels[4].add(sbbar, BorderLayout.CENTER); final TextField tfield = new TextField("64.0"); final Scrollbar bar = new Scrollbar(Scrollbar.HORIZONTAL, 1, 1, 1, 129); bar.setValue(64); tfield.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 1.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 1.0f) value = 1.0f; if (value > 128.0f) value = 128.0f; material.setShininess(value); bar.setValue((int)value); } catch (NumberFormatException ex) {} } }); downpanels[6].add(tfield, BorderLayout.WEST); bar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)e.getValue(); material.setShininess(value); tfield.setText(Float.toString(value)); } }); downpanels[6].add(bar, BorderLayout.CENTER); final TextField arfield = new TextField("0.2"); final Scrollbar arbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); arbar.setValue(200); arfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getAmbientColor(color); color.x = value; material.setAmbientColor(color); arbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); downpanels[1].add(arfield, BorderLayout.WEST); arbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getAmbientColor(color); color.x = value; material.setAmbientColor(color); arfield.setText(Float.toString(value)); } }); downpanels[1].add(arbar, BorderLayout.CENTER); final TextField agfield = new TextField("0.2"); final Scrollbar agbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); agbar.setValue(200); agfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getAmbientColor(color); color.y = value; material.setAmbientColor(color); agbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); downpanels[3].add(agfield, BorderLayout.WEST); agbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getAmbientColor(color); color.y = value; material.setAmbientColor(color); agfield.setText(Float.toString(value)); } }); downpanels[3].add(agbar, BorderLayout.CENTER); final TextField abfield = new TextField("0.2"); final Scrollbar abbar = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 1001); abbar.setValue(200); abfield.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { float value = 0.0f; try { value = Float.parseFloat(e.getActionCommand()); if (value < 0.0f) value = 0.0f; if (value > 1.0f) value = 1.0f; Color3f color = new Color3f(); material.getAmbientColor(color); color.z = value; material.setAmbientColor(color); abbar.setValue((int)(value * 1000.0f)); } catch (NumberFormatException ex) {} } }); downpanels[5].add(abfield, BorderLayout.WEST); abbar.addAdjustmentListener( new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { float value = (float)(e.getValue()) / 1000.0f; Color3f color = new Color3f(); material.getAmbientColor(color); color.z = value; material.setAmbientColor(color); abfield.setText(Float.toString(value)); } }); downpanels[5].add(abbar, BorderLayout.CENTER); Checkbox checkbox = new Checkbox("AmbientLight", true); checkbox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { switch (e.getStateChange()) { case ItemEvent.SELECTED: ambientLight.setEnable(true); break; case ItemEvent.DESELECTED: ambientLight.setEnable(false); break; } } }); downpanel.add(checkbox); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(config); this.add(canvas, BorderLayout.CENTER); SimpleUniverse universe = new SimpleUniverse(canvas); universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph( createSceneGraph() ); } private BranchGroup createSceneGraph() { BranchGroup root = new BranchGroup(); BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0); DirectionalLight light = new DirectionalLight( new Color3f(1.0f, 1.0f, 1.0f), new Vector3f(-0.5f, -0.5f, -0.7f) ); light.setInfluencingBounds(bounds); root.addChild(light); material.setCapability(Material.ALLOW_COMPONENT_READ); material.setCapability(Material.ALLOW_COMPONENT_WRITE); material.setDiffuseColor( new Color3f(0.0f, 0.0f, 0.8f) ); Appearance ap = new Appearance(); ap.setMaterial(material); Sphere sphere = new Sphere(0.6f, ap); root.addChild(sphere); ambientLight.setCapability(Light.ALLOW_STATE_WRITE); ambientLight.setInfluencingBounds(bounds); root.addChild(ambientLight); return root; } public static void main(String[] args) { MaterialTest applet = new MaterialTest(); Frame frame = new MainFrame(applet, 500, 500); } }