You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(134) |
Sep
(52) |
Oct
(13) |
Nov
(342) |
Dec
(163) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(44) |
Feb
(62) |
Mar
(158) |
Apr
(38) |
May
(70) |
Jun
(58) |
Jul
(104) |
Aug
(207) |
Sep
(83) |
Oct
(122) |
Nov
(23) |
Dec
(49) |
| 2004 |
Jan
(119) |
Feb
(132) |
Mar
(192) |
Apr
(140) |
May
(77) |
Jun
(74) |
Jul
(201) |
Aug
(63) |
Sep
(102) |
Oct
(70) |
Nov
(173) |
Dec
(78) |
| 2005 |
Jan
(174) |
Feb
(197) |
Mar
(105) |
Apr
(59) |
May
(77) |
Jun
(43) |
Jul
(21) |
Aug
(18) |
Sep
(47) |
Oct
(37) |
Nov
(74) |
Dec
(50) |
| 2006 |
Jan
(44) |
Feb
(19) |
Mar
(32) |
Apr
(24) |
May
(31) |
Jun
(55) |
Jul
(138) |
Aug
(28) |
Sep
(12) |
Oct
(41) |
Nov
(58) |
Dec
(24) |
| 2007 |
Jan
(28) |
Feb
(14) |
Mar
(10) |
Apr
(68) |
May
(30) |
Jun
(26) |
Jul
(18) |
Aug
(63) |
Sep
(19) |
Oct
(29) |
Nov
(20) |
Dec
(10) |
| 2008 |
Jan
(38) |
Feb
(7) |
Mar
(37) |
Apr
(120) |
May
(41) |
Jun
(36) |
Jul
(39) |
Aug
(24) |
Sep
(28) |
Oct
(30) |
Nov
(36) |
Dec
(75) |
| 2009 |
Jan
(46) |
Feb
(22) |
Mar
(50) |
Apr
(70) |
May
(134) |
Jun
(105) |
Jul
(75) |
Aug
(34) |
Sep
(38) |
Oct
(34) |
Nov
(19) |
Dec
(20) |
| 2010 |
Jan
(11) |
Feb
(20) |
Mar
(65) |
Apr
(83) |
May
(104) |
Jun
(73) |
Jul
(78) |
Aug
(57) |
Sep
(43) |
Oct
(35) |
Nov
(9) |
Dec
(4) |
| 2011 |
Jan
(21) |
Feb
(11) |
Mar
(18) |
Apr
(10) |
May
(18) |
Jun
(15) |
Jul
(48) |
Aug
(25) |
Sep
(17) |
Oct
(45) |
Nov
(15) |
Dec
(12) |
| 2012 |
Jan
(21) |
Feb
(9) |
Mar
(12) |
Apr
(9) |
May
(9) |
Jun
(5) |
Jul
(1) |
Aug
(10) |
Sep
(12) |
Oct
(1) |
Nov
(28) |
Dec
(5) |
| 2013 |
Jan
(4) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2014 |
Jan
|
Feb
(1) |
Mar
(1) |
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
| 2015 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
| 2016 |
Jan
(2) |
Feb
(1) |
Mar
(1) |
Apr
(1) |
May
(2) |
Jun
|
Jul
(1) |
Aug
(2) |
Sep
|
Oct
|
Nov
(1) |
Dec
|
| 2017 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
|
|
1
(1) |
2
|
|
3
(1) |
4
|
5
(2) |
6
(6) |
7
|
8
|
9
|
|
10
(5) |
11
(2) |
12
|
13
|
14
(1) |
15
(1) |
16
|
|
17
|
18
(1) |
19
(2) |
20
(2) |
21
|
22
|
23
|
|
24
|
25
|
26
|
27
|
28
|
29
(2) |
30
|
|
From: <ma...@us...> - 2007-06-10 20:31:42
|
Revision: 2850
http://svn.sourceforge.net/java-game-lib/?rev=2850&view=rev
Author: matzon
Date: 2007-06-10 13:31:41 -0700 (Sun, 10 Jun 2007)
Log Message:
-----------
appletloader sample
Added Paths:
-----------
trunk/LWJGL/applet/appletloader.html
Added: trunk/LWJGL/applet/appletloader.html
===================================================================
--- trunk/LWJGL/applet/appletloader.html (rev 0)
+++ trunk/LWJGL/applet/appletloader.html 2007-06-10 20:31:41 UTC (rev 2850)
@@ -0,0 +1,57 @@
+<html><head><title>AppletLoader</title>
+
+<APPLET code="org.lwjgl.util.applet.AppletLoader" archive="lwjgl_util_applet.jar" codebase="." width="640" height="480">
+
+<!-- The following tags are mandatory -->
+
+<!-- Name of Applet, will be used as name of directory it is saved in, and will uniquely identify it in cache -->
+<param name="al_title" value="appletloadertest">
+
+<!-- Main Applet Class -->
+<param name="al_main" value="org.lwjgl.test.applet.AppletLoaderTest">
+
+<!-- logo to paint while loading, will be centered -->
+<param name="al_logo" value="appletlogo.png">
+
+<!-- progressbar to paint while loading. Will be painted on top of logo, width clipped to percentage done -->
+<param name="al_progressbar" value="appletprogress.gif">
+
+<!-- List of Jars to add to classpath -->
+<param name="al_jars" value="lwjgl_applet.jar, lwjgl.jar, jinput.jar, lwjgl_devil.jar, lwjgl_fmod3.jar, lwjgl_util.jar, res.jar">
+
+<!-- signed windows natives jar in a jar -->
+<param name="al_windows" value="windows_natives.jar">
+
+<!-- signed linux natives jar in a jar -->
+<param name="al_linux" value="linux_natives.jar">
+
+<!-- signed mac osx natives jar in a jar -->
+<param name="al_mac" value="macosx_natives.jar">
+
+<!-- Tags under here are optional -->
+
+<!-- Version of Applet, important otherwise applet won't be cached, version change will update applet, must be int or float -->
+<!-- <param name="al_version" value="0.1"> -->
+
+<!-- background color to paint with, defaults to white -->
+<!-- <param name="al_bgcolor" value="000000"> -->
+
+<!-- foreground color to paint with, defaults to black -->
+<!-- <param name="al_fgcolor" value="ffffff"> -->
+
+<!-- error color to paint with, defaults to red -->
+<!-- <param name="al_errorcolor" value="ff0000"> -->
+
+<!-- whether to run in debug mode -->
+<!-- <param name="al_debug" value="false"> -->
+
+<!-- main applet specific params -->
+<param name="test" value="org.lwjgl.test.opengl.awt.AWTGearsCanvas">
+
+</APPLET>
+
+<p>
+ if <code>al_debug</code> is true the applet will load and extract resources with a delay, to be able to see the loader process.
+</p>
+
+</body></html>
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2007-06-10 20:31:11
|
Revision: 2849
http://svn.sourceforge.net/java-game-lib/?rev=2849&view=rev
Author: matzon
Date: 2007-06-10 13:31:09 -0700 (Sun, 10 Jun 2007)
Log Message:
-----------
support for AppletLoader
Modified Paths:
--------------
trunk/LWJGL/build.xml
Modified: trunk/LWJGL/build.xml
===================================================================
--- trunk/LWJGL/build.xml 2007-06-10 20:30:03 UTC (rev 2848)
+++ trunk/LWJGL/build.xml 2007-06-10 20:31:09 UTC (rev 2849)
@@ -77,6 +77,7 @@
<fileset id="lwjgl_applet.fileset" dir="${lwjgl.bin}">
<exclude name="**.*"/>
<include name="org/lwjgl/test/applet/**"/>
+ <include name="org/lwjgl/test/opengl/awt/AWTGearsCanvas.class"/>
</fileset>
<!-- Files to make Javadoc from -->
@@ -447,11 +448,12 @@
<include name="macosx_natives.jar"/>
</fileset>
</jar>
- <delete file="applet/windows_natives.jar"/>
- <delete file="applet/linux_natives.jar"/>
- <delete file="applet/macosx_natives.jar"/>
- <copy file="${lwjgl.lib}/lwjgl.jar" todir="applet"/>
+ <jar destfile="${lwjgl.lib}/lwjgl_util_applet.jar" update="true">
+ <fileset dir="${lwjgl.res}" includes="applet*"/>
+ </jar>
+
+ <copy file="${lwjgl.lib}/lwjgl.jar" todir="applet"/>
<copy file="${lwjgl.lib}/lwjgl_util_applet.jar" todir="applet"/>
<copy file="${lwjgl.lib}/lwjgl_util.jar" todir="applet"/>
<copy file="${lwjgl.lib}/lwjgl_fmod3.jar" todir="applet"/>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2007-06-10 20:30:06
|
Revision: 2848
http://svn.sourceforge.net/java-game-lib/?rev=2848&view=rev
Author: matzon
Date: 2007-06-10 13:30:03 -0700 (Sun, 10 Jun 2007)
Log Message:
-----------
initial checking on AppletLoader
Added Paths:
-----------
trunk/LWJGL/res/appletlogo.png
trunk/LWJGL/res/appletprogress.gif
trunk/LWJGL/src/java/org/lwjgl/test/applet/AppletLoaderTest.java
trunk/LWJGL/src/java/org/lwjgl/util/applet/AppletLoader.java
Added: trunk/LWJGL/res/appletlogo.png
===================================================================
(Binary files differ)
Property changes on: trunk/LWJGL/res/appletlogo.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/LWJGL/res/appletprogress.gif
===================================================================
(Binary files differ)
Property changes on: trunk/LWJGL/res/appletprogress.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/LWJGL/src/java/org/lwjgl/test/applet/AppletLoaderTest.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/test/applet/AppletLoaderTest.java (rev 0)
+++ trunk/LWJGL/src/java/org/lwjgl/test/applet/AppletLoaderTest.java 2007-06-10 20:30:03 UTC (rev 2848)
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2006 LWJGL Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'LWJGL' nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.test.applet;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Canvas;
+
+import org.lwjgl.opengl.AWTInputAdapter;
+
+public class AppletLoaderTest extends Applet {
+
+ Test test = null;
+
+ public void destroy() {
+ super.destroy();
+ System.out.println("*** destroy ***");
+ AWTInputAdapter.destroy();
+ }
+
+ public void start() {
+ super.start();
+ System.out.println("*** start ***");
+ }
+
+ public void stop() {
+ super.stop();
+ System.out.println("*** stop ***");
+ test.stop();
+ }
+
+ public void init() {
+ System.out.println("*** init ***");
+
+ setLayout(new BorderLayout());
+ try {
+ test = (Test) Class.forName(getParameter("test")).newInstance();
+ Canvas canvas = (Canvas) test;
+ canvas.setSize(getWidth(), getHeight());
+ add(canvas);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ test.start();
+ }
+}
Added: trunk/LWJGL/src/java/org/lwjgl/util/applet/AppletLoader.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/util/applet/AppletLoader.java (rev 0)
+++ trunk/LWJGL/src/java/org/lwjgl/util/applet/AppletLoader.java 2007-06-10 20:30:03 UTC (rev 2848)
@@ -0,0 +1,907 @@
+/*
+ * Copyright (c) 2002-2007 LWJGL Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'LWJGL' nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util.applet;
+
+import java.applet.Applet;
+import java.applet.AppletStub;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.GridLayout;
+import java.awt.Image;
+import java.awt.Toolkit;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.URLConnection;
+import java.security.AccessControlException;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
+import java.security.cert.Certificate;
+import java.util.Enumeration;
+import java.util.StringTokenizer;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+/**
+ * <p>
+ * The AppletLoader enables deployment of LWJGL to applets in an easy
+ * and polished way. The loader will display a configurable logo and progressbar
+ * while the relevant jars (generic and native) are downloaded from a specified source.
+ * </p>
+ * <p>
+ * The downloaded are extracted to the users temporary directory - and if enabled, cached for
+ * faster loading in future uses.
+ * </p>
+ * <p>
+ * The following applet parameters are required:
+ * <ul>
+ * <li>al_main - [String] Full package and class the applet to instantiate and display when loaded.</li>
+ * <li>al_logo - [String Path of of the logo resource to paint while loading.</li>
+ * <li>al_progressbar - [String] Path of the progressbar resource to paint on top of the logo, width clipped by percentage.</li>
+ * <li>al_jars - [String] Comma seperated list of jars to download.</li>
+ * <li>al_windows - [String] Jar containing native files for windows.</li>
+ * <li>al_linux - [String] Jar containing native files for linux.</li>
+ * <li>al_mac - [String] Jar containing native files for mac.</li>
+ * </ul>
+ * </p>
+ * <p>
+ * Additionally the following parameters can be supplied to tweak the behaviour of the AppletLoader.
+ * <ul>
+ * <li>al_version - [int or float] Version of deployment. If this is specified, the jars will be cached and
+ * reused if the version matches. If version doesn't match all of the files are reloaded.</li>
+ * <li>al_bgcolor - [String] Hex formated color to use as background. <i>Default: ffffff</i>.</li>
+ * <li>al_fgcolor - [String] Hex formated color to use as foreground. <i>Default: 000000</i>.</li>
+ * <li>al_errorcolor - [String] Hex formated color to use as foreground color on error. <i>Default: ff0000</i>.</li>
+ * <li>al_debug - [boolean] Whether to enable debug mode. <i>Default: false</i>.</li>
+ * </ul>
+ * </p>
+ * @author kappaOne
+ * @author Brian Matzon <br...@ma...>
+ * @version $Revision$
+ * $Id$
+ */
+public class AppletLoader extends Applet implements Runnable, AppletStub {
+ /** initializing */
+ public static final int STATE_INIT = 1;
+
+ /** determining which packages that are required */
+ public static final int STATE_DETERMINING_PACKAGES = 2;
+
+ /** checking for already downloaded files */
+ public static final int STATE_CHECKING_CACHE = 3;
+
+ /** downloading packages */
+ public static final int STATE_DOWNLOADING = 4;
+
+ /** extracting packages */
+ public static final int STATE_EXTRACTING_PACKAGES = 5;
+
+ /** updating the classpath */
+ public static final int STATE_UPDATING_CLASSPATH = 6;
+
+ /** switching to real applet */
+ public static final int STATE_SWITCHING_APPLET = 7;
+
+ /** initializing real applet */
+ public static final int STATE_INITIALIZE_REAL_APPLET = 8;
+
+ /** stating real applet */
+ public static final int STATE_START_REAL_APPLET = 9;
+
+ /** done */
+ public static final int STATE_DONE = 10;
+
+ /** used to calculate length of progress bar */
+ protected int percentage;
+
+ /** current size of download in bytes */
+ protected int currentSizeDownload;
+
+ /** total size of download in bytes */
+ protected int totalSizeDownload;
+
+ /** current size of extracted in bytes */
+ protected int currentSizeExtract;
+
+ /** total size of extracted in bytes */
+ protected int totalSizeExtract;
+
+ /** logo to be shown while loading */
+ protected Image logo;
+
+ /** progressbar to render while loading */
+ protected Image progressbar;
+
+ /** offscreen image used */
+ protected Image offscreen;
+
+ /** background color of applet */
+ protected Color bgColor = Color.white;
+
+ /** Color to write errors in */
+ protected Color errorColor = Color.red;
+
+ /** color to write forground in */
+ protected Color fgColor = Color.black;
+
+ /** urls of the jars to download */
+ protected URL[] urlList;
+
+ /** list of jars to download */
+ protected String jarList;
+
+ /** actual thread that does the loading */
+ protected Thread loaderThread;
+
+ /** animation thread that renders our loaderscreen while loading */
+ protected Thread animationThread;
+
+ /** applet to load after all downloads are complete */
+ protected Applet lwjglApplet;
+
+ /** whether a fatal error occured */
+ protected boolean fatalError;
+
+ /** fatal error that occured */
+ protected String fatalErrorDescription;
+
+ /** whether we're running in debug mode */
+ protected boolean debugMode;
+
+ /** String to display as a subtask */
+ protected String subtaskMessage = "";
+
+ /** state of applet loader */
+ protected int state = STATE_INIT;
+
+ /** generic error message to display on error */
+ protected String[] genericErrorMessage = { "An error occured while loading the applet.",
+ "Plese contact support to resolve this issue.",
+ "<placeholder for error message>"};
+
+ /*
+ * @see java.applet.Applet#init()
+ */
+ public void init() {
+
+ // sanity check
+ String[] requiredArgs = {"al_main", "al_logo", "al_progressbar", "al_jars"};
+ for(int i=0; i<requiredArgs.length; i++) {
+ if(getParameter(requiredArgs[i]) == null) {
+ fatalErrorOccured("missing required applet parameter: " + requiredArgs[i]);
+ return;
+ }
+ }
+
+ // whether to run in debug mode
+ debugMode = getBooleanParameter("al_debug", false);
+
+ // get colors of applet
+ bgColor = getColor("al_bgcolor", Color.white);
+ fgColor = getColor("al_fgcolor", Color.black);
+ errorColor = getColor("al_errorcolor", Color.red);
+
+ // load logos
+ logo = getImage("/" + getParameter("al_logo"));
+ progressbar = getImage("/" + getParameter("al_progressbar"));
+
+ // jars to load
+ jarList = getParameter("al_jars");
+
+ //sanity check
+ if(logo == null || progressbar == null) {
+ fatalErrorOccured("Unable to load logo and progressbar images");
+ return;
+ }
+
+ // parse the urls for the jars into the url list
+ loadJarURLs();
+ }
+
+ /*
+ * @see java.applet.Applet#start()
+ */
+ public void start() {
+ if(loaderThread == null && !fatalError) {
+ loaderThread = new Thread(this);
+ loaderThread.setName("AppletLoader.loaderThread");
+ loaderThread.start();
+
+ animationThread = new Thread() {
+ public void run() {
+ while(state != STATE_DONE) {
+ repaint();
+ AppletLoader.this.sleep(100);
+ }
+ animationThread = null;
+ }
+ };
+ animationThread.setName("AppletLoader.animationthread");
+ animationThread.start();
+ }
+ }
+
+ /*
+ * @see java.applet.Applet#stop()
+ */
+ public void stop() {
+ if (lwjglApplet != null) {
+ lwjglApplet.stop();
+ }
+ super.stop();
+ }
+
+ /*
+ * @see java.applet.Applet#destroy()
+ */
+ public void destroy() {
+ if (lwjglApplet != null) {
+ lwjglApplet.destroy();
+ }
+
+ progressbar = null;
+ logo = null;
+
+ super.destroy();
+ }
+
+ /**
+ * Retrieves the applet that has been loaded. Usefull for liveconnect.
+ */
+ public Applet getApplet() {
+ return lwjglApplet;
+ }
+
+ /*
+ * @see java.applet.AppletStub#appletResize(int, int)
+ */
+ public void appletResize(int width, int height) {
+ /* uhm? */
+ }
+
+ /*
+ * @see java.awt.Container#update(java.awt.Graphics)
+ */
+ public final void update(Graphics g) {
+ paint(g);
+ }
+
+ /*
+ * @see java.awt.Container#paint(java.awt.Graphics)
+ */
+ public final synchronized void paint(Graphics g) {
+
+ // paint applet if available
+ if(lwjglApplet != null && state == STATE_DONE) {
+ lwjglApplet.paint(g);
+ return;
+ }
+
+ // create offscreen if missing
+ if (offscreen == null) {
+ offscreen = createImage(getWidth(), getHeight());
+ }
+
+ // draw everything onto an image before drawing to avoid flicker
+ Graphics og = offscreen.getGraphics();
+ FontMetrics fm = og.getFontMetrics();
+
+ // set background color
+ og.setColor(bgColor);
+ og.fillRect(0, 0, getWidth(), getHeight());
+
+ // get logo position so its in the middle of applet
+ int x = 0, y = 0;
+
+ if(logo != null && !fatalError) {
+ x = (getWidth() - logo.getWidth(this)) / 2;
+ y = (getHeight() - logo.getHeight(this)) / 2;
+ }
+
+ og.setColor(fgColor);
+ String message = null;
+
+ switch (state) {
+ case STATE_INIT:
+ message = "Initializing loader";
+ break;
+ case STATE_DETERMINING_PACKAGES:
+ message = "Determining packages to load";
+ break;
+ case STATE_CHECKING_CACHE:
+ message = "Checking cache for existing files";
+ break;
+ case STATE_DOWNLOADING:
+ message = "Downloading packages";
+ break;
+ case STATE_EXTRACTING_PACKAGES:
+ message = "Extracting downloaded packages";
+ break;
+ case STATE_UPDATING_CLASSPATH:
+ message = "Updating classpath";
+ break;
+ case STATE_SWITCHING_APPLET:
+ message = "Switching applet";
+ break;
+ case STATE_INITIALIZE_REAL_APPLET:
+ message = "Initializing real applet";
+ break;
+ case STATE_START_REAL_APPLET:
+ message = "Starting real applet";
+ break;
+ case STATE_DONE:
+ message = "Done loading";
+ break;
+ }
+
+ if (fatalError) {
+ genericErrorMessage[genericErrorMessage.length-1] = fatalErrorDescription;
+ for(int i=0; i<genericErrorMessage.length; i++) {
+ int messageX = (getWidth() - fm.stringWidth(genericErrorMessage[i])) / 2;
+ int messageY = (getHeight() - (fm.getHeight() * genericErrorMessage.length)) / 2;
+
+ og.setColor(errorColor);
+ og.drawString(genericErrorMessage[i], messageX, messageY + i*fm.getHeight());
+ }
+ } else {
+ og.setColor(fgColor);
+
+ // draw logo
+ og.drawImage(logo, x, y, null);
+
+ // draw message
+ int messageX = (getWidth() - fm.stringWidth(message)) / 2;
+ int messageY = y + logo.getHeight(null) + 20;
+ og.drawString(message, messageX, messageY);
+
+ // draw subtaskmessage, if any
+ if(subtaskMessage.length() > 0) {
+ messageX = (getWidth() - fm.stringWidth(subtaskMessage)) / 2;
+ og.drawString(subtaskMessage, messageX, messageY+20);
+ }
+
+ // draw loading bar, clipping it depending on percentage done
+ int barSize = (progressbar.getWidth(this) * percentage) / 100;
+ og.clipRect(0, 0, x + barSize, getHeight());
+ og.drawImage(progressbar, x, y, null);
+ }
+
+ og.dispose();
+
+ // finally draw it all
+ g.drawImage(offscreen, 0, 0, null);
+ }
+
+ /**
+ * Reads list of jars to download and adds the urls to urlList
+ * also finds out which OS you are on and adds appropriate native
+ * jar to the urlList
+ */
+ protected void loadJarURLs() {
+ state = STATE_DETERMINING_PACKAGES;
+
+ StringTokenizer jar = new StringTokenizer(jarList, ", ");
+
+ int jarCount = jar.countTokens() + 1;
+
+ urlList = new URL[jarCount];
+
+ try {
+ URL path = getCodeBase();
+
+ // set jars urls
+ for (int i = 0; i < jarCount - 1; i++) {
+ urlList[i] = new URL(path, jar.nextToken());
+ }
+
+ // native jar url
+ String osName = System.getProperty("os.name");
+ String nativeJar = null;
+
+ if (osName.startsWith("Win")) {
+ nativeJar = getParameter("al_windows");
+ } else if (osName.startsWith("Linux") || osName.startsWith("FreeBSD") || osName.startsWith("SunOS")) {
+ nativeJar = getParameter("al_linux");
+ } else if (osName.startsWith("Mac")) {
+ nativeJar = getParameter("al_mac");
+ } else {
+ fatalErrorOccured("OS (" + osName + ") not supported");
+ }
+
+ if (nativeJar == null) {
+ fatalErrorOccured("no lwjgl natives files found");
+ } else {
+ urlList[jarCount - 1] = new URL(path, nativeJar);
+ }
+
+ } catch (MalformedURLException e) {
+ fatalErrorOccured(e.getMessage());
+ }
+ }
+
+ /**
+ * 4 steps
+ *
+ * 1) check version of applet and decide whether to download jars
+ * 2) download the jars
+ * 3) extract natives
+ * 4) add to jars to class path
+ * 5) switch applets
+ *
+ */
+ public void run() {
+
+ state = STATE_CHECKING_CACHE;
+
+ percentage = 5;
+
+ try {
+ if(debugMode) {
+ sleep(2000);
+ }
+
+ // get path where applet will be stored
+ String path = (String) AccessController.doPrivileged(new PrivilegedExceptionAction() {
+ public Object run() throws Exception {
+ return System.getProperty("java.io.tmpdir") + File.separator + getParameter("al_title") + File.separator;
+ }
+ });
+
+ File dir = new File(path);
+
+ // create directory
+ if (!dir.exists()) {
+ dir.mkdir();
+ }
+ dir = new File(dir, "version");
+
+ // if applet already available don't download anything
+ boolean cacheAvailable = false;
+
+ // version of applet
+ String version = getParameter("al_version");
+ float latestVersion = 0;
+
+ // if applet version specifed, check if you have latest version of applet
+ if (version != null) {
+
+ latestVersion = Float.parseFloat(version);
+
+ // if version file exists
+ if (dir.exists()) {
+ // compare to new version
+ if (latestVersion <= readVersionFile(dir)) {
+ cacheAvailable = true;
+ percentage = 90;
+ if(debugMode) {
+ sleep(2000);
+ }
+ }
+ }
+ }
+
+ // if jars not available or need updating download them
+ if (!cacheAvailable) {
+ // downloads jars from the server
+ downloadJars(path); // 10-65%
+
+ // Extracts Native Files
+ extractNatives(path); // 65-85%
+
+ // add version information once jars downloaded successfully
+ if (version != null) {
+ percentage = 90;
+ writeVersionFile(dir, latestVersion);
+ }
+ }
+
+ // add the downloaded jars and natives to classpath
+ updateClassPath(path);
+
+ // switch to LWJGL Applet
+ switchApplet();
+
+ state = STATE_DONE;
+ } catch (AccessControlException ace) {
+ fatalErrorOccured(ace.getMessage());
+ } catch (Exception e) {
+ fatalErrorOccured(e.getMessage());
+ } finally {
+ loaderThread = null;
+ }
+ }
+
+ /**
+ * read the current version file
+ *
+ * @param file the file to read
+ * @return the version value of saved file
+ * @throws Exception if it fails to read value
+ */
+ protected float readVersionFile(File file) throws Exception {
+ DataInputStream dis = new DataInputStream(new FileInputStream(file));
+ float version = dis.readFloat();
+ dis.close();
+ return version;
+ }
+
+ /**
+ * write out version file of applet
+ *
+ * @param file the file to write out to
+ * @param version the version of the applet as a float
+ * @throws Exception if it fails to write file
+ */
+ protected void writeVersionFile(File file, float version) throws Exception {
+ DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
+ dos.writeFloat(version);
+ dos.close();
+ }
+
+ /**
+ * Edits the ClassPath at runtime to include the jars
+ * that have just been downloaded and then adds the
+ * lwjgl natives folder property.
+ *
+ * @param path location where applet is stored
+ * @throws Exception if it fails to add classpath
+ */
+ protected void updateClassPath(String path) throws Exception {
+
+ state = STATE_UPDATING_CLASSPATH;
+
+ percentage = 95;
+
+ Class[] parameters = new Class[] { URL.class};
+
+ // modify class path by adding downloaded jars to it
+ for (int i = 0; i < urlList.length; i++) {
+ // get location of jar as a url
+ URL u = new URL("file:" + path + getFileName(urlList[i]));
+
+ // add to class path
+ Method method = URLClassLoader.class.getDeclaredMethod("addURL", parameters);
+ method.setAccessible(true);
+ method.invoke((URLClassLoader) ClassLoader.getSystemClassLoader(), new Object[] { u});
+ }
+
+ if(debugMode) {
+ sleep(2000);
+ }
+
+ // add natives files path to native class path
+ System.setProperty("org.lwjgl.librarypath", path + "natives");
+
+ // Make sure jinput knows about the new path too
+ System.setProperty("net.java.games.input.librarypath", path + "natives");
+
+ // replace security system to avoid bug where vm fails to
+ // recognise downloaded jars as signed, when they are
+ System.setSecurityManager(null);
+ }
+
+ /**
+ * replace the current applet with the lwjgl applet
+ * using AppletStub and initialise and start it
+ */
+ protected void switchApplet() throws Exception {
+
+ state = STATE_SWITCHING_APPLET;
+ percentage = 100;
+
+ if(debugMode) {
+ sleep(2000);
+ }
+
+ Class appletClass = Class.forName(getParameter("al_main"));
+ lwjglApplet = (Applet) appletClass.newInstance();
+
+ lwjglApplet.setStub(this);
+
+ setLayout(new GridLayout(1, 1));
+ add(lwjglApplet);
+ validate();
+
+ state = STATE_INITIALIZE_REAL_APPLET;
+ lwjglApplet.init();
+
+ state = STATE_START_REAL_APPLET;
+ lwjglApplet.start();
+ }
+
+ /**
+ * Will download the jars from the server using the list of urls
+ * in urlList, while at the same time updating progress bar
+ *
+ * @param path location of the directory to save to
+ * @throws Exception if download fails
+ */
+ protected void downloadJars(String path) throws Exception {
+
+ state = STATE_DOWNLOADING;
+
+ URLConnection urlconnection;
+
+ // calculate total size of jars to download
+ for (int i = 0; i < urlList.length; i++) {
+ urlconnection = urlList[i].openConnection();
+ totalSizeDownload += urlconnection.getContentLength();
+ }
+
+ int initialPercentage = percentage = 10;
+
+ // download each jar
+ byte buffer[] = new byte[65536];
+ for (int i = 0; i < urlList.length; i++) {
+ if(debugMode) {
+ sleep(2000);
+ }
+
+ urlconnection = urlList[i].openConnection();
+
+ String currentFile = getFileName(urlList[i]);
+ InputStream inputstream = urlconnection.getInputStream();
+ FileOutputStream fos = new FileOutputStream(path + currentFile);
+
+
+ int bufferSize;
+ while ((bufferSize = inputstream.read(buffer, 0, buffer.length)) != -1) {
+ if(debugMode) {
+ sleep(10);
+ }
+ fos.write(buffer, 0, bufferSize);
+ currentSizeDownload += bufferSize;
+ percentage = initialPercentage + ((currentSizeDownload * 55) / totalSizeDownload);
+ subtaskMessage = "Retrieving: " + currentFile + " " + ((currentSizeDownload * 100) / totalSizeDownload) + "%";
+ }
+ }
+ subtaskMessage = "";
+ }
+
+ /**
+ * This method will extract all file from the native jar and extract them
+ * to the subdirectory called "natives" in the local path, will also check
+ * to see if the native jar files is signed properly
+ *
+ * @param path base folder containing all downloaded jars
+ * @throws Exception if it fails to extract files
+ */
+ protected void extractNatives(String path) throws Exception {
+
+ state = STATE_EXTRACTING_PACKAGES;
+
+ int initialPercentage = percentage;
+
+ // get name of jar file with natives from urlList, it will be the last url
+ String nativeJar = getFileName(urlList[urlList.length - 1]);
+
+ // get the current certificate to compare against native files
+ Certificate[] certificate = AppletLoader.class.getProtectionDomain().getCodeSource().getCertificates();
+
+ // create native folder
+ File nativeFolder = new File(path + "natives");
+ if (!nativeFolder.exists()) {
+ nativeFolder.mkdir();
+ }
+
+ // open jar file
+ JarFile jarFile = new JarFile(path + nativeJar, true);
+
+ // get list of files in jar
+ Enumeration entities = jarFile.entries();
+
+ totalSizeExtract = 0;
+
+ // calculate the size of the files to extract for progress bar
+ while (entities.hasMoreElements()) {
+ JarEntry entry = (JarEntry) entities.nextElement();
+
+ // skip directories and anything in directories
+ // conveniently ignores the manifest
+ if (entry.isDirectory() || entry.getName().indexOf('/') != -1) {
+ continue;
+ }
+ totalSizeExtract += entry.getSize();
+ }
+
+ currentSizeExtract = 0;
+
+ // reset point to begining by getting list of file again
+ entities = jarFile.entries();
+
+ // extract all files from the jar
+ while (entities.hasMoreElements()) {
+ JarEntry entry = (JarEntry) entities.nextElement();
+
+ // skip directories and anything in directories
+ // conveniently ignores the manifest
+ if (entry.isDirectory() || entry.getName().indexOf('/') != -1) {
+ continue;
+ }
+
+ // check if native file already exists if so delete it to make room for new one
+ // useful when using the reload button on the browser
+ File f = new File(path + "natives" + File.separator + entry.getName());
+ if (f.exists()) {
+ if (!f.delete()) {
+ continue; // unable to delete file, it is in use, skip extracting it
+ }
+ }
+
+ if(debugMode) {
+ sleep(1000);
+ }
+
+ InputStream in = jarFile.getInputStream(jarFile.getEntry(entry.getName()));
+ OutputStream out = new FileOutputStream(path + "natives" + File.separator + entry.getName());
+
+ int bufferSize;
+ byte buffer[] = new byte[65536];
+
+ while ((bufferSize = in.read(buffer, 0, buffer.length)) != -1) {
+ if(debugMode) {
+ sleep(10);
+ }
+ out.write(buffer, 0, bufferSize);
+ currentSizeExtract += bufferSize;
+
+ // update progress bar
+ percentage = initialPercentage + ((currentSizeExtract * 20) / totalSizeExtract);
+ subtaskMessage = "Extracting: " + entry.getName() + " " + ((currentSizeExtract * 100) / totalSizeExtract) + "%";
+ }
+
+ // validate if the certificate for native file is correct
+ validateCertificateChain(certificate, entry.getCertificates());
+
+ in.close();
+ out.close();
+ }
+ subtaskMessage = "";
+
+ jarFile.close();
+ }
+
+ /**
+ * Validates the certificate chain for a single file
+ *
+ * @param ownCerts Chain of certificates to check against
+ * @param native_certs Chain of certificates to check
+ * @return true if the chains match
+ */
+ protected static void validateCertificateChain(Certificate[] ownCerts, Certificate[] native_certs) throws Exception {
+ if (native_certs == null)
+ throw new Exception("Unable to validate certificate chain. Native entry did not have a certificate chain at all");
+
+ if (ownCerts.length != native_certs.length)
+ throw new Exception("Unable to validate certificate chain. Chain differs in length [" + ownCerts.length + " vs " + native_certs.length + "]");
+
+ for (int i = 0; i < ownCerts.length; i++) {
+ if (!ownCerts[i].equals(native_certs[i])) {
+ throw new Exception("Certificate mismatch: " + ownCerts[i] + " != " + native_certs[i]);
+ }
+ }
+ }
+
+ /**
+ * Get Image from path provided
+ *
+ * @param s location of the image
+ * @return the Image file
+ */
+ protected Image getImage(String s) {
+ try {
+ DataInputStream datainputstream = new DataInputStream(getClass().getResourceAsStream(s));
+ byte abyte0[] = new byte[datainputstream.available()];
+ datainputstream.readFully(abyte0);
+ datainputstream.close();
+ return Toolkit.getDefaultToolkit().createImage(abyte0);
+ } catch (Exception e) {
+ /* */
+ }
+ return null;
+ }
+
+
+ /**
+ * Get file name portion of URL.
+ *
+ * @param url Get file name from this url
+ * @return file name as string
+ */
+ protected String getFileName(URL url) {
+ String fileName = url.getFile();
+ return fileName.substring(fileName.lastIndexOf('/') + 1);
+ }
+
+ /**
+ * Retrieves the color
+ *
+ * @param color Color to load
+ * @param defaultColor Default color to use if no color to load
+ * @return Color to use
+ */
+ protected Color getColor(String color, Color defaultColor) {
+ String param_color = getParameter(color);
+ if (param_color != null) {
+ return new Color(Integer.parseInt(param_color, 16));
+ }
+ return defaultColor;
+ }
+
+ /**
+ * Retrieves the boolean value for the applet
+ * @param name Name of parameter
+ * @param defaultValue default value to return if no such parameter
+ * @return value of parameter or defaultValue
+ */
+ protected boolean getBooleanParameter(String name, boolean defaultValue) {
+ String parameter = getParameter(name);
+ if(parameter != null) {
+ return Boolean.parseBoolean(parameter);
+ }
+ return defaultValue;
+ }
+
+ /**
+ * Sets the state of the loaded and prints some debug information
+ *
+ * @param error Error message to print
+ * @param state State to enter
+ */
+ protected void fatalErrorOccured(String error) {
+ fatalError = true;
+ fatalErrorDescription = "Fatal error occured (" + state + "): " + error;
+ System.out.println(fatalErrorDescription);
+ repaint();
+ }
+
+ /**
+ * Utility method for sleeping
+ * @param ms milliseconds to sleep
+ */
+ protected void sleep(long ms) {
+ try {
+ Thread.sleep(ms);
+ } catch (Exception e) {
+ /* ignored */
+ }
+ }
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2007-06-10 20:28:52
|
Revision: 2847
http://svn.sourceforge.net/java-game-lib/?rev=2847&view=rev
Author: matzon
Date: 2007-06-10 13:28:49 -0700 (Sun, 10 Jun 2007)
Log Message:
-----------
split gears implementation into own canvas, to be reused
Modified Paths:
--------------
trunk/LWJGL/src/java/org/lwjgl/test/opengl/awt/AWTGears.java
Added Paths:
-----------
trunk/LWJGL/src/java/org/lwjgl/test/opengl/awt/AWTGearsCanvas.java
Modified: trunk/LWJGL/src/java/org/lwjgl/test/opengl/awt/AWTGears.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/test/opengl/awt/AWTGears.java 2007-06-06 13:56:03 UTC (rev 2846)
+++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/awt/AWTGears.java 2007-06-10 20:28:49 UTC (rev 2847)
@@ -78,67 +78,7 @@
setTitle("Gears");
setSize(300, 300);
setBackground(Color.BLACK);
- add(canvas0 = new AWTGLCanvas() {
- long startTime = 0;
- long fps = 0;
- int current_width;
- int current_height;
- public void paintGL() {
-
- if(startTime == 0) {
- setup();
- startTime = System.currentTimeMillis() + 5000;
- }
-
- try {
- angle += 2.0f;
- if (getWidth() != current_width || getHeight() != current_height) {
- current_width = getWidth();
- current_height = getHeight();
- GL11.glViewport(0, 0, current_width, current_height);
- }
- GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
-
- GL11.glPushMatrix();
- GL11.glRotatef(view_rotx, 1.0f, 0.0f, 0.0f);
- GL11.glRotatef(view_roty, 0.0f, 1.0f, 0.0f);
- GL11.glRotatef(view_rotz, 0.0f, 0.0f, 1.0f);
-
- GL11.glPushMatrix();
- GL11.glTranslatef(-3.0f, -2.0f, 0.0f);
- GL11.glRotatef(angle, 0.0f, 0.0f, 1.0f);
- GL11.glCallList(gear1);
- GL11.glPopMatrix();
-
- GL11.glPushMatrix();
- GL11.glTranslatef(3.1f, -2.0f, 0.0f);
- GL11.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f);
- GL11.glCallList(gear2);
- GL11.glPopMatrix();
-
- GL11.glPushMatrix();
- GL11.glTranslatef(-3.1f, 4.2f, 0.0f);
- GL11.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f);
- GL11.glCallList(gear3);
- GL11.glPopMatrix();
-
- GL11.glPopMatrix();
- swapBuffers();
- repaint();
- } catch (LWJGLException e) {
- throw new RuntimeException(e);
- }
- if (startTime > System.currentTimeMillis()) {
- fps++;
- } else {
- long timeUsed = 5000 + (startTime - System.currentTimeMillis());
- startTime = System.currentTimeMillis() + 5000;
- System.out.println(fps + " frames in " + (float) (timeUsed / 1000f) + " seconds = "
- + (fps / (timeUsed / 1000f)));
- fps = 0;
- }
- }
- });
+ add(new AWTGearsCanvas());
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
Added: trunk/LWJGL/src/java/org/lwjgl/test/opengl/awt/AWTGearsCanvas.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/test/opengl/awt/AWTGearsCanvas.java (rev 0)
+++ trunk/LWJGL/src/java/org/lwjgl/test/opengl/awt/AWTGearsCanvas.java 2007-06-10 20:28:49 UTC (rev 2847)
@@ -0,0 +1,325 @@
+/*
+ * Copyright (c) 2002-2005 LWJGL Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'LWJGL' nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.test.opengl.awt;
+
+import java.nio.FloatBuffer;
+
+import org.lwjgl.BufferUtils;
+import org.lwjgl.LWJGLException;
+import org.lwjgl.opengl.ARBTransposeMatrix;
+import org.lwjgl.opengl.AWTGLCanvas;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GLContext;
+import org.lwjgl.test.applet.Test;
+
+/**
+ * <p>
+ * AWT version of the gears demo
+ * <p>
+ * @version $Revision$
+ * @author Brian Matzon <br...@ma...>
+ * $Id$
+ */
+public class AWTGearsCanvas extends AWTGLCanvas implements Test {
+
+ private float view_rotx = 20.0f;
+
+ private float view_roty = 30.0f;
+
+ private float view_rotz = 0.0f;
+
+ private int gear1;
+
+ private int gear2;
+
+ private int gear3;
+
+ private float angle = 0.0f;
+
+ long startTime = 0;
+ long fps = 0;
+ int current_width;
+ int current_height;
+
+ /**
+ * C'tor
+ */
+ public AWTGearsCanvas() throws LWJGLException {
+ super();
+ }
+
+ public void paintGL() {
+
+ if(startTime == 0) {
+ setup();
+ startTime = System.currentTimeMillis() + 5000;
+ }
+
+ try {
+ angle += 2.0f;
+ if (getWidth() != current_width || getHeight() != current_height) {
+ current_width = getWidth();
+ current_height = getHeight();
+ GL11.glViewport(0, 0, current_width, current_height);
+ }
+ GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+
+ GL11.glPushMatrix();
+ GL11.glRotatef(view_rotx, 1.0f, 0.0f, 0.0f);
+ GL11.glRotatef(view_roty, 0.0f, 1.0f, 0.0f);
+ GL11.glRotatef(view_rotz, 0.0f, 0.0f, 1.0f);
+
+ GL11.glPushMatrix();
+ GL11.glTranslatef(-3.0f, -2.0f, 0.0f);
+ GL11.glRotatef(angle, 0.0f, 0.0f, 1.0f);
+ GL11.glCallList(gear1);
+ GL11.glPopMatrix();
+
+ GL11.glPushMatrix();
+ GL11.glTranslatef(3.1f, -2.0f, 0.0f);
+ GL11.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f);
+ GL11.glCallList(gear2);
+ GL11.glPopMatrix();
+
+ GL11.glPushMatrix();
+ GL11.glTranslatef(-3.1f, 4.2f, 0.0f);
+ GL11.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f);
+ GL11.glCallList(gear3);
+ GL11.glPopMatrix();
+
+ GL11.glPopMatrix();
+ swapBuffers();
+ repaint();
+ } catch (LWJGLException e) {
+ throw new RuntimeException(e);
+ }
+ if (startTime > System.currentTimeMillis()) {
+ fps++;
+ } else {
+ long timeUsed = 5000 + (startTime - System.currentTimeMillis());
+ startTime = System.currentTimeMillis() + 5000;
+ System.out.println(fps + " frames in " + (float) (timeUsed / 1000f) + " seconds = "
+ + (fps / (timeUsed / 1000f)));
+ fps = 0;
+ }
+ }
+
+ private void setup() {
+ // setup ogl
+ FloatBuffer pos = BufferUtils.createFloatBuffer(4).put(new float[] { 5.0f, 5.0f, 10.0f, 0.0f});
+ FloatBuffer red = BufferUtils.createFloatBuffer(4).put(new float[] { 0.8f, 0.1f, 0.0f, 1.0f});
+ FloatBuffer green = BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 0.8f, 0.2f, 1.0f});
+ FloatBuffer blue = BufferUtils.createFloatBuffer(4).put(new float[] { 0.2f, 0.2f, 1.0f, 1.0f});
+ pos.flip();
+ red.flip();
+ green.flip();
+ blue.flip();
+
+ GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, pos);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_LIGHT0);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+
+ /* make the gears */
+ gear1 = GL11.glGenLists(1);
+ GL11.glNewList(gear1, GL11.GL_COMPILE);
+ GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, red);
+ gear(1.0f, 4.0f, 1.0f, 20, 0.7f);
+ GL11.glEndList();
+
+ gear2 = GL11.glGenLists(1);
+ GL11.glNewList(gear2, GL11.GL_COMPILE);
+ GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, green);
+ gear(0.5f, 2.0f, 2.0f, 10, 0.7f);
+ GL11.glEndList();
+
+ gear3 = GL11.glGenLists(1);
+ GL11.glNewList(gear3, GL11.GL_COMPILE);
+ GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, blue);
+ gear(1.3f, 2.0f, 0.5f, 10, 0.7f);
+ GL11.glEndList();
+
+ GL11.glEnable(GL11.GL_NORMALIZE);
+
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+
+ System.err.println("GL_VENDOR: " + GL11.glGetString(GL11.GL_VENDOR));
+ System.err.println("GL_RENDERER: " + GL11.glGetString(GL11.GL_RENDERER));
+ System.err.println("GL_VERSION: " + GL11.glGetString(GL11.GL_VERSION));
+ System.err.println();
+ System.err.println("glLoadTransposeMatrixfARB() supported: " + GLContext.getCapabilities().GL_ARB_transpose_matrix);
+ if (!GLContext.getCapabilities().GL_ARB_transpose_matrix) {
+ // --- not using extensions
+ GL11.glLoadIdentity();
+ } else {
+ // --- using extensions
+ final FloatBuffer identityTranspose = BufferUtils.createFloatBuffer(16).put(
+ new float[] { 1, 0, 0, 0, 0, 1, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 1});
+ identityTranspose.flip();
+ ARBTransposeMatrix.glLoadTransposeMatrixARB(identityTranspose);
+ }
+
+ float h = (float) 300 / (float) 300;
+ GL11.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f);
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glLoadIdentity();
+ GL11.glTranslatef(0.0f, 0.0f, -40.0f);
+ }
+
+ /**
+ * Draw a gear wheel. You'll probably want to call this function when
+ * building a display list since we do a lot of trig here.
+ *
+ * @param inner_radius radius of hole at center
+ * @param outer_radius radius at center of teeth
+ * @param width width of gear
+ * @param teeth number of teeth
+ * @param tooth_depth depth of tooth
+ */
+ private void gear(float inner_radius, float outer_radius, float width, int teeth, float tooth_depth) {
+ int i;
+ float r0, r1, r2;
+ float angle, da;
+ float u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0f;
+ r2 = outer_radius + tooth_depth / 2.0f;
+
+ da = 2.0f * (float) Math.PI / teeth / 4.0f;
+
+ GL11.glShadeModel(GL11.GL_FLAT);
+
+ GL11.glNormal3f(0.0f, 0.0f, 1.0f);
+
+ /* draw front face */
+ GL11.glBegin(GL11.GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0f * (float) Math.PI / teeth;
+ GL11.glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f);
+ GL11.glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f);
+ if (i < teeth) {
+ GL11.glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f);
+ GL11.glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da),
+ width * 0.5f);
+ }
+ }
+ GL11.glEnd();
+
+ /* draw front sides of teeth */
+ GL11.glBegin(GL11.GL_QUADS);
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0f * (float) Math.PI / teeth;
+ GL11.glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f);
+ GL11.glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f);
+ GL11.glVertex3f(r2 * (float) Math.cos(angle + 2.0f * da), r2 * (float) Math.sin(angle + 2.0f * da), width * 0.5f);
+ GL11.glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ GL11.glEnd();
+
+ /* draw back face */
+ GL11.glBegin(GL11.GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0f * (float) Math.PI / teeth;
+ GL11.glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f);
+ GL11.glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f);
+ GL11.glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f);
+ GL11.glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f);
+ }
+ GL11.glEnd();
+
+ /* draw back sides of teeth */
+ GL11.glBegin(GL11.GL_QUADS);
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0f * (float) Math.PI / teeth;
+ GL11.glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f);
+ GL11.glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f);
+ GL11.glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f);
+ GL11.glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f);
+ }
+ GL11.glEnd();
+
+ /* draw outward faces of teeth */
+ GL11.glBegin(GL11.GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0f * (float) Math.PI / teeth;
+ GL11.glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f);
+ GL11.glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f);
+ u = r2 * (float) Math.cos(angle + da) - r1 * (float) Math.cos(angle);
+ v = r2 * (float) Math.sin(angle + da) - r1 * (float) Math.sin(angle);
+ len = (float) Math.sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ GL11.glNormal3f(v, -u, 0.0f);
+ GL11.glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f);
+ GL11.glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f);
+ GL11.glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f);
+ GL11.glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), width * 0.5f);
+ GL11.glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f);
+ u = r1 * (float) Math.cos(angle + 3 * da) - r2 * (float) Math.cos(angle + 2 * da);
+ v = r1 * (float) Math.sin(angle + 3 * da) - r2 * (float) Math.sin(angle + 2 * da);
+ GL11.glNormal3f(v, -u, 0.0f);
+ GL11.glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), width * 0.5f);
+ GL11.glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f);
+ GL11.glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f);
+ }
+ GL11.glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), width * 0.5f);
+ GL11.glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), -width * 0.5f);
+ GL11.glEnd();
+
+ GL11.glShadeModel(GL11.GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ GL11.glBegin(GL11.GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0f * (float) Math.PI / teeth;
+ GL11.glNormal3f(-(float) Math.cos(angle), -(float) Math.sin(angle), 0.0f);
+ GL11.glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f);
+ GL11.glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f);
+ }
+ GL11.glEnd();
+ }
+
+ /*
+ * @see org.lwjgl.test.applet.Test#start()
+ */
+ public void start() {
+ }
+
+ /*
+ * @see org.lwjgl.test.applet.Test#stop()
+ */
+ public void stop() {
+ }
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: Alexander P. <xt...@am...> - 2007-06-10 12:30:50
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type"> </head> <body bgcolor="#ffffff" text="#000000"> <img alt="shoe" src="http://nfhare.hk/unchanged.gif"><br> He does not own shares in any of the companies in this story.<br> " That's a sobering thought, but not to worry: There are still plenty of bargains to be found.<br> Shannon Zimmerman runs point on the Fool's Champion Funds newsletter service and co-advises Motley Fool Green Light with his pal Dayana Yochim. Sales and membership drive it allLook at the first page of Costco's annual report. In short, it's a great look for Ask.<br> is that layoffs and corporate reshufflings may cost them their hides.<br> He owns no shares of companies mentioned here. This is what savvy investors understand, and why they pay a premium to own the Costco store. If the next stock that's pitched to you doesn't possess these traits, then you're probably better off passing. Small companies offer individual investors like us many other advantages. Tap into the potential of this DBA community to expand your business!<br> Most institutional investors, who have billions of dollars to allocate, must avoid small caps at least until they grow larger. That's because the company is designed to create value and share it with consumers in the form of lower and lower prices.<br> Wal-Mart just announced that it is slowing new Supercenter growth to curb cannibalization.<br> The ace in the hole for Costco investors is that management cares more about their members than they do about Wall Street analysts. But history shows that the good outweighs the bad, and you can do better investing in stocks than in any other asset class. But a dividend is a positive indicator, a telling sign of both financial strength and management's confidence that the company will continue to be solid through good times and bad.<br> Our guess is that Sal wants to live better than that. Yet Costco's growth rate is no better than average, and it's actually slower than either Target's or Best Buy's.<br> com for guidance you had Jeeves the butler showing you around. In the book Thomas offers advice you can follow to avoid this syndrome.<br> Motley Fool contributor Timothy M.<br> Even better, they'll help you earn great returns for decades.<br> A marginal investmentLacking a reason to argue, I'd like to use my allotted space to add a little context to this discussion.<br> Beating the market with small-cap stocks, as we've been doing in Hidden Gems, is not as difficult as you might think. Flipping and flipping until the Miami condo market came down around him.<br> </body> </html> |