|
From: <tre...@us...> - 2007-09-27 18:06:39
|
Revision: 446
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=446&view=rev
Author: trevorolio
Date: 2007-09-27 11:06:43 -0700 (Thu, 27 Sep 2007)
Log Message:
-----------
Halfway through a grand avatar rewhack.
In this half I switch over to using downloadable wadges of avatar data instead of in-jar resources for avatar data.
Removed the GeomtryProvider interface, which is now replaced by TemplateDataProvider and BodyDataProvider interfaces which are used to fill the J3DDataManager with cached versions of all network accessed resources. This allows us to control memory usage, but also (eventually) reduces our memory footprint as we only make copies of data which is avatar specific.
Modified Paths:
--------------
maven/trunk/ogoglio-common/.classpath
maven/trunk/ogoglio-common/pom.xml
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/SpaceClient.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIDescriptor.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Door.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Space.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Template.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Thing.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/User.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/BodyConstants.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/StreamUtils.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataCache.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/J3DRenderableLoader.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/Skin.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/SkinLoader.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/bvh/Bvh.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/bvh/BvhParser.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/obj/MtlParser.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/obj/ObjParser.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/smap/SkinMapParser.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/SpaceEvent.java
maven/trunk/ogoglio-common/src/main/resources/sourceArt/Emily/Emily.blend
Added Paths:
-----------
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyDataProvider.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/TemplateDataProvider.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DBodyData.java
Removed Paths:
-------------
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/GeometryProvider.java
maven/trunk/ogoglio-common/src/main/resources/avatar/
Modified: maven/trunk/ogoglio-common/.classpath
===================================================================
--- maven/trunk/ogoglio-common/.classpath 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/.classpath 2007-09-27 18:06:43 UTC (rev 446)
@@ -2,7 +2,6 @@
<classpath>
<classpathentry kind="src" path="src/main/java"/>
<classpathentry kind="src" path="src/test/java"/>
- <classpathentry excluding="**" kind="src" output="src/main/resources/avatar" path="src/main/resources/avatar"/>
<classpathentry excluding="**" kind="src" output="src/main/resources/templates" path="src/main/resources/templates"/>
<classpathentry excluding="**" kind="src" output="src/test/resources" path="src/test/resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
Modified: maven/trunk/ogoglio-common/pom.xml
===================================================================
--- maven/trunk/ogoglio-common/pom.xml 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/pom.xml 2007-09-27 18:06:43 UTC (rev 446)
@@ -14,12 +14,6 @@
<artifactId>ogoglio-common</artifactId>
<build>
<resources>
- <!-- FILTER RESOURCES FOR SOME CONSTANTS-->
- <resource>
- <targetPath>avatar</targetPath>
- <directory>src/main/resources/avatar</directory>
- </resource>
-
<!-- for loading indicator -->
<resource>
<targetPath>templates</targetPath>
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/SpaceClient.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/SpaceClient.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/SpaceClient.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -18,17 +18,19 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Vector;
+import java.util.zip.ZipInputStream;
import javax.media.j3d.Transform3D;
import javax.vecmath.Point3d;
+import com.ogoglio.client.model.BodyDataProvider;
import com.ogoglio.client.model.Door;
-import com.ogoglio.client.model.GeometryProvider;
import com.ogoglio.client.model.Page;
import com.ogoglio.client.model.Shape;
import com.ogoglio.client.model.Space;
import com.ogoglio.client.model.SplinePath;
import com.ogoglio.client.model.Template;
+import com.ogoglio.client.model.TemplateDataProvider;
import com.ogoglio.client.model.Thing;
import com.ogoglio.client.model.User;
import com.ogoglio.message.Message;
@@ -37,7 +39,6 @@
import com.ogoglio.message.PayloadFactory;
import com.ogoglio.message.TCPChannel;
import com.ogoglio.util.ArgumentUtils;
-import com.ogoglio.util.BodyConstants;
import com.ogoglio.util.Log;
import com.ogoglio.util.UIConstants;
import com.ogoglio.xml.AccountDocument;
@@ -67,31 +68,33 @@
private Messenger messenger = new Messenger();
- private ErrorGeometryProvider errorGeometryProvider = new ErrorGeometryProvider();
+ private SpaceClientTemplateDataProvider templateDataProvider = new SpaceClientTemplateDataProvider();
private boolean cleanedUp = false;
+ private BodyDataProvider bodyDataProvider = new NetworkBodyDataProvider();
+
public SpaceClient(long spaceID, URI serviceURI, String authCookie, Listener listener) throws IOException {
ArgumentUtils.assertNotNegative(spaceID);
ArgumentUtils.assertNotNull(serviceURI);
ArgumentUtils.assertNotNull(authCookie);
-
+
WebAPIDescriptor descriptor = new WebAPIDescriptor(serviceURI);
WebAPIClientWire wire = new WebAPIClientWire();
-
+
WebAPIAuthenticator authenticator = null;
- if(authCookie.startsWith("guest")){
+ if (authCookie.startsWith("guest")) {
authenticator = new WebAPIGuestAuthenticator(descriptor, authCookie);
} else {
authenticator = new WebAPIAuthenticator(wire, descriptor, authCookie);
}
-
+
webClient = new WebAPIClient(descriptor, authenticator, wire);
ArgumentUtils.assertNotNull(listener);
this.listener = listener;
accountDoc = authenticator.getAccountDocument(true);
- if(accountDoc == null) {
+ if (accountDoc == null) {
throw new IOException("Could not get account document.");
}
@@ -114,7 +117,7 @@
Log.error("No auth, message " + messenger.errorMessage);
messenger.cleanup();
- if(messenger.errorMessage == null) {
+ if (messenger.errorMessage == null) {
throw new IOException("This viewer could not get the go-ahead.");
} else {
throw new IOException(messenger.errorMessage);
@@ -190,7 +193,7 @@
}
public void mouseClickedThing(Thing thing, String shapeName, Point3d intersection) {
- SpaceEvent event = createSpaceEventForThing(thing, shapeName,SpaceEvent.THING_CLICKED_EVENT);
+ SpaceEvent event = createSpaceEventForThing(thing, shapeName, SpaceEvent.THING_CLICKED_EVENT);
attemptToSendSpaceEventToServer(event);
}
@@ -212,26 +215,24 @@
}
return event;
}
-
+
public void mouseContextClickedThing(Thing thing, String shapeName, int x, int y) {
// we should be asking the thing for the info about it's menu
- long now=System.currentTimeMillis();
- listener.receivedContextMenuRequest(thing,shapeName,x,y,now);
- SpaceEvent event = createSpaceEventForThing(thing, shapeName,SpaceEvent.THING_CONTEXT_CLICKED_EVENT);
- event.setProperty(SpaceEvent.NONCE,new Long(now));
+ long now = System.currentTimeMillis();
+ listener.receivedContextMenuRequest(thing, shapeName, x, y, now);
+ SpaceEvent event = createSpaceEventForThing(thing, shapeName, SpaceEvent.THING_CONTEXT_CLICKED_EVENT);
+ event.setProperty(SpaceEvent.NONCE, new Long(now));
attemptToSendSpaceEventToServer(event);
}
-
+
public void mouseContextItemChosen(Thing thing, long nonce, String id) {
- listener.contextItemChosen(thing,nonce,id);
+ listener.contextItemChosen(thing, nonce, id);
SpaceEvent event = createSpaceEventForThing(thing, null, SpaceEvent.THING_CONTEXT_SELECTION_MADE_EVENT);
- event.setProperty(SpaceEvent.NONCE,new Long(nonce));
+ event.setProperty(SpaceEvent.NONCE, new Long(nonce));
event.setProperty(SpaceEvent.CONTEXT_MENU_DATA_ITEM_ID, id);
attemptToSendSpaceEventToServer(event);
}
-
-
public void mouseClickedPage(Page page, Point3d intersection) {
Log.info("User clicked the page. Ignoring");
}
@@ -311,12 +312,12 @@
if (template == null) {
try {
TemplateDocument templateDoc = webClient.getTemplateDocument(event.getStringProperty(SpaceEvent.TEMPLATE_OWNER), templateID);
- //is it true that event.getStringProperty(SpaceEvent.TEMPLATE_OWNER) is the same as the authenticated user?
+ //is it true that event.getStringProperty(SpaceEvent.TEMPLATE_OWNER) is the same as the authenticated user?
//TemplateDocument templateDoc = webClient.getTemplateDocument(templateID);
template = new Template(templateDoc);
space.addTemplate(template);
} catch (IOException e) {
- Log.error("Could not add the template",e);
+ Log.error("Could not add the template", e);
}
}
Thing thing = new Thing(space, event.getLongProperty(SpaceEvent.THING_ID).longValue(), template, event.getStringProperty(SpaceEvent.DISPLAY_NAME), event.getStringProperty(SpaceEvent.OWNER_USERNAME), event.getLongProperty(SpaceEvent.POSSESSION_ID).longValue(), event.getTransform());
@@ -399,19 +400,19 @@
if (template == null) {
try {
TemplateDocument templateDoc = webClient.getTemplateDocument(event.getStringProperty(SpaceEvent.TEMPLATE_OWNER), templateID);
- //note: always true that event.getStringProperty(SpaceEvent.TEMPLATE_OWNER) is the same as authenticated user?
+ //note: always true that event.getStringProperty(SpaceEvent.TEMPLATE_OWNER) is the same as authenticated user?
//TemplateDocument templateDoc = webClient.getTemplateDocument(templateID);
template = new Template(templateDoc);
space.addTemplate(template);
} catch (IOException e) {
- Log.error("Could not add the template",e);
+ Log.error("Could not add the template", e);
}
}
try {
Door door = new Door(space, template, event.getLongProperty(SpaceEvent.DOOR_ID).longValue(), event.getStringProperty(SpaceEvent.DISPLAY_NAME), new URI(event.getStringProperty(SpaceEvent.LINK)), event.getTransform());
space.addDoor(door);
} catch (URISyntaxException e) {
- Log.error("Could not parse the door link: " + event.getStringProperty(SpaceEvent.LINK),e);
+ Log.error("Could not parse the door link: " + event.getStringProperty(SpaceEvent.LINK), e);
}
} else if (SpaceEvent.UPDATE_DOOR_EVENT.equals(event.getName())) {
@@ -515,8 +516,8 @@
Log.error("Got an animation event for an unknown user: " + event.getStringProperty(SpaceEvent.USERNAME));
return;
}
- user.playAnimation(event.getLongProperty(SpaceEvent.ANIMATION_ID).longValue());
-
+ user.playAnimation(event.getStringProperty(SpaceEvent.ANIMATION_NAME));
+
} else if (SpaceEvent.SHOW_LINK_EVENT.equals(event.getName())) {
String displayName = event.getStringProperty(SpaceEvent.DISPLAY_NAME);
String link = event.getStringProperty(SpaceEvent.LINK);
@@ -547,9 +548,7 @@
thing.stopMotion(position);
thing.setName(displayName);
} else if (SpaceEvent.CONTEXT_MENU_DATA_EVENT.equals(event.getName())) {
- listener.receivedContextMenuData(event.getLongProperty(SpaceEvent.NONCE).longValue(),
- event.getStringProperty(SpaceEvent.CONTEXT_MENU_DATA_GENERATION_ERROR),
- event.getContextMenu());
+ listener.receivedContextMenuData(event.getLongProperty(SpaceEvent.NONCE).longValue(), event.getStringProperty(SpaceEvent.CONTEXT_MENU_DATA_GENERATION_ERROR), event.getContextMenu());
} else if (SpaceEvent.MESSAGE_BROWSER_EVENT.equals(event.getName())) {
long thingID = event.getLongProperty(SpaceEvent.THING_ID).longValue();
@@ -590,7 +589,7 @@
private Vector waitingMessages = new Vector();
private String errorMessage = null;
-
+
public void handleMessage(Message message, TCPChannel sourceChannel) throws NoSuchDestinationException {
synchronized (this) {
if (waiting) {
@@ -599,7 +598,7 @@
return;
} else if (message.getPayload() instanceof PayloadFactory.AuthenticationFailurePayload) {
authStatus = FAILED_STATUS;
- errorMessage = ((PayloadFactory.AuthenticationFailurePayload)message.getPayload()).getMessage();
+ errorMessage = ((PayloadFactory.AuthenticationFailurePayload) message.getPayload()).getMessage();
return;
}
waitingMessages.add(message);
@@ -662,7 +661,7 @@
public void receivedContextMenuData(long nonce, String errorIfAny, Vector contextMenu);
- public void receivedContextMenuRequest(Thing thing, String shapeName, int x, int y,long nonce);
+ public void receivedContextMenuRequest(Thing thing, String shapeName, int x, int y, long nonce);
public void receivedLink(String displayName, String link);
@@ -685,25 +684,6 @@
messenger.cleanup();
}
- public InputStream getTemplateGeometryStream(String ownerUsername, long templateID, int lodIndex) {
- try {
- return webClient.getTemplateGeometryStream(ownerUsername, templateID, lodIndex);
- } catch (IOException e) {
- return UIConstants.getResource("templates/loading.obj");
- }
- }
-
- public InputStream getTemplateResourceStream(String ownerUsername, long templateID, String name) throws IOException {
- try {
- return webClient.getTemplateResourceStream(ownerUsername, templateID, name);
- } catch (IOException e) {
- if("loading.mtl".equals(name)){
- return UIConstants.getResource("templates/loading.mtl");
- }
- return null;
- }
- }
-
public InputStream getPageContentStream(long thingID, long pageID) {
try {
return webClient.getPageContents(space.getSpaceID(), thingID, pageID);
@@ -713,75 +693,57 @@
}
}
- public InputStream getThingAnimationStream(long thingID, long animationID) throws IOException {
- throw new IllegalStateException("this isn't implemented");
+ public BodyDocument getBodyDocument(String username, long bodyID) throws IOException {
+ return webClient.getBodyDocument(username, bodyID);
}
- public String getThingScript(long thingID) throws IOException {
- throw new IllegalStateException("this isn't implemented");
+ public WebAPIClient getWebClient() {
+ return webClient;
}
- public InputStream getUserGeometryStream(String username, String name) throws IOException {
- User user = space.getUser(username);
- if(user == null){
- return null;
- }
- if(user.getBody().isMale()){
- return UIConstants.getResource(BodyConstants.MALE_AVATAR_PATH);
- } else {
- return UIConstants.getResource(BodyConstants.FEMALE_AVATAR_PATH);
- }
+ public BodyDataProvider getBodyDataProvider() {
+ return bodyDataProvider;
}
- public InputStream getUserAnimationStream(String username, long animationID) throws IOException {
- return BodyConstants.getUserAnimation((int) animationID);
- }
+ private class NetworkBodyDataProvider implements BodyDataProvider {
- public InputStream getUserSkinMapStream(String username) throws IOException {
- User user = space.getUser(username);
- if(user == null){
- return null;
+ public ZipInputStream getBodyData(String bodyName) {
+ try {
+ return webClient.getBodyData(bodyName);
+ } catch (IOException e) {
+ Log.warn("Requested an unknown body: " + bodyName);
+ return null;
+ }
}
- if(user.getBody().isMale()){
- return UIConstants.getResource(BodyConstants.MALE_SMAP_PATH);
- } else {
- return UIConstants.getResource(BodyConstants.FEMALE_SMAP_PATH);
- }
- }
- public BodyDocument getBodyDocument(String username, long bodyID) throws IOException {
- return webClient.getBodyDocument(username, bodyID);
}
- public WebAPIClient getWebClient() {
- return webClient;
+ public TemplateDataProvider getTemplateDataProvider() {
+ return templateDataProvider;
}
- public GeometryProvider getErrorGeometryProvider() {
- return errorGeometryProvider;
- }
+ private class SpaceClientTemplateDataProvider implements TemplateDataProvider {
- private class ErrorGeometryProvider implements GeometryProvider {
-
- public InputStream getAnimationStream(long animationID) throws IOException {
- return null;
+ public InputStream getTemplateGeometry(String username, long templateID, int lod) {
+ try {
+ return webClient.getTemplateGeometryStream(username, templateID, lod);
+ } catch (IOException e) {
+ return null;
+ }
}
- public InputStream getGeometryStream(int lodIndex) throws IOException {
- if (lodIndex != 0) {
+ public InputStream getTemplateResource(String username, long templateID, String resourceName) {
+ try {
+ return webClient.getTemplateResourceStream(username, templateID, resourceName);
+ } catch (IOException e) {
return null;
}
- return UIConstants.getResource("templates/loading.obj");
}
- public InputStream getSkinMapStream() throws IOException {
- return null;
+ public String getTemplateScript(String username, long templateID) {
+ return webClient.getTemplateScript(username, templateID);
}
- public InputStream getSubGeometryStream(String name) throws IOException {
- return null;
- }
-
}
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -16,10 +16,10 @@
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
-import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
+import java.util.zip.ZipInputStream;
import javax.media.j3d.Transform3D;
@@ -38,7 +38,6 @@
import com.ogoglio.xml.SpaceDocument;
import com.ogoglio.xml.SpaceMemberDocument;
import com.ogoglio.xml.TemplateDocument;
-import com.ogoglio.xml.TemplateSupportFileDocument;
import com.ogoglio.xml.ThingDocument;
import com.ogoglio.xml.UserDocument;
@@ -509,6 +508,14 @@
return wire.sendDelete(descriptor.getBodyURI(authenticator.getUsername(), bodyID), authenticator.getAuthCookie());
}
+ public ZipInputStream getBodyData(String bodyName) throws IOException {
+ InputStream stream = wire.fetchAuthenticatedStream(descriptor.getBodyDataURI(bodyName), authenticator.getAuthCookie());
+ if(stream == null){
+ return null;
+ }
+ return new ZipInputStream(stream);
+ }
+
public ServiceStateDocument setRegistrationState(String registrationState) throws IOException {
ServiceStateDocument doc = new ServiceStateDocument(registrationState);
XMLElement xml = wire.postAuthenticatedXML(descriptor.getServiceStateURI(), doc.toString(), authenticator.getAuthCookie());
@@ -537,5 +544,4 @@
public WebAPIClientWire getWire() {
return wire;
}
-
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIDescriptor.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIDescriptor.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIDescriptor.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -123,6 +123,10 @@
return WebAPIUtil.appendToURI(getBodiesURI(username), bodyID + "/");
}
+ public URI getBodyDataURI(String bodyName) {
+ return WebAPIUtil.appendToURI(serviceURI, "ogoglio-body-" + bodyName + ".jar");
+ }
+
public URI getPagesURI(long spaceID, long thingID) {
return WebAPIUtil.appendToURI(getThingURI(spaceID, thingID), "page/");
}
Added: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyDataProvider.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyDataProvider.java (rev 0)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyDataProvider.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -0,0 +1,9 @@
+package com.ogoglio.client.model;
+
+import java.util.zip.ZipInputStream;
+
+public interface BodyDataProvider {
+
+ public ZipInputStream getBodyData(String bodyName);
+
+}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Door.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Door.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Door.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -1,7 +1,5 @@
package com.ogoglio.client.model;
-import java.io.IOException;
-import java.io.InputStream;
import java.net.URI;
import javax.media.j3d.Transform3D;
@@ -9,7 +7,7 @@
import com.ogoglio.util.ArgumentUtils;
import com.ogoglio.xml.DoorDocument;
-public class Door implements GeometryProvider {
+public class Door {
private Space space = null;
@@ -83,22 +81,6 @@
position.set(this.position);
}
- public InputStream getGeometryStream(int lodIndex) throws IOException {
- return space.getDoorGeometryStream(this, lodIndex);
- }
-
- public InputStream getSubGeometryStream(String name) throws IOException {
- return space.getDoorResourceStream(this, name);
- }
-
- public InputStream getAnimationStream(long animationID) throws IOException {
- throw new IllegalStateException("Doors don't have animations");
- }
-
- public InputStream getSkinMapStream() throws IOException {
- throw new IllegalStateException("Doors don't have skin maps");
- }
-
public void setDoorID(long doorID) {
ArgumentUtils.assertNotNegative(doorID);
if(this.doorID != -1) {
Deleted: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/GeometryProvider.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/GeometryProvider.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/GeometryProvider.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -1,31 +0,0 @@
-/* Copyright 2007 Transmutable (http://transmutable.com/)
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License. */
-package com.ogoglio.client.model;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-public interface GeometryProvider {
-
- public static final float[] LOD_DISTANCES = { 15f, 75f };
-
- public InputStream getGeometryStream(int lodIndex) throws IOException;
-
- public InputStream getSubGeometryStream(String name) throws IOException;
-
- public InputStream getAnimationStream(long animationID) throws IOException ;
-
- public InputStream getSkinMapStream() throws IOException;
-
-}
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 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Space.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -204,26 +204,12 @@
public void shapeMotionStopped(Shape shape, Transform3D position);
- public void userAnimationStarted(User user, long animationID);
+ public void userAnimationStarted(User user, String animationName);
}
public interface Context {
- public InputStream getTemplateResourceStream(String ownerUsername, long templateID, String name) throws IOException;
-
- public InputStream getTemplateGeometryStream(String ownerUsername, long templateID, int lodIndex);
-
- public InputStream getUserGeometryStream(String username, String name) throws IOException;
-
- public InputStream getThingAnimationStream(long thingID, long animationID) throws IOException;
-
- public InputStream getUserAnimationStream(String username, long animationID) throws IOException;
-
- public InputStream getUserSkinMapStream(String username) throws IOException;
-
- public String getThingScript(long thingID) throws IOException;
-
public InputStream getPageContentStream(long thingID, long pageID);
public BodyDocument getBodyDocument(String username, long bodyID) throws IOException;
@@ -281,10 +267,10 @@
}
}
- public void notifyUserAnimationStarted(User user, long animationID) {
+ public void notifyUserAnimationStarted(User user, String animationName) {
Listener[] listeners = listenerList.getListeners();
for (int i = 0; i < listeners.length; i++) {
- listeners[i].userAnimationStarted(user, animationID);
+ listeners[i].userAnimationStarted(user, animationName);
}
}
@@ -512,46 +498,6 @@
return ownerUsername;
}
- protected InputStream getDoorGeometryStream(Door door, int lodIndex) throws IOException {
- return spaceContext.getTemplateGeometryStream(door.getTemplate().getOwnerUsername(), door.getTemplate().getTemplateID(), lodIndex);
- }
-
- protected InputStream getDoorResourceStream(Door door, String name) throws IOException {
- return spaceContext.getTemplateResourceStream(door.getTemplate().getOwnerUsername(), door.getTemplate().getTemplateID(), name);
- }
-
- protected InputStream getThingGeometryStream(Thing thing, int lodIndex) throws IOException {
- return spaceContext.getTemplateGeometryStream(thing.getTemplate().getOwnerUsername(), thing.getTemplate().getTemplateID(), lodIndex);
- }
-
- protected InputStream getThingResourceStream(Thing thing, String resourceName) throws IOException {
- return spaceContext.getTemplateResourceStream(thing.getTemplate().getOwnerUsername(), thing.getTemplate().getTemplateID(), resourceName);
- }
-
- protected InputStream getUserGeometryStream(String username) throws IOException {
- return spaceContext.getUserGeometryStream(username, null);
- }
-
- protected InputStream getUserGeometryStream(String username, String name) throws IOException {
- return spaceContext.getUserGeometryStream(username, null);
- }
-
- public InputStream getThingAnimationStream(long thingID, long animationID) throws IOException {
- return spaceContext.getThingAnimationStream(thingID, animationID);
- }
-
- public InputStream getUserAnimationStream(String username, long animationID) throws IOException {
- return spaceContext.getUserAnimationStream(username, animationID);
- }
-
- public InputStream getUserSkinMapStream(String username) throws IOException {
- return spaceContext.getUserSkinMapStream(username);
- }
-
- public String getThingScript(long thingID) throws IOException {
- return spaceContext.getThingScript(thingID);
- }
-
public InputStream getPageContentStream(long thingID, long pageID) throws IOException {
return spaceContext.getPageContentStream(thingID, pageID);
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Template.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Template.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Template.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -18,12 +18,14 @@
public class Template {
+ public static final float[] LOD_DISTANCES = { 15f, 75f };
+
private long templateID = -1;
-
+
private String ownerUsername = null;
-
+
private String displayName = null;
-
+
public Template(long templateID, String ownerUsername, String displayName) {
ArgumentUtils.assertNotNegative(templateID);
this.templateID = templateID;
@@ -32,7 +34,7 @@
ArgumentUtils.assertNotEmpty(displayName);
this.displayName = displayName;
}
-
+
public Template(TemplateDocument templateDoc) {
this(templateDoc.getTemplateID(), templateDoc.getOwnerUsername(), templateDoc.getDisplayName());
}
Added: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/TemplateDataProvider.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/TemplateDataProvider.java (rev 0)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/TemplateDataProvider.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -0,0 +1,12 @@
+package com.ogoglio.client.model;
+
+import java.io.InputStream;
+
+public interface TemplateDataProvider {
+
+ public InputStream getTemplateGeometry(String username, long templateID, int lod);
+
+ public InputStream getTemplateResource(String username, long templateID, String resourceName);
+
+ public String getTemplateScript(String username, long templateID);
+}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Thing.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Thing.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Thing.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -24,7 +24,7 @@
import com.ogoglio.xml.ShapeDocument;
import com.ogoglio.xml.ThingDocument;
-public class Thing implements GeometryProvider {
+public class Thing {
private long thingID = -1;
@@ -113,23 +113,6 @@
public Template getTemplate() {
return template;
}
-
- public InputStream getGeometryStream(int lodIndex) throws IOException {
- return space.getThingGeometryStream(this, lodIndex);
- }
-
- public InputStream getSubGeometryStream(String name) throws IOException {
- return space.getThingResourceStream(this, name);
- }
-
- public InputStream getAnimationStream(long animationID) throws IOException {
- return space.getThingAnimationStream(thingID, animationID);
- }
-
- public InputStream getSkinMapStream() throws IOException {
- throw new IllegalStateException("Things don't have skin maps");
- }
-
public String getOwnerUsername() {
return ownerUsername;
}
@@ -145,18 +128,10 @@
this.thingID = newThingID;
}
- public String getScript() throws IOException {
- return space.getThingScript(thingID);
- }
-
- //XXX FIXME: Should this be synchronized? The locking semantics of this object are really
- //XXX FIXME: unclear and I am worred that I am going to mess up something in the threading
public void reload() {
- pages.clear(); // is this a lock as well?
- synchronized (shapes) { //IES: This looks like it's being used as a lock in other places, so I did so here
- shapes.clear(); //IES CHANGE: I believe this should be cleared at reload time or there are shapes
- //IES CHANGE: that can be "leftover" if the geometry files of the template
- //IES CHANGE: change names
+ pages.clear();
+ synchronized (shapes) {
+ shapes.clear();
}
space.notifyThingReload(this);
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/User.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/User.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/User.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -15,13 +15,12 @@
package com.ogoglio.client.model;
import java.io.IOException;
-import java.io.InputStream;
import javax.media.j3d.Transform3D;
import com.ogoglio.util.ArgumentUtils;
-public class User implements GeometryProvider {
+public class User {
private Space space = null;
@@ -63,8 +62,8 @@
space.notifyUserMotionStopped(this, position);
}
- public void playAnimation(long animationID) {
- space.notifyUserAnimationStarted(this, animationID);
+ public void playAnimation(String animationName) {
+ space.notifyUserAnimationStarted(this, animationName);
}
public String toString() {
@@ -87,22 +86,6 @@
return username;
}
- public InputStream getGeometryStream(int lodIndex) throws IOException {
- return space.getUserGeometryStream(username);
- }
-
- public InputStream getSubGeometryStream(String name) throws IOException {
- return space.getUserGeometryStream(username, name);
- }
-
- public InputStream getAnimationStream(long animationID) throws IOException {
- return space.getUserAnimationStream(username, animationID);
- }
-
- public InputStream getSkinMapStream() throws IOException {
- return space.getUserSkinMapStream(username);
- }
-
public void setPosition(Transform3D newPosition) {
position.set(newPosition);
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/BodyConstants.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/BodyConstants.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/BodyConstants.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -1,80 +1,10 @@
package com.ogoglio.util;
-import java.awt.Image;
-import java.io.InputStream;
public class BodyConstants {
- public static final String TEXTURE_RESOURCE_PATH = "avatar/";
+ public static final String DEFAULT_ANIMATION_NAME = "default";
- public static Image MALE_BASE_SKIN_TEXTURE1 = UIConstants.loadImageFromResource(TEXTURE_RESOURCE_PATH + "male1.jpg");
+ public static final String WALK_ANIMATION_NAME = "walk";
- public static Image FEMALE_BASE_SKIN_TEXTURE1 = UIConstants.loadImageFromResource(TEXTURE_RESOURCE_PATH + "female1.jpg");
-
- public static final int BASE_SKIN_TEXTURE_WIDTH = MALE_BASE_SKIN_TEXTURE1.getWidth(null);
-
- public static final int BASE_SKIN_TEXTURE_HEIGHT = MALE_BASE_SKIN_TEXTURE1.getHeight(null);
-
- public static final Image[] MALE_BASE_SKIN_TEXTURES = { MALE_BASE_SKIN_TEXTURE1 };
-
- public static final Image[] FEMALE_BASE_SKIN_TEXTURES = { FEMALE_BASE_SKIN_TEXTURE1 };
-
- public static final Image EYES_1 = UIConstants.loadImageFromResource(TEXTURE_RESOURCE_PATH + "Eyes1.gif");
-
- public static final Image EYES_2 = UIConstants.loadImageFromResource(TEXTURE_RESOURCE_PATH + "Eyes2.gif");
-
- public static final Image[] EYES = { EYES_1, EYES_2 };
-
- public static final Image NOSE_1 = UIConstants.loadImageFromResource(TEXTURE_RESOURCE_PATH + "Nose1.gif");
-
- public static final Image NOSE_2 = UIConstants.loadImageFromResource(TEXTURE_RESOURCE_PATH + "Nose2.gif");
-
- public static final Image[] NOSES = { NOSE_1, NOSE_2 };
-
- public static final Image MOUTH_1 = UIConstants.loadImageFromResource(TEXTURE_RESOURCE_PATH + "Mouth1.gif");
-
- public static final Image MOUTH_2 = UIConstants.loadImageFromResource(TEXTURE_RESOURCE_PATH + "Mouth2.gif");
-
- public static final Image[] MOUTHES = { MOUTH_1, MOUTH_2 };
-
- public static final String DEFAULT_ANIMATION_PATH = "avatar/avatar.bvh";
-
- public static final String WALK_ANIMATION_PATH = "avatar/avatar-walk.bvh";
-
- public static final String WAVE_ANIMATION_PATH = "avatar/avatar-wave.bvh";
-
- public static final String POINT_ANIMATION_PATH = "avatar/avatar-point.bvh";
-
- public static final String LAUGH_ANIMATION_PATH = "avatar/avatar-laugh.bvh";
-
- public static final String CLAP_ANIMATION_PATH = "avatar/avatar-clap.bvh";
-
- public static final String[] USER_ANIMATION_COMMANDS = { "default", "walk", "wave", "point", "laugh", "clap" };
-
- public static final String[] USER_ANIMATION_PATHS = { DEFAULT_ANIMATION_PATH, WALK_ANIMATION_PATH, WAVE_ANIMATION_PATH, POINT_ANIMATION_PATH, LAUGH_ANIMATION_PATH, CLAP_ANIMATION_PATH };
-
- public static final String MALE_AVATAR_PATH = "avatar/male.obj";
-
- public static final String MALE_SMAP_PATH = "avatar/male.smap";
-
- public static final String FEMALE_AVATAR_PATH = "avatar/female.obj";
-
- public static final String FEMALE_SMAP_PATH = "avatar/female.smap";
-
- public static InputStream getUserAnimation(int animationID) {
- if (animationID < 0 || animationID >= USER_ANIMATION_PATHS.length) {
- return null;
- }
- return UIConstants.getResource(USER_ANIMATION_PATHS[animationID]);
- }
-
- public static InputStream getUserAnimation(String command) {
- for (int i = 0; i < USER_ANIMATION_COMMANDS.length; i++) {
- if (USER_ANIMATION_COMMANDS[i].equals(command)) {
- return UIConstants.getResource(USER_ANIMATION_PATHS[i]);
- }
- }
- return null;
- }
-
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/StreamUtils.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/StreamUtils.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/StreamUtils.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -90,4 +90,14 @@
return results.toString();
}
+ public static void discardInput(InputStream input) throws IOException {
+ StringBuffer results = new StringBuffer();
+ byte[] buffer = new byte[4096];
+ int read = -1;
+ while ((read = input.read(buffer)) > 0) {
+ results.append(new String(buffer, 0, read));
+ }
+ input.close();
+ }
+
}
Added: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DBodyData.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DBodyData.java (rev 0)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DBodyData.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -0,0 +1,107 @@
+package com.ogoglio.viewer.j3d;
+
+import java.awt.image.BufferedImage;
+
+import javax.media.j3d.GeometryArray;
+import javax.media.j3d.IndexedTriangleArray;
+import javax.media.j3d.TriangleArray;
+
+import com.ogoglio.util.ArgumentUtils;
+import com.ogoglio.util.BodyConstants;
+import com.ogoglio.viewer.j3d.bvh.Bvh;
+import com.ogoglio.viewer.j3d.smap.SkinMap;
+
+public class J3DBodyData {
+ private IndexedTriangleArray bodyGeometry = null;
+
+ private Bvh[] animations = null;
+
+ private SkinMap skinMap = null;
+
+ private BufferedImage baseTexture = null;
+
+ private Bvh defaultAnimation = null;
+
+ public J3DBodyData(IndexedTriangleArray bodyGeometry, Bvh[] animations, SkinMap skinMap, BufferedImage baseTexture) {
+ ArgumentUtils.assertNotNull(bodyGeometry);
+ this.bodyGeometry = bodyGeometry;
+ ArgumentUtils.assertNotNull(animations);
+ this.animations = animations;
+ ArgumentUtils.assertNotNull(skinMap);
+ this.skinMap = skinMap;
+ ArgumentUtils.assertNotNull(baseTexture);
+ this.baseTexture = baseTexture;
+
+ for (int i = 0; i < animations.length; i++) {
+ if (animations[i].getName().equals(BodyConstants.DEFAULT_ANIMATION_NAME)) {
+ defaultAnimation = animations[i];
+ }
+ }
+ if (defaultAnimation == null) {
+ throw new IllegalStateException("Could not load default animation");
+ }
+ }
+
+ public GeometryArray cloneBodyGeometry(){
+ float[] vertexArray = bodyGeometry.getCoordRefFloat();
+
+ int[] coordinateIndices = new int[bodyGeometry.getIndexCount()];
+ bodyGeometry.getCoordinateIndices(0, coordinateIndices);
+
+ float[] textureCoordinateArray = bodyGeometry.getTexCoordRefFloat(0);
+ int[] textureCoordinateIndices = new int[bodyGeometry.getIndexCount()];
+ bodyGeometry.getTextureCoordinateIndices(0, 0, textureCoordinateIndices);
+
+ float[] normalArray = bodyGeometry.getNormalRefFloat();
+ int[] normalIndices = new int[bodyGeometry.getIndexCount()];
+ bodyGeometry.getNormalIndices(0, normalIndices);
+
+ IndexedTriangleArray array = new IndexedTriangleArray(vertexArray.length / 3, TriangleArray.COORDINATES | TriangleArray.NORMALS | TriangleArray.TEXTURE_COORDINATE_2 | TriangleArray.BY_REFERENCE, coordinateIndices.length);
+ array.setCoordRefFloat((float[])vertexArray.clone()); //we clone so that we can mess with individual bodies during animation
+ array.setCoordinateIndices(0, coordinateIndices);
+ array.setTextureCoordinateIndices(0, 0, textureCoordinateIndices);
+ array.setTexCoordRefFloat(0, textureCoordinateArray);
+ array.setNormalIndices(0, normalIndices);
+ array.setNormalRefFloat(normalArray);
+
+ array.setCapability(GeometryArray.ALLOW_COORDINATE_READ);
+ array.setCapability(GeometryArray.ALLOW_COORDINATE_WRITE);
+ array.setCapability(GeometryArray.ALLOW_INTERSECT);
+ array.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
+ return array;
+ }
+
+ public GeometryArray getBodyGeometry() {
+ return bodyGeometry;
+ }
+
+ public void cleanup() {
+ bodyGeometry = null;
+ animations = null;
+ skinMap = null;
+ baseTexture = null;
+ }
+
+ public Bvh[] getAnimations() {
+ if(animations == null){
+ throw new IllegalStateException("Body has been cleaned");
+ }
+ return animations;
+ }
+
+ public SkinMap getSkinMap() {
+ return skinMap;
+ }
+
+ public BufferedImage getBaseTexture() {
+ return baseTexture;
+ }
+
+ public String toString() {
+ return "BodyData (" + bodyGeometry + ", " + skinMap + ", " + baseTexture + ")";
+ }
+
+ public Bvh getDefaultAnimation() {
+ return defaultAnimation;
+ }
+}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataCache.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataCache.java 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataCache.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -17,17 +17,27 @@
public class J3DDataCache {
- private HashMap templateDataMap = new HashMap(); //maps template guid to GeometryCacheEntry objects
+ private HashMap bodyDataMap = new HashMap(); //maps body names to J3DBodyData objects
+
+ private HashMap templateDataMap = new HashMap(); //maps template guid to J3DTemplateData objects
public J3DTemplateData getTemplateData(long templateID, int lod) {
- return (J3DTemplateData) templateDataMap.get(createGUID(templateID, lod));
+ return (J3DTemplateData) templateDataMap.get(createTemplateGUID(templateID, lod));
}
+ public void putBodyData(String bodyName, J3DBodyData data){
+ bodyDataMap.put(bodyName, data);
+ }
+
+ public J3DBodyData getBodyData(String bodyName){
+ return (J3DBodyData)bodyDataMap.get(bodyName);
+ }
+
public void putTemplateData(long templateID, int lod, J3DTemplateData entry) {
- templateDataMap.put(createGUID(templateID, lod), entry);
+ templateDataMap.put(createTemplateGUID(templateID, lod), entry);
}
- private String createGUID(long id, int lod){
+ private String createTemplateGUID(long id, int lod){
return id + "-" + lod;
}
@@ -48,5 +58,13 @@
for (int i = 0; i < data.length; i++) {
data[i].cleanup();
}
+ J3DBodyData[] bodiesData = getAllBodyData();
+ for (int i = 0; i < bodiesData.length; i++) {
+ bodiesData[i].cleanup();
+ }
}
+
+ private J3DBodyData[] getAllBodyData() {
+ return (J3DBodyData[])bodyDataMap.values().toArray(new J3DBodyData[0]);
+ }
}
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 2007-09-27 18:06:34 UTC (rev 445)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java 2007-09-27 18:06:43 UTC (rev 446)
@@ -1,36 +1,54 @@
package com.ogoglio.viewer.j3d;
import java.awt.Image;
+import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.util.HashMap;
import java.util.Vector;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
import javax.imageio.ImageIO;
import javax.media.j3d.Appearance;
import javax.media.j3d.Geometry;
import javax.media.j3d.GeometryArray;
import javax.media.j3d.ImageComponent;
+import javax.media.j3d.IndexedTriangleArray;
import javax.media.j3d.Material;
import javax.media.j3d.RenderingAttributes;
import javax.media.j3d.Texture;
import javax.media.j3d.TextureAttributes;
import javax.media.j3d.TransparencyAttributes;
+import javax.media.j3d.TriangleArray;
import javax.vecmath.Color3f;
import javax.vecmath.Point3f;
import javax.vecmath.TexCoord2f;
+import javax.vecmath.Vector3f;
-import com.ogoglio.client.model.GeometryProvider;
+import com.ogoglio.client.model.BodyDataProvider;
+import com.ogoglio.client.model.Template;
+import com.ogoglio.client.model.TemplateDataProvider;
+import com.ogoglio.util.ArgumentUtils;
+import com.ogoglio.util.LimitedInputStream;
import com.ogoglio.util.Log;
+import com.ogoglio.util.StreamUtils;
+import com.ogoglio.util.UIConstants;
+import com.ogoglio.viewer.j3d.bvh.Bvh;
+import com.ogoglio.viewer.j3d.bvh.BvhParseException;
+import com.ogoglio.viewer.j3d.bvh.BvhParser;
import com.ogoglio.viewer.j3d.obj.Obj;
import com.ogoglio.viewer.j3d.obj.ObjMtl;
import com.ogoglio.viewer.j3d.obj.ObjParseException;
import com.ogoglio.viewer.j3d.obj.ObjParser;
+import com.ogoglio.viewer.j3d.smap.SkinMap;
+import com.ogoglio.viewer.j3d.smap.SkinMapParseException;
+import com.ogoglio.viewer.j3d.smap.SkinMapParser;
import com.sun.j3d.utils.geometry.GeometryInfo;
import com.sun.j3d.utils.geometry.NormalGenerator;
-import com.sun.j3d.utils.geometry.Stripifier;
import com.sun.j3d.utils.image.TextureLoader;
public class J3DDataManager {
@@ -50,21 +68,138 @@
DEFAULT_APPEARANCE.setMaterial(DEFAULT_MATERIAL);
}
- private GeometryProvider errorGeometryProvider = null;
+ public static final String[] BODY_NAMES = { "mike", "andrea" };
+ private TemplateDataProvider templateDataProvider = null;
+
+ private BodyDataProvider bodyDataProvider = null;
+
private J3DDataCache dataCache = new J3DDataCache();
private boolean loadAppearances = true;
private boolean complainedAboutMemory = false;
-
- public J3DDataManager(boolean loadAppearances, GeometryProvider errorGeometryProvider) {
+
+ public J3DDataManager(boolean loadAppearances, TemplateDataProvider templateDataProvider, BodyDataProvider bodyDataProvider) {
this.loadAppearances = loadAppearances;
- this.errorGeometryProvider = errorGeometryProvider;
+ this.templateDataProvider = templateDataProvider;
+ this.bodyDataProvider = bodyDataProvider;
}
- public J3DTemplateData[] getTemplateData(long templateID, GeometryProvider geoProvider, boolean useCache) {
- J3DTemplateData[] results = new J3DTemplateData[GeometryProvider.LOD_DISTANCES.length + 1];
+ public J3DBodyData getBodyData(String bodyName) {
+ J3DBodyData data = dataCache.getBodyData(bodyName);
+ if (data != null) {
+ return data;
+ }
+
+ ZipInputStream bodyDataInput = bodyDataProvider.getBodyData(bodyName);
+ if (bodyDataInput == null) {
+ throw new IllegalStateException("Trevor didn't implement an error body for an unknown body name");
+ }
+
+ J3DBodyData bodyData = readBodyData(bodyDataInput);
+ if (bodyData == null) {
+ throw new IllegalStateException("Trevor didn't implement an error body for an illegible body");
+ }
+ dataCache.putBodyData(bodyName, bodyData);
+ return bodyData;
+ }
+
+ private J3DBodyData readBodyData(ZipInputStream bodyDataStream) {
+ IndexedTriangleArray array = null;
+ SkinMap skinMap = null;
+ Vector animations = new Vector();
+ BufferedImage baseTexture = null;
+ try {
+ ZipEntry entry = null;
+ while ((entry = bodyDataStream.getNextEntry()) != null) {
+ LimitedInputStream entryStream = new LimitedInputStream(bodyDataStream, (int) entry.getSize());
+ if (entry.getName().equals("geometry/body.obj")) {
+ ObjParser parser = new ObjParser(entryStream);
+ Obj bodyObj = parser.parse();
+ array = generateBodyGeometry(bodyObj);
+ } else if (entry.getName().equals("geometry/body.smap")) {
+ SkinMapParser parser = new SkinMapParser(entryStream);
+ skinMap = parser.parse();
+ } else if (entry.getName().startsWith("animation/") && entry.getName().indexOf(".bvh") != -1) {
+ String name = entry.getName().substring("animation/".length(), entry.getName().length() - 4);
+ BvhParser parser = new BvhParser(name, entryStream);
+ animations.add(parser.parse());
+ } else if (entry.getName().equals("texture/body.jpg")) {
+ baseTexture = ImageIO.read(entryStream);
+ } else { //discard the data
+ StreamUtils.discardInput(new LimitedInputStream(bodyDataStream, (int) entry.getSize()));
+ }
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException("Trevor didn't implement an error body: " + e);
+ } catch (ObjParseException e) {
+ throw new IllegalStateException("Trevor didn't implement an error body: " + e);
+ } catch (SkinMapParseException e) {
+ throw new IllegalStateException("Trevor didn't implement an error body: " + e);
+ } catch (BvhParseException e) {
+ throw new IllegalStateException("Trevor didn't implement an error body: " + e);
+ }
+
+ return new J3DBodyData(array, (Bvh[]) animations.toArray(new Bvh[0]), skinMap, baseTexture);
+ }
+
+ private IndexedTriangleArray generateBodyGeometry(Obj obj) {
+ int indicesTotal = obj.faceCount() * 3;
+ int[] coordinateIndices = new int[indicesTotal];
+ int[] normalIndices = new int[indicesTotal];
+ int[] textureCoordinateIndices = new int[indicesTotal];
+ int cIndex = 0;
+ for (int i = 0; i < obj.faceCount(); i++) {
+ int[][] indices = obj.getFaceIndices(i + 1);
+ for (int j = 0; j < indices.length; j++) {
+ coordinateIndices[cIndex] = indices[j][0] - 1;
+ textureCoordinateIndices[cIndex] = indices[j][1] - 1;
+ normalIndices[cIndex] = indices[j][2] - 1;
+ cIndex++;
+ }
+ }
+
+ Point3f[] vertices = obj.getVertices();
+ float[] vertexArray = new float[vertices.length * 3];
+ for (int i = 0; i < vertices.length; i++) {
+ vertexArray[i * 3] = vertices[i].x;
+ vertexArray[(i * 3) + 1] = vertices[i].y;
+ vertexArray[(i * 3) + 2] = vertices[i].z;
+ }
+
+ Point3f[] texCoords = obj.getTextureVertices();
+ float[] textureCoordinateArray = new float[texCoords.length * 2];
+ for (int i = 0; i < texCoords.length; i++) {
+ textureCoordinateArray[i * 2] = texCoords[i].x;
+ textureCoordinateArray[(i * 2) + 1] = texCoords[i].y;
+ }
+
+ float[] normalArray = new float[obj.normalCount() * 3];
+ Vector3f[] normals = obj.getNormals();
+ for (int i = 0; i < normals.length; i++) {
+ normalArray[i * 3] = normals[i].x;
+ normalArray[(i * 3) + 1] = normals[i].y;
+ normalArray[(i * 3) + 1] = normals[i].z;
+ }
+
+ IndexedTriangleArray array = new IndexedTriangleArray(vertices.length, TriangleArray.COORDINATES | TriangleArray.NORMALS | TriangleArray.TEXTURE_COORDINATE_2 | TriangleArray.BY_REFERENCE, indicesTotal);
+ array.setCoordRefFloat(vertexArray);
+ array.setCoordinateIndices(0, coordinateIndices);
+ array.setTextureCoordinateIndices(0, 0, textureCoordinateIndices);
+ array.setTexCoordRefFloat(0, textureCoordinateArray);
+ array.setNormalIndices(0, normalIndices);
+ array.setNormalRefFloat(normalArray);
+
+ array.setCapability(GeometryArray.ALLOW_COORDINATE_READ);
+ array.setCapability(GeometryArray.ALLOW_COORDINATE_WRITE);
+ array.setCapability(GeometryArray.ALLOW_INTERSECT);
+ array.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
+ return array;
+ }
+
+ public J3DTemplateData[] getTemplateData(String username, long templateID, boolean useCache) {
+ J3DTemplateData[] results = new J3DTemplateData[Template.LOD_DISTANCES.length + 1];
if (useCache) {
boolean hitCache = false;
for (int i = 0; i < results.length; i++) {
@@ -76,7 +211,7 @@
}
}
- fetchTemplateData(templateID, geoProvider, results);
+ fetchTemplateData(username, templateID, results);
for (int i = 0; i < results.length; i++) {
if (results[i] == null) {
continue;
@@ -87,8 +222,11 @@
return results;
}
- private void fetchTemplateData(long templateID, GeometryProvider geoProvider, J3DTemplateData[] results) {
- Obj[] objs = getObjs(geoProvider, templateID);
+ private void fetchTemplateData(String username, long templateID, J3DTemplateData[] results) {
+ ArgumentUtils.assertNotNull(username);
+ ArgumentUtils.assertNotNegative(templateID);
+
+ Obj[] objs = getObjs(username, templateID);
HashMap textures = new HashMap();
for (int i = 0; i < objs.length; i++) {
@@ -99,16 +237,16 @@
Obj.Group[] groups = objs[i].getGroups();
for (int g = 0; g < groups.length; g++) {
- Geometry geometry = generateGeometry(geoProvider, groups[g]);
+ Geometry geometry = generateTemplateGeometry(groups[g]);
results[i].putGeometry(groups[g].getName(), geometry);
- Appearance appearance = generateAppearance(geoProvider, groups[g], textures);
+ Appearance appearance = generateTemplateAppearance(username, templateID, groups[g], textures);
results[i].putAppearances(groups[g].getName(), appearance);
}
}
textures.clear();
}
- private Geometry generateGeometry(GeometryProvider geoProvider, Obj.Group group) {
+ private Geometry generateTemplateGeometry(Obj.Group group) {
//TODO consider a more memory efficient way to load shapes
Obj.Range[] ranges = group.getRanges();
if (ranges.length == 0) {
@@ -187,11 +325,11 @@
return faceIndices.length;
}
- private Appearance generateAppearance(GeometryProvider geoProvider, Obj.Group group, HashMap textures) {
+ private Appearance generateTemplateAppearance(String username, long templateID, Obj.Group group, HashMap textures) {
if (!loadAppearances) {
return DEFAULT_APPEARANCE;
}
-
+
Obj.Range[] ranges = group.getRanges();
ObjMtl.Material material = group.getObj().getMaterialForFace(ranges[0].getLower());
if (material == null) {
@@ -229,7 +367,7 @@
Texture texImage = (Texture) textures.get(material.getDiffuseMapName());
if (texImage == null) {
- InputStream imageStream = geoProvider.getSubGeometryStream(material.getDiffuseMapName(...
[truncated message content] |