* Small javadoc fixes

* Formatting for com.jme3.effect package
 * Formatting for blender importer and networking tests
 * All networking tests ported to new SpiderMonkey
 * Removed all mentions of java.util.Serializable
 * RMI now works under new SpiderMonkey

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7593 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sha..rd 14 years ago
parent 95cdde7f53
commit 8cbb0f210d
  1. 5
      engine/src/blender/com/jme3/scene/plugins/blender/helpers/v249/MaterialHelper.java
  2. 30
      engine/src/core/com/jme3/animation/AnimChannel.java
  3. 16
      engine/src/core/com/jme3/animation/AnimControl.java
  4. 45
      engine/src/core/com/jme3/animation/Bone.java
  5. 10
      engine/src/core/com/jme3/animation/BoneAnimation.java
  6. 5
      engine/src/core/com/jme3/animation/MeshAnimation.java
  7. 5
      engine/src/core/com/jme3/animation/Pose.java
  8. 5
      engine/src/core/com/jme3/animation/PoseTrack.java
  9. 5
      engine/src/core/com/jme3/animation/Track.java
  10. 1
      engine/src/core/com/jme3/effect/influencers/DefaultParticleInfluencer.java
  11. 15
      engine/src/core/com/jme3/effect/influencers/EmptyParticleInfluencer.java
  12. 1
      engine/src/core/com/jme3/effect/influencers/NewtonianParticleInfluencer.java
  13. 1
      engine/src/core/com/jme3/effect/influencers/ParticleInfluencer.java
  14. 7
      engine/src/core/com/jme3/effect/shapes/EmitterBoxShape.java
  15. 4
      engine/src/core/com/jme3/effect/shapes/EmitterMeshConvexHullShape.java
  16. 4
      engine/src/core/com/jme3/effect/shapes/EmitterMeshFaceShape.java
  17. 4
      engine/src/core/com/jme3/effect/shapes/EmitterMeshVertexShape.java
  18. 8
      engine/src/core/com/jme3/effect/shapes/EmitterPointShape.java
  19. 2
      engine/src/core/com/jme3/effect/shapes/EmitterShape.java
  20. 6
      engine/src/core/com/jme3/effect/shapes/EmitterSphereShape.java
  21. 1
      engine/src/core/com/jme3/math/ColorRGBA.java
  22. 3
      engine/src/core/com/jme3/math/Line.java
  23. 30
      engine/src/core/com/jme3/math/LineSegment.java
  24. 1
      engine/src/core/com/jme3/math/Ray.java
  25. 4
      engine/src/core/com/jme3/math/Rectangle.java
  26. 4
      engine/src/core/com/jme3/math/Ring.java
  27. 2
      engine/src/core/com/jme3/math/Vector2f.java
  28. 2
      engine/src/core/com/jme3/scene/shape/Box.java
  29. 2
      engine/src/core/com/jme3/scene/shape/PQTorus.java
  30. 111
      engine/src/networking/com/jme3/network/rmi/ObjectStore.java
  31. 4
      engine/src/networking/com/jme3/network/rmi/RemoteMethodCallMessage.java
  32. 5
      engine/src/networking/com/jme3/network/rmi/RemoteMethodReturnMessage.java
  33. 7
      engine/src/networking/com/jme3/network/rmi/RemoteObject.java
  34. 6
      engine/src/networking/com/jme3/network/rmi/RemoteObjectDefMessage.java
  35. 4
      engine/src/terrain/com/jme3/terrain/geomipmap/LRUCache.java
  36. 39
      engine/src/test/jme3test/blender/ManualBlenderTester.java
  37. 63
      engine/src/test/jme3test/blender/config/AbstractConfigDialog.java
  38. 122
      engine/src/test/jme3test/blender/config/ConfigDialog.java
  39. 2
      engine/src/test/jme3test/blender/config/ConfigExecutable.java
  40. 1059
      engine/src/test/jme3test/blender/config/NoiseConstantsGenerator.java
  41. 3
      engine/src/test/jme3test/blender/scene/Pivot.java
  42. 5
      engine/src/test/jme3test/blender/scene/VisibleBone.java
  43. 112
      engine/src/test/jme3test/network/TestChatClient.java
  44. 65
      engine/src/test/jme3test/network/TestChatServer.java
  45. 58
      engine/src/test/jme3test/network/TestHostDiscovery.java
  46. 63
      engine/src/test/jme3test/network/TestLatency.java
  47. 17
      engine/src/test/jme3test/network/TestMessages.java
  48. 28
      engine/src/test/jme3test/network/TestNetworkStress.java
  49. 36
      engine/src/test/jme3test/network/TestRemoteCall.java
  50. 48
      engine/src/test/jme3test/network/TestThroughput.java

