/* PlanDImmed.java 0.0 09/15/01 * This is a program that will be used to illustrate opportunities and * problems doing physics with the Java 3D API. * * It is built using Sun Microsystem's demo example * PureImmediate.java, the Copyright notice of which is * reproduced below. * * modifications Copyright Fred Klingener 2001 * may be reproduced or used for any non-commercial purpose * * Plan D: * run() ... * try * { Thread.sleep(DeltaT); * } * catch (InterruptedException e) * { * } * /* * @(#)PureImmediate.java 1.16 01/01/11 07:38:31 * * Copyright (c) 1996-2001 Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, * modify and redistribute this software in source and binary code form, * provided that i) this copyright notice and license appear on all copies of * the software; and ii) Licensee does not utilize the software in a manner * which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control of * aircraft, air traffic, aircraft navigation or aircraft communications; or in * the design, construction, operation or maintenance of any nuclear * facility. Licensee represents and warrants that it will not use or * redistribute the Software for such purposes. */ import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import java.awt.event.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; /** * Pure immediate mode example program. In pure immediate mode, the * renderer must be stopped on the Canvas being rendered into. In our * example, this is done immediately after the canvas is created. A * separate thread is started up to do the immediate mode rendering. */ // Plan D Immediate mode public class PlanD_Immed extends Applet implements Runnable { String ProgramName = "PlanD_Immed.java 09-28-2001"; // 09-20-01 // first, add frame delay monitor final boolean debug = true; int FrameBlock; int Frame; long Then; // 09-20-01 // next add a time delay int DeltaT; // then back to original example private Canvas3D canvas; private GraphicsContext3D gc = null; private Geometry cube = null; private Transform3D cmt = new Transform3D(); // One rotation (2*PI radians) every 6 seconds private Alpha rotAlpha = new Alpha(-1, 6000); private SimpleUniverse u = null; // // Renders a single frame by clearing the canvas, drawing the // geometry, and swapping the draw and display buffer. // public void render() { if (gc == null) { // Set up Graphics context gc = canvas.getGraphicsContext3D(); gc.setAppearance(new Appearance()); // Set up geometry cube = new ColorCube(0.4).getGeometry(); } // Compute angle of rotation based on alpha value double angle = rotAlpha.value() * 2.0*Math.PI; cmt.rotY(angle); // Render the geometry for this frame gc.clear(); gc.setModelTransform(cmt); gc.draw(cube); canvas.swap(); } // // Run method for our immediate mode rendering thread. // public void run() { // System.out.println("PlanD_Immed.run: starting main loop"); java.text.NumberFormat Double1; Double1 = java.text.NumberFormat.getInstance(); Double1.setMaximumFractionDigits(1); Double1.setMinimumFractionDigits(1); while (true) { render(); if (debug) { if (++Frame >= FrameBlock) { long Now = System.currentTimeMillis(); long ET = Now - Then; double AvgDelay = (double)ET/FrameBlock; System.out.print(" "+DeltaT+" "+ Double1.format(AvgDelay)+" "); String s = ""; for (int i=0; i<(int)AvgDelay-DeltaT; i++) { s += "*"; } System.out.print(s+"\n"); Then = Now; Frame = 0; DeltaT++; } } try { Thread.sleep(DeltaT); } catch (InterruptedException e) { } // Thread.yield(); } } public PlanD_Immed() { } // // init: create the canvas, stop the renderer, // create the universe, and start the drawing thread. // public void init() { java.text.DateFormat DayTime; DayTime = java.text.DateFormat.getDateTimeInstance(java.text.DateFormat.SHORT, java.text.DateFormat.SHORT); DeltaT = 10; if (debug) { FrameBlock = 200; Then = System.currentTimeMillis(); Frame = 0; System.out.println(""); System.out.println("Program: "+ProgramName); System.out.println("Run "+DayTime.format(new java.util.Date())); System.out.println("OS Arch.: "+System.getProperty("os.arch")); System.out.println("OS: "+System.getProperty("os.name")+ " Version: "+System.getProperty("os.version")); System.out.println("Averaging block = "+FrameBlock+" Frames"); System.out.println("---------------------------------"); System.out.print(" Frame\n"); System.out.print("DeltaT Delay Lag\n"); System.out.print("(ms) (ms) (ms)\n"); System.out.print("------ --------- -----------\n"); } setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); canvas = new Canvas3D(config); canvas.stopRenderer(); add("Center", canvas); // Create the universe and viewing branch u = new SimpleUniverse(canvas); // This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. u.getViewingPlatform().setNominalViewingTransform(); // Start a new thread that will continuously render new Thread(this).start(); } public void destroy() { u.removeAllLocales(); } // // The following allows PlanD_Immed to be run as an application // as well as an applet // public static void main(String[] args) { new MainFrame(new PlanD_Immed(), 256, 256); } }