Merge pull request #5 from jMonkeyEngine/master

Merge jMonkeyEngine/master into scenecomposer/master
experimental
Dokthar 10 years ago
commit a457b81d13
  1. 14
      .travis.yml
  2. 49
      common.gradle
  3. 11
      gradle.properties
  4. 3
      jme3-android/src/main/java/com/jme3/renderer/android/AndroidGL.java
  5. 12
      jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.cpp
  6. 8
      jme3-bullet-native/src/native/cpp/com_jme3_bullet_PhysicsSpace.h
  7. 10
      jme3-bullet/src/common/java/com/jme3/bullet/BulletAppState.java
  8. 28
      jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java
  9. 2
      jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java
  10. 2
      jme3-examples/src/main/java/jme3test/bullet/TestAttachDriver.java
  11. 2
      jme3-examples/src/main/java/jme3test/bullet/TestAttachGhostObject.java
  12. 2
      jme3-examples/src/main/java/jme3test/bullet/TestCcd.java
  13. 2
      jme3-examples/src/main/java/jme3test/bullet/TestCollisionGroups.java
  14. 2
      jme3-examples/src/main/java/jme3test/bullet/TestCollisionListener.java
  15. 2
      jme3-examples/src/main/java/jme3test/bullet/TestCollisionShapeFactory.java
  16. 2
      jme3-examples/src/main/java/jme3test/bullet/TestGhostObject.java
  17. 2
      jme3-examples/src/main/java/jme3test/bullet/TestKinematicAddToPhysicsSpaceIssue.java
  18. 2
      jme3-examples/src/main/java/jme3test/bullet/TestLocalPhysics.java
  19. 2
      jme3-examples/src/main/java/jme3test/bullet/TestPhysicsCar.java
  20. 2
      jme3-examples/src/main/java/jme3test/bullet/TestPhysicsHingeJoint.java
  21. 2
      jme3-examples/src/main/java/jme3test/bullet/TestPhysicsRayCast.java
  22. 2
      jme3-examples/src/main/java/jme3test/bullet/TestPhysicsReadWrite.java
  23. 2
      jme3-examples/src/main/java/jme3test/bullet/TestRagDoll.java
  24. 2
      jme3-examples/src/main/java/jme3test/bullet/TestSimplePhysics.java
  25. 2
      jme3-examples/src/main/java/jme3test/bullet/TestSweepTest.java
  26. 4
      jme3-ios/src/main/java/com/jme3/asset/IOS.cfg
  27. 2573
      jme3-ios/src/main/java/com/jme3/renderer/ios/IGLESShaderRenderer.java
  28. 576
      jme3-ios/src/main/java/com/jme3/renderer/ios/TextureUtil.java
  29. 4
      jme3-ios/src/main/resources/com/jme3/asset/IOS.cfg
  30. 25
      jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java
  31. 2
      sdk/build.gradle

@ -1,11 +1,21 @@
language: java language: java
# jdk: sudo: false
# - oraclejdk8 env:
- GRADLE_USER_HOME=gradle-cache
cache:
directories:
- gradle-cache
- netbeans
branches: branches:
only: only:
- master - master
notifications:
slack:
secure: "PWEk4+VL986c3gAjWp12nqyifvxCjBqKoESG9d7zWh1uiTLadTHhZJRMdsye36FCpz/c/Jt7zCRO/5y7FaubQptnRrkrRfjp5f99MJRzQVXnUAM+y385qVkXKRKd/PLpM7XPm4AvjvxHCyvzX2wamRvul/TekaXKB9Ti5FCN87s="
before_install: before_install:
# required libs for android build tools # required libs for android build tools
# sudo apt-get update # sudo apt-get update

@ -4,9 +4,10 @@
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'maven' apply plugin: 'maven'
apply plugin: 'maven-publish'
String mavenGroupId = 'com.jme3' group = 'com.jme3'
String mavenVersion = jmeVersion + '-' + jmeVersionTag //'-SNAPSHOT' version = jmeVersion + '-' + jmeVersionTag
sourceCompatibility = '1.6' sourceCompatibility = '1.6'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
@ -23,11 +24,6 @@ dependencies {
testCompile group: 'junit', name: 'junit', version: '4.10' testCompile group: 'junit', name: 'junit', version: '4.10'
} }
String mavenArtifactId = name
group = mavenGroupId
version = mavenVersion
javadoc { javadoc {
failOnError = false failOnError = false
options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
@ -60,11 +56,40 @@ artifacts {
} }
} }
configure(install.repositories.mavenInstaller) { publishing {
pom.project { publications {
groupId = mavenGroupId maven(MavenPublication) {
artifactId = mavenArtifactId from components.java
version = mavenVersion artifact sourcesJar
artifact javadocJar
pom.withXml {
asNode().children().last() + {
resolveStrategy = Closure.DELEGATE_FIRST
name POM_NAME
description POM_DESCRIPTION
url POM_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEVELOPER_CONNECTION
}
licenses {
license {
name POM_LICENSE_NAME
url POM_LICENSE_URL
distribution POM_LICENSE_DISTRIBUTION
}
}
}
}
}
}
repositories {
maven {
url "${rootProject.buildDir}/repo" // change to point to your repo, e.g. http://my.org/repo
}
} }
} }