@ -260,7 +260,10 @@ public class MaterialHelper extends AbstractBlenderHelper {
Texture texture = textureHelper.getTexture(tex, dataRepository);
if (texture != null) {
if ((mapto & 0x01) != 0) {// Col
result.setBoolean("UseMaterialColors", Boolean.FALSE);
if (!shadeless){
result.setBoolean("UseMaterialColors", false);
}
// blending the texture with material color and texture's defined color
int blendType = ((Number) textureLink.getFieldValue("blendtype")).intValue();
float[] color = new float[]{((Number) textureLink.getFieldValue("r")).floatValue(), ((Number) textureLink.getFieldValue("g")).floatValue(), ((Number) textureLink.getFieldValue("b")).floatValue()};

@ -48,6 +48,8 @@ import java.util.BitSet;
*/
public final class AnimChannel {
private static final float DEFAULT_BLEND_TIME = 0.15f;
private AnimControl control;
// private ArrayList<Integer> affectedBones;
@ -61,7 +63,7 @@ public final class AnimChannel {
private float speedBlendFrom;
private LoopMode loopMode, loopModeBlendFrom;
private float defaultBlendTime = 0.15f;
private float blendAmount = 1f;
private float blendRate = 0;
@ -95,6 +97,15 @@ public final class AnimChannel {
this.control = control;
}
/**
* Returns the parent control of this AnimChannel.
* @return the parent control of this AnimChannel.
* @see AnimControl
*/
public AnimControl getControl() {
return control;
}
/**
* @return The name of the currently playing animation, or null if
* none is assigned.
@ -180,6 +191,7 @@ public final class AnimChannel {
/**
* Set the current animation that is played by this AnimChannel.
* <p>
* This resets the time to zero, and optionally blends the animation
* over <code>blendTime</code> seconds with the currently playing animation.
* Notice that this method will reset the control's speed to 1.0.
@ -219,11 +231,15 @@ public final class AnimChannel {
}
/**
* Set the current animation that is played by this AnimChannel.
* <p>
* See {@link #setAnim(java.lang.String, float) }.
* The blendTime argument by default is 150 milliseconds.
*
* @param name
* @param name The name of the animation to play
*/
public void setAnim(String name){
setAnim(name, defaultBlendTime);
setAnim(name, DEFAULT_BLEND_TIME);
}
/**
@ -294,7 +310,6 @@ public final class AnimChannel {
}
}
void reset(){
animation = null;
blendFrom = null;
@ -340,11 +355,4 @@ public final class AnimChannel {
}
public AnimControl getControl() {
return control;
}
}

@ -110,13 +110,14 @@ public final class AnimControl extends AbstractControl implements Savable, Clone
}
/**
* Used only for Saving/Loading models (all parameters of the non-default
* constructor are restored from the saved model, but the object must be
* constructed beforehand)
* Serialization only. Do not use.
*/
public AnimControl() {
}
/**
* Internal use only.
*/
public Control cloneForSpatial(Spatial spatial) {
try {
AnimControl clone = (AnimControl) super.clone();
@ -268,6 +269,9 @@ public final class AnimControl extends AbstractControl implements Savable, Clone
}
}
/**
* Internal use only.
*/
@Override
public void setSpatial(Spatial spatial) {
if (spatial == null && skeletonControl != null){
@ -311,6 +315,9 @@ public final class AnimControl extends AbstractControl implements Savable, Clone
return a.getLength();
}
/**
* Internal use only.
*/
@Override
protected void controlUpdate(float tpf) {
skeleton.reset(); // reset skeleton to bind pose
@ -322,6 +329,9 @@ public final class AnimControl extends AbstractControl implements Savable, Clone
skeleton.updateWorldVectors();
}
/**
* Internal use only.
*/
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
}

@ -93,9 +93,8 @@ public final class Bone implements Savable {
private Vector3f worldPos = new Vector3f();
private Quaternion worldRot = new Quaternion();
private Vector3f worldScale = new Vector3f();
//used for getCombinedTransform
private Transform tmpTransform=new Transform();
private Transform tmpTransform = new Transform();
/**
* Creates a new bone with the given name.
@ -143,6 +142,8 @@ public final class Bone implements Savable {
}
/**
* Returns the name of the bone, set in the constructor.
*
* @return The name of the bone, set in the constructor.
*/
public String getName() {
@ -150,6 +151,7 @@ public final class Bone implements Savable {
}
/**
* Returns parent bone of this bone, or null if it is a root bone.
* @return The parent bone of this bone, or null if it is a root bone.
*/
public Bone getParent() {
@ -157,6 +159,8 @@ public final class Bone implements Savable {
}
/**
* Returns all the children bones of this bone.
*
* @return All the children bones of this bone.
*/
public ArrayList<Bone> getChildren() {
@ -164,6 +168,8 @@ public final class Bone implements Savable {
}
/**
* Returns the local position of the bone, relative to the parent bone.
*
* @return The local position of the bone, relative to the parent bone.
*/
public Vector3f getLocalPosition() {
@ -171,6 +177,8 @@ public final class Bone implements Savable {
}
/**
* Returns the local rotation of the bone, relative to the parent bone.
*
* @return The local rotation of the bone, relative to the parent bone.
*/
public Quaternion getLocalRotation() {
@ -178,6 +186,8 @@ public final class Bone implements Savable {
}
/**
* Returns the local scale of the bone, relative to the parent bone.
*
* @return The local scale of the bone, relative to the parent bone.
*/
public Vector3f getLocalScale() {
@ -185,6 +195,8 @@ public final class Bone implements Savable {
}
/**
* Returns the position of the bone in model space.
*
* @return The position of the bone in model space.
*/
public Vector3f getModelSpacePosition() {
@ -192,6 +204,8 @@ public final class Bone implements Savable {
}
/**
* Returns the rotation of the bone in model space.
*
* @return The rotation of the bone in model space.
*/
public Quaternion getModelSpaceRotation() {
@ -199,20 +213,37 @@ public final class Bone implements Savable {
}
/**
* Returns the scale of the bone in model space.
*
* @return The scale of the bone in model space.
*/
public Vector3f getModelSpaceScale() {
return worldScale;
}
/**
* Returns the inverse world bind pose position.
*
* @return the inverse world bind pose position.
*/
public Vector3f getWorldBindInversePosition() {
return worldBindInversePos;
}
/**
* Returns the inverse world bind pose rotation.
*
* @return the inverse world bind pose rotation.
*/
public Quaternion getWorldBindInverseRotation() {
return worldBindInverseRot;
}
/**
* Returns the inverse world bind pose scale.
*
* @return the inverse world bind pose scale.
*/
public Vector3f getWorldBindInverseScale() {
return worldBindInverseScale;
}
@ -381,7 +412,7 @@ public final class Bone implements Savable {
* @param position a position
* @param rotation a rotation
*/
public Transform getCombinedTransform(Vector3f position, Quaternion rotation){
public Transform getCombinedTransform(Vector3f position, Quaternion rotation) {
rotation.mult(localPos, tmpTransform.getTranslation()).addLocal(position);
tmpTransform.setRotation(rotation).getRotation().multLocal(localRot);
return tmpTransform;
@ -477,14 +508,6 @@ public final class Bone implements Savable {
}
}
void setAnimTransforms(Vector3f translation, Quaternion rotation) {
this.setAnimTransforms(translation, rotation, Vector3f.UNIT_XYZ);
}
public void setBindTransforms(Vector3f translation, Quaternion rotation) {
this.setBindTransforms(translation, rotation, Vector3f.UNIT_XYZ);
}
private String toString(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {

@ -41,18 +41,22 @@ import java.io.IOException;
import java.util.BitSet;
/**
* Bone animation updates each of it's tracks with the skeleton and time
* Bone animation updates each of its tracks with the skeleton and time
* to apply the animation.
*/
public final class BoneAnimation implements Savable {
private static final long serialVersionUID = 1L;
private String name;
private float length;
private BoneTrack[] tracks;
/**
* Creates a new BoneAnimation with the given name and length.
*
* @param name The name of the bone animation.
* @param length Length in seconds of the bone animation.
*/
public BoneAnimation(String name, float length){
this.name = name;
this.length = length;

@ -39,11 +39,8 @@ import com.jme3.export.OutputCapsule;
import com.jme3.export.Savable;
import com.jme3.scene.Mesh;
import java.io.IOException;
import java.io.Serializable;
public class MeshAnimation implements Serializable, Savable {
private static final long serialVersionUID = 1L;
public class MeshAnimation implements Savable {
private String name;
private float length;

@ -40,15 +40,12 @@ import com.jme3.export.Savable;
import com.jme3.math.Vector3f;
import com.jme3.util.BufferUtils;
import java.io.IOException;
import java.io.Serializable;
import java.nio.FloatBuffer;
/**
* A pose is a list of offsets that say where a mesh verticles should be for this pose.
*/
public final class Pose implements Serializable, Savable {
private static final long serialVersionUID = 1L;
public final class Pose implements Savable {
private String name;
private int targetMeshIndex;

@ -41,7 +41,6 @@ import com.jme3.scene.Mesh;
import com.jme3.scene.VertexBuffer;
import com.jme3.scene.VertexBuffer.Type;
import java.io.IOException;
import java.io.Serializable;
import java.nio.FloatBuffer;
/**
@ -49,15 +48,11 @@ import java.nio.FloatBuffer;
*/
public final class PoseTrack extends Track {
private static final long serialVersionUID = 1L;
private PoseFrame[] frames;
private float[] times;
public static class PoseFrame implements Savable {
private static final long serialVersionUID = 1L;
Pose[] poses;
float[] weights;

@ -37,15 +37,12 @@ import com.jme3.export.JmeImporter;
import com.jme3.export.Savable;
import com.jme3.scene.Mesh;
import java.io.IOException;
import java.io.Serializable;
/**
* A single track of mesh animation (either morph or pose based).
* Currently morph animations are not supported (only pose).
*/
public abstract class Track implements Serializable, Savable {
private static final long serialVersionUID = 1L;
public abstract class Track implements Savable {
protected int targetMeshIndex;

@ -18,6 +18,7 @@ import com.jme3.math.Vector3f;
* @author Marcin Roguski (Kaelthas)
*/
public class DefaultParticleInfluencer implements ParticleInfluencer {
/** Temporary variable used to help with calculations. */
protected transient Vector3f temp = new Vector3f();
/** The initial velocity of the particles. */

@ -16,16 +16,20 @@ import com.jme3.math.Vector3f;
public class EmptyParticleInfluencer implements ParticleInfluencer {
@Override
public void write(JmeExporter ex) throws IOException {}
public void write(JmeExporter ex) throws IOException {
}
@Override
public void read(JmeImporter im) throws IOException {}
public void read(JmeImporter im) throws IOException {
}
@Override
public void influenceParticle(Particle particle, EmitterShape emitterShape) {}
public void influenceParticle(Particle particle, EmitterShape emitterShape) {
}
@Override
public void setInitialVelocity(Vector3f initialVelocity) {}
public void setInitialVelocity(Vector3f initialVelocity) {
}
@Override
public Vector3f getInitialVelocity() {
@ -33,7 +37,8 @@ public class EmptyParticleInfluencer implements ParticleInfluencer {
}
@Override
public void setVelocityVariation(float variation) {}
public void setVelocityVariation(float variation) {
}
@Override
public float getVelocityVariation() {

@ -16,6 +16,7 @@ import com.jme3.math.Matrix3f;
* @author Marcin Roguski (Kaelthas)
*/
public class NewtonianParticleInfluencer extends DefaultParticleInfluencer {
/** Normal to emitter's shape factor. */
protected float normalVelocity;
/** Emitter's surface tangent factor. */

@ -11,6 +11,7 @@ import com.jme3.math.Vector3f;
* @author Marcin Roguski (Kaelthas)
*/
public interface ParticleInfluencer extends Savable, Cloneable {
/**
* This method influences the particle.
* @param particle

@ -29,7 +29,6 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.effect.shapes;
import com.jme3.export.JmeExporter;
@ -44,7 +43,7 @@ public class EmitterBoxShape implements EmitterShape {
private Vector3f min, len;
public EmitterBoxShape(){
public EmitterBoxShape() {
}
public EmitterBoxShape(Vector3f min, Vector3f max) {
@ -76,7 +75,7 @@ public class EmitterBoxShape implements EmitterShape {
}
@Override
public EmitterShape deepClone(){
public EmitterShape deepClone() {
try {
EmitterBoxShape clone = (EmitterBoxShape) super.clone();
clone.min = min.clone();
@ -109,11 +108,11 @@ public class EmitterBoxShape implements EmitterShape {
oc.write(min, "min", null);
oc.write(len, "length", null);
}
@Override
public void read(JmeImporter im) throws IOException {
InputCapsule ic = im.getCapsule(this);
min = (Vector3f) ic.readSavable("min", null);
len = (Vector3f) ic.readSavable("length", null);
}
}

@ -13,10 +13,12 @@ import com.jme3.scene.Mesh;
* @author Marcin Roguski (Kaelthas)
*/
public class EmitterMeshConvexHullShape extends EmitterMeshFaceShape {
/**
* Empty constructor. Sets nothing.
*/
public EmitterMeshConvexHullShape() {}
public EmitterMeshConvexHullShape() {
}
/**
* Constructor. It stores a copy of vertex list of all meshes.

@ -14,10 +14,12 @@ import com.jme3.util.BufferUtils;
* @author Marcin Roguski (Kaelthas)
*/
public class EmitterMeshFaceShape extends EmitterMeshVertexShape {
/**
* Empty constructor. Sets nothing.
*/
public EmitterMeshFaceShape() {}
public EmitterMeshFaceShape() {
}
/**
* Constructor. It stores a copy of vertex list of all meshes.

@ -21,13 +21,15 @@ import com.jme3.util.BufferUtils;
* @author Marcin Roguski (Kaelthas)
*/
public class EmitterMeshVertexShape implements EmitterShape {
protected List<List<Vector3f>> vertices;
protected List<List<Vector3f>> normals;
/**
* Empty constructor. Sets nothing.
*/
public EmitterMeshVertexShape() {}
public EmitterMeshVertexShape() {
}
/**
* Constructor. It stores a copy of vertex list of all meshes.

@ -29,7 +29,6 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.effect.shapes;
import com.jme3.export.JmeExporter;
@ -42,15 +41,15 @@ public class EmitterPointShape implements EmitterShape {
private Vector3f point;
public EmitterPointShape(){
public EmitterPointShape() {
}
public EmitterPointShape(Vector3f point){
public EmitterPointShape(Vector3f point) {
this.point = point;
}
@Override
public EmitterShape deepClone(){
public EmitterShape deepClone() {
try {
EmitterPointShape clone = (EmitterPointShape) super.clone();
clone.point = point.clone();
@ -94,5 +93,4 @@ public class EmitterPointShape implements EmitterShape {
public void read(JmeImporter im) throws IOException {
this.point = (Vector3f) im.getCapsule(this).readSavable("point", null);
}
}

@ -29,7 +29,6 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.effect.shapes;
import com.jme3.export.Savable;
@ -40,6 +39,7 @@ import com.jme3.math.Vector3f;
* @author Kirill
*/
public interface EmitterShape extends Savable, Cloneable {
/**
* This method fills in the initial position of the particle.
* @param store

@ -29,7 +29,6 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.effect.shapes;
import com.jme3.export.JmeExporter;
@ -45,7 +44,7 @@ public class EmitterSphereShape implements EmitterShape {
private Vector3f center;
private float radius;
public EmitterSphereShape(){
public EmitterSphereShape() {
}
public EmitterSphereShape(Vector3f center, float radius) {
@ -62,7 +61,7 @@ public class EmitterSphereShape implements EmitterShape {
}
@Override
public EmitterShape deepClone(){
public EmitterShape deepClone() {
try {
EmitterSphereShape clone = (EmitterSphereShape) super.clone();
clone.center = center.clone();
@ -115,5 +114,4 @@ public class EmitterSphereShape implements EmitterShape {
center = (Vector3f) ic.readSavable("center", null);
radius = ic.readFloat("radius", 0);
}
}

@ -56,7 +56,6 @@ import java.io.IOException;
*/
public final class ColorRGBA implements Savable, Cloneable {
private static final long serialVersionUID = 1L;
/**
* the color black (0,0,0).
*/

@ -40,7 +40,6 @@ import com.jme3.export.Savable;
import com.jme3.util.BufferUtils;
import com.jme3.util.TempVars;
import java.io.IOException;
import java.io.Serializable;
import java.nio.FloatBuffer;
/**
@ -51,8 +50,6 @@ import java.nio.FloatBuffer;
* @author Joshua Slack
*/
public class Line implements Savable, Cloneable {
//todo: merge with Ray?
private static final long serialVersionUID = 1L;
private Vector3f origin;
private Vector3f direction;

@ -29,7 +29,6 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.math;
import com.jme3.export.InputCapsule;
@ -56,12 +55,8 @@ import java.io.IOException;
*/
public class LineSegment implements Cloneable, Savable {
private static final long serialVersionUID = 1L;
private Vector3f origin;
private Vector3f direction;
private float extent;
public LineSegment() {
@ -121,14 +116,14 @@ public class LineSegment implements Cloneable, Savable {
point.subtract(origin, compVec1);
float segmentParameter = direction.dot(compVec1);
if (-extent < segmentParameter){
if (segmentParameter < extent){
if (-extent < segmentParameter) {
if (segmentParameter < extent) {
origin.add(direction.mult(segmentParameter, compVec1),
compVec1);
}else{
} else {
origin.add(direction.mult(extent, compVec1), compVec1);
}
}else{
} else {
origin.subtract(direction.mult(extent, compVec1), compVec1);
}
@ -591,8 +586,8 @@ public class LineSegment implements Cloneable, Savable {
public void read(JmeImporter e) throws IOException {
InputCapsule capsule = e.getCapsule(this);
origin = (Vector3f)capsule.readSavable("origin", Vector3f.ZERO.clone());
direction = (Vector3f)capsule.readSavable("direction", Vector3f.ZERO.clone());
origin = (Vector3f) capsule.readSavable("origin", Vector3f.ZERO.clone());
direction = (Vector3f) capsule.readSavable("direction", Vector3f.ZERO.clone());
extent = capsule.readFloat("extent", 0);
}
@ -623,11 +618,16 @@ public class LineSegment implements Cloneable, Savable {
*/
public boolean isPointInsideBounds(Vector3f point, float error) {
if (FastMath.abs(point.x - origin.x) > FastMath.abs(direction.x * extent) + error) return false;
if (FastMath.abs(point.y - origin.y) > FastMath.abs(direction.y * extent) + error) return false;
if (FastMath.abs(point.z - origin.z) > FastMath.abs(direction.z * extent) + error) return false;
if (FastMath.abs(point.x - origin.x) > FastMath.abs(direction.x * extent) + error) {
return false;
}
if (FastMath.abs(point.y - origin.y) > FastMath.abs(direction.y * extent) + error) {
return false;
}
if (FastMath.abs(point.z - origin.z) > FastMath.abs(direction.z * extent) + error) {
return false;
}
return true;
}
}

@ -57,7 +57,6 @@ import java.io.IOException;
public final class Ray implements Savable, Cloneable, Collidable {
//todo: merge with Line?
private static final long serialVersionUID = 1L;
/** The ray's begining point. */
public Vector3f origin;

@ -38,7 +38,6 @@ import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule;
import com.jme3.export.Savable;
import java.io.IOException;
import java.io.Serializable;
/**
@ -51,8 +50,7 @@ import java.io.Serializable;
* @author Joshua Slack
*/
public final class Rectangle implements Serializable, Savable, Cloneable {
private static final long serialVersionUID = 1L;
public final class Rectangle implements Savable, Cloneable {
private Vector3f a, b, c;

@ -38,7 +38,6 @@ import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule;
import com.jme3.export.Savable;
import java.io.IOException;
import java.io.Serializable;
/**
@ -50,8 +49,7 @@ import java.io.Serializable;
* @author Joshua Slack
*/
public final class Ring implements Serializable, Savable, Cloneable {
private static final long serialVersionUID = 1L;
public final class Ring implements Savable, Cloneable {
private Vector3f center, up;
private float innerRadius, outerRadius;

@ -52,8 +52,6 @@ import java.util.logging.Logger;
public final class Vector2f implements Savable, Cloneable {
private static final Logger logger = Logger.getLogger(Vector2f.class.getName());
private static final long serialVersionUID = 1L;
public static final Vector2f ZERO = new Vector2f(0f, 0f);
public static final Vector2f UNIT_XY = new Vector2f(1f, 1f);

@ -73,8 +73,6 @@ public class Box extends AbstractBox {
1, 0, 0, 0, 0, 1, 1, 1 // bottom
};
private static final long serialVersionUID = 1L;
/**
* Creates a new box.
* <p>

@ -56,8 +56,6 @@ import java.nio.ShortBuffer;
*/
public class PQTorus extends Mesh {
private static final long serialVersionUID = 1L;
private float p, q;
private float radius, width;

@ -32,12 +32,14 @@
package com.jme3.network.rmi;
import com.jme3.network.connection.Client;
import com.jme3.network.connection.Server;
import com.jme3.network.events.ConnectionListener;
import com.jme3.network.events.MessageListener;
import com.jme3.network.message.Message;
import com.jme3.network.Client;
import com.jme3.network.ClientStateListener;
import com.jme3.network.ClientStateListener.DisconnectInfo;
import com.jme3.network.ConnectionListener;
import com.jme3.network.HostedConnection;
import com.jme3.network.Message;
import com.jme3.network.MessageListener;
import com.jme3.network.Server;
import com.jme3.network.serializing.Serializer;
import com.jme3.util.IntMap;
import com.jme3.util.IntMap.Entry;
@ -45,11 +47,12 @@ import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ObjectStore implements MessageListener, ConnectionListener {
public class ObjectStore {
private static final Logger logger = Logger.getLogger(ObjectStore.class.getName());
@ -67,6 +70,9 @@ public class ObjectStore implements MessageListener, ConnectionListener {
private Client client;
private Server server;
private ClientEventHandler clientEventHandler = new ClientEventHandler();
private ServerEventHandler serverEventHandler = new ServerEventHandler();
// Local object ID counter
private volatile short objectIdCounter = 0;
@ -85,6 +91,38 @@ public class ObjectStore implements MessageListener, ConnectionListener {
private final Object receiveObjectLock = new Object();
public class ServerEventHandler implements MessageListener<HostedConnection>,
ConnectionListener {
public void messageReceived(HostedConnection source, Message m) {
onMessage(source, m);
}
public void connectionAdded(Server server, HostedConnection conn) {
onConnection(conn);
}
public void connectionRemoved(Server server, HostedConnection conn) {
}
}
public class ClientEventHandler implements MessageListener,
ClientStateListener {
public void messageReceived(Object source, Message m) {
onMessage(null, m);
}
public void clientConnected(Client c) {
onConnection(null);
}
public void clientDisconnected(Client c, DisconnectInfo info) {
}
}
static {
Serializer s = new RmiSerializer();
Serializer.registerClass(RemoteObjectDefMessage.class, s);
@ -92,20 +130,22 @@ public class ObjectStore implements MessageListener, ConnectionListener {
Serializer.registerClass(RemoteMethodReturnMessage.class, s);
}
public ObjectStore(Client client){
public ObjectStore(Client client) {
this.client = client;
client.addMessageListener(this, RemoteObjectDefMessage.class,
client.addMessageListener(clientEventHandler,
RemoteObjectDefMessage.class,
RemoteMethodCallMessage.class,
RemoteMethodReturnMessage.class);
client.addConnectionListener(this);
client.addClientStateListener(clientEventHandler);
}
public ObjectStore(Server server){
public ObjectStore(Server server) {
this.server = server;
server.addMessageListener(this, RemoteObjectDefMessage.class,
server.addMessageListener(serverEventHandler,
RemoteObjectDefMessage.class,
RemoteMethodCallMessage.class,
RemoteMethodReturnMessage.class);
server.addConnectionListener(this);
server.addConnectionListener(serverEventHandler);
}
private ObjectDef makeObjectDef(LocalObject localObj){
@ -122,7 +162,15 @@ public class ObjectStore implements MessageListener, ConnectionListener {
localObj.objectName = name;
localObj.objectId = objectIdCounter++;
localObj.theObject = obj;
localObj.methods = obj.getClass().getMethods();
//localObj.methods = obj.getClass().getMethods();
ArrayList<Method> methodList = new ArrayList<Method>();
for (Method method : obj.getClass().getMethods()){
if (method.getDeclaringClass() == obj.getClass()){
methodList.add(method);
}
}
localObj.methods = methodList.toArray(new Method[methodList.size()]);
// Put it in the store
localObjects.put(localObj.objectId, localObj);
@ -180,7 +228,6 @@ public class ObjectStore implements MessageListener, ConnectionListener {
pendingInvocations.put(call.invocationId, invoke);
}
try{
if (server != null){
remoteObj.client.send(call);
logger.log(Level.INFO, "Server: Sending {0}", call);
@ -188,9 +235,6 @@ public class ObjectStore implements MessageListener, ConnectionListener {
client.send(call);
logger.log(Level.INFO, "Client: Sending {0}", call);
}
} catch (IOException ex){
ex.printStackTrace();
}
if (invoke != null){
synchronized(invoke){
@ -210,7 +254,7 @@ public class ObjectStore implements MessageListener, ConnectionListener {
}
}
public void messageReceived(Message message) {
private void onMessage(HostedConnection source, Message message) {
// Might want to do more strict validation of the data
// in the message to prevent crashes
@ -219,7 +263,7 @@ public class ObjectStore implements MessageListener, ConnectionListener {
ObjectDef[] defs = defMsg.objects;
for (ObjectDef def : defs){
RemoteObject remoteObject = new RemoteObject(this, message.getClient());
RemoteObject remoteObject = new RemoteObject(this, source);
remoteObject.objectId = (short)def.objectId;
remoteObject.methodDefs = def.methodDefs;
remoteObjects.put(def.objectName, remoteObject);
@ -257,17 +301,13 @@ public class ObjectStore implements MessageListener, ConnectionListener {
RemoteMethodReturnMessage retMsg = new RemoteMethodReturnMessage();
retMsg.invocationID = call.invocationId;
retMsg.retVal = ret;
try {
if (server != null){
call.getClient().send(retMsg);
source.send(retMsg);
logger.log(Level.INFO, "Server: Sending {0}", retMsg);
} else{
client.send(retMsg);
logger.log(Level.INFO, "Client: Sending {0}", retMsg);
}
} catch (IOException ex){
ex.printStackTrace();
}
}
}else if (message instanceof RemoteMethodReturnMessage){
RemoteMethodReturnMessage retMsg = (RemoteMethodReturnMessage) message;
@ -285,7 +325,7 @@ public class ObjectStore implements MessageListener, ConnectionListener {
}
}
public void clientConnected(Client client) {
private void onConnection(HostedConnection conn) {
if (localObjects.size() > 0){
// send a object definition message
ObjectDef[] defs = new ObjectDef[localObjects.size()];
@ -297,31 +337,14 @@ public class ObjectStore implements MessageListener, ConnectionListener {
RemoteObjectDefMessage defMsg = new RemoteObjectDefMessage();
defMsg.objects = defs;
try {
if (this.client != null){
this.client.send(defMsg);
logger.log(Level.INFO, "Client: Sending {0}", defMsg);
} else{
client.send(defMsg);
conn.send(defMsg);
logger.log(Level.INFO, "Server: Sending {0}", defMsg);
}
} catch (IOException ex){
ex.printStackTrace();
}
}
}
public void clientDisconnected(Client client) {
}
public void messageSent(Message message) {
}
public void objectReceived(Object object) {
}
public void objectSent(Object object) {
}
}

@ -32,7 +32,7 @@
package com.jme3.network.rmi;
import com.jme3.network.message.Message;
import com.jme3.network.AbstractMessage;
import com.jme3.network.serializing.Serializable;
/**
@ -41,7 +41,7 @@ import com.jme3.network.serializing.Serializable;
* @author Kirill Vainer
*/
@Serializable
public class RemoteMethodCallMessage extends Message {
public class RemoteMethodCallMessage extends AbstractMessage {
public RemoteMethodCallMessage(){
super(true);

@ -32,8 +32,7 @@
package com.jme3.network.rmi;
import com.jme3.network.message.Message;
import com.jme3.network.AbstractMessage;
import com.jme3.network.serializing.Serializable;
/**
@ -43,7 +42,7 @@ import com.jme3.network.serializing.Serializable;
* @author Kirill Vainer.
*/
@Serializable
public class RemoteMethodReturnMessage extends Message {
public class RemoteMethodReturnMessage extends AbstractMessage {
public RemoteMethodReturnMessage(){
super(true);

@ -32,8 +32,7 @@
package com.jme3.network.rmi;
import com.jme3.network.connection.Client;
import com.jme3.network.HostedConnection;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.ArrayList;
@ -72,9 +71,9 @@ public class RemoteObject implements InvocationHandler {
* The client who exposed the RMI interface, or null if the server
* exposed it.
*/
Client client;
HostedConnection client;
public RemoteObject(ObjectStore store, Client client){
public RemoteObject(ObjectStore store, HostedConnection client){
this.store = store;
this.client = client;
}

@ -32,9 +32,7 @@
package com.jme3.network.rmi;
import com.jme3.network.message.Message;
import com.jme3.network.AbstractMessage;
import com.jme3.network.serializing.Serializable;
/**
@ -42,7 +40,7 @@ import com.jme3.network.serializing.Serializable;
* @author Kirill Vainer
*/
@Serializable
public class RemoteObjectDefMessage extends Message {
public class RemoteObjectDefMessage extends AbstractMessage {
public ObjectDef[] objects;

@ -17,7 +17,6 @@ package com.jme3.terrain.geomipmap;
//
// Please contact the author if you need another license.
// This module is provided "as is", without warranties of any kind.
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
@ -41,7 +40,6 @@ import java.util.Map;
public class LRUCache<K, V> {
private static final float hashTableLoadFactor = 0.75f;
private LinkedHashMap<K, V> map;
private int cacheSize;
@ -56,6 +54,7 @@ public class LRUCache<K, V> {
int hashTableCapacity = (int) Math.ceil(cacheSize / LRUCache.hashTableLoadFactor) + 1;
this.map = new LinkedHashMap<K, V>(hashTableCapacity, LRUCache.hashTableLoadFactor, true) {
// (an anonymous inner class)
private static final long serialVersionUID = 1;
@Override
@ -120,5 +119,4 @@ public class LRUCache<K, V> {
public synchronized Collection<Map.Entry<K, V>> getAll() {
return new ArrayList<Map.Entry<K, V>>(this.map.entrySet());
}
} // end class LRUCache

@ -41,7 +41,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import jme3test.blender.config.ConfigDialog;
import jme3test.blender.config.IConfigExecutable;
import jme3test.blender.config.ConfigExecutable;
import jme3test.blender.scene.Pivot;
import com.jme3.animation.AnimControl;
@ -67,6 +67,7 @@ import com.jme3.texture.plugins.AWTLoader;
* @author Marcin Roguski (Kaelthas)
*/
public class ManualBlenderTester extends SimpleApplication {
private static final Logger LOGGER = Logger.getLogger(ManualBlenderTester.class.getName());
private ModelKey modelKey;//the key that holds the test file configuration
private final boolean debug;
@ -81,15 +82,16 @@ public class ManualBlenderTester extends SimpleApplication {
public static void main(String[] args) {
//veryfying if the application is in debug mode
boolean debug = false;
for(String arg : args) {
if("-debug".equalsIgnoreCase(arg)) {
for (String arg : args) {
if ("-debug".equalsIgnoreCase(arg)) {
debug = true;
break;
}
}
final boolean debugMode = debug;
//running the application
new ConfigDialog("./src/test-data/Blender", new IConfigExecutable() {
new ConfigDialog("./src/test-data/Blender", new ConfigExecutable() {
@Override
public void execute(ModelKey modelKey, Level logLevel) {
new ManualBlenderTester(modelKey, logLevel, debugMode).start();
@ -113,7 +115,7 @@ public class ManualBlenderTester extends SimpleApplication {
@Override
public void simpleInitApp() {
if(debug) {
if (debug) {
mouseInput.setCursorVisible(true);
}
assetManager.registerLocator(".", FileLocator.class);
@ -126,24 +128,25 @@ public class ManualBlenderTester extends SimpleApplication {
cam.setFrustumFar(1000.0f);
cam.setFrustumNear(1.0f);
AssetInfo ai = new AssetInfo(assetManager, modelKey) {
@Override
public InputStream openStream() {
try {
return new FileInputStream(this.key.getName());
} catch(FileNotFoundException e) {
} catch (FileNotFoundException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
return null;
}
}
};
rootNode.attachChild(new Pivot(assetManager));
if(modelKey instanceof BlenderKey) {
if (modelKey instanceof BlenderKey) {
Node blenderModel = this.testBlenderLoader(ai);
Map<String, Map<String, int[]>> animations = ((BlenderKey) modelKey).getAnimations();
//setting the first animation as active
if(((BlenderKey) modelKey).getAnimations()!=null) {
for(Entry<String, Map<String, int[]>> animEntry : animations.entrySet()) {
for(Entry<String, int[]> anim : animEntry.getValue().entrySet()) {
if (((BlenderKey) modelKey).getAnimations() != null) {
for (Entry<String, Map<String, int[]>> animEntry : animations.entrySet()) {
for (Entry<String, int[]> anim : animEntry.getValue().entrySet()) {
Spatial animatedSpatial = this.findNode(blenderModel, animEntry.getKey());
animatedSpatial.getControl(AnimControl.class).createChannel().setAnim(anim.getKey());
break;
@ -168,7 +171,7 @@ public class ManualBlenderTester extends SimpleApplication {
* @return the found node or null
*/
private Spatial findNode(Node rootNode, String name) {
if(name.equals(rootNode.getName())) {
if (name.equals(rootNode.getName())) {
return rootNode;
}
return rootNode.getChild(name);
@ -185,17 +188,17 @@ public class ManualBlenderTester extends SimpleApplication {
BlenderLoader blenderLoader = new BlenderLoader();
try {
LoadingResults loadingResults = blenderLoader.load(assetInfo);
for(Node object : loadingResults.getObjects()) {
for (Node object : loadingResults.getObjects()) {
this.rootNode.attachChild(object);
blenderModel = object;
}
for(Light light : loadingResults.getLights()) {
for (Light light : loadingResults.getLights()) {
this.rootNode.addLight(light);
}
for(Camera camera : loadingResults.getCameras()) {
for (Camera camera : loadingResults.getCameras()) {
LOGGER.info(camera.toString());
}
} catch(IOException e) {
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
return blenderModel;
@ -212,10 +215,10 @@ public class ManualBlenderTester extends SimpleApplication {
try {
Spatial loadingResults = blenderLoader.load(assetInfo);
this.rootNode.attachChild(loadingResults);
if(loadingResults instanceof Node) {
return (Node)loadingResults;
if (loadingResults instanceof Node) {
return (Node) loadingResults;
}
} catch(IOException e) {
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
return null;

@ -45,9 +45,9 @@ import javax.swing.table.TableCellEditor;
* @author Marcin Roguski (Kaelthas)
*/
public abstract class AbstractConfigDialog extends JFrame {
private static final long serialVersionUID = -3677493125861310310L;
private static final Logger LOGGER = Logger.getLogger(AbstractConfigDialog.class.getName());
protected JComboBox jComboBoxVersionSelection;
protected JList jListBlenderFiles;
protected JTable jTableProperties;
@ -118,9 +118,9 @@ public abstract class AbstractConfigDialog extends JFrame {
box.add(new Label("Log level:"));
ButtonGroup buttonGroup = new ButtonGroup();
Level[] levels = new Level[] {Level.OFF, Level.SEVERE, Level.WARNING, Level.INFO,
Level[] levels = new Level[]{Level.OFF, Level.SEVERE, Level.WARNING, Level.INFO,
Level.CONFIG, Level.FINE, Level.FINER, Level.FINEST, Level.ALL};
for(Level level : levels) {
for (Level level : levels) {
JRadioButtonLevel jRadioButtonLevel = new JRadioButtonLevel(level);
buttonGroup.add(jRadioButtonLevel);
box.add(jRadioButtonLevel);
@ -143,7 +143,7 @@ public abstract class AbstractConfigDialog extends JFrame {
jTableProperties = new JTable();
jTableProperties.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
jTableProperties.setModel(new BlenderTableModel(new Object[] {"Name", "Value"}));
jTableProperties.setModel(new BlenderTableModel(new Object[]{"Name", "Value"}));
jTableProperties.getColumnModel().getColumn(1).setCellEditor(new BlenderTableCellEditor());
JScrollPane jScrollPaneProperties = new JScrollPane(jTableProperties);
jTableProperties.setFillsViewportHeight(true);
@ -158,8 +158,8 @@ public abstract class AbstractConfigDialog extends JFrame {
jTableAnimations = new JTable();
jTableAnimations.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
jTableAnimations.setModel(new DefaultTableModel(new Object[] {"Object", "Name", "Start frame", "Stop frame"}, 0));
for(int i=0;i<jTableAnimations.getColumnModel().getColumnCount();++i) {
jTableAnimations.setModel(new DefaultTableModel(new Object[]{"Object", "Name", "Start frame", "Stop frame"}, 0));
for (int i = 0; i < jTableAnimations.getColumnModel().getColumnCount(); ++i) {
jTableAnimations.getColumnModel().getColumn(i).setCellEditor(new BlenderTableCellEditor());
}
JScrollPane jScrollPaneAnimations = new JScrollPane(jTableAnimations);
@ -180,8 +180,8 @@ public abstract class AbstractConfigDialog extends JFrame {
//model key check-box
jCheckBoxUseModelKey = new JCheckBox();
jCheckBoxUseModelKey.setText("Use ModelKey to start the test");
jCheckBoxUseModelKey.setToolTipText("All BlenderKey settings will remain here, but the application will be " +
"started using a model key. So only the path to the file will be given!");
jCheckBoxUseModelKey.setToolTipText("All BlenderKey settings will remain here, but the application will be "
+ "started using a model key. So only the path to the file will be given!");
//building the result panel
JPanel jPanelResult = new JPanel();
@ -213,6 +213,7 @@ public abstract class AbstractConfigDialog extends JFrame {
* @author Marcin Roguski
*/
protected static class JRadioButtonLevel extends JRadioButton {
private static final long serialVersionUID = 8874525909060993518L;
private static Level selectedLevel;
private static Map<Level, JRadioButtonLevel> radioButtons = new HashMap<Level, AbstractConfigDialog.JRadioButtonLevel>();
@ -228,6 +229,7 @@ public abstract class AbstractConfigDialog extends JFrame {
this.level = level;
radioButtons.put(level, this);
this.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JRadioButtonLevel.selectedLevel = JRadioButtonLevel.this.level;
@ -257,7 +259,9 @@ public abstract class AbstractConfigDialog extends JFrame {
* @author Marcin Roguski (Kaelthas)
*/
protected static class FileListItem {
private File file; //the file to be stored
/**
* Constructore. Stores the given file.
* @param file the file to be stored
@ -286,6 +290,7 @@ public abstract class AbstractConfigDialog extends JFrame {
* @author Marcin Roguski (Kaelthas)
*/
protected static class BlenderTableModel extends DefaultTableModel {
private static final long serialVersionUID = -4211206550875326553L;
/**
@ -298,8 +303,8 @@ public abstract class AbstractConfigDialog extends JFrame {
@Override
public void addRow(Object[] rowData) {
for(int i=0;i<rowData.length;++i) {
if(rowData[i]==null) {
for (int i = 0; i < rowData.length; ++i) {
if (rowData[i] == null) {
rowData[i] = "";
}
}
@ -308,7 +313,7 @@ public abstract class AbstractConfigDialog extends JFrame {
@Override
public boolean isCellEditable(int row, int column) {
return column>0;
return column > 0;
}
}
@ -317,6 +322,7 @@ public abstract class AbstractConfigDialog extends JFrame {
* @author Marcin Roguski (Kaelthas)
*/
protected static class BlenderTableCellEditor extends AbstractCellEditor implements TableCellEditor {
private static final long serialVersionUID = -8601975203921608519L;
private JCheckBox jCheckBox = new JCheckBox();
private JTextField jTextField = new JTextField();
@ -326,47 +332,46 @@ public abstract class AbstractConfigDialog extends JFrame {
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.lastValue = value;
if(value instanceof Boolean) {
if (value instanceof Boolean) {
jCheckBox.setSelected(((Boolean) value).booleanValue());
return jCheckBox;
} else if(value instanceof String || value instanceof Number || value instanceof Character) {
} else if (value instanceof String || value instanceof Number || value instanceof Character) {
jTextField.setText(value.toString());
return jTextField;
} else if(value instanceof Enum<?>) {
DefaultComboBoxModel defaultComboBoxModel = (DefaultComboBoxModel)jComboBox.getModel();
} else if (value instanceof Enum<?>) {
DefaultComboBoxModel defaultComboBoxModel = (DefaultComboBoxModel) jComboBox.getModel();
defaultComboBoxModel.removeAllElements();
for(Object object : value.getClass().getEnumConstants()) {
for (Object object : value.getClass().getEnumConstants()) {
defaultComboBoxModel.addElement(object);
}
return jComboBox;
}
else {
jTextField.setText(value==null ? "" : value.toString());
} else {
jTextField.setText(value == null ? "" : value.toString());
return jTextField;
}
}
@Override
public Object getCellEditorValue() {
if(lastValue instanceof Boolean) {
if (lastValue instanceof Boolean) {
return Boolean.valueOf(jCheckBox.isSelected());
} else if(lastValue instanceof String) {
} else if (lastValue instanceof String) {
return jTextField.getText();
} else if(lastValue instanceof Character) {
} else if (lastValue instanceof Character) {
return Character.valueOf(jTextField.getText().charAt(0));
} else if(lastValue instanceof Byte) {
} else if (lastValue instanceof Byte) {
return Byte.valueOf(jTextField.getText());
} else if(lastValue instanceof Short) {
} else if (lastValue instanceof Short) {
return Short.valueOf(jTextField.getText());
} else if(lastValue instanceof Integer) {
} else if (lastValue instanceof Integer) {
return Integer.valueOf(jTextField.getText());
} else if(lastValue instanceof Long) {
} else if (lastValue instanceof Long) {
return Long.valueOf(jTextField.getText());
} else if(lastValue instanceof Float) {
} else if (lastValue instanceof Float) {
return Float.valueOf(jTextField.getText());
} else if(lastValue instanceof Double) {
} else if (lastValue instanceof Double) {
return Double.valueOf(jTextField.getText());
} else if(lastValue instanceof Enum<?>) {
} else if (lastValue instanceof Enum<?>) {
return jComboBox.getSelectedItem();
}
//TODO: savable objects

@ -41,24 +41,24 @@ import com.jme3.export.binary.BinaryImporter;
* @author Marcin Roguski (Kaelthas)
*/
public class ConfigDialog extends AbstractConfigDialog {
private static final long serialVersionUID = 2863364888664674247L;
private static final Logger LOGGER = Logger.getLogger(ConfigDialog.class.getName());
private String baseFolderName;
private File configFile; //the config file
private Map<String, BlenderKeyConfiguration> configMap; //the blender key configuration map
private BlenderKeyConfiguration blenderKeyConfiguration;//the configuration for the files
private IConfigExecutable configExecutable; //this is called after clicking the 'OK' button
private ConfigExecutable configExecutable; //this is called after clicking the 'OK' button
/**
* Constructor. Builds the whole window and stores its data.
* @param testAssetsFolderName the path to test files folder
*/
public ConfigDialog(String baseFolderName, IConfigExecutable configExecutable) {
if(baseFolderName==null) {
public ConfigDialog(String baseFolderName, ConfigExecutable configExecutable) {
if (baseFolderName == null) {
throw new IllegalArgumentException("No test asset folder given!");
}
if(configExecutable==null) {
if (configExecutable == null) {
throw new IllegalArgumentException("No config executable given!");
}
this.baseFolderName = baseFolderName;
@ -67,17 +67,18 @@ public class ConfigDialog extends AbstractConfigDialog {
//setting up version selection (as a folder list in a compo box)
File baseFolder = new File(baseFolderName);
if(!baseFolder.exists() || !baseFolder.isDirectory()) {
if (!baseFolder.exists() || !baseFolder.isDirectory()) {
throw new IllegalArgumentException("The given base folder path either does not exists or does not point to a directory!");
}
File[] folders = baseFolder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory() && file.getName().charAt(0)!='.';
return file.isDirectory() && file.getName().charAt(0) != '.';
}
});
for(File folder : folders) {
((DefaultComboBoxModel)jComboBoxVersionSelection.getModel()).addElement(folder.getName());
for (File folder : folders) {
((DefaultComboBoxModel) jComboBoxVersionSelection.getModel()).addElement(folder.getName());
configMap.put(folder.getName(), null);
}
this.initListeners();
@ -103,6 +104,7 @@ public class ConfigDialog extends AbstractConfigDialog {
//loading blender files
File[] blenderFiles = testAssetsFolder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.canRead() && file.getName().endsWith(".blend");
@ -111,6 +113,7 @@ public class ConfigDialog extends AbstractConfigDialog {
//loading the blender files configuration
File[] files = testAssetsFolder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.canRead() && file.getName().endsWith(".conf");
@ -121,9 +124,9 @@ public class ConfigDialog extends AbstractConfigDialog {
} else {
BinaryImporter jmeImporter = new BinaryImporter();
String instructionToUser = files.length==1 ?
"No other config file to load! No configuration set!" :
"Please choose different config file!";
String instructionToUser = files.length == 1
? "No other config file to load! No configuration set!"
: "Please choose different config file!";
do {
if (files.length > 1) {
configFile = (File) JOptionPane.showInputDialog(null, "Choose the config file!", "Config file selection",
@ -131,7 +134,7 @@ public class ConfigDialog extends AbstractConfigDialog {
} else {
configFile = files[0];
}
if(configFile==null) {
if (configFile == null) {
JOptionPane.showMessageDialog(this, "No config file selected!\nEmpty configuration will be created!",
"No configuration selected", JOptionPane.INFORMATION_MESSAGE);
blenderKeyConfiguration = new BlenderKeyConfiguration(blenderFiles.length);
@ -155,7 +158,7 @@ public class ConfigDialog extends AbstractConfigDialog {
LOGGER.log(Level.SEVERE, "Unable to load configuration due to unpredicted error!", e);
}
}
} while (blenderKeyConfiguration == null && files.length>1);
} while (blenderKeyConfiguration == null && files.length > 1);
}
configFile = new File(testAssetsFolder, "test.conf");
@ -164,7 +167,7 @@ public class ConfigDialog extends AbstractConfigDialog {
//enlisting the files in the list
DefaultListModel defaultListModel = (DefaultListModel) jListBlenderFiles.getModel();
defaultListModel.removeAllElements();
for(int i=0; i<blenderFiles.length; ++i) {
for (int i = 0; i < blenderFiles.length; ++i) {
defaultListModel.addElement(new FileListItem(blenderFiles[i]));
}
return blenderFiles;
@ -178,17 +181,17 @@ public class ConfigDialog extends AbstractConfigDialog {
//setting properties
BlenderTableModel propertiesModel = (BlenderTableModel) jTableProperties.getModel();
int rowCount = propertiesModel.getRowCount();
for(int i=0;i<rowCount;++i) {
for (int i = 0; i < rowCount; ++i) {
propertiesModel.removeRow(0);
}
Field[] fields = blenderKey.getClass().getDeclaredFields();
for(Field field : fields) {
for (Field field : fields) {
field.setAccessible(true);
if(!"animations".equalsIgnoreCase(field.getName()) &&
(field.getModifiers() & Modifier.STATIC)==0) {
if (!"animations".equalsIgnoreCase(field.getName())
&& (field.getModifiers() & Modifier.STATIC) == 0) {
try {
propertiesModel.addRow(new Object[] {field.getName(), field.get(blenderKey)});
propertiesModel.addRow(new Object[]{field.getName(), field.get(blenderKey)});
} catch (IllegalArgumentException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (IllegalAccessException e) {
@ -200,15 +203,15 @@ public class ConfigDialog extends AbstractConfigDialog {
//setting animations
DefaultTableModel animationsModel = (DefaultTableModel) jTableAnimations.getModel();
rowCount = animationsModel.getRowCount();
for(int i=0;i<rowCount;++i) {
for (int i = 0; i < rowCount; ++i) {
animationsModel.removeRow(0);
}
Map<String, Map<String, int[]>> animations = blenderKey.getAnimations();
if(animations!=null) {
for(Entry<String, Map<String, int[]>> animationEntry : animations.entrySet()) {
for(Entry<String, int[]> animDataEntry : animationEntry.getValue().entrySet()) {
if (animations != null) {
for (Entry<String, Map<String, int[]>> animationEntry : animations.entrySet()) {
for (Entry<String, int[]> animDataEntry : animationEntry.getValue().entrySet()) {
int[] frames = animDataEntry.getValue();
animationsModel.addRow(new Object[] {animationEntry.getKey(), animDataEntry.getKey(),
animationsModel.addRow(new Object[]{animationEntry.getKey(), animDataEntry.getKey(),
Integer.valueOf(frames[0]), Integer.valueOf(frames[1])});
}
}
@ -224,23 +227,23 @@ public class ConfigDialog extends AbstractConfigDialog {
* @param configuration the blender config to store
*/
private void storeConfig(BlenderKeyConfiguration configuration) {
if(configuration.lastUsedKey!=null) {//reading animations
DefaultTableModel animationsTableModel = (DefaultTableModel)jTableAnimations.getModel();
if(configuration.lastUsedKey.getAnimations()!=null) {
if (configuration.lastUsedKey != null) {//reading animations
DefaultTableModel animationsTableModel = (DefaultTableModel) jTableAnimations.getModel();
if (configuration.lastUsedKey.getAnimations() != null) {
configuration.lastUsedKey.getAnimations().clear();
}
int animCounter = 0;
for(int i=0;i<animationsTableModel.getRowCount();++i) {
String objectName = (String)animationsTableModel.getValueAt(i, 0);
String animName = (String)animationsTableModel.getValueAt(i, 1);
Number startFrame = (Number)animationsTableModel.getValueAt(i, 2);
Number stopFrame = (Number)animationsTableModel.getValueAt(i, 3);
if(objectName!=null && animName!=null && startFrame.intValue()<=stopFrame.intValue()) {
for (int i = 0; i < animationsTableModel.getRowCount(); ++i) {
String objectName = (String) animationsTableModel.getValueAt(i, 0);
String animName = (String) animationsTableModel.getValueAt(i, 1);
Number startFrame = (Number) animationsTableModel.getValueAt(i, 2);
Number stopFrame = (Number) animationsTableModel.getValueAt(i, 3);
if (objectName != null && animName != null && startFrame.intValue() <= stopFrame.intValue()) {
configuration.lastUsedKey.addAnimation(objectName, animName, startFrame.intValue(), stopFrame.intValue());
++animCounter;
}
}
if(animCounter<animationsTableModel.getRowCount()) {
if (animCounter < animationsTableModel.getRowCount()) {
JOptionPane.showMessageDialog(ConfigDialog.this, "Some animations had errors!\nThey had not been added!",
"Invalid animations definitions", JOptionPane.WARNING_MESSAGE);
}
@ -252,7 +255,7 @@ public class ConfigDialog extends AbstractConfigDialog {
//storing the config
JmeExporter jmeExporter = new BinaryExporter();
try {
if(!jmeExporter.save(configuration, configFile)) {
if (!jmeExporter.save(configuration, configFile)) {
JOptionPane.showMessageDialog(ConfigDialog.this, "Unable to save the config data!", "Config save problem", JOptionPane.ERROR_MESSAGE);
}
} catch (IOException e) {
@ -267,25 +270,26 @@ public class ConfigDialog extends AbstractConfigDialog {
private void initListeners() {
//selection of blender version
jComboBoxVersionSelection.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//save the previous congifuration
if(blenderKeyConfiguration!=null) {
if (blenderKeyConfiguration != null) {
ConfigDialog.this.storeConfig(blenderKeyConfiguration);
blenderKeyConfiguration = null;
}
//load new configuration
File[] blenderFiles = ConfigDialog.this.prepareFilesList(baseFolderName+'/'+jComboBoxVersionSelection.getSelectedItem().toString());
if(blenderKeyConfiguration.lastUsedKey!=null) {
for(int i=0;i<blenderFiles.length; ++i) {
if(blenderFiles[i].getPath().equalsIgnoreCase(blenderKeyConfiguration.lastUsedKey.getName())) {
File[] blenderFiles = ConfigDialog.this.prepareFilesList(baseFolderName + '/' + jComboBoxVersionSelection.getSelectedItem().toString());
if (blenderKeyConfiguration.lastUsedKey != null) {
for (int i = 0; i < blenderFiles.length; ++i) {
if (blenderFiles[i].getPath().equalsIgnoreCase(blenderKeyConfiguration.lastUsedKey.getName())) {
jListBlenderFiles.setSelectedIndex(i);
break;
}
}
}
if(blenderKeyConfiguration.logLevel==null) {
if (blenderKeyConfiguration.logLevel == null) {
blenderKeyConfiguration.logLevel = Level.INFO;
}
JRadioButtonLevel.setSelectedLevel(blenderKeyConfiguration.logLevel);
@ -293,14 +297,15 @@ public class ConfigDialog extends AbstractConfigDialog {
});
//selection of the file changes the config on the right
jListBlenderFiles.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent evt) {
BlenderKeyConfiguration config = ConfigDialog.this.blenderKeyConfiguration;
FileListItem selectedItem = (FileListItem) ConfigDialog.this.jListBlenderFiles.getSelectedValue();
if(selectedItem != null) {
if (selectedItem != null) {
String fileName = selectedItem.getFile().getName();
config.lastUsedKey = config.blenderKeys.get(fileName);
if(config.lastUsedKey==null) {
if (config.lastUsedKey == null) {
config.lastUsedKey = new BlenderKey(selectedItem.getFile().getPath());
config.blenderKeys.put(fileName, config.lastUsedKey);
}
@ -311,12 +316,13 @@ public class ConfigDialog extends AbstractConfigDialog {
}
});
jTableProperties.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent evt) {
if(evt.getType()==TableModelEvent.UPDATE) {
if (evt.getType() == TableModelEvent.UPDATE) {
BlenderKeyConfiguration config = ConfigDialog.this.blenderKeyConfiguration;
int row = evt.getFirstRow();
String name = (String)jTableProperties.getModel().getValueAt(row, 0);
String name = (String) jTableProperties.getModel().getValueAt(row, 0);
Object value = jTableProperties.getModel().getValueAt(row, 1);
try {
Field field = config.lastUsedKey.getClass().getDeclaredField(name);
@ -335,38 +341,43 @@ public class ConfigDialog extends AbstractConfigDialog {
}
});
jTableAnimations.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent evt) {
if(evt.getType()==TableModelEvent.INSERT) {
if (evt.getType() == TableModelEvent.INSERT) {
jButtonRemoveAnimation.setEnabled(true);
} else if(evt.getType()==TableModelEvent.DELETE && jTableAnimations.getModel().getRowCount()==0) {
} else if (evt.getType() == TableModelEvent.DELETE && jTableAnimations.getModel().getRowCount() == 0) {
jButtonRemoveAnimation.setEnabled(false);
}
}
});
jButtonAddAnimation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
((DefaultTableModel)jTableAnimations.getModel()).addRow(new Object[] {"", "", Integer.valueOf(-1), Integer.valueOf(-1)});
((DefaultTableModel) jTableAnimations.getModel()).addRow(new Object[]{"", "", Integer.valueOf(-1), Integer.valueOf(-1)});
}
});
jButtonRemoveAnimation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
int row = jTableAnimations.getSelectedRow();
if(row>=0) {
((DefaultTableModel)jTableAnimations.getModel()).removeRow(row);
if (row >= 0) {
((DefaultTableModel) jTableAnimations.getModel()).removeRow(row);
}
}
});
//button listeners
jButtonOK.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
ConfigDialog.this.storeConfig(blenderKeyConfiguration);
//running the test
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
configExecutable.execute(ConfigDialog.this.blenderKeyConfiguration.getKeyToUse(),
@ -378,6 +389,7 @@ public class ConfigDialog extends AbstractConfigDialog {
}
});
jButtonCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
ConfigDialog.this.dispose();
@ -391,6 +403,7 @@ public class ConfigDialog extends AbstractConfigDialog {
* @author Marcin Roguski (Kaelthas)
*/
public static class BlenderKeyConfiguration implements Savable {
private Map<String, BlenderKey> blenderKeys;
private BlenderKey lastUsedKey;
private Level logLevel;
@ -399,7 +412,8 @@ public class ConfigDialog extends AbstractConfigDialog {
/**
* Constructor for jme serialization.
*/
public BlenderKeyConfiguration() {}
public BlenderKeyConfiguration() {
}
/**
* Constructor that creates new empty configuration for every blender file.
@ -423,7 +437,7 @@ public class ConfigDialog extends AbstractConfigDialog {
oc.writeStringSavableMap(blenderKeys, "keys", null);
oc.write(lastUsedKey, "last-key", null);
oc.write(useModelKey, "use-model-key", false);
oc.write(logLevel==null ? null : logLevel.getName(), "log-level", Level.INFO.getName());
oc.write(logLevel == null ? null : logLevel.getName(), "log-level", Level.INFO.getName());
}
@Override
@ -434,7 +448,7 @@ public class ConfigDialog extends AbstractConfigDialog {
lastUsedKey = (BlenderKey) ic.readSavable("last-key", null);
useModelKey = ic.readBoolean("use-model-key", false);
String logLevelName = ic.readString("log-level", Level.INFO.getName());
logLevel = logLevelName==null ? Level.INFO : Level.parse(logLevelName);
logLevel = logLevelName == null ? Level.INFO : Level.parse(logLevelName);
}
}
}

@ -9,7 +9,7 @@ import com.jme3.asset.ModelKey;
* itself.
* @author Marcin Roguski (Kaelthas)
*/
public interface IConfigExecutable {
public interface ConfigExecutable {
/**
* This method runs the test with the given blender key.
* @param modelKey

@ -14,6 +14,7 @@ import com.jme3.scene.shape.Sphere;
* @author Marcin Roguski
*/
public class Pivot extends Node {
public Pivot(AssetManager assetManager) {
this.attachChild(this.getAxis("x", new Vector3f(10, 0, 0), ColorRGBA.Red, assetManager));
this.attachChild(this.getAxis("y", new Vector3f(0, 10, 0), ColorRGBA.Green, assetManager));
@ -24,7 +25,7 @@ public class Pivot extends Node {
private void assignPoints(AssetManager assetManager) {
Material defaultMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
defaultMaterial.setColor("Color", ColorRGBA.DarkGray);
for(int i = -10; i <= 10; ++i) {
for (int i = -10; i <= 10; ++i) {
Geometry g = new Geometry("", new Sphere(3, 3, 0.05f));
g.setLocalTranslation(i, 0, 0);
g.setMaterial(defaultMaterial);

@ -16,6 +16,7 @@ import com.jme3.scene.shape.Sphere;
* @author Marcin Roguski
*/
public class VisibleBone extends Node {
private Vector3f globalPosition;
public VisibleBone(Bone bone, Vector3f parentLocation, Quaternion parentRotation, AssetManager assetManager) {
@ -32,8 +33,8 @@ public class VisibleBone extends Node {
g.setMaterial(redMat);
this.attachChild(g);
if(bone.getChildren() != null) {
for(Bone child : bone.getChildren()) {
if (bone.getChildren() != null) {
for (Bone child : bone.getChildren()) {
VisibleBone vb = new VisibleBone(child, bone.getLocalPosition(), bone.getLocalRotation(), assetManager);
this.attachChild(vb);
Line line = new Line(globalPosition, vb.globalPosition);

@ -29,7 +29,6 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package jme3test.network;
import java.awt.Dimension;
@ -38,19 +37,13 @@ import java.awt.Component;
import java.io.IOException;
import javax.swing.*;
import com.jme3.network.AbstractMessage;
import com.jme3.network.Client;
import com.jme3.network.HostedConnection;
import com.jme3.network.Message;
import com.jme3.network.MessageListener;
import com.jme3.network.Network;
import com.jme3.network.Server;
import com.jme3.network.serializing.Serializable;
import com.jme3.network.serializing.Serializer;
import jme3test.network.TestChatServer.ChatMessage;
/**
* A simple test chat server. When SM implements a set
* of standard chat classes this can become a lot simpler.
@ -58,115 +51,108 @@ import jme3test.network.TestChatServer.ChatMessage;
* @version $Revision$
* @author Paul Speed
*/
public class TestChatClient extends JFrame
{
public class TestChatClient extends JFrame {
private Client client;
private JEditorPane chatLog;
private StringBuilder chatMessages = new StringBuilder();
private JTextField nameField;
private JTextField messageField;
public TestChatClient( String host ) throws IOException
{
super( "jME3 Test Chat Client - to:" + host );
public TestChatClient(String host) throws IOException {
super("jME3 Test Chat Client - to:" + host);
// Build out the UI
setDefaultCloseOperation( DISPOSE_ON_CLOSE );
setSize( 800, 600 );
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setSize(800, 600);
chatLog = new JEditorPane();
chatLog.setEditable(false);
chatLog.setContentType("text/html");
chatLog.setText( "<html><body>" );
chatLog.setText("<html><body>");
getContentPane().add( new JScrollPane(chatLog), "Center" );
getContentPane().add(new JScrollPane(chatLog), "Center");
// A crude form
JPanel p = new JPanel();
p.setLayout( new BoxLayout(p, BoxLayout.X_AXIS) );
p.add( new JLabel( "Name:" ) );
nameField = new JTextField( System.getProperty( "user.name", "yourname" ) );
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.add(new JLabel("Name:"));
nameField = new JTextField(System.getProperty("user.name", "yourname"));
Dimension d = nameField.getPreferredSize();
nameField.setMaximumSize( new Dimension(120, d.height + 6) );
p.add( nameField );
p.add( new JLabel( " Message:" ) );
nameField.setMaximumSize(new Dimension(120, d.height + 6));
p.add(nameField);
p.add(new JLabel(" Message:"));
messageField = new JTextField();
p.add( messageField );
p.add( new JButton(new SendAction(true)) );
p.add( new JButton(new SendAction(false)) );
p.add(messageField);
p.add(new JButton(new SendAction(true)));
p.add(new JButton(new SendAction(false)));
getContentPane().add( p, "South" );
getContentPane().add(p, "South");
client = Network.connectToServer( TestChatServer.NAME, TestChatServer.VERSION,
host, TestChatServer.PORT, TestChatServer.UDP_PORT );
client.addMessageListener( new ChatHandler(), ChatMessage.class );
client = Network.connectToServer(TestChatServer.NAME, TestChatServer.VERSION,
host, TestChatServer.PORT, TestChatServer.UDP_PORT);
client.addMessageListener(new ChatHandler(), ChatMessage.class);
client.start();
}
public static String getString( Component owner, String title, String message, String initialValue )
{
return (String)JOptionPane.showInputDialog( owner, message, title, JOptionPane.PLAIN_MESSAGE,
null, null, initialValue );
public static String getString(Component owner, String title, String message, String initialValue) {
return (String) JOptionPane.showInputDialog(owner, message, title, JOptionPane.PLAIN_MESSAGE,
null, null, initialValue);
}
public static void main( String... args ) throws Exception
{
public static void main(String... args) throws Exception {
TestChatServer.initializeClasses();
// Grab a host string from the user
String s = getString( null, "Host Info", "Enter chat host:", "localhost" );
if( s == null ) {
System.out.println( "User cancelled." );
String s = getString(null, "Host Info", "Enter chat host:", "localhost");
if (s == null) {
System.out.println("User cancelled.");
return;
}
TestChatClient test = new TestChatClient( s );
test.setVisible( true );
TestChatClient test = new TestChatClient(s);
test.setVisible(true);
}
private class ChatHandler implements MessageListener<Client>
{
public void messageReceived( Client source, Message m )
{
ChatMessage chat = (ChatMessage)m;
private class ChatHandler implements MessageListener<Client> {
System.out.println( "Received:" + chat );
public void messageReceived(Client source, Message m) {
ChatMessage chat = (ChatMessage) m;
System.out.println("Received:" + chat);
// One of the least efficient ways to add text to a
// JEditorPane
chatMessages.append( "<font color='#00a000'>" + (m.isReliable() ? "TCP" : "UDP") + "</font>" );
chatMessages.append( " -- <font color='#000080'><b>" + chat.getName() + "</b></font> : " );
chatMessages.append( chat.getMessage() );
chatMessages.append( "<br />" );
chatMessages.append("<font color='#00a000'>" + (m.isReliable() ? "TCP" : "UDP") + "</font>");
chatMessages.append(" -- <font color='#000080'><b>" + chat.getName() + "</b></font> : ");
chatMessages.append(chat.getMessage());
chatMessages.append("<br />");
String s = "<html><body>" + chatMessages + "</body></html>";
chatLog.setText( s );
chatLog.setText(s);
// Set selection to the end so that the scroll panel will scroll
// down.
chatLog.select( s.length(), s.length() );
chatLog.select(s.length(), s.length());
}
}
private class SendAction extends AbstractAction
{
private class SendAction extends AbstractAction {
private boolean reliable;
public SendAction( boolean reliable )
{
super( reliable ? "TCP" : "UDP" );
public SendAction(boolean reliable) {
super(reliable ? "TCP" : "UDP");
this.reliable = reliable;
}
public void actionPerformed( ActionEvent evt )
{
public void actionPerformed(ActionEvent evt) {
String name = nameField.getText();
String message = messageField.getText();
ChatMessage chat = new ChatMessage( name, message );
ChatMessage chat = new ChatMessage(name, message);
chat.setReliable(reliable);
System.out.println( "Sending:" + chat );
client.send( chat );
System.out.println("Sending:" + chat);
client.send(chat);
}
}
}

@ -29,7 +29,6 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package jme3test.network;
import com.jme3.network.Message;
@ -41,7 +40,6 @@ import com.jme3.network.Server;
import com.jme3.network.serializing.Serializable;
import com.jme3.network.serializing.Serializer;
/**
* A simple test chat server. When SM implements a set
* of standard chat classes this can become a lot simpler.
@ -49,105 +47,92 @@ import com.jme3.network.serializing.Serializer;
* @version $Revision$
* @author Paul Speed
*/
public class TestChatServer
{
public class TestChatServer {
// Normally these and the initialized method would
// be in shared constants or something.
public static final String NAME = "Test Chat Server";
public static final int VERSION = 1;
public static final int PORT = 5110;
public static final int UDP_PORT = 5110;
public static void initializeClasses()
{
public static void initializeClasses() {
// Doing it here means that the client code only needs to
// call our initialize.
Serializer.registerClass(ChatMessage.class);
}
public static void main( String... args ) throws Exception
{
public static void main(String... args) throws Exception {
initializeClasses();
// Use this to test the client/server name version check
Server server = Network.createServer( NAME, VERSION, PORT, UDP_PORT );
Server server = Network.createServer(NAME, VERSION, PORT, UDP_PORT);
server.start();
ChatHandler handler = new ChatHandler();
server.addMessageListener( handler, ChatMessage.class );
server.addMessageListener(handler, ChatMessage.class);
// Keep running basically forever
synchronized( NAME ) {
synchronized (NAME) {
NAME.wait();
}
}
private static class ChatHandler implements MessageListener<HostedConnection>
{
public ChatHandler()
{
private static class ChatHandler implements MessageListener<HostedConnection> {
public ChatHandler() {
}
public void messageReceived( HostedConnection source, Message m )
{
if( m instanceof ChatMessage ) {
public void messageReceived(HostedConnection source, Message m) {
if (m instanceof ChatMessage) {
// Keep track of the name just in case we
// want to know it for some other reason later and it's
// a good example of session data
source.setAttribute( "name", ((ChatMessage)m).getName() );
source.setAttribute("name", ((ChatMessage) m).getName());
System.out.println( "Broadcasting:" + m + " reliable:" + m.isReliable() );
System.out.println("Broadcasting:" + m + " reliable:" + m.isReliable());
// Just rebroadcast... the reliable flag will stay the
// same so if it came in on UDP it will go out on that too
source.getServer().broadcast( m );
source.getServer().broadcast(m);
} else {
System.err.println( "Received odd message:" + m );
System.err.println("Received odd message:" + m);
}
}
}
@Serializable
public static class ChatMessage extends AbstractMessage
{
public static class ChatMessage extends AbstractMessage {
private String name;
private String message;
public ChatMessage()
{
public ChatMessage() {
}
public ChatMessage( String name, String message )
{
public ChatMessage(String name, String message) {
setName(name);
setMessage(message);
}
public void setName( String name )
{
public void setName(String name) {
this.name = name;
}
public String getName()
{
public String getName() {
return name;
}
public void setMessage( String s )
{
public void setMessage(String s) {
this.message = s;
}
public String getMessage()
{
public String getMessage() {
return message;
}
public String toString()
{
public String toString() {
return name + ":" + message;
}
}
}

@ -1,58 +0,0 @@
/*
* Copyright (c) 2009-2010 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package jme3test.network;
import com.jme3.network.connection.Client;
import com.jme3.network.connection.Server;
import java.io.IOException;
import java.net.InetAddress;
import java.util.List;
public class TestHostDiscovery {
public static void main(String[] args) throws IOException, InterruptedException{
Server server = new Server(5110, 5110);
server.start();
Client client = new Client();
client.start();
List<InetAddress> hosts = client.discoverHosts(5110, 5000);
for (InetAddress host : hosts){
System.out.println("Found host: " + host);
System.out.println("Reachable? " + host.isReachable(5000));
}
System.out.println("Connecting to: "+ hosts.get(0));
client.connect(hosts.get(0).getCanonicalHostName(), 5110, 5110);
}
}

@ -32,16 +32,18 @@
package jme3test.network;
import com.jme3.network.connection.Client;
import com.jme3.network.connection.Server;
import com.jme3.network.events.MessageAdapter;
import com.jme3.network.message.Message;
import com.jme3.network.Client;
import com.jme3.network.HostedConnection;
import com.jme3.network.MessageListener;
import com.jme3.network.Network;
import com.jme3.network.Server;
import com.jme3.network.Message;
import com.jme3.network.serializing.Serializable;
import com.jme3.network.serializing.Serializer;
import com.jme3.network.sync.MovingAverage;
import java.io.IOException;
public class TestLatency extends MessageAdapter {
public class TestLatency {
private static long startTime;
private static Client client;
@ -56,7 +58,7 @@ public class TestLatency extends MessageAdapter {
}
@Serializable
public static class TimestampMessage extends Message {
public static class TimestampMessage extends com.jme3.network.message.Message {
long timeSent = 0;
long timeReceived = 0;
@ -73,14 +75,19 @@ public class TestLatency extends MessageAdapter {
}
@Override
public void messageReceived(Message msg){
TimestampMessage timeMsg = (TimestampMessage) msg;
try {
if (timeMsg.timeReceived == 0){
TimestampMessage outMsg = new TimestampMessage(timeMsg.timeSent, getTime());
msg.getClient().send(outMsg);
}else{
public static void main(String[] args) throws IOException, InterruptedException{
Serializer.registerClass(TimestampMessage.class);
Server server = Network.createServer(5110);
server.start();
client = Network.connectToServer("localhost", 5110);
client.start();
client.addMessageListener(new MessageListener<Client>(){
public void messageReceived(Client source, Message m) {
TimestampMessage timeMsg = (TimestampMessage) m;
long curTime = getTime();
//System.out.println("Time sent: " + timeMsg.timeSent);
//System.out.println("Time received by server: " + timeMsg.timeReceived);
@ -99,26 +106,24 @@ public class TestLatency extends MessageAdapter {
client.send(new TimestampMessage(getTime(), 0));
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}, TimestampMessage.class);
public static void main(String[] args) throws IOException, InterruptedException{
Serializer.registerClass(TimestampMessage.class);
Server server = new Server(5110, 5110);
server.start();
client = new Client("localhost", 5110, 5110);
client.start();
client.addMessageListener(new TestLatency(), TimestampMessage.class);
server.addMessageListener(new TestLatency(), TimestampMessage.class);
server.addMessageListener(new MessageListener<HostedConnection>(){
public void messageReceived(HostedConnection source, Message m) {
TimestampMessage timeMsg = (TimestampMessage) m;
TimestampMessage outMsg = new TimestampMessage(timeMsg.timeSent, getTime());
source.send(outMsg);
}
}, TimestampMessage.class);
Thread.sleep(1);
client.send(new TimestampMessage(getTime(), 0));
Object obj = new Object();
synchronized(obj){
obj.wait();
}
}
}

@ -32,12 +32,12 @@
package jme3test.network;
import com.jme3.network.AbstractMessage;
import com.jme3.network.Client;
import com.jme3.network.HostedConnection;
import com.jme3.network.MessageListener;
import com.jme3.network.Network;
import com.jme3.network.Server;
import com.jme3.network.message.Message;
import com.jme3.network.serializing.Serializable;
import com.jme3.network.serializing.Serializer;
import java.io.IOException;
@ -45,11 +45,11 @@ import java.io.IOException;
public class TestMessages {
@Serializable
public static class PingMessage extends Message {
public static class PingMessage extends AbstractMessage {
}
@Serializable
public static class PongMessage extends Message {
public static class PongMessage extends AbstractMessage {
}
private static class ServerPingResponder implements MessageListener<HostedConnection> {
@ -76,15 +76,18 @@ public class TestMessages {
Server server = Network.createServer(5110);
server.start();
Client client = Network.connectToServer("192.168.1.101", 5110, 5111);
Client client = Network.connectToServer("localhost", 5110);
client.start();
server.addMessageListener(new ServerPingResponder(), PingMessage.class);
client.addMessageListener(new ClientPingResponder(), PongMessage.class);
Thread.sleep(100);
System.out.println("Sending ping message..");
System.out.println("Client: Sending ping message..");
client.send(new PingMessage());
Object obj = new Object();
synchronized (obj){
obj.wait();
}
}
}

@ -32,37 +32,39 @@
package jme3test.network;
import com.jme3.network.connection.Client;
import com.jme3.network.connection.Server;
import com.jme3.network.events.ConnectionAdapter;
import com.jme3.network.Client;
import com.jme3.network.ConnectionListener;
import com.jme3.network.HostedConnection;
import com.jme3.network.Network;
import com.jme3.network.Server;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class TestNetworkStress extends ConnectionAdapter {
public class TestNetworkStress implements ConnectionListener {
@Override
public void clientConnected(Client client) {
System.out.println("CLIENT CONNECTED: "+client.getClientID());
try {
client.kick("goodbye");
} catch (IOException ex) {
ex.printStackTrace();
public void connectionAdded(Server server, HostedConnection conn) {
System.out.println("Client Connected: "+conn.getId());
//conn.close("goodbye");
}
public void connectionRemoved(Server server, HostedConnection conn) {
}
public static void main(String[] args) throws IOException, InterruptedException{
Logger.getLogger("").getHandlers()[0].setLevel(Level.OFF);
Server server = new Server(5110, 5110);
Server server = Network.createServer(5110);
server.start();
server.addConnectionListener(new TestNetworkStress());
for (int i = 0; i < 1000; i++){
Client client = new Client("localhost", 5110, 5110);
Client client = Network.connectToServer("localhost", 5110);
client.start();
Thread.sleep(10);
client.close();
}
}
}

@ -34,25 +34,45 @@ package jme3test.network;
import com.jme3.app.SimpleApplication;
import com.jme3.export.Savable;
import com.jme3.network.connection.Client;
import com.jme3.network.connection.Server;
import com.jme3.network.Client;
import com.jme3.network.Network;
import com.jme3.network.Server;
import com.jme3.network.rmi.ObjectDef;
import com.jme3.network.rmi.ObjectStore;
import com.jme3.network.rmi.RemoteObjectDefMessage;
import com.jme3.network.serializing.Serializer;
import com.jme3.network.serializing.serializers.SavableSerializer;
import com.jme3.scene.Spatial;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
public class TestRemoteCall {
private static SimpleApplication serverApp;
/**
* Interface implemented by the server, exposing
* RMI calls that clients can use.
*/
public static interface ServerAccess {
public void attachChild(String model);
/**
* Attaches the model with the given name to the server's scene.
*
* @param model The model name
*
* @return True if the model was attached.
*
* @throws RuntimeException If some error occurs.
*/
public boolean attachChild(String model);
}
public static class ServerAccessImpl implements ServerAccess {
public void attachChild(String model) {
public boolean attachChild(String model) {
if (model == null)
throw new RuntimeException("Cannot be null. .. etc");
final String finalModel = model;
serverApp.enqueue(new Callable<Void>() {
public Void call() throws Exception {
@ -61,6 +81,7 @@ public class TestRemoteCall {
return null;
}
});
return true;
}
}
@ -73,7 +94,7 @@ public class TestRemoteCall {
serverApp.start();
try {
Server server = new Server(5110, 5110);
Server server = Network.createServer(5110);
server.start();
ObjectStore store = new ObjectStore(server);
@ -88,11 +109,12 @@ public class TestRemoteCall {
createServer();
Client client = new Client("localhost", 5110, 5110);
Client client = Network.connectToServer("localhost", 5110);
client.start();
ObjectStore store = new ObjectStore(client);
ServerAccess access = store.getExposedObject("access", ServerAccess.class, true);
access.attachChild("Models/Ferrari/WheelBackLeft.mesh.xml");
boolean result = access.attachChild("Models/Oto/Oto.mesh.xml");
System.out.println(result);
}
}

@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package jme3test.network;
import com.jme3.network.AbstractMessage;
import com.jme3.network.Client;
import com.jme3.network.Message;
import com.jme3.network.MessageConnection;
@ -47,59 +47,64 @@ public class TestThroughput implements MessageListener<MessageConnection> { //ex
private static long lastTime = -1;
private static long counter = 0;
private static long total = 0;
private static Client client;
// Change this flag to test UDP instead of TCP
private static boolean testReliable = false;
private boolean isOnServer;
public TestThroughput( boolean isOnServer ) {
public TestThroughput(boolean isOnServer) {
this.isOnServer = isOnServer;
}
@Serializable
public static class TestMessage extends AbstractMessage {
public TestMessage() {
setReliable(testReliable);
}
}
@Override
public void messageReceived( MessageConnection source, Message msg){
public void messageReceived(MessageConnection source, Message msg) {
if( !isOnServer ) {
if (!isOnServer) {
// It's local to the client so we got it back
counter++;
total++;
long time = System.currentTimeMillis();
//System.out.println( "total:" + total + " counter:" + counter + " lastTime:" + lastTime + " time:" + time );
if( lastTime < 0 ) {
if (lastTime < 0) {
lastTime = time;
} else if( time - lastTime > 1000 ) {
} else if (time - lastTime > 1000) {
long delta = time - lastTime;
double scale = delta / 1000.0;
double pps = counter / scale;
System.out.println( "messages per second:" + pps + " total messages:" + total );
System.out.println("messages per second:" + pps + " total messages:" + total);
counter = 0;
lastTime = time;
}
} else {
if( source == null ) {
System.out.println( "Received a message from a not fully connected source, msg:"+ msg );
if (source == null) {
System.out.println("Received a message from a not fully connected source, msg:" + msg);
} else {
//System.out.println( "sending:" + msg + " back to client:" + source );
// The 'reliable' flag is transient and the server doesn't
// (yet) reset this value for us.
((com.jme3.network.message.Message)msg).setReliable(testReliable);
((com.jme3.network.Message) msg).setReliable(testReliable);
source.send(msg);
}
}
}
public static void main(String[] args) throws IOException, InterruptedException{
public static void main(String[] args) throws IOException, InterruptedException {
Serializer.registerClass(TestMessage.class);
// Use this to test the client/server name version check
//Server server = Network.createServer( "bad name", 42, 5110, 5110 );
Server server = Network.createServer( 5110, 5110 );
Server server = Network.createServer(5110, 5110);
server.start();
Client client = Network.connectToServer( "localhost", 5110 );
Client client = Network.connectToServer("localhost", 5110);
client.start();
client.addMessageListener(new TestThroughput(false), TestMessage.class);
@ -109,20 +114,11 @@ public class TestThroughput implements MessageListener<MessageConnection> { //ex
TestMessage test = new TestMessage();
// for( int i = 0; i < 10; i++ ) {
while( true ) {
while (true) {
//System.out.println( "sending." );
client.send(test);
}
//Thread.sleep(5000);
}
@Serializable
public static class TestMessage extends com.jme3.network.message.Message {
public TestMessage(){
setReliable(testReliable);
}
}
}

Loading…
Cancel
Save