|
From: <tre...@us...> - 2007-10-04 21:24:17
|
Revision: 477
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=477&view=rev
Author: trevorolio
Date: 2007-10-04 14:24:10 -0700 (Thu, 04 Oct 2007)
Log Message:
-----------
At last, in the body editor applet you can change the morph settings and see them reflected in real time. Hit save, and the next time you visit a space the morph settings will be respected.
Modified Paths:
--------------
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyConfiguration.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/User.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/xml/BodyConfigurationDocument.java
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 2007-10-04 06:30:49 UTC (rev 476)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/BodyConfiguration.java 2007-10-04 21:24:10 UTC (rev 477)
@@ -78,5 +78,9 @@
public long getBodyDataID() {
return bodyDataID;
}
+
+ public String[] getSettingNames() {
+ return (String[])settings.keySet().toArray(new String[0]);
+ }
}
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-10-04 06:30:49 UTC (rev 476)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/model/User.java 2007-10-04 21:24:10 UTC (rev 477)
@@ -41,6 +41,7 @@
this.position = position;
ArgumentUtils.assertNotNull(bodyConfiguration);
this.bodyConfiguration = bodyConfiguration;
+ bodyConfiguration.setUser(this);
}
public void startMotion(SplinePath path) {
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 2007-10-04 06:30:49 UTC (rev 476)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java 2007-10-04 21:24:10 UTC (rev 477)
@@ -221,6 +221,10 @@
stopAnimation();
}
+ public void updateMorphs(){
+ skin.updateMorphs();
+ }
+
public void repaintSkinTexture() {
skin.updateTexture();
}
Modified: 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/Skin.java 2007-10-04 06:30:49 UTC (rev 476)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/Skin.java 2007-10-04 21:24:10 UTC (rev 477)
@@ -15,8 +15,8 @@
package com.ogoglio.viewer.j3d.body;
import java.awt.Graphics;
-import java.awt.Image;
import java.awt.image.BufferedImage;
+import java.util.HashMap;
import java.util.Vector;
import javax.media.j3d.Appearance;
@@ -36,8 +36,9 @@
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3d;
+import javax.vecmath.Vector3f;
-import com.ogoglio.util.BodyConstants;
+import com.ogoglio.client.model.BodyConfiguration;
import com.ogoglio.viewer.j3d.body.Skeleton.Bone;
import com.ogoglio.viewer.j3d.smap.SkinMap;
import com.ogoglio.viewer.j3d.smap.SkinMap.Group;
@@ -51,15 +52,23 @@
private Texture texture = null;
- private SkinUpdater skinUpdater = null;
+ private SkinAnimationUpdater skinAnimationUpdater = null;
- public Skin(BufferedImage baseImage) {
+ private SkinMorphUpdater skinMorphUpdater = null;
+
+ private MorphDeltaMap[] morphDeltaMaps;
+
+ private BodyConfiguration bodyConfiguration = null;
+
+ public Skin(BufferedImage baseImage, MorphDeltaMap[] morphDeltaMaps, BodyConfiguration bodyConfiguration) {
setCapability(Skin.ALLOW_APPEARANCE_WRITE);
setCapability(Skin.ALLOW_PICKABLE_READ);
setCapability(Skin.ALLOW_GEOMETRY_READ);
setCapability(Skin.ALLOW_BOUNDS_READ);
this.baseImage = baseImage;
-
+ this.morphDeltaMaps = morphDeltaMaps;
+ this.bodyConfiguration = bodyConfiguration;
+
//I don't really care for any of these formats
// LUMINANCE is nice for a film noir effect
texture = new TextureLoader(baseImage, "RGB5", TextureLoader.BY_REFERENCE, null).getTexture();
@@ -92,17 +101,19 @@
}
public void updateData(ImageComponent2D imageComp, int arg1, int arg2, int arg3, int arg4) {
- if(baseImage == null){
+ if (baseImage == null) {
return;
}
Graphics g = imageComp.getImage().getGraphics();
g.drawImage(baseImage, 0, 0, null);
+
+ //TODO this is where we'd draw on the decals
}
}
public void updateTexture() {
- if(baseImage == null){
+ if (baseImage == null) {
return;
}
ImageComponent2D imageComp = (ImageComponent2D) texture.getImage(0);
@@ -112,17 +123,62 @@
public void setGeometry(Geometry geo) {
super.setGeometry(geo);
PickTool.setCapabilities(this, PickTool.INTERSECT_FULL);
+
+ skinMorphUpdater = new SkinMorphUpdater();
+ skinMorphUpdater.morph();
}
+ public void updateMorphs() {
+ skinMorphUpdater.morph();
+ }
+
+ private class SkinMorphUpdater implements GeometryUpdater {
+
+ HashMap lastMorphValues = new HashMap();
+
+ float[] vertices = null;
+
+ SkinMorphUpdater() {
+ IndexedTriangleArray triArray = (IndexedTriangleArray) getGeometry();
+ vertices = triArray.getCoordRefFloat();
+ }
+
+ public void morph(){
+ ((GeometryArray) getGeometry()).updateData(this);
+ }
+
+ public void updateData(Geometry ignored) {
+ for (int i = 0; i < morphDeltaMaps.length; i++) {
+ float setting = bodyConfiguration.getSetting(morphDeltaMaps[i].getName());
+ if (lastMorphValues.get(morphDeltaMaps[i].getName()) != null) {
+ setting -= ((Float)lastMorphValues.remove(morphDeltaMaps[i].getName())).floatValue();
+ }
+ lastMorphValues.put(morphDeltaMaps[i].getName(), new Float(bodyConfiguration.getSetting(morphDeltaMaps[i].getName())));
+
+ MorphDeltaMap.Range[] ranges = morphDeltaMaps[i].getRanges();
+ for (int r = 0; r < ranges.length; r++) {
+ Vector3f[] deltas = ranges[r].getDeltas();
+ for (int d = 0; d < deltas.length; d++) {
+ int index = (ranges[r].getLower() - 1 + d) * 3;
+ vertices[index] = vertices[index] + (deltas[d].x * setting);
+ vertices[index + 1] = vertices[index + 1] + (deltas[d].y * setting);
+ vertices[index + 2] = vertices[index + 2] + (deltas[d].z * setting);
+ }
+ }
+ }
+ }
+
+ }
+
public void setSkeleton(Skeleton skeleton, SkinMap skinMap) {
- skinUpdater = new SkinUpdater(skeleton, skinMap);
+ skinAnimationUpdater = new SkinAnimationUpdater(skeleton, skinMap);
}
public void pose() {
- skinUpdater.transform();
+ skinAnimationUpdater.transform();
}
- private class SkinUpdater implements GeometryUpdater {
+ private class SkinAnimationUpdater implements GeometryUpdater {
Skeleton skeleton = null;
@@ -150,7 +206,7 @@
float[] coords = null;
- SkinUpdater(Skeleton skeleton, SkinMap skinMap) {
+ SkinAnimationUpdater(Skeleton skeleton, SkinMap skinMap) {
this.skeleton = skeleton;
bones = getBoneArray(skeleton);
groups = new SkinMap.Group[bones.length];
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 2007-10-04 06:30:49 UTC (rev 476)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/body/SkinLoader.java 2007-10-04 21:24:10 UTC (rev 477)
@@ -43,22 +43,6 @@
public Skin generateSkin() {
float[] vertices = geometry.getCoordRefFloat();
- for (int i = 0; i < morphDeltaMaps.length; i++) {
- float setting = bodyConfiguration.getSetting(morphDeltaMaps[i].getName());
- if(setting <= 0.0001){
- continue;
- }
- MorphDeltaMap.Range[] ranges = morphDeltaMaps[i].getRanges();
- for (int r = 0; r < ranges.length; r++) {
- Vector3f[] deltas = ranges[r].getDeltas();
- for (int d = 0; d < deltas.length; d++) {
- int index = (ranges[r].getLower() - 1 + d) * 3;
- vertices[index] = vertices[index] + (deltas[d].x * setting);
- vertices[index + 1] = vertices[index + 1] + (deltas[d].y * setting);
- vertices[index + 2] = vertices[index + 2] + (deltas[d].z * setting);
- }
- }
- }
float maxY = Float.MIN_VALUE;
float minY = Float.MAX_VALUE;
@@ -79,7 +63,7 @@
}
}
- Skin skin = new Skin(baseImage);
+ Skin skin = new Skin(baseImage, morphDeltaMaps, bodyConfiguration);
skin.setGeometry(geometry);
return skin;
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 2007-10-04 06:30:49 UTC (rev 476)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/BodyConfigurationDocument.java 2007-10-04 21:24:10 UTC (rev 477)
@@ -15,6 +15,7 @@
import nanoxml.XMLElement;
+import com.ogoglio.client.model.BodyConfiguration;
import com.ogoglio.util.ArgumentUtils;
public class BodyConfigurationDocument {
@@ -49,6 +50,14 @@
this.data = data;
}
+ public BodyConfigurationDocument(BodyConfiguration bodyConfiguration) {
+ this(bodyConfiguration.getBodyConfigurationID(), bodyConfiguration.getUser().getUsername(), bodyConfiguration.getDisplayName(), bodyConfiguration.getBodyDataID());
+ String[] settingNames = bodyConfiguration.getSettingNames();
+ for (int i = 0; i < settingNames.length; i++) {
+ addBodySetting(settingNames[i], bodyConfiguration.getSetting(settingNames[i]));
+ }
+ }
+
public long getBodyConfigurationID(){
return data.getLongAttribute(BODY_CONFIGURATION_ID);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|