@ -23,3 +23,14 @@ bulletZipFile = bullet.zip
# Path for downloading NetBeans Base # Path for downloading NetBeans Base
netbeansUrl = http://download.netbeans.org/netbeans/8.0.2/final/zip/netbeans-8.0.2-201411181905-javase.zip netbeansUrl = http://download.netbeans.org/netbeans/8.0.2/final/zip/netbeans-8.0.2-201411181905-javase.zip
# POM settings
POM_NAME=jMonkeyEngine
POM_DESCRIPTION=jMonkeyEngine is a 3D game engine for adventurous Java developers
POM_URL=http://jmonkeyengine.org
POM_SCM_URL=https://github.com/jMonkeyEngine/jmonkeyengine
POM_SCM_CONNECTION=scm:git:git://github.com/jMonkeyEngine/jmonkeyengine.git
POM_SCM_DEVELOPER_CONNECTION=scm:git:git@github.com:jMonkeyEngine/jmonkeyengine.git
POM_LICENSE_NAME=New BSD (3-clause) License
POM_LICENSE_URL=http://opensource.org/licenses/BSD-3-Clause
POM_LICENSE_DISTRIBUTION=repo

@ -35,13 +35,14 @@ import android.opengl.GLES20;
import com.jme3.renderer.RendererException; import com.jme3.renderer.RendererException;
import com.jme3.renderer.opengl.GL; import com.jme3.renderer.opengl.GL;
import com.jme3.renderer.opengl.GLExt; import com.jme3.renderer.opengl.GLExt;
import com.jme3.renderer.opengl.GLFbo;
import java.nio.Buffer; import java.nio.Buffer;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.FloatBuffer; import java.nio.FloatBuffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import java.nio.ShortBuffer; import java.nio.ShortBuffer;
public class AndroidGL implements GL, GLExt { public class AndroidGL implements GL, GLExt, GLFbo {
public void resetStats() { public void resetStats() {
} }

@ -529,6 +529,18 @@ extern "C" {
return; return;
} }
JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_setSolverNumIterations
(JNIEnv *env, jobject object, jlong spaceId, jint value) {
jmePhysicsSpace* space = reinterpret_cast<jmePhysicsSpace*>(spaceId);
if (space == NULL) {
jclass newExc = env->FindClass("java/lang/NullPointerException");
env->ThrowNew(newExc, "The physics space does not exist.");
return;
}
space->getDynamicsWorld()->getSolverInfo().m_numIterations = value;
}
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

@ -174,6 +174,14 @@ JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_finalizeNative
JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_sweepTest_1native JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_sweepTest_1native
(JNIEnv *, jobject, jlong, jobject, jobject, jlong, jobject, jfloat); (JNIEnv *, jobject, jlong, jobject, jobject, jlong, jobject, jfloat);
/*
* Class: com_jme3_bullet_PhysicsSpace
* Method: setSolverNumIterations
* Signature: (JI)V
*/
JNIEXPORT void JNICALL Java_com_jme3_bullet_PhysicsSpace_setSolverNumIterations
(JNIEnv *, jobject, jlong, jint);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

@ -226,19 +226,9 @@ public class BulletAppState implements AppState, PhysicsTickListener {
if (debugEnabled && debugAppState == null && pSpace != null) { if (debugEnabled && debugAppState == null && pSpace != null) {
debugAppState = new BulletDebugAppState(pSpace); debugAppState = new BulletDebugAppState(pSpace);
stateManager.attach(debugAppState); stateManager.attach(debugAppState);
pSpace.enableDebug(app.getAssetManager());
} else if (!debugEnabled && debugAppState != null) { } else if (!debugEnabled && debugAppState != null) {
stateManager.detach(debugAppState); stateManager.detach(debugAppState);
debugAppState = null; debugAppState = null;
if (pSpace != null) {
pSpace.enableDebug(null);
}
}
//TODO: remove when deprecation of PhysicsSpace.enableDebug is through
if (pSpace.getDebugManager() != null && !debugEnabled) {
debugEnabled = true;
} else if (pSpace.getDebugManager() == null && debugEnabled) {
debugEnabled = false;
} }
if (!active) { if (!active) {
return; return;

@ -102,7 +102,7 @@ public class PhysicsSpace {
private Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f); private Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f);
private float accuracy = 1f / 60f; private float accuracy = 1f / 60f;
private int maxSubSteps = 4, rayTestFlags = 1 << 2; private int maxSubSteps = 4, rayTestFlags = 1 << 2;
private AssetManager debugManager; private int solverNumIterations = 10;
static { static {
// System.loadLibrary("bulletjme"); // System.loadLibrary("bulletjme");
@ -960,27 +960,27 @@ public class PhysicsSpace {
} }
/** /**
* Enable debug display for physics. * Set the number of iterations used by the contact solver.
* *
* @deprecated in favor of BulletDebugAppState, use * The default is 10. Use 4 for low quality, 20 for high quality.
* <code>BulletAppState.setDebugEnabled(boolean)</code> to add automatically *
* @param manager AssetManager to use to create debug materials * @param numIterations The number of iterations used by the contact & constraint solver.
*/ */
@Deprecated public void setSolverNumIterations(int numIterations) {
public void enableDebug(AssetManager manager) { this.solverNumIterations = numIterations;
debugManager = manager; setSolverNumIterations(physicsSpaceId, numIterations);
} }
/** /**
* Disable debug display * Get the number of iterations used by the contact solver.
*
* @return The number of iterations used by the contact & constraint solver.
*/ */
public void disableDebug() { public int getSolverNumIterations() {
debugManager = null; return solverNumIterations;
} }
public AssetManager getDebugManager() { private static native void setSolverNumIterations(long physicsSpaceId, int numIterations);
return debugManager;
}
public static native void initNativePhysics(); public static native void initNativePhysics();

@ -140,7 +140,7 @@ public class GLRenderer implements Renderer {
private HashSet<String> loadExtensions() { private HashSet<String> loadExtensions() {
HashSet<String> extensionSet = new HashSet<String>(64); HashSet<String> extensionSet = new HashSet<String>(64);
if (gl3 != null) { if (caps.contains(Caps.OpenGL30)) {
// If OpenGL3+ is available, use the non-deprecated way // If OpenGL3+ is available, use the non-deprecated way
// of getting supported extensions. // of getting supported extensions.
gl3.glGetInteger(GL3.GL_NUM_EXTENSIONS, intBuf16); gl3.glGetInteger(GL3.GL_NUM_EXTENSIONS, intBuf16);

@ -79,7 +79,7 @@ public class TestAttachDriver extends SimpleApplication implements ActionListene
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
setupKeys(); setupKeys();
setupFloor(); setupFloor();
buildPlayer(); buildPlayer();

@ -85,7 +85,7 @@ public class TestAttachGhostObject extends SimpleApplication implements AnalogLi
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
setupKeys(); setupKeys();
setupJoint(); setupJoint();
} }

@ -80,7 +80,7 @@ public class TestCcd extends SimpleApplication implements ActionListener {
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
bullet = new Sphere(32, 32, 0.4f, true, false); bullet = new Sphere(32, 32, 0.4f, true, false);
bullet.setTextureMode(TextureMode.Projected); bullet.setTextureMode(TextureMode.Projected);
bulletCollisionShape = new SphereCollisionShape(0.1f); bulletCollisionShape = new SphereCollisionShape(0.1f);

@ -61,7 +61,7 @@ public class TestCollisionGroups extends SimpleApplication {
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
// Add a physics sphere to the world // Add a physics sphere to the world
Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1); Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1);

@ -61,7 +61,7 @@ public class TestCollisionListener extends SimpleApplication implements PhysicsC
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
bullet = new Sphere(32, 32, 0.4f, true, false); bullet = new Sphere(32, 32, 0.4f, true, false);
bullet.setTextureMode(TextureMode.Projected); bullet.setTextureMode(TextureMode.Projected);
bulletCollisionShape = new SphereCollisionShape(0.4f); bulletCollisionShape = new SphereCollisionShape(0.4f);

@ -67,7 +67,7 @@ public class TestCollisionShapeFactory extends SimpleApplication {
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
createMaterial(); createMaterial();
Node node = new Node("node1"); Node node = new Node("node1");

@ -62,7 +62,7 @@ public class TestGhostObject extends SimpleApplication {
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
// Mesh to be shared across several boxes. // Mesh to be shared across several boxes.
Box boxGeom = new Box(Vector3f.ZERO, 1f, 1f, 1f); Box boxGeom = new Box(Vector3f.ZERO, 1f, 1f, 1f);

@ -60,7 +60,7 @@ public class TestKinematicAddToPhysicsSpaceIssue extends SimpleApplication {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
// Add a physics sphere to the world // Add a physics sphere to the world
Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1); Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1);
physicsSphere.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(3, 6, 0)); physicsSphere.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(3, 6, 0));

@ -59,7 +59,7 @@ public class TestLocalPhysics extends SimpleApplication {
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
// Add a physics sphere to the world // Add a physics sphere to the world
Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1); Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1);

@ -69,7 +69,7 @@ public class TestPhysicsCar extends SimpleApplication implements ActionListener
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace());
setupKeys(); setupKeys();
buildPlayer(); buildPlayer();

@ -76,7 +76,7 @@ public class TestPhysicsHingeJoint extends SimpleApplication implements AnalogLi
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
setupKeys(); setupKeys();
setupJoint(); setupJoint();
} }

@ -37,7 +37,7 @@ public class TestPhysicsRayCast extends SimpleApplication {
n.getControl(RigidBodyControl.class).setKinematic(true); n.getControl(RigidBodyControl.class).setKinematic(true);
bulletAppState.getPhysicsSpace().add(n); bulletAppState.getPhysicsSpace().add(n);
rootNode.attachChild(n); rootNode.attachChild(n);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
} }
@Override @Override

@ -69,7 +69,7 @@ public class TestPhysicsReadWrite extends SimpleApplication{
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
physicsRootNode=new Node("PhysicsRootNode"); physicsRootNode=new Node("PhysicsRootNode");
rootNode.attachChild(physicsRootNode); rootNode.attachChild(physicsRootNode);

@ -64,7 +64,7 @@ public class TestRagDoll extends SimpleApplication implements ActionListener {
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
inputManager.addMapping("Pull ragdoll up", new MouseButtonTrigger(0)); inputManager.addMapping("Pull ragdoll up", new MouseButtonTrigger(0));
inputManager.addListener(this, "Pull ragdoll up"); inputManager.addListener(this, "Pull ragdoll up");
PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace());

@ -59,7 +59,7 @@ public class TestSimplePhysics extends SimpleApplication {
public void simpleInitApp() { public void simpleInitApp() {
bulletAppState = new BulletAppState(); bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState); stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
// Add a physics sphere to the world // Add a physics sphere to the world
Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1); Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1);

@ -52,7 +52,7 @@ public class TestSweepTest extends SimpleApplication {
bulletAppState.getPhysicsSpace().add(obstacle); bulletAppState.getPhysicsSpace().add(obstacle);
rootNode.attachChild(obstacle); rootNode.attachChild(obstacle);
bulletAppState.getPhysicsSpace().enableDebug(assetManager); bulletAppState.setDebugEnabled(true);
} }
@Override @Override

@ -2,7 +2,9 @@ INCLUDE com/jme3/asset/General.cfg
# IOS specific loaders # IOS specific loaders
LOADER com.jme3.system.ios.IosImageLoader : jpg, bmp, gif, png, jpeg LOADER com.jme3.system.ios.IosImageLoader : jpg, bmp, gif, png, jpeg
LOADER com.jme3.material.plugins.J3MLoader : j3m, j3md LOADER com.jme3.audio.plugins.OGGLoader : ogg
LOADER com.jme3.material.plugins.J3MLoader : j3m
LOADER com.jme3.material.plugins.J3MLoader : j3md
LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, glsl, glsllib LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, glsl, glsllib
LOADER com.jme3.export.binary.BinaryImporter : j3o LOADER com.jme3.export.binary.BinaryImporter : j3o
LOADER com.jme3.font.plugins.BitmapFontLoader : fnt LOADER com.jme3.font.plugins.BitmapFontLoader : fnt

@ -1,576 +0,0 @@
package com.jme3.renderer.ios;
//import android.graphics.Bitmap;
//import android.opengl.ETC1;
//import android.opengl.ETC1Util.ETC1Texture;
//import android.opengl.JmeIosGLES;
//import android.opengl.GLUtils;
//import com.jme3.asset.AndroidImageInfo;
import com.jme3.renderer.ios.JmeIosGLES;
import com.jme3.math.FastMath;
import com.jme3.renderer.RendererException;
import com.jme3.texture.Image;
import com.jme3.texture.Image.Format;
import com.jme3.util.BufferUtils;
import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;
public class TextureUtil {
private static final Logger logger = Logger.getLogger(TextureUtil.class.getName());
//TODO Make this configurable through appSettings
public static boolean ENABLE_COMPRESSION = true;
private static boolean NPOT = false;
private static boolean ETC1support = false;
private static boolean DXT1 = false;
private static boolean PVRTC = false;
private static boolean DEPTH24_STENCIL8 = false;
private static boolean DEPTH_TEXTURE = false;
private static boolean RGBA8 = false;
// Same constant used by both GL_ARM_rgba8 and GL_OES_rgb8_rgba8.
private static final int GL_RGBA8 = 0x8058;
private static final int GL_DXT1 = 0x83F0;
private static final int GL_DXT1A = 0x83F1;
private static final int GL_DEPTH_STENCIL_OES = 0x84F9;
private static final int GL_UNSIGNED_INT_24_8_OES = 0x84FA;
private static final int GL_DEPTH24_STENCIL8_OES = 0x88F0;
public static void loadTextureFeatures(String extensionString) {
ETC1support = extensionString.contains("GL_OES_compressed_ETC1_RGB8_texture");
DEPTH24_STENCIL8 = extensionString.contains("GL_OES_packed_depth_stencil");
NPOT = extensionString.contains("GL_IMG_texture_npot")
|| extensionString.contains("GL_OES_texture_npot")
|| extensionString.contains("GL_NV_texture_npot_2D_mipmap");
PVRTC = extensionString.contains("GL_IMG_texture_compression_pvrtc");
DXT1 = extensionString.contains("GL_EXT_texture_compression_dxt1");
DEPTH_TEXTURE = extensionString.contains("GL_OES_depth_texture");
RGBA8 = extensionString.contains("GL_ARM_rgba8") ||
extensionString.contains("GL_OES_rgb8_rgba8");
logger.log(Level.FINE, "Supports ETC1? {0}", ETC1support);
logger.log(Level.FINE, "Supports DEPTH24_STENCIL8? {0}", DEPTH24_STENCIL8);
logger.log(Level.FINE, "Supports NPOT? {0}", NPOT);
logger.log(Level.FINE, "Supports PVRTC? {0}", PVRTC);
logger.log(Level.FINE, "Supports DXT1? {0}", DXT1);
logger.log(Level.FINE, "Supports DEPTH_TEXTURE? {0}", DEPTH_TEXTURE);
logger.log(Level.FINE, "Supports RGBA8? {0}", RGBA8);
}
/*
private static void buildMipmap(Bitmap bitmap, boolean compress) {
int level = 0;
int height = bitmap.getHeight();
int width = bitmap.getWidth();
logger.log(Level.FINEST, " - Generating mipmaps for bitmap using SOFTWARE");
JmeIosGLES.glPixelStorei(JmeIosGLES.GL_UNPACK_ALIGNMENT, 1);
while (height >= 1 || width >= 1) {
//First of all, generate the texture from our bitmap and set it to the according level
if (compress) {
logger.log(Level.FINEST, " - Uploading LOD level {0} ({1}x{2}) with compression.", new Object[]{level, width, height});
uploadBitmapAsCompressed(JmeIosGLES.GL_TEXTURE_2D, level, bitmap, false, 0, 0);
} else {
logger.log(Level.FINEST, " - Uploading LOD level {0} ({1}x{2}) directly.", new Object[]{level, width, height});
GLUtils.texImage2D(JmeIosGLES.GL_TEXTURE_2D, level, bitmap, 0);
}
if (height == 1 || width == 1) {
break;
}
//Increase the mipmap level
height /= 2;
width /= 2;
Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height, true);
// Recycle any bitmaps created as a result of scaling the bitmap.
// Do not recycle the original image (mipmap level 0)
if (level != 0) {
bitmap.recycle();
}
bitmap = bitmap2;
level++;
}
}
private static void uploadBitmapAsCompressed(int target, int level, Bitmap bitmap, boolean subTexture, int x, int y) {
if (bitmap.hasAlpha()) {
logger.log(Level.FINEST, " - Uploading bitmap directly. Cannot compress as alpha present.");
if (subTexture) {
GLUtils.texSubImage2D(target, level, x, y, bitmap);
JmeIosGLES.checkGLError();
} else {
GLUtils.texImage2D(target, level, bitmap, 0);
JmeIosGLES.checkGLError();
}
} else {
// Convert to RGB565
int bytesPerPixel = 2;
Bitmap rgb565 = bitmap.copy(Bitmap.Config.RGB_565, true);
// Put texture data into ByteBuffer
ByteBuffer inputImage = BufferUtils.createByteBuffer(bitmap.getRowBytes() * bitmap.getHeight());
rgb565.copyPixelsToBuffer(inputImage);
inputImage.position(0);
// Delete the copied RGB565 image
rgb565.recycle();
// Encode the image into the output bytebuffer
int encodedImageSize = ETC1.getEncodedDataSize(bitmap.getWidth(), bitmap.getHeight());
ByteBuffer compressedImage = BufferUtils.createByteBuffer(encodedImageSize);
ETC1.encodeImage(inputImage, bitmap.getWidth(),
bitmap.getHeight(),
bytesPerPixel,
bytesPerPixel * bitmap.getWidth(),
compressedImage);
// Delete the input image buffer
BufferUtils.destroyDirectBuffer(inputImage);
// Create an ETC1Texture from the compressed image data
ETC1Texture etc1tex = new ETC1Texture(bitmap.getWidth(), bitmap.getHeight(), compressedImage);
// Upload the ETC1Texture
if (bytesPerPixel == 2) {
int oldSize = (bitmap.getRowBytes() * bitmap.getHeight());
int newSize = compressedImage.capacity();
logger.log(Level.FINEST, " - Uploading compressed image to GL, oldSize = {0}, newSize = {1}, ratio = {2}", new Object[]{oldSize, newSize, (float) oldSize / newSize});
if (subTexture) {
JmeIosGLES.glCompressedTexSubImage2D(target,
level,
x, y,
bitmap.getWidth(),
bitmap.getHeight(),
ETC1.ETC1_RGB8_OES,
etc1tex.getData().capacity(),
etc1tex.getData());
JmeIosGLES.checkGLError();
} else {
JmeIosGLES.glCompressedTexImage2D(target,
level,
ETC1.ETC1_RGB8_OES,
bitmap.getWidth(),
bitmap.getHeight(),
0,
etc1tex.getData().capacity(),
etc1tex.getData());
JmeIosGLES.checkGLError();
}
// ETC1Util.loadTexture(target, level, 0, JmeIosGLES.GL_RGB,
// JmeIosGLES.GL_UNSIGNED_SHORT_5_6_5, etc1Texture);
// } else if (bytesPerPixel == 3) {
// ETC1Util.loadTexture(target, level, 0, JmeIosGLES.GL_RGB,
// JmeIosGLES.GL_UNSIGNED_BYTE, etc1Texture);
}
BufferUtils.destroyDirectBuffer(compressedImage);
}
}
/**
* <code>uploadTextureBitmap</code> uploads a native android bitmap
*/
/*
public static void uploadTextureBitmap(final int target, Bitmap bitmap, boolean needMips) {
uploadTextureBitmap(target, bitmap, needMips, false, 0, 0);
}
/**
* <code>uploadTextureBitmap</code> uploads a native android bitmap
*/
/*
public static void uploadTextureBitmap(final int target, Bitmap bitmap, boolean needMips, boolean subTexture, int x, int y) {
boolean recycleBitmap = false;
//TODO, maybe this should raise an exception when NPOT is not supported
boolean willCompress = ENABLE_COMPRESSION && ETC1support && !bitmap.hasAlpha();
if (needMips && willCompress) {
// Image is compressed and mipmaps are desired, generate them
// using software.
buildMipmap(bitmap, willCompress);
} else {
if (willCompress) {
// Image is compressed but mipmaps are not desired, upload directly.
logger.log(Level.FINEST, " - Uploading compressed bitmap. Mipmaps are not generated.");
uploadBitmapAsCompressed(target, 0, bitmap, subTexture, x, y);
} else {
// Image is not compressed, mipmaps may or may not be desired.
logger.log(Level.FINEST, " - Uploading bitmap directly.{0}",
(needMips
? " Mipmaps will be generated in HARDWARE"
: " Mipmaps are not generated."));
if (subTexture) {
System.err.println("x : " + x + " y :" + y + " , " + bitmap.getWidth() + "/" + bitmap.getHeight());
GLUtils.texSubImage2D(target, 0, x, y, bitmap);
JmeIosGLES.checkGLError();
} else {
GLUtils.texImage2D(target, 0, bitmap, 0);
JmeIosGLES.checkGLError();
}
if (needMips) {
// No pregenerated mips available,
// generate from base level if required
JmeIosGLES.glGenerateMipmap(target);
JmeIosGLES.checkGLError();
}
}
}
if (recycleBitmap) {
bitmap.recycle();
}
}
*/
public static void uploadTextureAny(Image img, int target, int index, boolean needMips) {
/*
if (img.getEfficentData() instanceof AndroidImageInfo) {
logger.log(Level.FINEST, " === Uploading image {0}. Using BITMAP PATH === ", img);
// If image was loaded from asset manager, use fast path
AndroidImageInfo imageInfo = (AndroidImageInfo) img.getEfficentData();
uploadTextureBitmap(target, imageInfo.getBitmap(), needMips);
} else {
*/
logger.log(Level.FINEST, " === Uploading image {0}. Using BUFFER PATH === ", img);
boolean wantGeneratedMips = needMips && !img.hasMipmaps();
if (wantGeneratedMips && img.getFormat().isCompressed()) {
logger.log(Level.WARNING, "Generating mipmaps is only"
+ " supported for Bitmap based or non-compressed images!");
}
// Upload using slower path
logger.log(Level.FINEST, " - Uploading bitmap directly.{0}",
(wantGeneratedMips
? " Mipmaps will be generated in HARDWARE"
: " Mipmaps are not generated."));
uploadTexture(img, target, index);
// Image was uploaded using slower path, since it is not compressed,
// then compress it
if (wantGeneratedMips) {
// No pregenerated mips available,
// generate from base level if required
JmeIosGLES.glGenerateMipmap(target);
JmeIosGLES.checkGLError();
}
//}
}
private static void unsupportedFormat(Format fmt) {
throw new UnsupportedOperationException("The image format '" + fmt + "' is unsupported by the video hardware.");
}
public static IosGLImageFormat getImageFormat(Format fmt) throws UnsupportedOperationException {
IosGLImageFormat imageFormat = new IosGLImageFormat();
switch (fmt) {
case Depth32:
case Depth32F:
throw new UnsupportedOperationException("The image format '"
+ fmt + "' is not supported by OpenGL ES 2.0 specification.");
case Alpha8:
imageFormat.format = JmeIosGLES.GL_ALPHA;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE;
if (RGBA8) {
imageFormat.renderBufferStorageFormat = GL_RGBA8;
} else {
// Highest precision alpha supported by vanilla OGLES2
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGBA4;
}
break;
case Luminance8:
imageFormat.format = JmeIosGLES.GL_LUMINANCE;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE;
if (RGBA8) {
imageFormat.renderBufferStorageFormat = GL_RGBA8;
} else {
// Highest precision luminance supported by vanilla OGLES2
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB565;
}
break;
case Luminance8Alpha8:
imageFormat.format = JmeIosGLES.GL_LUMINANCE_ALPHA;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE;
if (RGBA8) {
imageFormat.renderBufferStorageFormat = GL_RGBA8;
} else {
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGBA4;
}
break;
case RGB565:
imageFormat.format = JmeIosGLES.GL_RGB;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_SHORT_5_6_5;
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB565;
break;
case RGB5A1:
imageFormat.format = JmeIosGLES.GL_RGBA;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_SHORT_5_5_5_1;
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB5_A1;
break;
case RGB8:
imageFormat.format = JmeIosGLES.GL_RGB;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE;
if (RGBA8) {
imageFormat.renderBufferStorageFormat = GL_RGBA8;
} else {
// Fallback: Use RGB565 if RGBA8 is not available.
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB565;
}
break;
case BGR8:
imageFormat.format = JmeIosGLES.GL_RGB;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE;
if (RGBA8) {
imageFormat.renderBufferStorageFormat = GL_RGBA8;
} else {
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB565;
}
break;
case RGBA8:
imageFormat.format = JmeIosGLES.GL_RGBA;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE;
if (RGBA8) {
imageFormat.renderBufferStorageFormat = GL_RGBA8;
} else {
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGBA4;
}
break;
case Depth:
case Depth16:
if (!DEPTH_TEXTURE) {
unsupportedFormat(fmt);
}
imageFormat.format = JmeIosGLES.GL_DEPTH_COMPONENT;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_SHORT;
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_DEPTH_COMPONENT16;
break;
case Depth24:
case Depth24Stencil8:
if (!DEPTH_TEXTURE) {
unsupportedFormat(fmt);
}
if (DEPTH24_STENCIL8) {
// NEW: True Depth24 + Stencil8 format.
imageFormat.format = GL_DEPTH_STENCIL_OES;
imageFormat.dataType = GL_UNSIGNED_INT_24_8_OES;
imageFormat.renderBufferStorageFormat = GL_DEPTH24_STENCIL8_OES;
} else {
// Vanilla OGLES2, only Depth16 available.
imageFormat.format = JmeIosGLES.GL_DEPTH_COMPONENT;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_SHORT;
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_DEPTH_COMPONENT16;
}
break;
case DXT1:
if (!DXT1) {
unsupportedFormat(fmt);
}
imageFormat.format = GL_DXT1;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE;
imageFormat.compress = true;
break;
case DXT1A:
if (!DXT1) {
unsupportedFormat(fmt);
}
imageFormat.format = GL_DXT1A;
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE;
imageFormat.compress = true;
break;
default:
throw new UnsupportedOperationException("Unrecognized format: " + fmt);
}
return imageFormat;
}
public static class IosGLImageFormat {
boolean compress = false;
int format = -1;
int renderBufferStorageFormat = -1;
int dataType = -1;
}
private static void uploadTexture(Image img,
int target,
int index) {
/*
if (img.getEfficentData() instanceof AndroidImageInfo) {
throw new RendererException("This image uses efficient data. "
+ "Use uploadTextureBitmap instead.");
}
*/
// Otherwise upload image directly.
// Prefer to only use power of 2 textures here to avoid errors.
Image.Format fmt = img.getFormat();
ByteBuffer data;
if (index >= 0 || img.getData() != null && img.getData().size() > 0) {
data = img.getData(index);
} else {
data = null;
}
int width = img.getWidth();
int height = img.getHeight();
if (!NPOT && img.isNPOT()) {
// Check if texture is POT
throw new RendererException("Non-power-of-2 textures "
+ "are not supported by the video hardware "
+ "and no scaling path available for image: " + img);
}
IosGLImageFormat imageFormat = getImageFormat(fmt);
if (data != null) {
JmeIosGLES.glPixelStorei(JmeIosGLES.GL_UNPACK_ALIGNMENT, 1);
JmeIosGLES.checkGLError();
}
int[] mipSizes = img.getMipMapSizes();
int pos = 0;
if (mipSizes == null) {
if (data != null) {
mipSizes = new int[]{data.capacity()};
} else {
mipSizes = new int[]{width * height * fmt.getBitsPerPixel() / 8};
}
}
for (int i = 0; i < mipSizes.length; i++) {
int mipWidth = Math.max(1, width >> i);
int mipHeight = Math.max(1, height >> i);
if (data != null) {
data.position(pos);
data.limit(pos + mipSizes[i]);
}
if (imageFormat.compress && data != null) {
JmeIosGLES.glCompressedTexImage2D(target,
i,
imageFormat.format,
mipWidth,
mipHeight,
0,
data.remaining(),
data);
} else {
JmeIosGLES.glTexImage2D(target,
i,
imageFormat.format,
mipWidth,
mipHeight,
0,
imageFormat.format,
imageFormat.dataType,
data);
}
JmeIosGLES.checkGLError();
pos += mipSizes[i];
}
}
/**
* Update the texture currently bound to target at with data from the given
* Image at position x and y. The parameter index is used as the zoffset in
* case a 3d texture or texture 2d array is being updated.
*
* @param image Image with the source data (this data will be put into the
* texture)
* @param target the target texture
* @param index the mipmap level to update
* @param x the x position where to put the image in the texture
* @param y the y position where to put the image in the texture
*/
public static void uploadSubTexture(
Image img,
int target,
int index,
int x,
int y) {
//TODO:
/*
if (img.getEfficentData() instanceof AndroidImageInfo) {
AndroidImageInfo imageInfo = (AndroidImageInfo) img.getEfficentData();
uploadTextureBitmap(target, imageInfo.getBitmap(), true, true, x, y);
return;
}
*/
// Otherwise upload image directly.
// Prefer to only use power of 2 textures here to avoid errors.
Image.Format fmt = img.getFormat();
ByteBuffer data;
if (index >= 0 || img.getData() != null && img.getData().size() > 0) {
data = img.getData(index);
} else {
data = null;
}
int width = img.getWidth();
int height = img.getHeight();
if (!NPOT && img.isNPOT()) {
// Check if texture is POT
throw new RendererException("Non-power-of-2 textures "
+ "are not supported by the video hardware "
+ "and no scaling path available for image: " + img);
}
IosGLImageFormat imageFormat = getImageFormat(fmt);
if (data != null) {
JmeIosGLES.glPixelStorei(JmeIosGLES.GL_UNPACK_ALIGNMENT, 1);
JmeIosGLES.checkGLError();
}
int[] mipSizes = img.getMipMapSizes();
int pos = 0;
if (mipSizes == null) {
if (data != null) {
mipSizes = new int[]{data.capacity()};
} else {
mipSizes = new int[]{width * height * fmt.getBitsPerPixel() / 8};
}
}
for (int i = 0; i < mipSizes.length; i++) {
int mipWidth = Math.max(1, width >> i);
int mipHeight = Math.max(1, height >> i);
if (data != null) {
data.position(pos);
data.limit(pos + mipSizes[i]);
}
if (imageFormat.compress && data != null) {
JmeIosGLES.glCompressedTexSubImage2D(target, i, x, y, mipWidth, mipHeight, imageFormat.format, data.remaining(), data);
JmeIosGLES.checkGLError();
} else {
JmeIosGLES.glTexSubImage2D(target, i, x, y, mipWidth, mipHeight, imageFormat.format, imageFormat.dataType, data);
JmeIosGLES.checkGLError();
}
pos += mipSizes[i];
}
}
}

@ -2,7 +2,9 @@ INCLUDE com/jme3/asset/General.cfg
# IOS specific loaders # IOS specific loaders
LOADER com.jme3.system.ios.IosImageLoader : jpg, bmp, gif, png, jpeg LOADER com.jme3.system.ios.IosImageLoader : jpg, bmp, gif, png, jpeg
LOADER com.jme3.material.plugins.J3MLoader : j3m, j3md LOADER com.jme3.audio.plugins.OGGLoader : ogg
LOADER com.jme3.material.plugins.J3MLoader : j3m
LOADER com.jme3.material.plugins.J3MLoader : j3md
LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, glsl, glsllib LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, glsl, glsllib
LOADER com.jme3.export.binary.BinaryImporter : j3o LOADER com.jme3.export.binary.BinaryImporter : j3o
LOADER com.jme3.font.plugins.BitmapFontLoader : fnt LOADER com.jme3.font.plugins.BitmapFontLoader : fnt

@ -142,7 +142,6 @@ public class PhysicsSpace {
private javax.vecmath.Vector3f rayVec2 = new javax.vecmath.Vector3f(); private javax.vecmath.Vector3f rayVec2 = new javax.vecmath.Vector3f();
private com.bulletphysics.linearmath.Transform sweepTrans1 = new com.bulletphysics.linearmath.Transform(new javax.vecmath.Matrix3f()); private com.bulletphysics.linearmath.Transform sweepTrans1 = new com.bulletphysics.linearmath.Transform(new javax.vecmath.Matrix3f());
private com.bulletphysics.linearmath.Transform sweepTrans2 = new com.bulletphysics.linearmath.Transform(new javax.vecmath.Matrix3f()); private com.bulletphysics.linearmath.Transform sweepTrans2 = new com.bulletphysics.linearmath.Transform(new javax.vecmath.Matrix3f());
private AssetManager debugManager;
/** /**
* Get the current PhysicsSpace <b>running on this thread</b><br/> * Get the current PhysicsSpace <b>running on this thread</b><br/>
@ -878,26 +877,18 @@ public class PhysicsSpace {
} }
/** /**
* Enable debug display for physics. * Set the number of iterations used by the contact solver.
* *
* @deprecated in favor of BulletDebugAppState, use * The default is 10. Use 4 for low quality, 20 for high quality.
* <code>BulletAppState.setDebugEnabled(boolean)</code> to add automatically *
* @param manager AssetManager to use to create debug materials * @param numIterations The number of iterations used by the contact & constraint solver.
*/
@Deprecated
public void enableDebug(AssetManager manager) {
debugManager = manager;
}
/**
* Disable debug display
*/ */
public void disableDebug() { public void setSolverNumIterations(int numIterations) {
debugManager = null; dynamicsWorld.getSolverInfo().numIterations = numIterations;
} }
public AssetManager getDebugManager() { public int getSolverNumIterations() {
return debugManager; return dynamicsWorld.getSolverInfo().numIterations;
} }
/** /**

@ -48,7 +48,7 @@ task checkPlatformConfig {
def platformFile = file("nbproject/private/platform-private.properties") def platformFile = file("nbproject/private/platform-private.properties")
if(!platformFile.exists()){ if(!platformFile.exists()){
def netbeansFolder = file("../netbeans") def netbeansFolder = file("../netbeans")
if(!netbeansFolder.exists()){ if(!netbeansFolder.exists() || netbeansFolder.list().length == 0){
println "Downloading NetBeans Platform base, this only has to be done once.." println "Downloading NetBeans Platform base, this only has to be done once.."
def f = file("netbeans.zip") def f = file("netbeans.zip")
new URL(netbeansUrl).withInputStream{ i -> f.withOutputStream{ it << i }} new URL(netbeansUrl).withInputStream{ i -> f.withOutputStream{ it << i }}

Loading…
Cancel
Save