From 878f2cbbbca2d794d8c2010368d210b3a7ca5717 Mon Sep 17 00:00:00 2001 From: Maselbas Date: Sun, 17 May 2015 20:40:25 +0200 Subject: [PATCH 01/32] Bullet PhysicsRigigBody : added set/getAngularFactor(Vector3f) and set/getLinearFactor(Vector3f), these methods are usefull for locking axis translations or rotation --- ...m_jme3_bullet_objects_PhysicsRigidBody.cpp | 62 +++++++++++++++++-- ...com_jme3_bullet_objects_PhysicsRigidBody.h | 30 ++++++++- .../jme3/bullet/objects/PhysicsRigidBody.java | 35 +++++++++-- 3 files changed, 114 insertions(+), 13 deletions(-) diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp index 0d9621bb8..39125f48e 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp @@ -811,17 +811,17 @@ extern "C" { /* * Class: com_jme3_bullet_objects_PhysicsRigidBody * Method: getAngularFactor - * Signature: (J)F + * Signature: (JLcom/jme3/math/Vector3f;)V */ - JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularFactor - (JNIEnv *env, jobject object, jlong bodyId) { + JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularFactor + (JNIEnv *env, jobject object, jlong bodyId, jobject factor) { btRigidBody* body = reinterpret_cast(bodyId); if (body == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); - return 0; + return; } - return body->getAngularFactor().getX(); + jmeBulletUtil::convert(env, &body->getAngularFactor(), factor); } /* @@ -844,6 +844,58 @@ extern "C" { body->setAngularFactor(vec1); } + /* + * Class: com_jme3_bullet_objects_PhysicsRigidBody + * Method: setAngularFactor + * Signature: (JLcom/jme3/math/Vector3f;)V + */ + JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor + (JNIEnv *env, jobject object, jlong bodyId, jobject factor) { + btRigidBody* body = reinterpret_cast(bodyId); + if (body == NULL) { + jclass newExc = env->FindClass("java/lang/NullPointerException"); + env->ThrowNew(newExc, "The native object does not exist."); + return; + } + btVector3 vec = btVector3(); + jmeBulletUtil::convert(env, factor, &vec); + body->setAngularFactor(vec); + } + + /* + * Class: com_jme3_bullet_objects_PhysicsRigidBody + * Method: getLinearFactor + * Signature: (JLcom/jme3/math/Vector3f;)V + */ + JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearFactor + (JNIEnv *env, jobject object, jlong bodyId, jobject factor) { + btRigidBody* body = reinterpret_cast(bodyId); + if (body == NULL) { + jclass newExc = env->FindClass("java/lang/NullPointerException"); + env->ThrowNew(newExc, "The native object does not exist."); + return; + } + jmeBulletUtil::convert(env, &body->getLinearFactor(), factor); + } + + /* + * Class: com_jme3_bullet_objects_PhysicsRigidBody + * Method: setLinearFactor + * Signature: (JLcom/jme3/math/Vector3f;)V + */ + JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearFactor + (JNIEnv *env, jobject object, jlong bodyId, jobject factor) { + btRigidBody* body = reinterpret_cast(bodyId); + if (body == NULL) { + jclass newExc = env->FindClass("java/lang/NullPointerException"); + env->ThrowNew(newExc, "The native object does not exist."); + return; + } + btVector3 vec = btVector3(); + jmeBulletUtil::convert(env, factor, &vec); + body->setLinearFactor(vec); + } + #ifdef __cplusplus } #endif diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h index aa09a620a..d966f74e2 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h @@ -396,10 +396,10 @@ JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngula /* * Class: com_jme3_bullet_objects_PhysicsRigidBody * Method: getAngularFactor - * Signature: (J)F + * Signature: (JLcom/jme3/math/Vector3f;)V */ -JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularFactor - (JNIEnv *, jobject, jlong); +JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularFactor + (JNIEnv *, jobject, jlong, jobject); /* * Class: com_jme3_bullet_objects_PhysicsRigidBody @@ -409,6 +409,30 @@ JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngula JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor (JNIEnv *, jobject, jlong, jfloat); +/* + * Class: com_jme3_bullet_objects_PhysicsRigidBody + * Method: setAngularFactor + * Signature: (JLcom/jme3/math/Vector3f;)V + */ +JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor + (JNIEnv *, jobject, jlong, jobject); + +/* + * Class: com_jme3_bullet_objects_PhysicsRigidBody + * Method: getLinearFactor + * Signature: (JLcom/jme3/math/Vector3f;)V + */ +JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getLinearFactor + (JNIEnv *, jobject, jlong, jobject); + +/* + * Class: com_jme3_bullet_objects_PhysicsRigidBody + * Method: setLinearFactor + * Signature: (JLcom/jme3/math/Vector3f;)V + */ +JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setLinearFactor + (JNIEnv *, jobject, jlong, jobject); + #ifdef __cplusplus } #endif diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java index 40417c775..c8d73d249 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java @@ -626,11 +626,13 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native float getAngularSleepingThreshold(long objectId); - public float getAngularFactor() { - return getAngularFactor(objectId); + public Vector3f getAngularFactor() { + Vector3f vec = new Vector3f(); + getAngularFactor(objectId, vec); + return vec; } - private native float getAngularFactor(long objectId); + private native void getAngularFactor(long objectId, Vector3f vec); public void setAngularFactor(float factor) { setAngularFactor(objectId, factor); @@ -638,6 +640,27 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setAngularFactor(long objectId, float factor); + public void setAngularFactor(Vector3f factor) { + setAngularFactor(objectId, factor); + } + + private native void setAngularFactor(long objectId, Vector3f factor); + + public Vector3f getLinearFactor() { + Vector3f vec = new Vector3f(); + getLinearFactor(objectId, vec); + return vec; + } + + private native void getLinearFactor(long objectId, Vector3f vec); + + public void setLinearFactor(Vector3f factor) { + setLinearFactor(objectId, factor); + } + + private native void setLinearFactor(long objectId, Vector3f factor); + + /** * do not use manually, joints are added automatically */ @@ -673,7 +696,8 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { capsule.write(getGravity(), "gravity", Vector3f.ZERO); capsule.write(getFriction(), "friction", 0.5f); capsule.write(getRestitution(), "restitution", 0); - capsule.write(getAngularFactor(), "angularFactor", 1); + capsule.write(getAngularFactor(), "angularFactor", Vector3f.UNIT_XYZ); + capsule.write(getLinearFactor(), "linearFactor", Vector3f.UNIT_XYZ); capsule.write(kinematic, "kinematic", false); capsule.write(getLinearDamping(), "linearDamping", 0); @@ -703,7 +727,8 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { setKinematic(capsule.readBoolean("kinematic", false)); setRestitution(capsule.readFloat("restitution", 0)); - setAngularFactor(capsule.readFloat("angularFactor", 1)); + setAngularFactor((Vector3f) capsule.readSavable("angularFactor", Vector3f.UNIT_XYZ.clone())); + setLinearFactor((Vector3f) capsule.readSavable("linearFactor", Vector3f.UNIT_XYZ.clone())); setDamping(capsule.readFloat("linearDamping", 0), capsule.readFloat("angularDamping", 0)); setSleepingThresholds(capsule.readFloat("linearSleepingThreshold", 0.8f), capsule.readFloat("angularSleepingThreshold", 1.0f)); setCcdMotionThreshold(capsule.readFloat("ccdMotionThreshold", 0)); From 37800618635081cf033b9e58d1571285a76c82bc Mon Sep 17 00:00:00 2001 From: Maselbas Date: Mon, 18 May 2015 00:34:42 +0200 Subject: [PATCH 02/32] Bullet PhysicsRididBody : compile time error fix --- ...m_jme3_bullet_objects_PhysicsRigidBody.cpp | 28 +++++++++---------- ...com_jme3_bullet_objects_PhysicsRigidBody.h | 4 +-- .../jme3/bullet/objects/PhysicsRigidBody.java | 4 +-- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp index 39125f48e..2bb6e057e 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp @@ -829,20 +829,20 @@ extern "C" { * Method: setAngularFactor * Signature: (JF)V */ - JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor - (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { - btRigidBody* body = reinterpret_cast(bodyId); - if (body == NULL) { - jclass newExc = env->FindClass("java/lang/NullPointerException"); - env->ThrowNew(newExc, "The native object does not exist."); - return; - } - btVector3 vec1 = btVector3(); - vec1.setX(value); - vec1.setY(value); - vec1.setZ(value); - body->setAngularFactor(vec1); - } +// JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor +// (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { +// btRigidBody* body = reinterpret_cast(bodyId); +// if (body == NULL) { +// jclass newExc = env->FindClass("java/lang/NullPointerException"); +// env->ThrowNew(newExc, "The native object does not exist."); +// return; +// } +// btVector3 vec1 = btVector3(); +// vec1.setX(value); +// vec1.setY(value); +// vec1.setZ(value); +// body->setAngularFactor(vec1); +// } /* * Class: com_jme3_bullet_objects_PhysicsRigidBody diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h index d966f74e2..cb714c7bc 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h @@ -406,8 +406,8 @@ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularF * Method: setAngularFactor * Signature: (JF)V */ -JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor - (JNIEnv *, jobject, jlong, jfloat); +//JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor +// (JNIEnv *, jobject, jlong, jfloat); /* * Class: com_jme3_bullet_objects_PhysicsRigidBody diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java index c8d73d249..d17b595c7 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java @@ -635,11 +635,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void getAngularFactor(long objectId, Vector3f vec); public void setAngularFactor(float factor) { - setAngularFactor(objectId, factor); + setAngularFactor(objectId, new Vector3f(factor, factor, factor)); } - private native void setAngularFactor(long objectId, float factor); - public void setAngularFactor(Vector3f factor) { setAngularFactor(objectId, factor); } From 5de3163fb8843fe3ca37e9c4e85f95dc73d5f4d6 Mon Sep 17 00:00:00 2001 From: Maselbas Date: Mon, 18 May 2015 22:36:45 +0200 Subject: [PATCH 03/32] Bullet RigidBody : removed commented code --- ...m_jme3_bullet_objects_PhysicsRigidBody.cpp | 19 ------------------- ...com_jme3_bullet_objects_PhysicsRigidBody.h | 7 ------- 2 files changed, 26 deletions(-) diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp index 2bb6e057e..c9fef97cb 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.cpp @@ -824,25 +824,6 @@ extern "C" { jmeBulletUtil::convert(env, &body->getAngularFactor(), factor); } - /* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularFactor - * Signature: (JF)V - */ -// JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor -// (JNIEnv *env, jobject object, jlong bodyId, jfloat value) { -// btRigidBody* body = reinterpret_cast(bodyId); -// if (body == NULL) { -// jclass newExc = env->FindClass("java/lang/NullPointerException"); -// env->ThrowNew(newExc, "The native object does not exist."); -// return; -// } -// btVector3 vec1 = btVector3(); -// vec1.setX(value); -// vec1.setY(value); -// vec1.setZ(value); -// body->setAngularFactor(vec1); -// } /* * Class: com_jme3_bullet_objects_PhysicsRigidBody diff --git a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h index cb714c7bc..67ba9e609 100644 --- a/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h +++ b/jme3-bullet-native/src/native/cpp/com_jme3_bullet_objects_PhysicsRigidBody.h @@ -401,13 +401,6 @@ JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngula JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_getAngularFactor (JNIEnv *, jobject, jlong, jobject); -/* - * Class: com_jme3_bullet_objects_PhysicsRigidBody - * Method: setAngularFactor - * Signature: (JF)V - */ -//JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsRigidBody_setAngularFactor -// (JNIEnv *, jobject, jlong, jfloat); /* * Class: com_jme3_bullet_objects_PhysicsRigidBody From 7f2c7c5d356acc350e705168e972112bfb151e83 Mon Sep 17 00:00:00 2001 From: Dokthar Date: Fri, 17 Jul 2015 13:46:06 +0200 Subject: [PATCH 04/32] Bullet RigidBody : prevent from breaking the API & reverted --- .../jme3/bullet/objects/PhysicsRigidBody.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java index d17b595c7..a27d0ea7f 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java @@ -626,10 +626,16 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native float getAngularSleepingThreshold(long objectId); - public Vector3f getAngularFactor() { - Vector3f vec = new Vector3f(); - getAngularFactor(objectId, vec); - return vec; + public float getAngularFactor() { + return getAngularFactor(null).getX(); + } + + public Vector3f getAngularFactor(Vector3f store) { + // doing like this prevent from breaking the API + if(store == null) + store = new Vector3f(); + getAngularFactor(objectId, store); + return store; } private native void getAngularFactor(long objectId, Vector3f vec); @@ -694,8 +700,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { capsule.write(getGravity(), "gravity", Vector3f.ZERO); capsule.write(getFriction(), "friction", 0.5f); capsule.write(getRestitution(), "restitution", 0); - capsule.write(getAngularFactor(), "angularFactor", Vector3f.UNIT_XYZ); - capsule.write(getLinearFactor(), "linearFactor", Vector3f.UNIT_XYZ); + capsule.write(getAngularFactor(), "angularFactor", 1); capsule.write(kinematic, "kinematic", false); capsule.write(getLinearDamping(), "linearDamping", 0); @@ -725,8 +730,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { setKinematic(capsule.readBoolean("kinematic", false)); setRestitution(capsule.readFloat("restitution", 0)); - setAngularFactor((Vector3f) capsule.readSavable("angularFactor", Vector3f.UNIT_XYZ.clone())); - setLinearFactor((Vector3f) capsule.readSavable("linearFactor", Vector3f.UNIT_XYZ.clone())); + setAngularFactor(capsule.readFloat("angularFactor", 1)); setDamping(capsule.readFloat("linearDamping", 0), capsule.readFloat("angularDamping", 0)); setSleepingThresholds(capsule.readFloat("linearSleepingThreshold", 0.8f), capsule.readFloat("angularSleepingThreshold", 1.0f)); setCcdMotionThreshold(capsule.readFloat("ccdMotionThreshold", 0)); From 0ade3a69d484cfc926412bbb7da308037a56bf11 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sat, 18 Jul 2015 17:47:40 -0400 Subject: [PATCH 05/32] GLRenderer: FBO always available in OpenGL ES 2 --- .../src/main/java/com/jme3/renderer/opengl/GLRenderer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index 6d4e4abba..ebfbc53b0 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -376,7 +376,9 @@ public class GLRenderer implements Renderer { caps.add(Caps.TextureFilterAnisotropic); } - if (hasExtension("GL_EXT_framebuffer_object") || gl3 != null) { + if (hasExtension("GL_EXT_framebuffer_object") + || gl3 != null + || caps.contains(Caps.OpenGLES20)) { caps.add(Caps.FrameBuffer); limits.put(Limits.RenderBufferSize, getInteger(GLFbo.GL_MAX_RENDERBUFFER_SIZE_EXT)); From b1473c302c4076a4c336b65abe4f953a91abf1a2 Mon Sep 17 00:00:00 2001 From: Dokthar Date: Sun, 19 Jul 2015 20:46:03 +0200 Subject: [PATCH 06/32] Bullet RigidBody : modification of the serializer to support the old & new angular factor --- .../jme3/bullet/objects/PhysicsRigidBody.java | 116 ++++++++++++------ 1 file changed, 80 insertions(+), 36 deletions(-) diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java index a27d0ea7f..1d59f304a 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java @@ -51,7 +51,9 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - *

PhysicsRigidBody - Basic physics object

+ *

+ * PhysicsRigidBody - Basic physics object

+ * * @author normenhansen */ public class PhysicsRigidBody extends PhysicsCollisionObject { @@ -66,6 +68,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Creates a new PhysicsRigidBody with the supplied collision shape + * * @param child * @param shape */ @@ -134,6 +137,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the physics object location + * * @param location the location of the actual physics object */ public void setPhysicsLocation(Vector3f location) { @@ -144,6 +148,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the physics object rotation + * * @param rotation the rotation of the actual physics object */ public void setPhysicsRotation(Matrix3f rotation) { @@ -154,6 +159,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the physics object rotation + * * @param rotation the rotation of the actual physics object */ public void setPhysicsRotation(Quaternion rotation) { @@ -249,9 +255,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { // return Converter.convert(tempTrans.basis, rotation); // } /** - * Sets the node to kinematic mode. in this mode the node is not affected by physics - * but affects other physics objects. Iits kinetic force is calculated by the amount - * of movement it is exposed to and its weight. + * Sets the node to kinematic mode. in this mode the node is not affected by + * physics but affects other physics objects. Iits kinetic force is + * calculated by the amount of movement it is exposed to and its weight. + * * @param kinematic */ public void setKinematic(boolean kinematic) { @@ -272,8 +279,11 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setCcdSweptSphereRadius(long objectId, float radius); /** - * Sets the amount of motion that has to happen in one physics tick to trigger the continuous motion detection
- * This avoids the problem of fast objects moving through other objects, set to zero to disable (default) + * Sets the amount of motion that has to happen in one physics tick to + * trigger the continuous motion detection
+ * This avoids the problem of fast objects moving through other objects, set + * to zero to disable (default) + * * @param threshold */ public void setCcdMotionThreshold(float threshold) { @@ -306,6 +316,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the mass of this PhysicsRigidBody, objects with mass=0 are static. + * * @param mass */ public void setMass(float mass) { @@ -345,8 +356,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Set the local gravity of this PhysicsRigidBody
- * Set this after adding the node to the PhysicsSpace, - * the PhysicsSpace assigns its current gravity to the physics node when its added. + * Set this after adding the node to the PhysicsSpace, the PhysicsSpace + * assigns its current gravity to the physics node when its added. + * * @param gravity the gravity vector to set */ public void setGravity(Vector3f gravity) { @@ -363,6 +375,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the friction of this physics object + * * @param friction the friction of this physics object */ public void setFriction(float friction) { @@ -389,10 +402,11 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { public void setLinearDamping(float linearDamping) { setDamping(objectId, linearDamping, getAngularDamping()); } - + public void setAngularDamping(float angularDamping) { setAngularDamping(objectId, angularDamping); } + private native void setAngularDamping(long objectId, float factor); public float getLinearDamping() { @@ -414,7 +428,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native float getRestitution(long objectId); /** - * The "bouncyness" of the PhysicsRigidBody, best performance if restitution=0 + * The "bouncyness" of the PhysicsRigidBody, best performance if + * restitution=0 + * * @param restitution */ public void setRestitution(float restitution) { @@ -425,6 +441,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Get the current angular velocity of this PhysicsRigidBody + * * @return the current linear velocity */ public Vector3f getAngularVelocity() { @@ -437,6 +454,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Get the current angular velocity of this PhysicsRigidBody + * * @param vec the vector to store the velocity in */ public void getAngularVelocity(Vector3f vec) { @@ -445,6 +463,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the angular velocity of this PhysicsRigidBody + * * @param vec the angular velocity of this PhysicsRigidBody */ public void setAngularVelocity(Vector3f vec) { @@ -456,6 +475,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Get the current linear velocity of this PhysicsRigidBody + * * @return the current linear velocity */ public Vector3f getLinearVelocity() { @@ -468,6 +488,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Get the current linear velocity of this PhysicsRigidBody + * * @param vec the vector to store the velocity in */ public void getLinearVelocity(Vector3f vec) { @@ -476,6 +497,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the linear velocity of this PhysicsRigidBody + * * @param vec the linear velocity of this PhysicsRigidBody */ public void setLinearVelocity(Vector3f vec) { @@ -486,9 +508,11 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setLinearVelocity(long objectId, Vector3f vec); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call - * updates the physics space.
- * To apply an impulse, use applyImpulse, use applyContinuousForce to apply continuous force. + * Apply a force to the PhysicsRigidBody, only applies force if the next + * physics update call updates the physics space.
+ * To apply an impulse, use applyImpulse, use applyContinuousForce to apply + * continuous force. + * * @param force the force * @param location the location of the force */ @@ -500,10 +524,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyForce(long objectId, Vector3f force, Vector3f location); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call - * updates the physics space.
+ * Apply a force to the PhysicsRigidBody, only applies force if the next + * physics update call updates the physics space.
* To apply an impulse, use applyImpulse. - * + * * @param force the force */ public void applyCentralForce(Vector3f force) { @@ -514,10 +538,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyCentralForce(long objectId, Vector3f force); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call - * updates the physics space.
+ * Apply a force to the PhysicsRigidBody, only applies force if the next + * physics update call updates the physics space.
* To apply an impulse, use applyImpulse. - * + * * @param torque the torque */ public void applyTorque(Vector3f torque) { @@ -529,6 +553,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Apply an impulse to the PhysicsRigidBody in the next physics update. + * * @param impulse applied impulse * @param rel_pos location relative to object */ @@ -540,7 +565,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyImpulse(long objectId, Vector3f impulse, Vector3f rel_pos); /** - * Apply a torque impulse to the PhysicsRigidBody in the next physics update. + * Apply a torque impulse to the PhysicsRigidBody in the next physics + * update. + * * @param vec */ public void applyTorqueImpulse(Vector3f vec) { @@ -552,7 +579,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Clear all forces from the PhysicsRigidBody - * + * */ public void clearForces() { clearForces(objectId); @@ -576,7 +603,8 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setCollisionShape(long objectId, long collisionShapeId); /** - * reactivates this PhysicsRigidBody when it has been deactivated because it was not moving + * reactivates this PhysicsRigidBody when it has been deactivated because it + * was not moving */ public void activate() { activate(objectId); @@ -591,8 +619,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native boolean isActive(long objectId); /** - * sets the sleeping thresholds, these define when the object gets deactivated - * to save ressources. Low values keep the object active when it barely moves + * sets the sleeping thresholds, these define when the object gets + * deactivated to save ressources. Low values keep the object active when it + * barely moves + * * @param linear the linear sleeping threshold * @param angular the angular sleeping threshold */ @@ -629,11 +659,12 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { public float getAngularFactor() { return getAngularFactor(null).getX(); } - + public Vector3f getAngularFactor(Vector3f store) { - // doing like this prevent from breaking the API - if(store == null) + // doing like this prevent from breaking the API + if (store == null) { store = new Vector3f(); + } getAngularFactor(objectId, store); return store; } @@ -645,26 +676,25 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } public void setAngularFactor(Vector3f factor) { - setAngularFactor(objectId, factor); + setAngularFactor(objectId, factor); } private native void setAngularFactor(long objectId, Vector3f factor); public Vector3f getLinearFactor() { Vector3f vec = new Vector3f(); - getLinearFactor(objectId, vec); + getLinearFactor(objectId, vec); return vec; } private native void getLinearFactor(long objectId, Vector3f vec); public void setLinearFactor(Vector3f factor) { - setLinearFactor(objectId, factor); + setLinearFactor(objectId, factor); } private native void setLinearFactor(long objectId, Vector3f factor); - /** * do not use manually, joints are added automatically */ @@ -675,15 +705,17 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } /** - * + * */ public void removeJoint(PhysicsJoint joint) { joints.remove(joint); } /** - * Returns a list of connected joints. This list is only filled when - * the PhysicsRigidBody is actually added to the physics space or loaded from disk. + * Returns a list of connected joints. This list is only filled when the + * PhysicsRigidBody is actually added to the physics space or loaded from + * disk. + * * @return list of active joints connected to this PhysicsRigidBody */ public List getJoints() { @@ -700,7 +732,13 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { capsule.write(getGravity(), "gravity", Vector3f.ZERO); capsule.write(getFriction(), "friction", 0.5f); capsule.write(getRestitution(), "restitution", 0); - capsule.write(getAngularFactor(), "angularFactor", 1); + Vector3f angularFactor = getAngularFactor(null); + if (angularFactor.x == angularFactor.y && angularFactor.y == angularFactor.z) { + capsule.write(getAngularFactor(), "angularFactor", 1); + } else { + capsule.write(getAngularFactor(null), "angularFactor", Vector3f.UNIT_XYZ); + capsule.write(getLinearFactor(), "linearFactor", Vector3f.UNIT_XYZ); + } capsule.write(kinematic, "kinematic", false); capsule.write(getLinearDamping(), "linearDamping", 0); @@ -730,7 +768,13 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { setKinematic(capsule.readBoolean("kinematic", false)); setRestitution(capsule.readFloat("restitution", 0)); - setAngularFactor(capsule.readFloat("angularFactor", 1)); + Vector3f angularFactor = (Vector3f) capsule.readSavable("angularFactor", Vector3f.NAN.clone()); + if(angularFactor == Vector3f.NAN) { + setAngularFactor(capsule.readFloat("angularFactor", 1)); + } else { + setAngularFactor(angularFactor); + setLinearFactor((Vector3f) capsule.readSavable("linearFactor", Vector3f.UNIT_XYZ.clone())); + } setDamping(capsule.readFloat("linearDamping", 0), capsule.readFloat("angularDamping", 0)); setSleepingThresholds(capsule.readFloat("linearSleepingThreshold", 0.8f), capsule.readFloat("angularSleepingThreshold", 1.0f)); setCcdMotionThreshold(capsule.readFloat("ccdMotionThreshold", 0)); From abbdefdcef2ccadf1a1089f4fb2522219b16dfa4 Mon Sep 17 00:00:00 2001 From: Dokthar Date: Sun, 19 Jul 2015 21:04:54 +0200 Subject: [PATCH 07/32] Bullet RigidBody : revert IDE autoformatting noise --- .../jme3/bullet/objects/PhysicsRigidBody.java | 93 +++++++------------ 1 file changed, 31 insertions(+), 62 deletions(-) diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java index 1d59f304a..6f6eb4d76 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java @@ -51,9 +51,7 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - *

- * PhysicsRigidBody - Basic physics object

- * + *

PhysicsRigidBody - Basic physics object

* @author normenhansen */ public class PhysicsRigidBody extends PhysicsCollisionObject { @@ -68,7 +66,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Creates a new PhysicsRigidBody with the supplied collision shape - * * @param child * @param shape */ @@ -137,7 +134,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the physics object location - * * @param location the location of the actual physics object */ public void setPhysicsLocation(Vector3f location) { @@ -148,7 +144,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the physics object rotation - * * @param rotation the rotation of the actual physics object */ public void setPhysicsRotation(Matrix3f rotation) { @@ -159,7 +154,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the physics object rotation - * * @param rotation the rotation of the actual physics object */ public void setPhysicsRotation(Quaternion rotation) { @@ -255,10 +249,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { // return Converter.convert(tempTrans.basis, rotation); // } /** - * Sets the node to kinematic mode. in this mode the node is not affected by - * physics but affects other physics objects. Iits kinetic force is - * calculated by the amount of movement it is exposed to and its weight. - * + * Sets the node to kinematic mode. in this mode the node is not affected by physics + * but affects other physics objects. Iits kinetic force is calculated by the amount + * of movement it is exposed to and its weight. * @param kinematic */ public void setKinematic(boolean kinematic) { @@ -279,11 +272,8 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setCcdSweptSphereRadius(long objectId, float radius); /** - * Sets the amount of motion that has to happen in one physics tick to - * trigger the continuous motion detection
- * This avoids the problem of fast objects moving through other objects, set - * to zero to disable (default) - * + * Sets the amount of motion that has to happen in one physics tick to trigger the continuous motion detection
+ * This avoids the problem of fast objects moving through other objects, set to zero to disable (default) * @param threshold */ public void setCcdMotionThreshold(float threshold) { @@ -316,7 +306,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the mass of this PhysicsRigidBody, objects with mass=0 are static. - * * @param mass */ public void setMass(float mass) { @@ -356,9 +345,8 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Set the local gravity of this PhysicsRigidBody
- * Set this after adding the node to the PhysicsSpace, the PhysicsSpace - * assigns its current gravity to the physics node when its added. - * + * Set this after adding the node to the PhysicsSpace, + * the PhysicsSpace assigns its current gravity to the physics node when its added. * @param gravity the gravity vector to set */ public void setGravity(Vector3f gravity) { @@ -375,7 +363,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the friction of this physics object - * * @param friction the friction of this physics object */ public void setFriction(float friction) { @@ -402,11 +389,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { public void setLinearDamping(float linearDamping) { setDamping(objectId, linearDamping, getAngularDamping()); } - + public void setAngularDamping(float angularDamping) { setAngularDamping(objectId, angularDamping); } - private native void setAngularDamping(long objectId, float factor); public float getLinearDamping() { @@ -428,9 +414,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native float getRestitution(long objectId); /** - * The "bouncyness" of the PhysicsRigidBody, best performance if - * restitution=0 - * + * The "bouncyness" of the PhysicsRigidBody, best performance if restitution=0 * @param restitution */ public void setRestitution(float restitution) { @@ -441,7 +425,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Get the current angular velocity of this PhysicsRigidBody - * * @return the current linear velocity */ public Vector3f getAngularVelocity() { @@ -454,7 +437,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Get the current angular velocity of this PhysicsRigidBody - * * @param vec the vector to store the velocity in */ public void getAngularVelocity(Vector3f vec) { @@ -463,7 +445,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the angular velocity of this PhysicsRigidBody - * * @param vec the angular velocity of this PhysicsRigidBody */ public void setAngularVelocity(Vector3f vec) { @@ -475,7 +456,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Get the current linear velocity of this PhysicsRigidBody - * * @return the current linear velocity */ public Vector3f getLinearVelocity() { @@ -488,7 +468,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Get the current linear velocity of this PhysicsRigidBody - * * @param vec the vector to store the velocity in */ public void getLinearVelocity(Vector3f vec) { @@ -497,7 +476,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Sets the linear velocity of this PhysicsRigidBody - * * @param vec the linear velocity of this PhysicsRigidBody */ public void setLinearVelocity(Vector3f vec) { @@ -508,11 +486,9 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setLinearVelocity(long objectId, Vector3f vec); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next - * physics update call updates the physics space.
- * To apply an impulse, use applyImpulse, use applyContinuousForce to apply - * continuous force. - * + * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call + * updates the physics space.
+ * To apply an impulse, use applyImpulse, use applyContinuousForce to apply continuous force. * @param force the force * @param location the location of the force */ @@ -524,10 +500,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyForce(long objectId, Vector3f force, Vector3f location); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next - * physics update call updates the physics space.
+ * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call + * updates the physics space.
* To apply an impulse, use applyImpulse. - * + * * @param force the force */ public void applyCentralForce(Vector3f force) { @@ -538,10 +514,10 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyCentralForce(long objectId, Vector3f force); /** - * Apply a force to the PhysicsRigidBody, only applies force if the next - * physics update call updates the physics space.
+ * Apply a force to the PhysicsRigidBody, only applies force if the next physics update call + * updates the physics space.
* To apply an impulse, use applyImpulse. - * + * * @param torque the torque */ public void applyTorque(Vector3f torque) { @@ -553,7 +529,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Apply an impulse to the PhysicsRigidBody in the next physics update. - * * @param impulse applied impulse * @param rel_pos location relative to object */ @@ -565,9 +540,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void applyImpulse(long objectId, Vector3f impulse, Vector3f rel_pos); /** - * Apply a torque impulse to the PhysicsRigidBody in the next physics - * update. - * + * Apply a torque impulse to the PhysicsRigidBody in the next physics update. * @param vec */ public void applyTorqueImpulse(Vector3f vec) { @@ -579,7 +552,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { /** * Clear all forces from the PhysicsRigidBody - * + * */ public void clearForces() { clearForces(objectId); @@ -603,8 +576,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native void setCollisionShape(long objectId, long collisionShapeId); /** - * reactivates this PhysicsRigidBody when it has been deactivated because it - * was not moving + * reactivates this PhysicsRigidBody when it has been deactivated because it was not moving */ public void activate() { activate(objectId); @@ -619,10 +591,8 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { private native boolean isActive(long objectId); /** - * sets the sleeping thresholds, these define when the object gets - * deactivated to save ressources. Low values keep the object active when it - * barely moves - * + * sets the sleeping thresholds, these define when the object gets deactivated + * to save ressources. Low values keep the object active when it barely moves * @param linear the linear sleeping threshold * @param angular the angular sleeping threshold */ @@ -676,25 +646,26 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } public void setAngularFactor(Vector3f factor) { - setAngularFactor(objectId, factor); + setAngularFactor(objectId, factor); } private native void setAngularFactor(long objectId, Vector3f factor); public Vector3f getLinearFactor() { Vector3f vec = new Vector3f(); - getLinearFactor(objectId, vec); + getLinearFactor(objectId, vec); return vec; } private native void getLinearFactor(long objectId, Vector3f vec); public void setLinearFactor(Vector3f factor) { - setLinearFactor(objectId, factor); + setLinearFactor(objectId, factor); } private native void setLinearFactor(long objectId, Vector3f factor); + /** * do not use manually, joints are added automatically */ @@ -705,17 +676,15 @@ public class PhysicsRigidBody extends PhysicsCollisionObject { } /** - * + * */ public void removeJoint(PhysicsJoint joint) { joints.remove(joint); } /** - * Returns a list of connected joints. This list is only filled when the - * PhysicsRigidBody is actually added to the physics space or loaded from - * disk. - * + * Returns a list of connected joints. This list is only filled when + * the PhysicsRigidBody is actually added to the physics space or loaded from disk. * @return list of active joints connected to this PhysicsRigidBody */ public List getJoints() { From 89fe2e57bebffe9db7268d4d5c454ebd547edc46 Mon Sep 17 00:00:00 2001 From: jmekaelthas Date: Tue, 21 Jul 2015 22:23:15 +0200 Subject: [PATCH 08/32] Bugfix: fixed some issues with bones' animations. --- .../jme3/scene/plugins/blender/animations/Ipo.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/Ipo.java b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/Ipo.java index f5113129f..6665752b7 100644 --- a/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/Ipo.java +++ b/jme3-blender/src/main/java/com/jme3/scene/plugins/blender/animations/Ipo.java @@ -145,7 +145,7 @@ public class Ipo { float[] times = new float[framesAmount + 1]; Vector3f[] translations = new Vector3f[framesAmount + 1]; - float[] translation = new float[] { localTranslation.x, localTranslation.y, localTranslation.z }; + float[] translation = new float[3]; Quaternion[] rotations = new Quaternion[framesAmount + 1]; float[] quaternionRotation = new float[] { localRotation.getX(), localRotation.getY(), localRotation.getZ(), localRotation.getW(), }; float[] eulerRotation = localRotation.toAngles(null); @@ -165,6 +165,8 @@ public class Ipo { // calculating track data for (int frame = startFrame; frame <= stopFrame; ++frame) { + boolean translationSet = false; + translation[0] = translation[1] = translation[2] = 0; int index = frame - startFrame; times[index] = index * timeBetweenFrames;// start + (frame - 1) * timeBetweenFrames; for (int j = 0; j < bezierCurves.length; ++j) { @@ -173,15 +175,18 @@ public class Ipo { // LOCATION case AC_LOC_X: translation[0] = (float) value; + translationSet = true; break; case AC_LOC_Y: if (swapAxes && value != 0) { value = -value; } translation[yIndex] = (float) value; + translationSet = true; break; case AC_LOC_Z: translation[zIndex] = (float) value; + translationSet = true; break; // EULER ROTATION @@ -235,7 +240,11 @@ public class Ipo { LOGGER.log(Level.WARNING, "Unknown ipo curve type: {0}.", bezierCurves[j].getType()); } } - translations[index] = localRotation.multLocal(new Vector3f(translation[0], translation[1], translation[2])); + if(translationSet) { + translations[index] = localRotation.multLocal(new Vector3f(translation[0], translation[1], translation[2])); + } else { + translations[index] = new Vector3f(); + } if(boneContext != null) { if(boneContext.getBone().getParent() == null && boneContext.is(BoneContext.NO_LOCAL_LOCATION)) { From aa1874442d98ed7c2aa8026ddf61ce3c8d257c75 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sun, 2 Aug 2015 13:48:31 -0400 Subject: [PATCH 10/32] Travis-CI: release test --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 71c3b576f..0aeda268d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,9 @@ cache: - gradle-cache - netbeans -branches: - only: - - master +# branches: +# only: +# - master notifications: slack: From 2bf5a5c0893d6b5548e313c409e72d19d1bb24f0 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sun, 2 Aug 2015 14:49:44 -0400 Subject: [PATCH 11/32] Travis-CI: fix release deployment --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0aeda268d..25f23fcac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,10 +29,11 @@ script: deploy: provider: releases api_key: - secure: "KbFiMt0a8FxUKvCJUYwikLYaqqGMn1p6k4OsXnGqwptQZEUIayabNLHeaD2kTNT3e6AY1ETwQLff/lB2LttmIo4g5NWW63g1K3A/HwgnhJwETengiProZ/Udl+ugPeDL/+ar43HUhFq4knBnzFKnEcHAThTPVqH/RMDvZf1UUYI=" - file: build/distributions/jME3.1.0_snapshot-github_2015-06-20.zip + secure: PuEsJd6juXBH29ByITW3ntSAyrwWs0IeFvXJ5Y2YlhojhSMtTwkoWeB6YmDJWP4fhzbajk4TQ1HlOX2IxJXSW/8ShOEIUlGXz9fHiST0dkSM+iRAUgC5enCLW5ITPTiem7eY9ZhS9miIam7ngce9jHNMh75PTzZrEJtezoALT9w= + file: build/distributions/jME3.1.0_snapshot-github_2015-08-02.zip skip_cleanup: true on: + repo: jMonkeyEngine/jmonkeyengine tags: true # before_install: From a68a9747bb04693e9f70e3dddf81f8953c24052d Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Tue, 4 Aug 2015 23:46:00 -0400 Subject: [PATCH 12/32] SDK Update Center URL: change 3.0 -> 3.1 Doesn't work yet, because the 3.1 folder is missing from the updates server. --- .../src/com/jme3/gde/core/updatecenters/Bundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/jme3-core-updatecenters/src/com/jme3/gde/core/updatecenters/Bundle.properties b/sdk/jme3-core-updatecenters/src/com/jme3/gde/core/updatecenters/Bundle.properties index 5a898643f..dd627e347 100644 --- a/sdk/jme3-core-updatecenters/src/com/jme3/gde/core/updatecenters/Bundle.properties +++ b/sdk/jme3-core-updatecenters/src/com/jme3/gde/core/updatecenters/Bundle.properties @@ -1,6 +1,6 @@ #jMP update centers -com_jme3_gde_core_update_center_nightly=http://updates.jmonkeyengine.org/nightly/3.0/plugins/updates.xml -com_jme3_gde_core_update_center_stable=http://updates.jmonkeyengine.org/stable/3.0/plugins/updates.xml +com_jme3_gde_core_update_center_nightly=http://updates.jmonkeyengine.org/nightly/3.1/plugins/updates.xml +com_jme3_gde_core_update_center_stable=http://updates.jmonkeyengine.org/stable/3.1/plugins/updates.xml com_jme3_jmp_contributions_update_center=http://updates.jmonkeyengine.org/contributions/updates.xml #jMP update centers From a655acb8f0b6ac291ad0aa7f89de74e8a8ad1f21 Mon Sep 17 00:00:00 2001 From: Nehon Date: Fri, 7 Aug 2015 08:34:11 +0200 Subject: [PATCH 13/32] BatchNode now preserves the lineWidth for Line meshes when batching. --- .../src/main/java/com/jme3/scene/BatchNode.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/jme3-core/src/main/java/com/jme3/scene/BatchNode.java b/jme3-core/src/main/java/com/jme3/scene/BatchNode.java index 9a920093d..c3a0ab4bb 100644 --- a/jme3-core/src/main/java/com/jme3/scene/BatchNode.java +++ b/jme3-core/src/main/java/com/jme3/scene/BatchNode.java @@ -444,6 +444,7 @@ public class BatchNode extends GeometryGroupNode { int maxWeights = -1; Mesh.Mode mode = null; + float lineWidth = 1f; for (Geometry geom : geometries) { totalVerts += geom.getVertexCount(); totalTris += geom.getTriangleCount(); @@ -452,6 +453,7 @@ public class BatchNode extends GeometryGroupNode { maxVertCount = geom.getVertexCount(); } Mesh.Mode listMode; + float listLineWidth = 1f; int components; switch (geom.getMesh().getMode()) { case Points: @@ -462,6 +464,7 @@ public class BatchNode extends GeometryGroupNode { case LineStrip: case Lines: listMode = Mesh.Mode.Lines; + listLineWidth = geom.getMesh().getLineWidth(); components = 2; break; case TriangleFan: @@ -491,13 +494,21 @@ public class BatchNode extends GeometryGroupNode { if (mode != null && mode != listMode) { throw new UnsupportedOperationException("Cannot combine different" + " primitive types: " + mode + " != " + listMode); - } + } mode = listMode; + if (mode == Mesh.Mode.Lines) { + if (lineWidth != 1f && listLineWidth != lineWidth) { + throw new UnsupportedOperationException("When using Mesh Line mode, cannot combine meshes with different line width " + + lineWidth + " != " + listLineWidth); + } + lineWidth = listLineWidth; + } compsForBuf[VertexBuffer.Type.Index.ordinal()] = components; } outMesh.setMaxNumWeights(maxWeights); outMesh.setMode(mode); + outMesh.setLineWidth(lineWidth); if (totalVerts >= 65536) { // make sure we create an UnsignedInt buffer so // we can fit all of the meshes From d7b02925906cc090f983044a652a49fd32cc3fcb Mon Sep 17 00:00:00 2001 From: Nehon Date: Sat, 8 Aug 2015 09:26:55 +0200 Subject: [PATCH 14/32] FilterPostProcessor now checks for ogl 3.2 capability to use multitsampled textures --- .../src/main/java/com/jme3/post/FilterPostProcessor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java b/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java index 2cd8b83f8..b28aecece 100644 --- a/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java +++ b/jme3-core/src/main/java/com/jme3/post/FilterPostProcessor.java @@ -300,7 +300,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { public void postFrame(FrameBuffer out) { FrameBuffer sceneBuffer = renderFrameBuffer; - if (renderFrameBufferMS != null && !renderer.getCaps().contains(Caps.OpenGL31)) { + if (renderFrameBufferMS != null && !renderer.getCaps().contains(Caps.OpenGL32)) { renderer.copyFrameBuffer(renderFrameBufferMS, renderFrameBuffer, true); } else if (renderFrameBufferMS != null) { sceneBuffer = renderFrameBufferMS; @@ -443,7 +443,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { //antialiasing on filters only supported in opengl 3 due to depth read problem if (numSamples > 1 && caps.contains(Caps.FrameBufferMultisample)) { renderFrameBufferMS = new FrameBuffer(width, height, numSamples); - if (caps.contains(Caps.OpenGL31)) { + if (caps.contains(Caps.OpenGL32)) { Texture2D msColor = new Texture2D(width, height, numSamples, fbFormat); Texture2D msDepth = new Texture2D(width, height, numSamples, Format.Depth); renderFrameBufferMS.setDepthTexture(msDepth); @@ -456,7 +456,7 @@ public class FilterPostProcessor implements SceneProcessor, Savable { } } - if (numSamples <= 1 || !caps.contains(Caps.OpenGL31)) { + if (numSamples <= 1 || !caps.contains(Caps.OpenGL32)) { renderFrameBuffer = new FrameBuffer(width, height, 1); renderFrameBuffer.setDepthBuffer(Format.Depth); filterTexture = new Texture2D(width, height, fbFormat); From f944d7c22b8ad4f89e4200a2e662150fd6ed16b6 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sat, 8 Aug 2015 14:03:36 -0400 Subject: [PATCH 15/32] build: use SNAPSHOT as default tag Maven publishing treats the "SNAPSHOT" tag in a special way, marking that build as a snapshot type build. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a00139bdf..69670e660 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ jmeVersion = 3.1.0 # Version used for application and settings folder, no spaces! jmeMainVersion = 3.1 # Version addition pre-alpha-svn, Stable, Beta -jmeVersionTag = snapshot-github +jmeVersionTag = SNAPSHOT # specify if JavaDoc should be built buildJavaDoc = true From 0d7dea20df9e3af986e16695a6eb54a80f00e70c Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sat, 8 Aug 2015 14:06:03 -0400 Subject: [PATCH 16/32] .gitignore: add .nb-gradle folder to ignore list --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6b6f30e2d..ada426409 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,4 @@ !/jme3-bullet-native/libs/native/osx/x86_64/libbulletjme.dylib !/jme3-bullet-native/libs/native/linux/x86/libbulletjme.so !/jme3-bullet-native/libs/native/linux/x86_64/libbulletjme.so +/.nb-gradle/ \ No newline at end of file From 17887b1fb0c1478808a6aee5dc441cb59d1b5975 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sat, 8 Aug 2015 17:35:05 -0400 Subject: [PATCH 17/32] build: new build version info system * JmeVersion is no longer autogenerated, instead it pulls info from version.properties * Added version.gradle script to generate version info and expose it to other gradle scripts * Embed version info inside JAR manifest * Refactor NDK finding to use the same way as the version generation --- .gitignore | 2 +- build.gradle | 40 +++---- common.gradle | 9 +- jme3-core/build.gradle | 61 +++------- .../main/java/com/jme3/system/JmeVersion.java | 65 +++++++++++ .../com/jme3/system/version.properties | 11 ++ version.gradle | 109 ++++++++++++++++++ 7 files changed, 223 insertions(+), 74 deletions(-) create mode 100644 jme3-core/src/main/java/com/jme3/system/JmeVersion.java create mode 100644 jme3-core/src/main/resources/com/jme3/system/version.properties create mode 100644 version.gradle diff --git a/.gitignore b/.gitignore index ada426409..9f79c5149 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ /build/ /netbeans/ /jme3-core/build/ -/jme3-core/src/main/java/com/jme3/system/JmeVersion.java +/jme3-core/src/main/resources/com/jme3/system/version.properties /jme3-plugins/build/ /jme3-desktop/build/ /jme3-android-native/build/ diff --git a/build.gradle b/build.gradle index 8e6790230..7cbe10525 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,16 @@ import org.gradle.api.artifacts.* buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:1.1.0' - } + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.1.0' + } } apply plugin: 'base' +apply from: file('version.gradle') // This is applied to all sub projects subprojects { @@ -114,7 +115,12 @@ task wrapper(type: Wrapper, description: 'Creates and deploys the Gradle wrapper gradleVersion = '2.2.1' } -String findNDK() { +ext { + ndkCommandPath = "" + ndkExists = false +} + +task configureAndroidNDK { def ndkBuildFile = "ndk-build" // if windows, use ndk-build.cmd instead if (System.properties['os.name'].toLowerCase().contains('windows')) { @@ -127,27 +133,13 @@ String findNDK() { if (System.env.ANDROID_NDK != null) { ndkBuildPath = System.env.ANDROID_NDK + File.separator + ndkBuildFile } + if (new File(ndkBuildPath).exists()) { - return ndkBuildPath - } else { - return null + ndkExists = true + ndkCommandPath = ndkBuildPath } } -boolean checkNdkExists(String ndkCommandPath) { -// String ndkCommandPath = findNDK() - if (ndkCommandPath != null && new File(ndkCommandPath).exists()) { - return true - } else { - return false - } -} - -ext { - ndkCommandPath = findNDK() - ndkExists = checkNdkExists(ndkCommandPath) -} - //class IncrementalReverseTask extends DefaultTask { // @InputDirectory // def File inputDir diff --git a/common.gradle b/common.gradle index 6af4c664f..1e6bdb93f 100644 --- a/common.gradle +++ b/common.gradle @@ -6,8 +6,8 @@ apply plugin: 'java' apply plugin: 'maven' apply plugin: 'maven-publish' -group = 'com.jme3' -version = jmeVersion + '-' + jmeVersionTag +group = 'com.jme3' +version = jmePomVersion sourceCompatibility = '1.6' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' @@ -22,6 +22,11 @@ repositories { dependencies { // Adding dependencies here will add the dependencies to each subproject. testCompile group: 'junit', name: 'junit', version: '4.10' +jar { + manifest { + attributes 'Implementation-Title': 'jMonkeyEngine', + 'Implementation-Version': version + } } javadoc { diff --git a/jme3-core/build.gradle b/jme3-core/build.gradle index bd699f52a..2d3f9cc9e 100644 --- a/jme3-core/build.gradle +++ b/jme3-core/build.gradle @@ -12,55 +12,22 @@ sourceSets { } } -buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath 'org.ajoberstar:gradle-git:1.0.0-rc.1' - } -} - -import java.text.SimpleDateFormat -import org.ajoberstar.grgit.* - -task updateVersion << { - - def verfile = file('src/main/java/com/jme3/system/JmeVersion.java') - def jmeGitHash - def jmeShortGitHash - def jmeBuildDate - def jmeBranchName - - try { - def grgit = Grgit.open(project.file('.').parent) - jmeGitHash = grgit.head().id - jmeShortGitHash = grgit.head().abbreviatedId - jmeBuildDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) - jmeBranchName = grgit.branch.current.name - } catch (ex) { - // Failed to get repo info - logger.warn("Failed to get repository info: " + ex.message + ". " + \ - "Only partial build info will be generated.") - - jmeGitHash = "" - jmeShortGitHash = "" - jmeBuildDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) - jmeBranchName = "unknown" - } - - verfile.text = "\npackage com.jme3.system;\n\n" + - "/**\n * THIS IS AN AUTO-GENERATED FILE..\n * DO NOT MODIFY!\n */\n" + - "public class JmeVersion {\n" + - " public static final String BUILD_DATE = \"${jmeBuildDate}\";\n" + - " public static final String BRANCH_NAME = \"${jmeBranchName}\";\n" + - " public static final String GIT_HASH = \"${jmeGitHash}\";\n" + - " public static final String GIT_SHORT_HASH = \"${jmeShortGitHash}\";\n" + - " public static final String FULL_NAME = \"jMonkeyEngine ${jmeVersion} (${jmeVersionTag})\";\n" + - "}\n" +task updateVersionPropertiesFile << { + def verfile = file('src/main/resources/com/jme3/system/version.properties') + verfile.text = "# THIS IS AN AUTO-GENERATED FILE..\n" + + "# DO NOT MODIFY!\n" + + "build.date=${jmeBuildDate}\n" + + "git.revision=${jmeRevision}\n" + + "git.branch=${jmeBranchName}\n" + + "git.hash=${jmeGitHash}\n" + + "git.hash.short=${jmeShortGitHash}\n" + + "git.tag=${jmeGitTag}\n" + + "name.full=${jmeFullName}\n" + + "version.number=${jmeVersion}\n" + + "version.tag=${jmeVersionTag}" } -compileJava.dependsOn(updateVersion) +compileJava.dependsOn(updateVersionPropertiesFile) dependencies { } diff --git a/jme3-core/src/main/java/com/jme3/system/JmeVersion.java b/jme3-core/src/main/java/com/jme3/system/JmeVersion.java new file mode 100644 index 000000000..d17bf4083 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/system/JmeVersion.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2009-2015 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 com.jme3.system; + +import java.io.IOException; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Pulls in version info from the version.properties file. + * + * @author Kirill Vainer + */ +public class JmeVersion { + + private static final Logger logger = Logger.getLogger(JmeVersion.class.getName()); + private static final Properties props = new Properties(); + + static { + try { + props.load(JmeVersion.class.getResourceAsStream("version.properties")); + } catch (IOException ex) { + logger.log(Level.WARNING, "Unable to read version info!", ex); + } + } + + public static final String BUILD_DATE = props.getProperty("build.date", "1900-01-01"); + public static final String BRANCH_NAME = props.getProperty("git.branch", "unknown"); + public static final String GIT_HASH = props.getProperty("git.hash", ""); + public static final String GIT_SHORT_HASH = props.getProperty("git.hash.short", ""); + public static final String GIT_TAG = props.getProperty("git.tag", ""); + public static final String VERSION_NUMBER = props.getProperty("version.number", ""); + public static final String VERSION_TAG = props.getProperty("version.tag", ""); + public static final String FULL_NAME = props.getProperty("name.full", "jMonkeyEngine (unknown version)"); +} diff --git a/jme3-core/src/main/resources/com/jme3/system/version.properties b/jme3-core/src/main/resources/com/jme3/system/version.properties new file mode 100644 index 000000000..98168a14e --- /dev/null +++ b/jme3-core/src/main/resources/com/jme3/system/version.properties @@ -0,0 +1,11 @@ +# THIS IS AN AUTO-GENERATED FILE.. +# DO NOT MODIFY! +build.date=1900-01-01 +git.revision=0 +git.branch=unknown +git.hash= +git.hash.short= +git.tag= +name.full=jMonkeyEngine 3.1.0-UNKNOWN +version.number=3.1.0 +version.tag=SNAPSHOT \ No newline at end of file diff --git a/version.gradle b/version.gradle new file mode 100644 index 000000000..91d8b01a8 --- /dev/null +++ b/version.gradle @@ -0,0 +1,109 @@ +/* + Version Info Examples + ===================== + + Nightly Build Snapshot + * Full Name: jMonkeyEngine 3.1.0-5124 + * POM Version: 3.1.0-SNAPSHOT + * NBM Version: 3.1.0.5124 + * NBM UC Suffix: nightly/3.1/plugins + + Nightly Build Snapshot (PBRIsComing branch) + * Full Name: jMonkeyEngine 3.1.0-PBRIsComing-5124 + * POM Version: 3.1.0-PBRIsComing-SNAPSHOT + * NBM Version: 3.1.0.5124 + * NBM UC Suffix: PBRIsComing-nightly/3.1/plugins + + Alpha1 Release + * Full Name: jMonkeyEngine 3.1.0-alpha1 + * POM Version: 3.1.0-alpha1 + * NBM Version: 3.1.0.0 + * NBM UC Suffix: alpha1/3.1/plugins + + Final Release + * Full Name: jMonkeyEngine 3.1.0 + * POM Version: 3.1.0 + * NBM Version: 3.1.0.0 + * NBM UC Suffix: stable/3.1/plugins + */ + +import java.text.SimpleDateFormat +import org.ajoberstar.grgit.* + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'org.ajoberstar:gradle-git:1.2.0' + } +} + +ext { + jmeRevision = 0 + jmeGitHash = "" + jmeGitTag = "" + jmeShortGitHash = "" + jmeBuildDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + jmeBranchName = "unknown" + jmeFullName = "jMonkeyEngine ${jmeVersion}-UNKNOWN" + jmePomVersion = "unknown" + jmeNbmVersion = "0.0.0.0" + jmeNbmUcSuffix = "unknown" +} + +task configureVersionInfo { + try { + def grgit = Grgit.open(project.file('.')) + jmeRevision = grgit.log(includes:['HEAD']).size() + jmeGitHash = grgit.head().id + jmeShortGitHash = grgit.head().abbreviatedId + jmeBranchName = grgit.branch.current.name + jmeGitTag = grgit.describe() + if (jmeGitTag == null) jmeGitTag = "" + + jmeFullName = "jMonkeyEngine ${jmeVersion}" + jmePomVersion = jmeVersion + jmeNbmVersion = jmeVersion + + if (jmeBranchName != "master") { + jmeFullName += "-${jmeBranchName}" + jmePomVersion += "-${jmeBranchName}" + + jmeNbmUcSuffix = "${jmeBranchName}-" + } else { + jmeNbmUcSuffix = "" + } + + if (jmeVersionTag == "SNAPSHOT") { + jmeNbmUcSuffix += "nightly" + } else if (jmeVersionTag == "") { + jmeNbmUcSuffix += "stable" + } else { + jmeNbmUcSuffix += jmeVersionTag + } + + jmeNbmUcSuffix += "/" + jmeMainVersion + "/plugins" + + if (jmeVersionTag == "SNAPSHOT") { + jmeFullName += "-${jmeRevision}" + jmePomVersion += "-SNAPSHOT" + jmeNbmVersion += ".${jmeRevision}" + } else if (jmeVersionTag == "") { + jmeNbmVersion += ".0" + } else { + jmeFullName += "-${jmeVersionTag}" + jmePomVersion += "-${jmeVersionTag}" + jmeNbmVersion += ".0" + } + + logger.warn("Full Name: ${jmeFullName}") + logger.warn("POM Version: ${jmePomVersion}") + logger.warn("NBM Version: ${jmeNbmVersion}") + logger.warn("NBM UC Suffix: ${jmeNbmUcSuffix}") + } catch (ex) { + // Failed to get repo info + logger.warn("Failed to get repository info: " + ex.message + ". " + \ + "Only partial build info will be generated.") + } +} From d36749c85b6267d988105c73dd443e2451eea9e1 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sat, 8 Aug 2015 17:39:18 -0400 Subject: [PATCH 18/32] build: fix syntax error --- common.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common.gradle b/common.gradle index 1e6bdb93f..cda51dbed 100644 --- a/common.gradle +++ b/common.gradle @@ -22,6 +22,8 @@ repositories { dependencies { // Adding dependencies here will add the dependencies to each subproject. testCompile group: 'junit', name: 'junit', version: '4.10' +} + jar { manifest { attributes 'Implementation-Title': 'jMonkeyEngine', From b7ab6d003eda60d7d3379958b7029971bdd57d84 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sat, 8 Aug 2015 17:57:59 -0400 Subject: [PATCH 19/32] build: separate full version from full name --- jme3-core/build.gradle | 3 +- .../main/java/com/jme3/system/JmeVersion.java | 1 + version.gradle | 32 +++++++++---------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/jme3-core/build.gradle b/jme3-core/build.gradle index 2d3f9cc9e..2a45d440b 100644 --- a/jme3-core/build.gradle +++ b/jme3-core/build.gradle @@ -22,7 +22,8 @@ task updateVersionPropertiesFile << { "git.hash=${jmeGitHash}\n" + "git.hash.short=${jmeShortGitHash}\n" + "git.tag=${jmeGitTag}\n" + - "name.full=${jmeFullName}\n" + + "name.full=jMonkeyEngine ${jmeFullVersion}\n" + + "version.full=${jmeFullVersion}\n" + "version.number=${jmeVersion}\n" + "version.tag=${jmeVersionTag}" } diff --git a/jme3-core/src/main/java/com/jme3/system/JmeVersion.java b/jme3-core/src/main/java/com/jme3/system/JmeVersion.java index d17bf4083..0492df950 100644 --- a/jme3-core/src/main/java/com/jme3/system/JmeVersion.java +++ b/jme3-core/src/main/java/com/jme3/system/JmeVersion.java @@ -61,5 +61,6 @@ public class JmeVersion { public static final String GIT_TAG = props.getProperty("git.tag", ""); public static final String VERSION_NUMBER = props.getProperty("version.number", ""); public static final String VERSION_TAG = props.getProperty("version.tag", ""); + public static final String VERSION_FULL = props.getProperty("version.full", ""); public static final String FULL_NAME = props.getProperty("name.full", "jMonkeyEngine (unknown version)"); } diff --git a/version.gradle b/version.gradle index 91d8b01a8..983090013 100644 --- a/version.gradle +++ b/version.gradle @@ -3,25 +3,25 @@ ===================== Nightly Build Snapshot - * Full Name: jMonkeyEngine 3.1.0-5124 + * Full Version: 3.1.0-5124 * POM Version: 3.1.0-SNAPSHOT * NBM Version: 3.1.0.5124 * NBM UC Suffix: nightly/3.1/plugins Nightly Build Snapshot (PBRIsComing branch) - * Full Name: jMonkeyEngine 3.1.0-PBRIsComing-5124 + * Full Version: 3.1.0-PBRIsComing-5124 * POM Version: 3.1.0-PBRIsComing-SNAPSHOT * NBM Version: 3.1.0.5124 * NBM UC Suffix: PBRIsComing-nightly/3.1/plugins Alpha1 Release - * Full Name: jMonkeyEngine 3.1.0-alpha1 + * Full Version: 3.1.0-alpha1 * POM Version: 3.1.0-alpha1 * NBM Version: 3.1.0.0 * NBM UC Suffix: alpha1/3.1/plugins Final Release - * Full Name: jMonkeyEngine 3.1.0 + * Full Version: 3.1.0 * POM Version: 3.1.0 * NBM Version: 3.1.0.0 * NBM UC Suffix: stable/3.1/plugins @@ -46,7 +46,7 @@ ext { jmeShortGitHash = "" jmeBuildDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) jmeBranchName = "unknown" - jmeFullName = "jMonkeyEngine ${jmeVersion}-UNKNOWN" + jmeFullVersion = "${jmeVersion}-UNKNOWN" jmePomVersion = "unknown" jmeNbmVersion = "0.0.0.0" jmeNbmUcSuffix = "unknown" @@ -62,12 +62,12 @@ task configureVersionInfo { jmeGitTag = grgit.describe() if (jmeGitTag == null) jmeGitTag = "" - jmeFullName = "jMonkeyEngine ${jmeVersion}" - jmePomVersion = jmeVersion - jmeNbmVersion = jmeVersion + jmeFullVersion = "${jmeVersion}" + jmePomVersion = jmeVersion + jmeNbmVersion = jmeVersion if (jmeBranchName != "master") { - jmeFullName += "-${jmeBranchName}" + jmeFullVersion += "-${jmeBranchName}" jmePomVersion += "-${jmeBranchName}" jmeNbmUcSuffix = "${jmeBranchName}-" @@ -86,18 +86,18 @@ task configureVersionInfo { jmeNbmUcSuffix += "/" + jmeMainVersion + "/plugins" if (jmeVersionTag == "SNAPSHOT") { - jmeFullName += "-${jmeRevision}" - jmePomVersion += "-SNAPSHOT" - jmeNbmVersion += ".${jmeRevision}" + jmeFullVersion += "-${jmeRevision}" + jmePomVersion += "-SNAPSHOT" + jmeNbmVersion += ".${jmeRevision}" } else if (jmeVersionTag == "") { jmeNbmVersion += ".0" } else { - jmeFullName += "-${jmeVersionTag}" - jmePomVersion += "-${jmeVersionTag}" - jmeNbmVersion += ".0" + jmeFullVersion += "-${jmeVersionTag}" + jmePomVersion += "-${jmeVersionTag}" + jmeNbmVersion += ".0" } - logger.warn("Full Name: ${jmeFullName}") + logger.warn("Full Version: ${jmeFullVersion}") logger.warn("POM Version: ${jmePomVersion}") logger.warn("NBM Version: ${jmeNbmVersion}") logger.warn("NBM UC Suffix: ${jmeNbmUcSuffix}") From e2d41ef8ee7d888bace54ed39f7a62c6de55ec1d Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sat, 8 Aug 2015 22:13:40 -0400 Subject: [PATCH 20/32] sdk: change javac source / target to 1.6 --- sdk/BasicGameTemplate/nbproject/project.properties | 4 ++-- sdk/JME3TestsTemplate/nbproject/project.properties | 4 ++-- sdk/JME3TestsTemplateAndroid/nbproject/project.properties | 4 ++-- sdk/ant-jme/nbproject/project.properties | 4 ++-- sdk/jme3-angelfont/nbproject/project.properties | 2 +- sdk/jme3-assetpack-support/nbproject/project.properties | 2 +- sdk/jme3-blender/nbproject/project.properties | 2 +- sdk/jme3-cinematics/nbproject/project.properties | 2 +- sdk/jme3-codepalette/nbproject/project.properties | 2 +- sdk/jme3-core-baselibs/nbproject/project.properties | 2 +- sdk/jme3-core-libraries/nbproject/project.properties | 2 +- sdk/jme3-core-updatecenters/nbproject/project.properties | 2 +- sdk/jme3-core/nbproject/project.properties | 2 +- sdk/jme3-desktop-executables/nbproject/project.properties | 2 +- sdk/jme3-gui/nbproject/project.properties | 2 +- sdk/jme3-lwjgl-applet/nbproject/project.properties | 2 +- sdk/jme3-materialeditor/nbproject/project.properties | 2 +- sdk/jme3-model-importer/nbproject/project.properties | 2 +- sdk/jme3-obfuscate/nbproject/project.properties | 2 +- sdk/jme3-ogretools/nbproject/project.properties | 2 +- sdk/jme3-ogrexml/nbproject/project.properties | 2 +- sdk/jme3-project-baselibs/nbproject/project.properties | 2 +- sdk/jme3-project-libraries/nbproject/project.properties | 2 +- sdk/jme3-project-testdata/nbproject/project.properties | 2 +- sdk/jme3-scenecomposer/nbproject/project.properties | 2 +- sdk/jme3-templates/nbproject/project.properties | 2 +- sdk/jme3-terrain-editor/nbproject/project.properties | 2 +- sdk/jme3-tests-template/nbproject/project.properties | 2 +- sdk/jme3-texture-editor/nbproject/project.properties | 2 +- sdk/jme3-vehicle-creator/nbproject/project.properties | 2 +- sdk/jme3-wavefront/nbproject/project.properties | 2 +- sdk/jme3-welcome-screen/nbproject/project.properties | 2 +- .../components/products/blender/nbproject/project.properties | 4 ++-- .../products/helloworld/nbproject/project.properties | 4 ++-- .../ext/components/products/jdk/nbproject/project.properties | 4 ++-- sdk/nbi/stub/ext/engine/nbproject/project.properties | 4 ++-- 36 files changed, 44 insertions(+), 44 deletions(-) diff --git a/sdk/BasicGameTemplate/nbproject/project.properties b/sdk/BasicGameTemplate/nbproject/project.properties index ac4b3d2a6..8f2414b51 100644 --- a/sdk/BasicGameTemplate/nbproject/project.properties +++ b/sdk/BasicGameTemplate/nbproject/project.properties @@ -50,8 +50,8 @@ javac.compilerargs= javac.deprecation=false javac.processorpath=\ ${javac.classpath} -javac.source=1.5 -javac.target=1.5 +javac.source=1.6 +javac.target=1.6 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/sdk/JME3TestsTemplate/nbproject/project.properties b/sdk/JME3TestsTemplate/nbproject/project.properties index 2a8d46f22..b502a6417 100644 --- a/sdk/JME3TestsTemplate/nbproject/project.properties +++ b/sdk/JME3TestsTemplate/nbproject/project.properties @@ -32,8 +32,8 @@ javac.classpath=\ # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false -javac.source=1.5 -javac.target=1.5 +javac.source=1.6 +javac.target=1.6 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ diff --git a/sdk/JME3TestsTemplateAndroid/nbproject/project.properties b/sdk/JME3TestsTemplateAndroid/nbproject/project.properties index e3a940489..f020f7d80 100644 --- a/sdk/JME3TestsTemplateAndroid/nbproject/project.properties +++ b/sdk/JME3TestsTemplateAndroid/nbproject/project.properties @@ -47,8 +47,8 @@ javac.compilerargs= javac.deprecation=false javac.processorpath=\ ${javac.classpath} -javac.source=1.5 -javac.target=1.5 +javac.source=1.6 +javac.target=1.6 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/sdk/ant-jme/nbproject/project.properties b/sdk/ant-jme/nbproject/project.properties index 80281cc3b..3a1490871 100644 --- a/sdk/ant-jme/nbproject/project.properties +++ b/sdk/ant-jme/nbproject/project.properties @@ -36,8 +36,8 @@ javac.compilerargs= javac.deprecation=false javac.processorpath=\ ${javac.classpath} -javac.source=1.5 -javac.target=1.5 +javac.source=1.6 +javac.target=1.6 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/sdk/jme3-angelfont/nbproject/project.properties b/sdk/jme3-angelfont/nbproject/project.properties index 44c34ecb9..0411b6ff9 100644 --- a/sdk/jme3-angelfont/nbproject/project.properties +++ b/sdk/jme3-angelfont/nbproject/project.properties @@ -1,4 +1,4 @@ #Thu, 25 Aug 2011 20:26:50 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial spec.version.base=3.1.0 diff --git a/sdk/jme3-assetpack-support/nbproject/project.properties b/sdk/jme3-assetpack-support/nbproject/project.properties index e0b462857..217f54c8d 100644 --- a/sdk/jme3-assetpack-support/nbproject/project.properties +++ b/sdk/jme3-assetpack-support/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-blender/nbproject/project.properties b/sdk/jme3-blender/nbproject/project.properties index 33a6b9205..2c3eb8b5d 100644 --- a/sdk/jme3-blender/nbproject/project.properties +++ b/sdk/jme3-blender/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:50 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial nbm.homepage=http\://www.jmonkeyengine.com nbm.module.author=Kaelthas diff --git a/sdk/jme3-cinematics/nbproject/project.properties b/sdk/jme3-cinematics/nbproject/project.properties index 437a62d3a..feb90dcd7 100644 --- a/sdk/jme3-cinematics/nbproject/project.properties +++ b/sdk/jme3-cinematics/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:50 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-codepalette/nbproject/project.properties b/sdk/jme3-codepalette/nbproject/project.properties index e0b462857..217f54c8d 100644 --- a/sdk/jme3-codepalette/nbproject/project.properties +++ b/sdk/jme3-codepalette/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-core-baselibs/nbproject/project.properties b/sdk/jme3-core-baselibs/nbproject/project.properties index 8bcd2222a..5d8b776f2 100644 --- a/sdk/jme3-core-baselibs/nbproject/project.properties +++ b/sdk/jme3-core-baselibs/nbproject/project.properties @@ -1,4 +1,4 @@ -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-core-libraries/nbproject/project.properties b/sdk/jme3-core-libraries/nbproject/project.properties index 2e01f5d86..c57e28b74 100644 --- a/sdk/jme3-core-libraries/nbproject/project.properties +++ b/sdk/jme3-core-libraries/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:48 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-core-updatecenters/nbproject/project.properties b/sdk/jme3-core-updatecenters/nbproject/project.properties index 9d2616783..98f519f77 100644 --- a/sdk/jme3-core-updatecenters/nbproject/project.properties +++ b/sdk/jme3-core-updatecenters/nbproject/project.properties @@ -1,4 +1,4 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial spec.version.base=3.1.0 diff --git a/sdk/jme3-core/nbproject/project.properties b/sdk/jme3-core/nbproject/project.properties index 4206d1dff..9b86cc291 100644 --- a/sdk/jme3-core/nbproject/project.properties +++ b/sdk/jme3-core/nbproject/project.properties @@ -1,7 +1,7 @@ #Thu, 25 Aug 2011 20:26:48 +0200 file.reference.DDSUtils.jar=release/modules/ext/DDSUtils.jar #Thu, 25 Aug 2011 19:32:54 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-desktop-executables/nbproject/project.properties b/sdk/jme3-desktop-executables/nbproject/project.properties index e0b462857..217f54c8d 100644 --- a/sdk/jme3-desktop-executables/nbproject/project.properties +++ b/sdk/jme3-desktop-executables/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-gui/nbproject/project.properties b/sdk/jme3-gui/nbproject/project.properties index 291042fd5..bfc05628e 100644 --- a/sdk/jme3-gui/nbproject/project.properties +++ b/sdk/jme3-gui/nbproject/project.properties @@ -10,7 +10,7 @@ file.reference.slf4j-simple-1.7.7.jar=release/modules/ext/slf4j-simple-1.7.7.jar file.reference.swingtonifty.jar=release/modules/ext/swingtonifty.jar file.reference.xsom-20110101-SNAPSHOT.jar=release/modules/ext/xsom-20110101-SNAPSHOT.jar #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint:-serial license.file=../license-jme.txt nbm.homepage=http://www.jmonkeyengine.com diff --git a/sdk/jme3-lwjgl-applet/nbproject/project.properties b/sdk/jme3-lwjgl-applet/nbproject/project.properties index e0b462857..217f54c8d 100644 --- a/sdk/jme3-lwjgl-applet/nbproject/project.properties +++ b/sdk/jme3-lwjgl-applet/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-materialeditor/nbproject/project.properties b/sdk/jme3-materialeditor/nbproject/project.properties index e0b462857..217f54c8d 100644 --- a/sdk/jme3-materialeditor/nbproject/project.properties +++ b/sdk/jme3-materialeditor/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-model-importer/nbproject/project.properties b/sdk/jme3-model-importer/nbproject/project.properties index e0b462857..217f54c8d 100644 --- a/sdk/jme3-model-importer/nbproject/project.properties +++ b/sdk/jme3-model-importer/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-obfuscate/nbproject/project.properties b/sdk/jme3-obfuscate/nbproject/project.properties index 61598fa7b..93b5b7a4b 100644 --- a/sdk/jme3-obfuscate/nbproject/project.properties +++ b/sdk/jme3-obfuscate/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:50 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial nbm.homepage=http\://proguard.sourceforge.net/ nbm.module.author=Normen Hansen diff --git a/sdk/jme3-ogretools/nbproject/project.properties b/sdk/jme3-ogretools/nbproject/project.properties index e0b462857..217f54c8d 100644 --- a/sdk/jme3-ogretools/nbproject/project.properties +++ b/sdk/jme3-ogretools/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-ogrexml/nbproject/project.properties b/sdk/jme3-ogrexml/nbproject/project.properties index 9b996acdd..eb5e232b7 100644 --- a/sdk/jme3-ogrexml/nbproject/project.properties +++ b/sdk/jme3-ogrexml/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:48 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-project-baselibs/nbproject/project.properties b/sdk/jme3-project-baselibs/nbproject/project.properties index 2e01f5d86..c57e28b74 100644 --- a/sdk/jme3-project-baselibs/nbproject/project.properties +++ b/sdk/jme3-project-baselibs/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:48 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-project-libraries/nbproject/project.properties b/sdk/jme3-project-libraries/nbproject/project.properties index 2e01f5d86..c57e28b74 100644 --- a/sdk/jme3-project-libraries/nbproject/project.properties +++ b/sdk/jme3-project-libraries/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:48 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-project-testdata/nbproject/project.properties b/sdk/jme3-project-testdata/nbproject/project.properties index 2e01f5d86..c57e28b74 100644 --- a/sdk/jme3-project-testdata/nbproject/project.properties +++ b/sdk/jme3-project-testdata/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:48 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-scenecomposer/nbproject/project.properties b/sdk/jme3-scenecomposer/nbproject/project.properties index e0b462857..217f54c8d 100644 --- a/sdk/jme3-scenecomposer/nbproject/project.properties +++ b/sdk/jme3-scenecomposer/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-templates/nbproject/project.properties b/sdk/jme3-templates/nbproject/project.properties index 2e01f5d86..c57e28b74 100644 --- a/sdk/jme3-templates/nbproject/project.properties +++ b/sdk/jme3-templates/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:48 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-terrain-editor/nbproject/project.properties b/sdk/jme3-terrain-editor/nbproject/project.properties index a0916a395..c4bd8305a 100644 --- a/sdk/jme3-terrain-editor/nbproject/project.properties +++ b/sdk/jme3-terrain-editor/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-tests-template/nbproject/project.properties b/sdk/jme3-tests-template/nbproject/project.properties index 2e01f5d86..c57e28b74 100644 --- a/sdk/jme3-tests-template/nbproject/project.properties +++ b/sdk/jme3-tests-template/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:48 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-texture-editor/nbproject/project.properties b/sdk/jme3-texture-editor/nbproject/project.properties index c4186f216..b4f16969c 100644 --- a/sdk/jme3-texture-editor/nbproject/project.properties +++ b/sdk/jme3-texture-editor/nbproject/project.properties @@ -1,5 +1,5 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/jme3-vehicle-creator/nbproject/project.properties b/sdk/jme3-vehicle-creator/nbproject/project.properties index 44c34ecb9..0411b6ff9 100644 --- a/sdk/jme3-vehicle-creator/nbproject/project.properties +++ b/sdk/jme3-vehicle-creator/nbproject/project.properties @@ -1,4 +1,4 @@ #Thu, 25 Aug 2011 20:26:50 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial spec.version.base=3.1.0 diff --git a/sdk/jme3-wavefront/nbproject/project.properties b/sdk/jme3-wavefront/nbproject/project.properties index 9d2616783..98f519f77 100644 --- a/sdk/jme3-wavefront/nbproject/project.properties +++ b/sdk/jme3-wavefront/nbproject/project.properties @@ -1,4 +1,4 @@ #Thu, 25 Aug 2011 20:26:49 +0200 -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial spec.version.base=3.1.0 diff --git a/sdk/jme3-welcome-screen/nbproject/project.properties b/sdk/jme3-welcome-screen/nbproject/project.properties index 99dbdf441..9b4116334 100644 --- a/sdk/jme3-welcome-screen/nbproject/project.properties +++ b/sdk/jme3-welcome-screen/nbproject/project.properties @@ -1,4 +1,4 @@ -javac.source=1.5 +javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt nbm.homepage=http\://www.jmonkeyengine.com diff --git a/sdk/nbi/stub/ext/components/products/blender/nbproject/project.properties b/sdk/nbi/stub/ext/components/products/blender/nbproject/project.properties index 91a39fd25..c2be09d67 100644 --- a/sdk/nbi/stub/ext/components/products/blender/nbproject/project.properties +++ b/sdk/nbi/stub/ext/components/products/blender/nbproject/project.properties @@ -27,8 +27,8 @@ javac.classpath=\ # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false -javac.source=1.5 -javac.target=1.5 +javac.source=1.6 +javac.target=1.6 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ diff --git a/sdk/nbi/stub/ext/components/products/helloworld/nbproject/project.properties b/sdk/nbi/stub/ext/components/products/helloworld/nbproject/project.properties index df20bfc24..ffc8588bc 100644 --- a/sdk/nbi/stub/ext/components/products/helloworld/nbproject/project.properties +++ b/sdk/nbi/stub/ext/components/products/helloworld/nbproject/project.properties @@ -27,8 +27,8 @@ javac.classpath=\ # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false -javac.source=1.5 -javac.target=1.5 +javac.source=1.6 +javac.target=1.6 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ diff --git a/sdk/nbi/stub/ext/components/products/jdk/nbproject/project.properties b/sdk/nbi/stub/ext/components/products/jdk/nbproject/project.properties index 47b4c3fee..98fbf3a49 100644 --- a/sdk/nbi/stub/ext/components/products/jdk/nbproject/project.properties +++ b/sdk/nbi/stub/ext/components/products/jdk/nbproject/project.properties @@ -27,8 +27,8 @@ javac.classpath=\ # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false -javac.source=1.5 -javac.target=1.5 +javac.source=1.6 +javac.target=1.6 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ diff --git a/sdk/nbi/stub/ext/engine/nbproject/project.properties b/sdk/nbi/stub/ext/engine/nbproject/project.properties index 60acb0db2..591b29d26 100644 --- a/sdk/nbi/stub/ext/engine/nbproject/project.properties +++ b/sdk/nbi/stub/ext/engine/nbproject/project.properties @@ -67,8 +67,8 @@ javac.classpath=\ # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false -javac.source=1.5 -javac.target=1.5 +javac.source=1.6 +javac.target=1.6 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ From 42597f0bc4f69a00a96cb1156cd7668bf4c224d8 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sun, 9 Aug 2015 13:32:46 -0400 Subject: [PATCH 21/32] sdk build: generate spec version based on GIT revision --- sdk/build.gradle | 6 ++- sdk/build.xml | 99 +++--------------------------------------------- 2 files changed, 9 insertions(+), 96 deletions(-) diff --git a/sdk/build.gradle b/sdk/build.gradle index b70e80b13..19dd1c9a4 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -388,12 +388,14 @@ copyTestSources.outputs.dir "JME3TestsTemplate/src/" copyTestSources.outputs.dir "JME3TestsTemplateAndroid/src/" ant.properties['plugins.version'] = jmeVersion -ant.properties['app.version']= jmeMainVersion + "-" + jmeVersionTag +ant.properties['app.version']= jmeFullVersion +ant.properties['git.revision']= jmeRevision task buildSdk(dependsOn: [copyBaseLibs, copyProjectLibs, createProjectXml, createBaseXml, copyTestSources]) <<{ ant.propertyfile(file: "nbproject/project.properties") { entry( key: "plugins.version", value: "${jmeVersion}") - entry( key: "app.version", value: "${jmeMainVersion + "-" + jmeVersionTag}") + entry( key: "app.version", value: "${jmeFullVersion}") + entry( key: "git.revision", value: "${jmeRevision}") } ant.ant(dir: ".", antfile: "build.xml", target: "build") } diff --git a/sdk/build.xml b/sdk/build.xml index acc5c1d04..e81b221c5 100644 --- a/sdk/build.xml +++ b/sdk/build.xml @@ -176,9 +176,6 @@ - - - @@ -191,105 +188,19 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Setting implementation version for ${module_dir} to revision: ${svn.LastChangedRev} - + Setting implementation version for ${module_dir} to revision: ${git.revision} + - Removing implementation version for ${module_dir} from revision: ${svn.LastChangedRev} - + Removing implementation version for ${module_dir} from revision: ${git.revision} + - - - - - - - - - - - - - - - - - - - - - - - - - - From 9de1cd3060491f8437fdb10e4f555a9603cf0f44 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sun, 9 Aug 2015 13:43:28 -0400 Subject: [PATCH 22/32] sdk build: fix incorrect regex for matching spec version --- sdk/build.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/build.xml b/sdk/build.xml index e81b221c5..a04828277 100644 --- a/sdk/build.xml +++ b/sdk/build.xml @@ -157,7 +157,7 @@ replace="OpenIDE-Module-Specification-Version: ${plugins.version}" byline="true"/> @@ -167,7 +167,7 @@ replace="OpenIDE-Module-Implementation-Version: 0" byline="true"/> From 8fcf864839e1868f2920df71b1b80e01bce3f767 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sun, 9 Aug 2015 16:59:36 -0400 Subject: [PATCH 23/32] sdk build: remove googlecode upload tasks --- sdk/build.xml | 54 --------------------------------------------------- 1 file changed, 54 deletions(-) diff --git a/sdk/build.xml b/sdk/build.xml index a04828277..3c7a97a12 100644 --- a/sdk/build.xml +++ b/sdk/build.xml @@ -12,7 +12,6 @@ - @@ -271,57 +270,4 @@ - - - - Upload windows installers to googlecode.. - - - Upload linux installers to googlecode.. - - - Upload mac installer to googlecode.. - - - - - - - - From 9eb1ce8694199a725630164c208d57484f9fc6aa Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sun, 9 Aug 2015 17:00:25 -0400 Subject: [PATCH 24/32] sdk build: fix year in jME3 license --- sdk/license-jme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/license-jme.txt b/sdk/license-jme.txt index 9f1503915..9c2661e5b 100644 --- a/sdk/license-jme.txt +++ b/sdk/license-jme.txt @@ -1,4 +1,4 @@ -Copyright (c) 2003-2012 jMonkeyEngine +Copyright (c) 2003-2015 jMonkeyEngine All rights reserved. Redistribution and use in source and binary forms, with or without From e60fbda50fb73525a3544f7617959d80530ecfd1 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sun, 9 Aug 2015 17:00:57 -0400 Subject: [PATCH 25/32] sdk: use a high resolution icon --- sdk/jmonkeyplatform.png | Bin 6108 -> 66955 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/sdk/jmonkeyplatform.png b/sdk/jmonkeyplatform.png index eee01902f79cb1d84743163e91c7ee93c99eb74f..36675de77e692b8a8ac25d189907765d899d371d 100644 GIT binary patch literal 66955 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 fGykW5`_C{V{LAvD_wm3L{|pSCu6{1-oD!M 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 ieEwnipZNMe0R{laZOUvXD1LAN0000 Date: Sun, 9 Aug 2015 17:03:12 -0400 Subject: [PATCH 26/32] sdk plugins: fix link to jME3 website --- sdk/jme3-android/nbproject/project.properties | 2 +- sdk/jme3-assetpack-support/nbproject/project.properties | 2 +- sdk/jme3-blender/nbproject/project.properties | 2 +- sdk/jme3-cinematics/nbproject/project.properties | 2 +- sdk/jme3-codepalette/nbproject/project.properties | 2 +- sdk/jme3-core-baselibs/nbproject/project.properties | 2 +- sdk/jme3-core-libraries/nbproject/project.properties | 2 +- sdk/jme3-core/nbproject/project.properties | 2 +- sdk/jme3-desktop-executables/nbproject/project.properties | 2 +- sdk/jme3-documentation/nbproject/project.properties | 2 +- sdk/jme3-gui/nbproject/project.properties | 2 +- sdk/jme3-lwjgl-applet/nbproject/project.properties | 2 +- sdk/jme3-materialeditor/nbproject/project.properties | 2 +- sdk/jme3-model-importer/nbproject/project.properties | 2 +- sdk/jme3-navmesh-gen/nbproject/project.properties | 2 +- sdk/jme3-ogretools/nbproject/project.properties | 2 +- sdk/jme3-ogrexml/nbproject/project.properties | 2 +- sdk/jme3-project-baselibs/nbproject/project.properties | 2 +- sdk/jme3-project-libraries/nbproject/project.properties | 2 +- sdk/jme3-project-testdata/nbproject/project.properties | 2 +- sdk/jme3-scenecomposer/nbproject/project.properties | 2 +- sdk/jme3-templates/nbproject/project.properties | 2 +- sdk/jme3-terrain-editor/nbproject/project.properties | 2 +- sdk/jme3-tests-template/nbproject/project.properties | 2 +- sdk/jme3-texture-editor/nbproject/project.properties | 2 +- sdk/jme3-welcome-screen/nbproject/project.properties | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/sdk/jme3-android/nbproject/project.properties b/sdk/jme3-android/nbproject/project.properties index e2ab10b96..9b1b7cb61 100644 --- a/sdk/jme3-android/nbproject/project.properties +++ b/sdk/jme3-android/nbproject/project.properties @@ -3,7 +3,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint:-serial license.file=../license-jme.txt -nbm.homepage=http://www.jmonkeyengine.com +nbm.homepage=http://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-assetpack-support/nbproject/project.properties b/sdk/jme3-assetpack-support/nbproject/project.properties index 217f54c8d..eec6af9cd 100644 --- a/sdk/jme3-assetpack-support/nbproject/project.properties +++ b/sdk/jme3-assetpack-support/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-blender/nbproject/project.properties b/sdk/jme3-blender/nbproject/project.properties index 2c3eb8b5d..fa453f9a3 100644 --- a/sdk/jme3-blender/nbproject/project.properties +++ b/sdk/jme3-blender/nbproject/project.properties @@ -1,7 +1,7 @@ #Thu, 25 Aug 2011 20:26:50 +0200 javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Kaelthas nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-cinematics/nbproject/project.properties b/sdk/jme3-cinematics/nbproject/project.properties index feb90dcd7..4b4ae0191 100644 --- a/sdk/jme3-cinematics/nbproject/project.properties +++ b/sdk/jme3-cinematics/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=R\u00e9my Bouquet nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-codepalette/nbproject/project.properties b/sdk/jme3-codepalette/nbproject/project.properties index 217f54c8d..eec6af9cd 100644 --- a/sdk/jme3-codepalette/nbproject/project.properties +++ b/sdk/jme3-codepalette/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-core-baselibs/nbproject/project.properties b/sdk/jme3-core-baselibs/nbproject/project.properties index 5d8b776f2..d4692bc80 100644 --- a/sdk/jme3-core-baselibs/nbproject/project.properties +++ b/sdk/jme3-core-baselibs/nbproject/project.properties @@ -1,7 +1,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=jMonkeyEngine nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-core-libraries/nbproject/project.properties b/sdk/jme3-core-libraries/nbproject/project.properties index c57e28b74..513fb20e4 100644 --- a/sdk/jme3-core-libraries/nbproject/project.properties +++ b/sdk/jme3-core-libraries/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=jMonkeyEngine nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-core/nbproject/project.properties b/sdk/jme3-core/nbproject/project.properties index 9b86cc291..88500da6c 100644 --- a/sdk/jme3-core/nbproject/project.properties +++ b/sdk/jme3-core/nbproject/project.properties @@ -4,7 +4,7 @@ file.reference.DDSUtils.jar=release/modules/ext/DDSUtils.jar javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true project.license=jme diff --git a/sdk/jme3-desktop-executables/nbproject/project.properties b/sdk/jme3-desktop-executables/nbproject/project.properties index 217f54c8d..eec6af9cd 100644 --- a/sdk/jme3-desktop-executables/nbproject/project.properties +++ b/sdk/jme3-desktop-executables/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-documentation/nbproject/project.properties b/sdk/jme3-documentation/nbproject/project.properties index 232d11645..39ff046d1 100644 --- a/sdk/jme3-documentation/nbproject/project.properties +++ b/sdk/jme3-documentation/nbproject/project.properties @@ -1,6 +1,6 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint:-serial license.file=../license-jme.txt -nbm.homepage=http://www.jmonkeyengine.com +nbm.homepage=http://www.jmonkeyengine.org nbm.module.author=Normen Hansen, Ruth Kusterer, many others spec.version.base=3.1.0 diff --git a/sdk/jme3-gui/nbproject/project.properties b/sdk/jme3-gui/nbproject/project.properties index bfc05628e..9a27f3767 100644 --- a/sdk/jme3-gui/nbproject/project.properties +++ b/sdk/jme3-gui/nbproject/project.properties @@ -13,7 +13,7 @@ file.reference.xsom-20110101-SNAPSHOT.jar=release/modules/ext/xsom-20110101-SNAP javac.source=1.6 javac.compilerargs=-Xlint -Xlint:-serial license.file=../license-jme.txt -nbm.homepage=http://www.jmonkeyengine.com +nbm.homepage=http://www.jmonkeyengine.org nbm.module.author=Relucri nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-lwjgl-applet/nbproject/project.properties b/sdk/jme3-lwjgl-applet/nbproject/project.properties index 217f54c8d..eec6af9cd 100644 --- a/sdk/jme3-lwjgl-applet/nbproject/project.properties +++ b/sdk/jme3-lwjgl-applet/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-materialeditor/nbproject/project.properties b/sdk/jme3-materialeditor/nbproject/project.properties index 217f54c8d..eec6af9cd 100644 --- a/sdk/jme3-materialeditor/nbproject/project.properties +++ b/sdk/jme3-materialeditor/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-model-importer/nbproject/project.properties b/sdk/jme3-model-importer/nbproject/project.properties index 217f54c8d..eec6af9cd 100644 --- a/sdk/jme3-model-importer/nbproject/project.properties +++ b/sdk/jme3-model-importer/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-navmesh-gen/nbproject/project.properties b/sdk/jme3-navmesh-gen/nbproject/project.properties index 65d1fb700..78227c671 100644 --- a/sdk/jme3-navmesh-gen/nbproject/project.properties +++ b/sdk/jme3-navmesh-gen/nbproject/project.properties @@ -1,6 +1,6 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint:-serial license.file=../license-jme.txt -nbm.homepage=http://www.jmonkeyengine.com +nbm.homepage=http://www.jmonkeyengine.org nbm.module.author=Brent Owens spec.version.base=3.1.0 diff --git a/sdk/jme3-ogretools/nbproject/project.properties b/sdk/jme3-ogretools/nbproject/project.properties index 217f54c8d..eec6af9cd 100644 --- a/sdk/jme3-ogretools/nbproject/project.properties +++ b/sdk/jme3-ogretools/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-ogrexml/nbproject/project.properties b/sdk/jme3-ogrexml/nbproject/project.properties index eb5e232b7..4ad5ba7ab 100644 --- a/sdk/jme3-ogrexml/nbproject/project.properties +++ b/sdk/jme3-ogrexml/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-project-baselibs/nbproject/project.properties b/sdk/jme3-project-baselibs/nbproject/project.properties index c57e28b74..513fb20e4 100644 --- a/sdk/jme3-project-baselibs/nbproject/project.properties +++ b/sdk/jme3-project-baselibs/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=jMonkeyEngine nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-project-libraries/nbproject/project.properties b/sdk/jme3-project-libraries/nbproject/project.properties index c57e28b74..513fb20e4 100644 --- a/sdk/jme3-project-libraries/nbproject/project.properties +++ b/sdk/jme3-project-libraries/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=jMonkeyEngine nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-project-testdata/nbproject/project.properties b/sdk/jme3-project-testdata/nbproject/project.properties index c57e28b74..513fb20e4 100644 --- a/sdk/jme3-project-testdata/nbproject/project.properties +++ b/sdk/jme3-project-testdata/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=jMonkeyEngine nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-scenecomposer/nbproject/project.properties b/sdk/jme3-scenecomposer/nbproject/project.properties index 217f54c8d..eec6af9cd 100644 --- a/sdk/jme3-scenecomposer/nbproject/project.properties +++ b/sdk/jme3-scenecomposer/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-templates/nbproject/project.properties b/sdk/jme3-templates/nbproject/project.properties index c57e28b74..513fb20e4 100644 --- a/sdk/jme3-templates/nbproject/project.properties +++ b/sdk/jme3-templates/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=jMonkeyEngine nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-terrain-editor/nbproject/project.properties b/sdk/jme3-terrain-editor/nbproject/project.properties index c4bd8305a..0ed16b7c1 100644 --- a/sdk/jme3-terrain-editor/nbproject/project.properties +++ b/sdk/jme3-terrain-editor/nbproject/project.properties @@ -2,6 +2,6 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Brent Owens, Normen Hansen spec.version.base=3.1.0 diff --git a/sdk/jme3-tests-template/nbproject/project.properties b/sdk/jme3-tests-template/nbproject/project.properties index c57e28b74..513fb20e4 100644 --- a/sdk/jme3-tests-template/nbproject/project.properties +++ b/sdk/jme3-tests-template/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=jMonkeyEngine nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-texture-editor/nbproject/project.properties b/sdk/jme3-texture-editor/nbproject/project.properties index b4f16969c..c3e2aa46a 100644 --- a/sdk/jme3-texture-editor/nbproject/project.properties +++ b/sdk/jme3-texture-editor/nbproject/project.properties @@ -2,7 +2,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=pgi nbm.needs.restart=true spec.version.base=3.1.0 diff --git a/sdk/jme3-welcome-screen/nbproject/project.properties b/sdk/jme3-welcome-screen/nbproject/project.properties index 9b4116334..ae558b0e0 100644 --- a/sdk/jme3-welcome-screen/nbproject/project.properties +++ b/sdk/jme3-welcome-screen/nbproject/project.properties @@ -1,7 +1,7 @@ javac.source=1.6 javac.compilerargs=-Xlint -Xlint\:-serial license.file=../license-jme.txt -nbm.homepage=http\://www.jmonkeyengine.com +nbm.homepage=http\://www.jmonkeyengine.org nbm.module.author=Normen Hansen, jiyarza nbm.needs.restart=true spec.version.base=3.1.0 From 5709fe587d90630308f6f1f37ed01d67d7e263a5 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Tue, 11 Aug 2015 21:11:17 -0400 Subject: [PATCH 27/32] sdk build: correct spec version dependency --- sdk/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/build.gradle b/sdk/build.gradle index 19dd1c9a4..bcf6311e0 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -165,7 +165,7 @@ task createBaseXml(dependsOn: configurations.corelibs) <<{ "compile-dependency"{} "run-dependency"{ "release-version" "1" - "specification-version" "3.0.0" + "specification-version" jmeVersion } } } From 64452843f156f0634b04ce734f1db4720b9dcea7 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Tue, 11 Aug 2015 21:15:35 -0400 Subject: [PATCH 28/32] sdk: correct jme.com -> jme.org --- sdk/build.xml | 2 +- sdk/jdks/build-osx-zip.sh | 2 +- sdk/jdks/build-package.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/build.xml b/sdk/build.xml index 3c7a97a12..495057178 100644 --- a/sdk/build.xml +++ b/sdk/build.xml @@ -249,7 +249,7 @@ section="devel" depends="sun-java6-jdk" maintainer="jMonkeyEngine" - homepage="http://www.jmonkeyengine.com" + homepage="http://www.jmonkeyengine.org" postrm="debscripts/postrm" > diff --git a/sdk/jdks/build-osx-zip.sh b/sdk/jdks/build-osx-zip.sh index cf1051901..db3c44e99 100755 --- a/sdk/jdks/build-osx-zip.sh +++ b/sdk/jdks/build-osx-zip.sh @@ -1,5 +1,5 @@ #!/bin/sh -#(c) jMonkeyEngine.com +#(c) jmonkeyengine.org #Author Normen Hansen set -e rm -rf jdk-macosx.zip diff --git a/sdk/jdks/build-package.sh b/sdk/jdks/build-package.sh index c11a8ff2f..6f9c53503 100755 --- a/sdk/jdks/build-package.sh +++ b/sdk/jdks/build-package.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -#(c) jMonkeyEngine.com +#(c) jmonkeyengine.org #This script creates SFX binaries of the JDK for the specified platform #Author Normen Hansen From be2e165a5d12ae2bc1a5dbdfbca27c5dcf764975 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Tue, 11 Aug 2015 21:16:23 -0400 Subject: [PATCH 29/32] version: consider any non-snapshot build as stable --- version.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/version.gradle b/version.gradle index 983090013..4aa9c1af8 100644 --- a/version.gradle +++ b/version.gradle @@ -77,10 +77,8 @@ task configureVersionInfo { if (jmeVersionTag == "SNAPSHOT") { jmeNbmUcSuffix += "nightly" - } else if (jmeVersionTag == "") { - jmeNbmUcSuffix += "stable" } else { - jmeNbmUcSuffix += jmeVersionTag + jmeNbmUcSuffix += "stable" } jmeNbmUcSuffix += "/" + jmeMainVersion + "/plugins" From bbb117348584107d4fe0fe36fac7948693442643 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Tue, 11 Aug 2015 21:19:58 -0400 Subject: [PATCH 30/32] linux SDK shortcut: proper category & description for .desktop file --- sdk/build.xml | 2 ++ .../products/helloworld/src/org/mycompany/Bundle.properties | 5 +++-- .../helloworld/src/org/mycompany/ConfigurationLogic.java | 5 ++--- sdk/nbi/stub/template.xml | 4 +++- sdk/nbproject/project.properties | 2 ++ 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sdk/build.xml b/sdk/build.xml index 495057178..b843d779a 100644 --- a/sdk/build.xml +++ b/sdk/build.xml @@ -221,6 +221,8 @@ + + diff --git a/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/Bundle.properties b/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/Bundle.properties index 273df84b3..956a1f2e6 100644 --- a/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/Bundle.properties +++ b/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/Bundle.properties @@ -1,6 +1,7 @@ CL.app.name={product-simple-name} +CL.app.categories={product-categories} CL.desktop.shortcut.name={product-name} -CL.desktop.shortcut.description= +CL.desktop.shortcut.description={product-description} CL.desktop.shortcut.path= CL.unix.icon.name={product-icon-name} CL.unix.icon.resource=org/mycompany/{product-icon-name} @@ -8,7 +9,7 @@ CL.unix.icon.resource=org/mycompany/{product-icon-name} CL.start.menu.shortcut.name={product-name} CL.start.menu.shortcut.name.macosx={product-name} -CL.start.menu.shortcut.description= +CL.start.menu.shortcut.description={product-description} CL.start.menu.shortcut.path= CL.install.desktop=Creating shortcut on desktop diff --git a/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java b/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java index 6d4c7e811..1b6e709a0 100644 --- a/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java +++ b/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java @@ -464,9 +464,8 @@ public class ConfigurationLogic extends ProductConfigurationLogic { } public static final String SHORTCUT_FILENAME = ResourceUtils.getString(ConfigurationLogic.class, "CL.app.name") + ".desktop"; // NOI18N - public static final String[] SHORTCUT_CATEGORIES = new String[]{ - "Application" - }; + public static final String[] SHORTCUT_CATEGORIES = + ResourceUtils.getString(ConfigurationLogic.class, "CL.app.categories").split(","); // NOI18N public static final String BIN_SUBDIR = "bin/"; public static final String EXECUTABLE_WINDOWS = diff --git a/sdk/nbi/stub/template.xml b/sdk/nbi/stub/template.xml index 80184f717..be69f1883 100644 --- a/sdk/nbi/stub/template.xml +++ b/sdk/nbi/stub/template.xml @@ -124,9 +124,11 @@ - + + + diff --git a/sdk/nbproject/project.properties b/sdk/nbproject/project.properties index dbcdb7343..d7206b308 100644 --- a/sdk/nbproject/project.properties +++ b/sdk/nbproject/project.properties @@ -3,6 +3,8 @@ app.icon=branding/core/core.jar/org/netbeans/core/startup/frame48.gif #same as ${branding.token} app.name=jmonkeyplatform app.title=jMonkeyEngine SDK +app.description=A complete 3D game development suite written purely in Java. +app.categories=Development,Graphics,IDE,3DGraphics,Java app.icon.icns=jmonkeyplatform.icns #version name used for application and settings folder, no spaces! app.version=3.1-snapshot-github From 22540c9812435c2b4d7f1b089673ef71f0d13c59 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Tue, 11 Aug 2015 21:20:44 -0400 Subject: [PATCH 31/32] .gitignore: update for sdk projects --- .gitignore | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9f79c5149..848b5f9fb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /dist/ /build/ /netbeans/ +/sdk/jdks/local/ /jme3-core/build/ /jme3-core/src/main/resources/com/jme3/system/version.properties /jme3-plugins/build/ @@ -132,4 +133,10 @@ !/jme3-bullet-native/libs/native/osx/x86_64/libbulletjme.dylib !/jme3-bullet-native/libs/native/linux/x86/libbulletjme.so !/jme3-bullet-native/libs/native/linux/x86_64/libbulletjme.so -/.nb-gradle/ \ No newline at end of file +/.nb-gradle/ +/sdk/ant-jme/nbproject/private/ +/sdk/nbi/stub/ext/components/products/jdk/nbproject/private/ +/sdk/nbi/stub/ext/components/products/blender/nbproject/private/ +/sdk/BasicGameTemplate/nbproject/private/ +/sdk/nbi/stub/ext/components/products/jdk/build/ +/sdk/nbi/stub/ext/components/products/jdk/dist/ From 3cf85668d1d4e462e455df9dcddb3b988a1fa6ff Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Tue, 11 Aug 2015 21:50:32 -0400 Subject: [PATCH 32/32] sdk installer: fix permissions issues on JRE and Blender executables --- .../src/org/mycompany/ConfigurationLogic.java | 17 ++++++++++ .../src/org/mycompany/ConfigurationLogic.java | 33 +++++++++++++++---- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/sdk/nbi/stub/ext/components/products/blender/src/org/mycompany/ConfigurationLogic.java b/sdk/nbi/stub/ext/components/products/blender/src/org/mycompany/ConfigurationLogic.java index be992b57b..d1616e459 100644 --- a/sdk/nbi/stub/ext/components/products/blender/src/org/mycompany/ConfigurationLogic.java +++ b/sdk/nbi/stub/ext/components/products/blender/src/org/mycompany/ConfigurationLogic.java @@ -1,8 +1,11 @@ package org.mycompany; +import java.io.File; import java.util.List; import org.netbeans.installer.product.Registry; +import org.netbeans.installer.product.components.Product; import org.netbeans.installer.product.components.ProductConfigurationLogic; +import org.netbeans.installer.utils.LogManager; import org.netbeans.installer.utils.helper.RemovalMode; import org.netbeans.installer.utils.exceptions.InitializationException; import org.netbeans.installer.utils.exceptions.InstallationException; @@ -35,6 +38,20 @@ public class ConfigurationLogic extends ProductConfigurationLogic { @Override public void install(Progress progress) throws InstallationException { + final Product product = getProduct(); + final File installLocation = product.getInstallationLocation(); + LogManager.log("Setting Blender files as executable"); + setExecutableFile(installLocation, "blender"); + setExecutableFile(installLocation, "blenderplayer"); + setExecutableFile(installLocation, "blender-softwaregl"); + } + private static void setExecutableFile(File parent, String path) { + File binFile = new File(parent, path); + try { + binFile.setExecutable(true, false); + } catch (Exception ex) { + ex.printStackTrace(); + } } @Override diff --git a/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java b/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java index 1b6e709a0..d6cd82a78 100644 --- a/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java +++ b/sdk/nbi/stub/ext/components/products/helloworld/src/org/mycompany/ConfigurationLogic.java @@ -198,16 +198,37 @@ public class ConfigurationLogic extends ProductConfigurationLogic { throw new InstallationException("Cannot copy JDK",e); } // set permissions: - File binDir = new File(target, "bin"); - for (File file : binDir.listFiles()) { - try { - file.setExecutable(true); - } catch (Exception ex) { ex.printStackTrace(); } - } + // ADDED BY KIRILL: force correct permissions for JDK files + LogManager.log("Setting JDK files as executable"); + setExecutableContents(target, "bin"); + setExecutableContents(target, "db/bin"); + setExecutableContents(target, "jre/bin"); + setExecutableFile(target, "lib/jexec"); + setExecutableFile(target, "lib/amd64/libjawt.so"); + setExecutableFile(target, "lib/amd64/jli/libjli.so"); + setExecutableFile(target, "lib/visualvm/platform/lib/nbexec"); // to add uninstaller logic: SystemUtils.getNativeUtils().addUninstallerJVM(new LauncherResource(false, target)); } } + private static void setExecutableContents(File parent, String path) { + File binDir = new File(parent, path); + for (File file : binDir.listFiles()) { + try { + file.setExecutable(true, false); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + private static void setExecutableFile(File parent, String path) { + File binFile = new File(parent, path); + try { + binFile.setExecutable(true, false); + } catch (Exception ex) { + ex.printStackTrace(); + } + } @Override public void uninstall(Progress progress) throws UninstallationException {