|
From: <duc...@us...> - 2008-02-13 03:38:44
|
Revision: 742
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=742&view=rev
Author: ducheneaut
Date: 2008-02-12 19:38:49 -0800 (Tue, 12 Feb 2008)
Log Message:
-----------
Added support for a RendererListener in order to warn the client that the JVM has run out of memory. When this happens, the client now pops up an alert box explaining why the user sees question marks everywhere. If the user clicks "help" he is redirected to the appropriate support page depending on his OS.
Modified Paths:
--------------
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Space.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/render/Renderer.java
maven/trunk/ogoglio-viewer-applet/src/main/java/com/ogoglio/viewer/applet/ViewerApplet.java
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Space.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Space.java 2008-02-12 21:19:22 UTC (rev 741)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Space.java 2008-02-13 03:38:49 UTC (rev 742)
@@ -27,7 +27,6 @@
import javax.vecmath.Vector3d;
import com.ogoglio.util.ArgumentUtils;
-import com.ogoglio.util.Log;
public class Space {
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java 2008-02-12 21:19:22 UTC (rev 741)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java 2008-02-13 03:38:49 UTC (rev 742)
@@ -1,6 +1,5 @@
package com.ogoglio.viewer.j3d;
-import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.IOException;
@@ -612,6 +611,10 @@
}
return atMax;
}
+
+ public boolean maxMemoryUsed() {
+ return complainedAboutMemory;
+ }
private Obj getObj(String username, long templateID, int lodIndex) throws ObjParseException {
try {
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java 2008-02-12 21:19:22 UTC (rev 741)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java 2008-02-13 03:38:49 UTC (rev 742)
@@ -22,24 +22,19 @@
import java.util.Enumeration;
import javax.media.j3d.AmbientLight;
-import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;
-import javax.media.j3d.Geometry;
import javax.media.j3d.GraphicsConfigTemplate3D;
import javax.media.j3d.Node;
-import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.View;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
-import javax.vecmath.Point3f;
import javax.vecmath.Quat4d;
import javax.vecmath.Vector3d;
-import javax.vecmath.Vector3f;
import com.ogoglio.client.SpaceClient;
import com.ogoglio.client.UserInputListener;
@@ -58,7 +53,6 @@
import com.ogoglio.util.BodyConstants;
import com.ogoglio.util.Log;
import com.ogoglio.util.WebConstants;
-import com.ogoglio.viewer.j3d.body.Skeleton;
import com.ogoglio.viewer.render.Camera;
import com.ogoglio.viewer.render.ClickTarget;
import com.ogoglio.viewer.render.DoorRenderable;
@@ -114,6 +108,8 @@
private boolean rendererStopped = false;
private boolean completedInitialLoad = false;
+
+ private boolean memoryNotificationSent = false;
private J3DDataManager dataManager = null;
@@ -749,6 +745,12 @@
private ThingRenderable createThingRenderable(Thing thing, boolean useCache) throws IOException, RenderableParseException {
J3DRenderableLoader loader = new J3DRenderableLoader(dataManager.getTemplateData(thing.getTemplate().getOwnerUsername(), thing.getTemplate().getTemplateID(), useCache));
+
+ if (dataManager.maxMemoryUsed() && !memoryNotificationSent) {
+ notifyMaximumMemoryUsed();
+ memoryNotificationSent = true;
+ }
+
J3DThingRenderable renderable = loader.loadThing(thing);
renderable.setPosition(thing.getPosition());
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/render/Renderer.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/render/Renderer.java 2008-02-12 21:19:22 UTC (rev 741)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/render/Renderer.java 2008-02-13 03:38:49 UTC (rev 742)
@@ -15,6 +15,7 @@
package com.ogoglio.viewer.render;
import java.awt.Canvas;
+import java.util.Vector;
import com.ogoglio.client.model.Space;
import com.ogoglio.util.ArgumentUtils;
@@ -22,6 +23,8 @@
public abstract class Renderer {
private Space space = null;
+
+ private ListenerList listenerList = new ListenerList();
public Renderer(Space space) {
ArgumentUtils.assertNotNull(space);
@@ -48,5 +51,34 @@
return space;
}
+ public interface Listener {
+ public void ranOutOfMemory();
+ }
+
+ private class ListenerList {
+ Vector list = new Vector();
+ synchronized Listener[] getListeners() {
+ return (Listener[]) list.toArray(new Listener[0]);
+ }
+
+ synchronized void addListener(Listener listener) {
+ list.add(listener);
+ }
+
+ synchronized void removeListener(Listener listener) {
+ list.remove(listener);
+ }
+ }
+
+ public void addListener(Listener listener) {
+ listenerList.addListener(listener);
+ }
+
+ public void notifyMaximumMemoryUsed() {
+ Listener[] listeners = listenerList.getListeners();
+ for (int i = 0; i < listeners.length; i++) {
+ listeners[i].ranOutOfMemory();
+ }
+ }
}
Modified: maven/trunk/ogoglio-viewer-applet/src/main/java/com/ogoglio/viewer/applet/ViewerApplet.java
===================================================================
--- maven/trunk/ogoglio-viewer-applet/src/main/java/com/ogoglio/viewer/applet/ViewerApplet.java 2008-02-12 21:19:22 UTC (rev 741)
+++ maven/trunk/ogoglio-viewer-applet/src/main/java/com/ogoglio/viewer/applet/ViewerApplet.java 2008-02-13 03:38:49 UTC (rev 742)
@@ -16,17 +16,23 @@
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.BorderLayout;
+import java.awt.Button;
import java.awt.Color;
+import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.FlowLayout;
+import java.awt.Frame;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.PopupMenu;
+import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
+import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
+import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
@@ -62,6 +68,8 @@
private Renderer renderer = null;
private SpaceClientListener spaceClientListener = new SpaceClientListener();
+
+ private RendererListener rendererListener = new RendererListener();
private URI serviceURI = null;
@@ -80,11 +88,17 @@
private AudioClip incomingChatAudioClip = null;
private String helpMessage = null;
+
+ private ViewerApplet theApplet;
+
+ private String osType;
public ViewerApplet() {
setBackground(Color.WHITE);
setLayout(new BorderLayout());
add(splashPanel, BorderLayout.CENTER);
+ theApplet = this;
+ osType = System.getProperty("os.name");
}
public void start() {
@@ -153,6 +167,7 @@
spaceClient.getSpace().getUser(spaceClient.getUsername()).setPosition(transform);
}
renderer = new J3DRenderer(spaceClient, false);
+ renderer.addListener(rendererListener);
renderer.setMovable(movable);
removeAll();
@@ -481,7 +496,14 @@
public String getUsername() {
return spaceClient.getUsername();
}
+
+ private class RendererListener implements Renderer.Listener {
+ public void ranOutOfMemory() {
+ MemoryInfoPanel memoryBox = new MemoryInfoPanel(new Frame(""));
+ }
+ }
+
private class SpaceClientListener implements SpaceClient.Listener {
User lastTellUser = null;
@@ -710,5 +732,75 @@
add(new JLabel("Connecting..."));
}
}
+
+ private class MemoryInfoPanel extends Dialog implements ActionListener {
+ Button help,cancel;
+ TextArea text;
+ String memoryMessage =
+ "Our renderer ran out of memory and could not\n"
+ + "display all of the objects in the space -\n"
+ + "they were replaced by question marks. Click\n"
+ + "the Help button below to open a page with \n"
+ + "instructions about how to easily solve this\n"
+ + "problem in your current operating system.";
+ String helpURL;
+
+ public MemoryInfoPanel(Frame frame){
+ super(frame, "Out Of Memory Error", true);
+ setLayout(new FlowLayout());
+ text = new TextArea(memoryMessage, 6, 40, TextArea.SCROLLBARS_NONE);
+ text.setEditable(false);
+ add(text);
+ addHelpCancelPanel();
+ createFrame();
+ pack();
+ setVisible(true);
+ }
+ private void addHelpCancelPanel() {
+ Panel p = new Panel();
+ p.setLayout(new FlowLayout());
+ createButtons(p);
+ add(p);
+ }
+
+ private void createButtons(Panel p) {
+ p.add(help = new Button("Help"));
+ help.addActionListener(this);
+ p.add(cancel = new Button("Cancel"));
+ cancel.addActionListener(this);
+ }
+
+ private void createFrame() {
+ Dimension d = theApplet.getSize();
+ setLocation(d.width/4,d.height/3);
+ setPreferredSize(new Dimension(d.width, d.height/3));
+ }
+
+ public void actionPerformed(ActionEvent ae){
+ if(ae.getSource() == help) {
+
+ setVisible(false);
+
+ if (osType.startsWith("Mac")) {
+ helpURL = "http://transmutable.com/appletSettingsOSX.html";
+ } else if (osType.startsWith("Windows")) {
+ helpURL = "http://transmutable.com/appletSettingsXP.html";
+ } else {
+ // TODO: add pages for other OS
+ helpURL = "http://transmutable.com/support.html";
+ }
+
+ try {
+ theApplet.stop();
+ theApplet.getAppletContext().showDocument(new URL(helpURL), "_top");
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+ else if (ae.getSource() == cancel) {
+ setVisible(false);
+ }
+ }
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|