|
From: <tre...@us...> - 2008-02-06 01:20:14
|
Revision: 710
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=710&view=rev
Author: trevorolio
Date: 2008-02-05 17:20:17 -0800 (Tue, 05 Feb 2008)
Log Message:
-----------
Added the back end and 3D rendering of attachment geometries and appearances, but not yet morphs or skin textures.
Also no example UI for picking attachments in the body editor, yet.
The "time to private parts" for Ogoglio starts now.
Modified Paths:
--------------
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/model/BodyConfiguration.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/j3d/J3DUserRenderable.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/MorphDeltaMap.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/MorphDeltaMapParser.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/Skeleton.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/obj/Obj.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/BodyConfigurationDocument.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/TemplateDocument.java
maven/trunk/ogoglio-common/src/test/java/com/ogoglio/xml/test/XMLTest.java
Added Paths:
-----------
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Attachment.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DAttachment.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/AttachmentDocument.java
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 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/SpaceClient.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -26,6 +26,7 @@
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
+import com.ogoglio.client.model.Attachment;
import com.ogoglio.client.model.BodyConfiguration;
import com.ogoglio.client.model.BodyDataProvider;
import com.ogoglio.client.model.Door;
@@ -47,8 +48,10 @@
import com.ogoglio.util.Log;
import com.ogoglio.util.WebConstants;
import com.ogoglio.xml.AccountDocument;
+import com.ogoglio.xml.AttachmentDocument;
import com.ogoglio.xml.BodyConfigurationDocument;
import com.ogoglio.xml.BodyDataDocument;
+import com.ogoglio.xml.BodySettingDocument;
import com.ogoglio.xml.DoorDocument;
import com.ogoglio.xml.PageDocument;
import com.ogoglio.xml.ShapeDocument;
@@ -182,7 +185,7 @@
} else {
bodyConfDoc = webClient.getBodyConfiguration(userDocs[i].getUsername(), userDocs[i].getBodyConfigurationID());
}
- BodyConfiguration bodyConfig = new BodyConfiguration(bodyConfDoc);
+ BodyConfiguration bodyConfig = createBodyConfiguration(bodyConfDoc);
Thing seatThing = null;
if (userDocs[i].getSeatThingID() != -1) {
seatThing = space.getThing(userDocs[i].getSeatThingID());
@@ -214,6 +217,31 @@
messenger.stopWaiting();
}
+ public BodyConfiguration createBodyConfiguration(BodyConfigurationDocument configDoc) {
+ BodyConfiguration config = new BodyConfiguration(configDoc.getBodyConfigurationID(), configDoc.getDisplayName(), configDoc.getBodyDataID(), configDoc.getBaseTextureName());
+ BodySettingDocument[] settingDocs = configDoc.getBodySettingDocuments();
+ for (int i = 0; i < settingDocs.length; i++) {
+ config.addSetting(settingDocs[i].getSettingName(), settingDocs[i].getSetting());
+ }
+ AttachmentDocument[] attachmentDocs = configDoc.getAttachmentDocuments();
+ for (int i = 0; i < attachmentDocs.length; i++) {
+ Template template = space.getTemplate(attachmentDocs[i].getTemplateID());
+ if (template == null) {
+ try {
+ TemplateDocument templateDoc = webClient.getTemplateDocument(attachmentDocs[i].getTemplateOwner(), attachmentDocs[i].getTemplateID());
+ template = new Template(templateDoc);
+ space.addTemplate(template);
+ } catch (IOException e) {
+ System.err.println("Could not find template for attachment: " + attachmentDocs[i].getTemplateID());
+ continue;
+ }
+ }
+ Attachment attachment = new Attachment(attachmentDocs[i].getAttachmentID(), template, config);
+ config.addAttachment(attachment);
+ }
+ return config;
+ }
+
public void mouseClickedUser(User user, Point3d intersection) {
Log.warn("SpaceClient ignoring user click");
}
@@ -352,7 +380,8 @@
SpaceEvent event = ((PayloadFactory.SpaceEventPayload) message.getPayload()).getSpaceEvent();
if (SpaceEvent.ADD_USER_EVENT.equals(event.getName())) {
BodyConfigurationDocument bodyConfigDoc = event.getBodyConfigurationDocument();
- BodyConfiguration bodyConfig = new BodyConfiguration(bodyConfigDoc);
+ BodyConfiguration bodyConfig = null;
+ bodyConfig = createBodyConfiguration(bodyConfigDoc);
String role = event.getStringProperty(SpaceEvent.USER_ROLE);
String voiceURI = event.getStringProperty(SpaceEvent.VOICE_URI);
String textURI = event.getStringProperty(SpaceEvent.TEXT_URI);
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 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -301,7 +301,7 @@
}
public TemplateDocument createTemplate(String templateName) throws IOException {
- TemplateDocument templateDoc = new TemplateDocument(-1, templateName, authenticator.getUsername(), null, null, false, 0, 0, 0, 1, 0, 0, 0);
+ TemplateDocument templateDoc = new TemplateDocument(-1, templateName, authenticator.getUsername(), null, null, false, false, 0, 0, 0, 1, 0, 0, 0);
XMLElement templateXML = wire.postAuthenticatedXML(descriptor.getTemplatesURI(authenticator.getUsername()), templateDoc.toString(), authenticator.getAuthCookie());
return new TemplateDocument(templateXML);
}
Added: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Attachment.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Attachment.java (rev 0)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/Attachment.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -0,0 +1,35 @@
+package com.ogoglio.client.model;
+
+import com.ogoglio.util.ArgumentUtils;
+
+public class Attachment {
+
+ private long attachmentID = -1;
+
+ private Template template = null;
+
+ private BodyConfiguration bodyConfiguration = null;
+
+ public Attachment(long attachmentID, Template template, BodyConfiguration bodyConfiguration){
+ ArgumentUtils.assertNotNegative(attachmentID);
+ this.attachmentID = attachmentID;
+ ArgumentUtils.assertNotNull(template);
+ this.template = template;
+ ArgumentUtils.assertNotNull(bodyConfiguration);
+ this.bodyConfiguration = bodyConfiguration;
+ }
+
+ public long getAttachmentID() {
+ return attachmentID;
+ }
+
+ public Template getTemplate() {
+ return template;
+ }
+
+ public BodyConfiguration getBodyConfiguration() {
+ return bodyConfiguration;
+ }
+
+
+}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyConfiguration.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyConfiguration.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyConfiguration.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -1,8 +1,10 @@
package com.ogoglio.client.model;
import java.util.HashMap;
+import java.util.Vector;
import com.ogoglio.util.ArgumentUtils;
+import com.ogoglio.xml.AttachmentDocument;
import com.ogoglio.xml.BodyConfigurationDocument;
import com.ogoglio.xml.BodySettingDocument;
@@ -20,13 +22,7 @@
private HashMap settings = new HashMap();
- public BodyConfiguration(BodyConfigurationDocument configDoc) {
- this(configDoc.getBodyConfigurationID(), configDoc.getDisplayName(), configDoc.getBodyDataID(), configDoc.getBaseTextureName());
- BodySettingDocument[] settingDocs = configDoc.getBodySettingDocuments();
- for (int i = 0; i < settingDocs.length; i++) {
- addSetting(settingDocs[i].getSettingName(), settingDocs[i].getSetting());
- }
- }
+ private Vector attachments = new Vector();
public BodyConfiguration(long bodyConfigurationID, String displayName, long bodyDataID, String baseTextureName) {
ArgumentUtils.assertNotNegative(bodyConfigurationID);
@@ -37,6 +33,25 @@
this.baseTextureName = baseTextureName;
}
+ public Attachment[] getAttachments(){
+ return (Attachment[])attachments.toArray(new Attachment[0]);
+ }
+
+ public void addAttachment(Attachment attachment){
+ attachments.add(attachment);
+ }
+
+ public Attachment removeAttachment(long attachmentID){
+ Attachment[] as = getAttachments();
+ for (int i = 0; i < as.length; i++) {
+ if(as[i].getAttachmentID() == attachmentID){
+ attachments.remove(as[i]);
+ return as[i];
+ }
+ }
+ return null;
+ }
+
public void setUser(User user) {
ArgumentUtils.assertNotNull(user);
this.user = user;
Added: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DAttachment.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DAttachment.java (rev 0)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DAttachment.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -0,0 +1,102 @@
+package com.ogoglio.viewer.j3d;
+
+import java.util.Vector;
+
+import javax.media.j3d.Appearance;
+import javax.media.j3d.Geometry;
+import javax.media.j3d.Shape3D;
+import javax.media.j3d.Transform3D;
+import javax.vecmath.Point3f;
+import javax.vecmath.Vector3f;
+
+import com.ogoglio.client.model.Attachment;
+import com.ogoglio.util.Log;
+import com.ogoglio.viewer.j3d.body.Skeleton;
+
+public class J3DAttachment {
+
+ private Attachment attachment = null;
+
+ private Vector skeletonAttachments = new Vector();
+
+ private Skeleton skeleton = null;
+
+ public J3DAttachment(Attachment attachment, J3DDataManager dataManager) {
+ this.attachment = attachment;
+
+ J3DTemplateData[] templateDataList = dataManager.getTemplateData(attachment.getTemplate().getOwnerUsername(), attachment.getTemplate().getTemplateID(), true);
+ J3DTemplateData templateData = null;
+ for (int j = 0; j < templateDataList.length; j++) {
+ if (templateDataList[j] != null) {
+ templateData = templateDataList[j];
+ break;
+ }
+ }
+
+ if (templateData == null) {
+ Log.warn("Could not load template data for attachment " + attachment.getAttachmentID());
+ return;
+ }
+
+ String[] shapeNames = templateData.getShapeNames();
+ for (int j = 0; j < shapeNames.length; j++) {
+ Geometry geometry = templateData.getGeometry(shapeNames[j]);
+ Skeleton.Attachment boneAttachment = new Skeleton.Attachment();
+ Shape3D shape = new Shape3D(geometry);
+ Appearance appearance = templateData.getAppearance(shapeNames[j]);
+ if (appearance != null) {
+ shape.setAppearance(appearance);
+ }
+ boneAttachment.addChild(shape);
+ boneAttachment.setUserData(shapeNames[j]);
+ skeletonAttachments.add(boneAttachment);
+ }
+ }
+
+ public Attachment getAttachment(){
+ return attachment;
+ }
+
+ public Skeleton.Attachment[] getSkeletonAttachments() {
+ return (Skeleton.Attachment[]) skeletonAttachments.toArray(new Skeleton.Attachment[0]);
+ }
+
+ public void detach() {
+ if (skeleton == null) {
+ return;
+ }
+ Skeleton.Attachment[] sAttachments = getSkeletonAttachments();
+ for (int i = 0; i < sAttachments.length; i++) {
+ String shapeName = (String) sAttachments[i].getUserData();
+ Skeleton.Bone bone = skeleton.getRootBone().getBone(shapeName);
+ if(bone != null){
+ bone.removeChild(sAttachments[i]);
+ }
+ }
+ skeleton = null;
+ }
+
+ public void attach(Skeleton skeleton) {
+ if (skeleton == this.skeleton) {
+ return;
+ }
+ detach();
+
+ this.skeleton = skeleton;
+ Skeleton.Attachment[] sAttachments = getSkeletonAttachments();
+ for (int i = 0; i < sAttachments.length; i++) {
+ String shapeName = (String) sAttachments[i].getUserData();
+ Skeleton.Bone bone = skeleton.getRootBone().getBone(shapeName);
+ if (bone == null) {
+ Log.warn("Could not find a bone for attachment shape " + shapeName + ", ignoring.");
+ continue;
+ }
+ Transform3D boneTransform = new Transform3D();
+ Point3f cumulativeOffset = bone.getCumulativeOffset();
+ boneTransform.setTranslation(new Vector3f(-cumulativeOffset.x, -cumulativeOffset.y, -cumulativeOffset.z));
+ sAttachments[i].setTransform(boneTransform);
+
+ bone.addAttachment(sAttachments[i]);
+ }
+ }
+}
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-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -325,7 +325,6 @@
return results;
}
}
-
fetchTemplateData(username, templateID, results);
for (int i = 0; i < results.length; i++) {
if (results[i] == null) {
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-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -17,30 +17,33 @@
import java.awt.GraphicsConfigTemplate;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
-import java.awt.event.MouseWheelEvent;
-import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
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;
+import com.ogoglio.client.model.Attachment;
import com.ogoglio.client.model.BodyConfiguration;
import com.ogoglio.client.model.BodyDataProvider;
import com.ogoglio.client.model.Door;
@@ -54,8 +57,8 @@
import com.ogoglio.client.model.User;
import com.ogoglio.util.BodyConstants;
import com.ogoglio.util.Log;
-import com.ogoglio.util.UIConstants;
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;
@@ -128,7 +131,7 @@
setCapabilities(sceneRoot);
setCapabilities(usersGroup);
setCapabilities(worldGroup);
- GraphicsConfiguration graphicsConfig = getGraphicsConfiguration(this.offScreen);
+ GraphicsConfiguration graphicsConfig = getGraphicsConfiguration(offScreen);
if (graphicsConfig == null) {
throw new IllegalStateException("Cannot create a 3D graphics configuration.");
}
@@ -216,7 +219,7 @@
sceneRoot.addChild(background);
if (!offScreen && getSpace().shouldDisplaySea()) {
- //TODO ideally this would be infinite in percieved size
+ //TODO ideally this would be infinite in size
float sideLength = 2500;
int divisions = (int) Math.min(20, sideLength / 100);
water = new J3DWater(sideLength, divisions, 2, 0);
@@ -697,10 +700,16 @@
customSkin = dataManager.getBodyTexture(user.getUsername(), bodyConfig.getBodyConfigurationID());
}
- boolean isLocalUser = !offScreen && username != null && user.getUsername().equals(username);
final J3DUserRenderable renderable = new J3DUserRenderable(user, bodyData, customSkin);
renderable.setID(USER_ID_PREFIX + user.getUsername());
+ if (offScreen) {
+ return renderable;
+ }
+
+ //NOTE: BELOW HERE SHOULD BE ONLY ON-SCREEN BLING LIKE CAMERAS, NAME TAGS, AND ATTACHMENTS
+
+ boolean isLocalUser = username != null && user.getUsername().equals(username);
if (isLocalUser) {
float cameraHeight = (float) (renderable.getHeight() - renderable.getHeight() / 5);
camera.setDefaultLocation(0, 0, 0);
@@ -711,7 +720,7 @@
getCanvas().addMouseListener(motionHandler);
getCanvas().addMouseMotionListener(motionHandler);
getCanvas().addMouseWheelListener(motionHandler);
- } else if (!offScreen) {
+ } else {
String displayName = user.getUsername();
if (displayName.startsWith(WebConstants.GUEST_COOKIE_PREFIX)) {
displayName = J3DUserRenderable.convertGuestCookieToDisplayName(displayName);
@@ -719,6 +728,11 @@
renderable.setNameTag(displayName);
}
+ Attachment[] attachments = bodyConfig.getAttachments();
+ for (int i = 0; i < attachments.length; i++) {
+ J3DAttachment j3dAttachment = new J3DAttachment(attachments[i], dataManager);
+ renderable.attach(j3dAttachment);
+ }
return renderable;
}
@@ -848,7 +862,7 @@
public boolean completedInitialLoad() {
return completedInitialLoad;
}
-
+
public static void getEuler(Quat4d quat, Vector3d euler) {
double heading = 0, bank = 0, attitude = 0;
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -16,6 +16,7 @@
import java.awt.Font;
import java.awt.image.BufferedImage;
+import java.util.Vector;
import java.util.regex.Pattern;
import javax.media.j3d.Billboard;
@@ -79,6 +80,8 @@
private boolean playDefaultAnimationWhenComplete = true;
private J3DCameraMotionBehavior cameraBehavior = null;
+
+ private Vector attachments = new Vector();
public J3DUserRenderable(User user, J3DBodyData bodyData, BufferedImage customSkin) {
ArgumentUtils.assertNotNull(user);
@@ -306,4 +309,16 @@
public J3DCameraMotionBehavior getCameraBehavior() {
return cameraBehavior;
}
+
+ public Skeleton getSkeleton() {
+ return skeleton;
+ }
+
+ public void attach(J3DAttachment attachment) {
+ if(attachments.contains(attachment)){
+ return;
+ }
+ attachments.add(attachment);
+ attachment.attach(skeleton);
+ }
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/MorphDeltaMap.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/MorphDeltaMap.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/MorphDeltaMap.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -30,6 +30,9 @@
public MorphDeltaMap(String name, String parentName) {
this.name = name;
+ if(parentName != null && parentName.length() == 0){
+ parentName = null;
+ }
this.parentName = parentName;
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/MorphDeltaMapParser.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/MorphDeltaMapParser.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/MorphDeltaMapParser.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -63,8 +63,8 @@
}
private void parseParentName(String[] tokens) throws MorphDeltaMapParseException {
- if(tokens.length < 2){
- throw new MorphDeltaMapParseException("Bad parent name definition: " + LineTokenizer.toString(tokens));
+ if(tokens.length == 1){
+ return;
}
parentName = LineTokenizer.toString(tokens, 1);
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/Skeleton.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/Skeleton.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/Skeleton.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -162,6 +162,18 @@
setTransform(workingTransform);
}
+ public Point3f getCumulativeOffset() {
+ Point3f result = new Point3f(offset.x, offset.y, offset.z);
+ Bone parent = getParentBone();
+ while(parent != null){
+ result.x += parent.getOffset().x;
+ result.y += parent.getOffset().y;
+ result.z += parent.getOffset().z;
+ parent = parent.getParentBone();
+ }
+ return result;
+ }
+
}
public void print(Bone bone) {
Modified: 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/body/SkinLoader.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/SkinLoader.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -25,8 +25,10 @@
public class SkinLoader {
- public static final float AVATAR_SIZE = 2; //this will eventually be changable
+ public static final float AVATAR_SIZE = 2; //this will eventually be mutable
+ public static final float ANIMATION_Y_SHIFT = -1.2772343f; //this is the offset to place a human hip at the origin (usually) for standard BVH files
+
private GeometryArray geometry = null;
private BufferedImage baseImage;
@@ -61,37 +63,6 @@
}
public Skin generateSkin(J3DUserRenderable userRenderable) {
- float[] vertices = geometry.getCoordRefFloat();
-
- float maxY = Float.MIN_VALUE;
- float minY = Float.MAX_VALUE;
- for (int i = 1; i < vertices.length; i += 3) {
- if (vertices[i] < minY) {
- minY = vertices[i];
- }
- if (vertices[i] > maxY) {
- maxY = vertices[i];
- }
- }
- float heightScale = AVATAR_SIZE / Math.abs(maxY - minY);
- if (Math.abs(heightScale) > 0.001) {
- for (int i = 0; i < vertices.length - 2; i += 3) {
- vertices[i] = vertices[i] * heightScale;
- vertices[i + 1] = vertices[i + 1] * heightScale;
- vertices[i + 2] = vertices[i + 2] * heightScale;
- }
- }
-
- minY = Float.MAX_VALUE;
- for (int i = 1; i < vertices.length; i += 3) {
- if (vertices[i] < minY) {
- minY = vertices[i];
- }
- }
- float yChange = (float) -1.2772343 - minY;
- for (int i = 0; i < vertices.length - 2; i += 3) {
- vertices[i + 1] = vertices[i + 1] + yChange;
- }
Skin skin = new Skin(baseImage, morphDeltaMaps, bodyConfiguration, userRenderable);
skin.setGeometry(geometry);
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/obj/Obj.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/obj/Obj.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/obj/Obj.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -67,7 +67,13 @@
private ObjMtl mtl = null;
public void writeObj(Writer writer) throws IOException {
- writer.write("# created by Ogoglio Obj library\n");
+ writer.write("# created by Ogoglio Obj library: http://ogoglio.com/\n");
+ writer.write("# num vertices: " + getVertices().length + "\n");
+ writer.write("# num faces: " + faces.size() + "\n");
+ writer.write("# num groups: " + getGroups().length + "\n");
+ writer.write("# num smoothing groups: " + getSmoothingGroups().length + "\n");
+ writer.write("# num material groups: " + getMaterialGroups().length + "\n");
+
if (mtl != null) {
writer.write("mtllib " + mtl.getResourceName() + "\n");
}
@@ -92,7 +98,6 @@
int[][] materialRangeStarts = getRangeStarts(getMaterialGroups());
for (int i = 1; i <= faces.size(); i++) {
-
for (int j = 0; j < groupRangeStarts.length; j++) {
if(groupRangeStarts[j][0] == i) {
writer.write("g " + getGroup(groupRangeStarts[j][1]).getName() + "\n");
@@ -132,6 +137,7 @@
}
writer.write("\n");
}
+ writer.flush();
}
/**
Added: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/AttachmentDocument.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/AttachmentDocument.java (rev 0)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/AttachmentDocument.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -0,0 +1,62 @@
+package com.ogoglio.xml;
+
+import nanoxml.XMLElement;
+
+import com.ogoglio.util.ArgumentUtils;
+
+public class AttachmentDocument {
+
+ public static final String NAME = "attachment";
+
+ public static final String ATTACHMENT_ID = "attachmentid";
+
+ public static final String TEMPLATE_ID = "templateid";
+
+ public static final String TEMPLATE_OWNER = "templateowner";
+
+ public static final String BODY_CONFIGURATION_ID = "bodyconfigurationid";
+
+ public XMLElement data = null;
+
+ public AttachmentDocument(long attachmentID, String templateOwner, long templateID, long bodyConfigurationID) {
+ data = new XMLElement(NAME);
+ data.setAttribute(ATTACHMENT_ID, attachmentID);
+ ArgumentUtils.assertNotEmpty(templateOwner);
+ data.setAttribute(TEMPLATE_OWNER, templateOwner);
+ ArgumentUtils.assertNotNegative(templateID);
+ data.setAttribute(TEMPLATE_ID, templateID);
+ ArgumentUtils.assertNotNegative(bodyConfigurationID);
+ data.setAttribute(BODY_CONFIGURATION_ID, bodyConfigurationID);
+ }
+
+ public AttachmentDocument(XMLElement data) {
+ if (!NAME.equals(data.getName())) {
+ throw new IllegalArgumentException("data is not named " + NAME + ": " + data);
+ }
+ this.data = data;
+ }
+
+ public long getAttachmentID() {
+ return data.getLongAttribute(ATTACHMENT_ID);
+ }
+
+ public long getTemplateID() {
+ return data.getLongAttribute(TEMPLATE_ID);
+ }
+
+ public String getTemplateOwner() {
+ return data.getStringAttribute(TEMPLATE_OWNER);
+ }
+
+ public long getBodyConfigurationID() {
+ return data.getLongAttribute(BODY_CONFIGURATION_ID);
+ }
+
+ public XMLElement toElement() {
+ return data;
+ }
+
+ public String toString() {
+ return data.toString();
+ }
+}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/BodyConfigurationDocument.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/BodyConfigurationDocument.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/BodyConfigurationDocument.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -41,7 +41,7 @@
data.setAttribute(OWNER_USERNAME, ownerUsername);
ArgumentUtils.assertNotNull(displayName);
data.setAttribute(DISPLAY_NAME, displayName);
- data.setAttribute(BODY_DATA_ID, bodyDataID); //if -1, indicates to use the guest body
+ data.setAttribute(BODY_DATA_ID, bodyDataID); // -1 indicates to use the guest body
if(baseTextureName != null){
data.setAttribute(BASE_TEXTURE_NAME, baseTextureName);
}
@@ -117,6 +117,31 @@
return results;
}
+ public AttachmentDocument[] getAttachmentDocuments() {
+ XMLElement[] elements = data.getChildren(AttachmentDocument.NAME);
+ AttachmentDocument[] results = new AttachmentDocument[elements.length];
+ for (int i = 0; i < results.length; i++) {
+ results[i] = new AttachmentDocument(elements[i]);
+ }
+ return results;
+ }
+
+ public void removeAttachment(long attachmentID) {
+ AttachmentDocument[] docs = getAttachmentDocuments();
+ for (int i = 0; i < docs.length; i++) {
+ if(docs[i].getAttachmentID() == attachmentID){
+ data.removeChild(docs[i].toElement());
+ return;
+ }
+ }
+ }
+
+ public AttachmentDocument addAttachment(String templateOwner, long templateID) {
+ AttachmentDocument doc = new AttachmentDocument(-1, templateOwner, templateID, getBodyConfigurationID());
+ data.addChild(doc.toElement());
+ return doc;
+ }
+
public XMLElement toElement(){
return data;
}
@@ -124,5 +149,4 @@
public String toString(){
return data.toString();
}
-
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/TemplateDocument.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/TemplateDocument.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/TemplateDocument.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -62,14 +62,16 @@
private static final String SEAT_RZ = "seatrz";
+ private static final String IS_ATTACHMENT = "attachment";
+
XMLElement data = null;
//for convenience of people who are creating this dynamically via the mock system
- public TemplateDocument(Long templateID, String displayName, String ownerUsername, String description) {
- this(templateID.longValue(), displayName, ownerUsername, description, null, false, 0, 0, 0, 1, 0, 0, 0);
+ public TemplateDocument(Long templateID, String displayName, String ownerUsername, String description, boolean isAttachment) {
+ this(templateID.longValue(), displayName, ownerUsername, description, null, isAttachment, false, 0, 0, 0, 1, 0, 0, 0);
}
- public TemplateDocument(long templateID, String displayName, String ownerUsername, String description, Set supportFiles, boolean isASeat, double seatX, double seatY, double seatZ, double seatRW, double seatRX, double seatRY, double seatRZ) {
+ public TemplateDocument(long templateID, String displayName, String ownerUsername, String description, Set supportFiles, boolean isAttachment, boolean isASeat, double seatX, double seatY, double seatZ, double seatRW, double seatRX, double seatRY, double seatRZ) {
data = new XMLElement(NAME);
data.setAttribute(TEMPLATE_ID, templateID);
ArgumentUtils.assertNotNull(displayName);
@@ -106,6 +108,7 @@
}
}
}
+ setAttachment(isAttachment);
setSeat(isASeat);
setSeatPosition(seatX, seatY, seatZ);
setSeatRotation(seatRW, seatRX, seatRY, seatRZ);
@@ -216,6 +219,14 @@
return result;
}
+ public boolean isAttachment(){
+ return data.getBooleanAttribute(IS_ATTACHMENT, false);
+ }
+
+ public void setAttachment(boolean isAttachment){
+ data.setAttribute(IS_ATTACHMENT, isAttachment);
+ }
+
public boolean isSeat() {
return data.getBooleanAttribute(IS_SEAT);
}
Modified: maven/trunk/ogoglio-common/src/test/java/com/ogoglio/xml/test/XMLTest.java
===================================================================
--- maven/trunk/ogoglio-common/src/test/java/com/ogoglio/xml/test/XMLTest.java 2008-02-06 01:19:59 UTC (rev 709)
+++ maven/trunk/ogoglio-common/src/test/java/com/ogoglio/xml/test/XMLTest.java 2008-02-06 01:20:17 UTC (rev 710)
@@ -159,18 +159,20 @@
String username = "kurt";
String description = "This thing rocks out with it's cupcake out.";
- TemplateDocument templateDoc = new TemplateDocument(1, displayName, username, description, null, false, 0, 0, 0, 1, 0, 0, 0);
+ TemplateDocument templateDoc = new TemplateDocument(1, displayName, username, description, null, true, false, 0, 0, 0, 1, 0, 0, 0);
assertEquals(1, templateDoc.getTemplateID());
assertEquals(displayName, templateDoc.getDisplayName());
assertEquals(username, templateDoc.getOwnerUsername());
assertEquals(description, templateDoc.getDescription());
-
+ assertEquals(true, templateDoc.isAttachment());
+
templateDoc = new TemplateDocument(XMLElement.parseElementFromString(templateDoc.toString()));
assertEquals(1, templateDoc.getTemplateID());
assertEquals(displayName, templateDoc.getDisplayName());
assertEquals(username, templateDoc.getOwnerUsername());
assertEquals(description, templateDoc.getDescription());
-
+ assertEquals(true, templateDoc.isAttachment());
+
ThingDocument thingDoc1 = new ThingDocument(1, displayName, 1, username, username, 1, new Transform3D(), null);
assertEquals(1, thingDoc1.getThingID());
assertEquals(displayName, thingDoc1.getDisplayName());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|