- add current iOS code

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9914 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
nor..67 12 years ago
parent 8b9b09e4cd
commit b3dc16535f
  1. 15
      engine/build.xml
  2. 19
      engine/nbproject/build-impl.xml
  3. 2
      engine/nbproject/bullet-native.properties
  4. 4
      engine/nbproject/genfiles.properties
  5. 8
      engine/nbproject/project.properties
  6. 1
      engine/nbproject/project.xml
  7. 11
      engine/src/core/com/jme3/system/JmeSystem.java
  8. 129
      engine/src/ios/com/jme3/system/ios/IosAssetManager.java
  9. 59
      engine/src/ios/com/jme3/system/ios/IosHarness.java
  10. 68
      engine/src/ios/com/jme3/system/ios/IosImageLoader.java
  11. 73
      engine/src/ios/com/jme3/system/ios/IosLogHandler.java
  12. 113
      engine/src/ios/com/jme3/system/ios/JmeIosSystem.java
  13. 106
      engine/src/ios/jme-ios.m

@ -34,6 +34,7 @@
<mkdir dir="${build.dir}/jogl"/>
<mkdir dir="${build.dir}/lwjgl"/>
<mkdir dir="${build.dir}/android"/>
<mkdir dir="${build.dir}/ios"/>
<echo>Compile Core</echo>
<j2seproject3:javac
@ -182,6 +183,16 @@
<fileset dir="${src.android.dir}" excludes="${build.classes.excludes},${excludes},**/jme3test/**,**/res/**" includes="${includes}"/>
</copy>
<echo>Compile iOS</echo>
<j2seproject3:javac
destdir="${build.dir}/ios"
srcdir="${src.ios.dir}"
classpath="${javac.classpath}:${build.dir}/core:${build.dir}/plugins"
gensrcdir="${build.generated.sources.dir}"/>
<copy todir="${build.dir}/ios">
<fileset dir="${src.ios.dir}" excludes="${build.classes.excludes},${excludes},**/jme3test/**,**/res/**" includes="${includes}"/>
</copy>
<echo>Compile Tests</echo>
<j2seproject3:javac
destdir="${build.classes.dir}"
@ -209,6 +220,7 @@
<jar jarfile="${build.dir}/jME3-lwjgl.jar" basedir="${build.dir}/lwjgl" compress="true"/>
<jar jarfile="${build.dir}/jME3-jogl.jar" basedir="${build.dir}/jogl" compress="true"/>
<jar jarfile="${build.dir}/jME3-android.jar" basedir="${build.dir}/android" compress="true"/>
<jar jarfile="${build.dir}/jME3-ios.jar" basedir="${build.dir}/ios" compress="true"/>
<echo>Building TestData JAR file..</echo>
<jar jarfile="${build.dir}/jME3-testdata.jar" basedir="test-data" compress="true"/>
@ -237,6 +249,7 @@
<map from="${build.dir.resolved}/lwjgl" to="${build.dir}/jME3-lwjgl.jar"/>
<map from="${build.dir.resolved}/jogl" to="${build.dir}/jME3-jogl.jar"/>
<map from="${build.dir.resolved}/android" to=""/>
<map from="${build.dir.resolved}/ios" to=""/>
<map from="${testdata.dir.resolved}" to="${build.dir.resolved}/jME3-testdata.jar"/>
<map from="${android.jar.resolved}" to=""/>
@ -261,6 +274,8 @@
<mkdir dir="${dist.dir}/opt/android"/>
<copy file="${build.dir}/jME3-android.jar" todir="${dist.dir}/opt/android" overwrite="true"/>
<mkdir dir="${dist.dir}/opt/ios"/>
<copy file="${build.dir}/jME3-ios.jar" todir="${dist.dir}/opt/ios" overwrite="true"/>
</target>
<!--

@ -187,6 +187,7 @@ is divided into following sections:
<available file="${src.lwjgl.dir}"/>
<available file="${src.jogl.dir}"/>
<available file="${src.android.dir}"/>
<available file="${src.ios.dir}"/>
</or>
</condition>
<condition property="netbeans.home+have.tests">
@ -295,6 +296,7 @@ is divided into following sections:
<fail unless="src.lwjgl.dir">Must set src.lwjgl.dir</fail>
<fail unless="src.jogl.dir">Must set src.jogl.dir</fail>
<fail unless="src.android.dir">Must set src.android.dir</fail>
<fail unless="src.ios.dir">Must set src.ios.dir</fail>
<fail unless="test.test.dir">Must set test.test.dir</fail>
<fail unless="build.dir">Must set build.dir</fail>
<fail unless="dist.dir">Must set dist.dir</fail>
@ -316,7 +318,7 @@ is divided into following sections:
</target>
<target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}" name="srcdir"/>
<attribute default="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}:${src.ios.dir}" name="srcdir"/>
<attribute default="${build.classes.dir}" name="destdir"/>
<attribute default="${javac.classpath}" name="classpath"/>
<attribute default="${javac.processorpath}" name="processorpath"/>
@ -356,7 +358,7 @@ is divided into following sections:
</target>
<target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}" name="srcdir"/>
<attribute default="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}:${src.ios.dir}" name="srcdir"/>
<attribute default="${build.classes.dir}" name="destdir"/>
<attribute default="${javac.classpath}" name="classpath"/>
<attribute default="${javac.processorpath}" name="processorpath"/>
@ -388,7 +390,7 @@ is divided into following sections:
</target>
<target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
<macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}" name="srcdir"/>
<attribute default="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}:${src.ios.dir}" name="srcdir"/>
<attribute default="${build.classes.dir}" name="destdir"/>
<attribute default="${javac.classpath}" name="classpath"/>
<sequential>
@ -975,7 +977,7 @@ is divided into following sections:
<include name="*"/>
</dirset>
</pathconvert>
<j2seproject3:depend srcdir="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}:${build.generated.subdirs}"/>
<j2seproject3:depend srcdir="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}:${src.ios.dir}:${build.generated.subdirs}"/>
</target>
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
<j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
@ -1001,6 +1003,7 @@ is divided into following sections:
<fileset dir="${src.lwjgl.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
<fileset dir="${src.jogl.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
<fileset dir="${src.android.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
<fileset dir="${src.ios.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
</copy>
</target>
<target if="has.persistence.xml" name="-copy-persistence-xml">
@ -1021,7 +1024,7 @@ is divided into following sections:
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
<j2seproject3:force-recompile/>
<j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}"/>
<j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.core.dir}:${src.core-data.dir}:${src.core-effects.dir}:${src.core-plugins.dir}:${src.desktop.dir}:${src.terrain.dir}:${src.jbullet.dir}:${src.bullet.dir}:${src.bullet-native.dir}:${src.bullet-common.dir}:${src.networking.dir}:${src.niftygui.dir}:${src.jogg.dir}:${src.ogre.dir}:${src.blender.dir}:${src.xml.dir}:${src.tools.dir}:${src.test.dir}:${src.lwjgl.dir}:${src.jogl.dir}:${src.android.dir}:${src.ios.dir}"/>
</target>
<target name="-post-compile-single">
<!-- Empty placeholder for easier customization. -->
@ -1345,6 +1348,9 @@ is divided into following sections:
<fileset dir="${src.android.dir}" excludes="*.java,${excludes}" includes="${includes}">
<filename name="**/*.java"/>
</fileset>
<fileset dir="${src.ios.dir}" excludes="*.java,${excludes}" includes="${includes}">
<filename name="**/*.java"/>
</fileset>
<fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
<include name="**/*.java"/>
<exclude name="*.java"/>
@ -1415,6 +1421,9 @@ is divided into following sections:
<fileset dir="${src.android.dir}" excludes="${excludes}" includes="${includes}">
<filename name="**/doc-files/**"/>
</fileset>
<fileset dir="${src.ios.dir}" excludes="${excludes}" includes="${includes}">
<filename name="**/doc-files/**"/>
</fileset>
<fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
<include name="**/doc-files/**"/>
</fileset>

@ -5,7 +5,7 @@ bullet.library.name=bulletjme
bullet.library.version=0.9
# location of Android NDK if available
ndk.dir=/opt/android-ndk-r7
ndk.dir=/Users/normenhansen/Documents/Code-Import/android-ndk-r7
# change if bullet version changes
bullet.folder=../bullet-2.80-rev2531

@ -3,8 +3,8 @@ build.xml.script.CRC32=34d4c2f2
build.xml.stylesheet.CRC32=958a1d3e
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=4d497e1c
nbproject/build-impl.xml.script.CRC32=6eeca707
nbproject/build-impl.xml.data.CRC32=0b6d6e3f
nbproject/build-impl.xml.script.CRC32=6a81ca7d
nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46
nbproject/profiler-build-impl.xml.data.CRC32=aff514c1
nbproject/profiler-build-impl.xml.script.CRC32=abda56ed

@ -7,7 +7,7 @@ application.homepage=http://www.jmonkeyengine.com/
application.title=jMonkeyEngine 3.0
application.vendor=jMonkeyEngine
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
build.classes.excludes=**/*.java,**/*.form,**/*.m
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
@ -77,7 +77,7 @@ jnlp.mixed.code=default
jnlp.offline-allowed=true
jnlp.signed=true
jnlp.signing=generated
jnlp.signing.alias=jme3
jnlp.signing.alias=engine
jnlp.signing.keystore=
main.class=jme3test.TestChooser
manifest.file=MANIFEST.MF
@ -100,7 +100,8 @@ run.classpath=\
${build.dir}/niftygui:\
${build.dir}/lwjgl:\
${build.dir}/jogl:\
${build.dir}/android
${build.dir}/android:\
${build.dir}/ios
run.jvmargs=-Xms128m -Xmx128m -XX:MaxDirectMemorySize=256M
run.test.classpath=\
${javac.test.classpath}:\
@ -116,6 +117,7 @@ src.core-effects.dir=src/core-effects
src.core-plugins.dir=src/core-plugins
src.core.dir=src/core
src.desktop.dir=src/desktop
src.ios.dir=src/ios
src.jbullet.dir=src/jbullet
src.jogg.dir=src/jogg
src.jogl.dir=src/jogl

@ -32,6 +32,7 @@
<root id="src.lwjgl.dir" name="LWJGL Renderer"/>
<root id="src.jogl.dir" name="JOGL Renderer"/>
<root id="src.android.dir" name="Android Renderer"/>
<root id="src.ios.dir" name="iOS Renderer"/>
</source-roots>
<test-roots>
<root id="test.test.dir" name="Unit Test"/>

@ -172,10 +172,13 @@ public class JmeSystem {
if (systemDelegate == null) {
systemDelegate = tryLoadDelegate("com.jme3.system.android.JmeAndroidSystem");
if (systemDelegate == null) {
// None of the system delegates were found ..
Logger.getLogger(JmeSystem.class.getName()).log(Level.SEVERE,
"Failed to find a JmeSystem delegate!\n"
+ "Ensure either desktop or android jME3 jar is in the classpath.");
systemDelegate = tryLoadDelegate("com.jme3.system.ios.JmeIosSystem");
if (systemDelegate == null) {
// None of the system delegates were found ..
Logger.getLogger(JmeSystem.class.getName()).log(Level.SEVERE,
"Failed to find a JmeSystem delegate!\n"
+ "Ensure either desktop or android jME3 jar is in the classpath.");
}
}
}
} catch (InstantiationException ex) {

@ -0,0 +1,129 @@
/*
* Copyright (c) 2009-2012 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.ios;
import com.jme3.asset.AssetLoader;
import com.jme3.asset.DesktopAssetManager;
import com.jme3.asset.TextureKey;
import com.jme3.asset.plugins.ClasspathLocator;
import com.jme3.texture.Texture;
import java.io.InputStream;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author normenhansen
*/
public class IosAssetManager extends DesktopAssetManager {
private static final Logger logger = Logger.getLogger(IosAssetManager.class.getName());
public IosAssetManager() {
this(null);
}
@Deprecated
public IosAssetManager(boolean loadDefaults) {
//this(Thread.currentThread().getContextClassLoader().getResource("com/jme3/asset/Android.cfg"));
this(null);
}
private void registerLoaderSafe(String loaderClass, String ... extensions) {
try {
Class<? extends AssetLoader> loader = (Class<? extends AssetLoader>) Class.forName(loaderClass);
registerLoader(loader, extensions);
} catch (Exception e){
logger.log(Level.WARNING, "Failed to load AssetLoader", e);
}
}
/**
* AndroidAssetManager constructor
* If URL == null then a default list of locators and loaders for android is set
* @param configFile
*/
public IosAssetManager(URL configFile) {
System.setProperty("org.xml.sax.driver", "org.xmlpull.v1.sax2.Driver");
// Set Default iOS config
registerLocator("", ClasspathLocator.class);
registerLoader(IosImageLoader.class, "jpg", "bmp", "gif", "png", "jpeg");
//registerLoader(AndroidImageLoader.class, "jpg", "bmp", "gif", "png", "jpeg");
//registerLoader(AndroidAudioLoader.class, "ogg", "mp3", "wav");
registerLoader(com.jme3.material.plugins.J3MLoader.class, "j3m");
registerLoader(com.jme3.material.plugins.J3MLoader.class, "j3md");
registerLoader(com.jme3.shader.plugins.GLSLLoader.class, "vert", "frag", "glsl", "glsllib");
registerLoader(com.jme3.export.binary.BinaryImporter.class, "j3o");
registerLoader(com.jme3.font.plugins.BitmapFontLoader.class, "fnt");
// Less common loaders (especially on Android)
registerLoaderSafe("com.jme3.texture.plugins.DDSLoader", "dds");
registerLoaderSafe("com.jme3.texture.plugins.PFMLoader", "pfm");
registerLoaderSafe("com.jme3.texture.plugins.HDRLoader", "hdr");
registerLoaderSafe("com.jme3.texture.plugins.TGALoader", "tga");
registerLoaderSafe("com.jme3.scene.plugins.OBJLoader", "obj");
registerLoaderSafe("com.jme3.scene.plugins.MTLLoader", "mtl");
registerLoaderSafe("com.jme3.scene.plugins.ogre.MeshLoader", "mesh.xml");
registerLoaderSafe("com.jme3.scene.plugins.ogre.SkeletonLoader", "skeleton.xml");
registerLoaderSafe("com.jme3.scene.plugins.ogre.MaterialLoader", "material");
registerLoaderSafe("com.jme3.scene.plugins.ogre.SceneLoader", "scene");
logger.info("IosAssetManager created.");
}
/**
* Loads a texture.
*
* @return the texture
*/
@Override
public Texture loadTexture(TextureKey key) {
Texture tex = (Texture) loadAsset(key);
// XXX: This will improve performance on some really
// low end GPUs (e.g. ones with OpenGL ES 1 support only)
// but otherwise won't help on the higher ones.
// Strongly consider removing this.
tex.setMagFilter(Texture.MagFilter.Nearest);
tex.setAnisotropicFilter(0);
if (tex.getMinFilter().usesMipMapLevels()) {
tex.setMinFilter(Texture.MinFilter.NearestNearestMipMap);
} else {
tex.setMinFilter(Texture.MinFilter.NearestNoMipMaps);
}
return tex;
}
}

@ -0,0 +1,59 @@
/*
* Copyright (c) 2009-2012 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.ios;
import com.jme3.app.Application;
import com.jme3.system.JmeSystem;
/**
* @author normenhansen
*/
public class IosHarness {
private final Application app;
public IosHarness(Application app) {
this.app = app;
JmeSystem.setSystemDelegate(new JmeIosSystem());
app.start();
}
public void appPaused(){
}
public void appReactivated(){
}
public void appClosed(){
app.stop();
}
}

@ -0,0 +1,68 @@
/*
* Copyright (c) 2009-2012 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.ios;
import com.jme3.asset.AssetInfo;
import com.jme3.asset.AssetLoader;
import com.jme3.texture.Image;
import com.jme3.texture.Image.Format;
import java.io.IOException;
import java.io.InputStream;
/**
*
* @author normenhansen
*/
public class IosImageLoader implements AssetLoader {
public Object load(AssetInfo info) throws IOException {
InputStream in = info.openStream();
Image img = null;
try {
img = loadImageData(Image.Format.RGBA8, in);
} catch (Exception e) {
e.printStackTrace();
} finally {
in.close();
}
return img;
}
/**
* Loads images via iOS native API
*
* @param format has to be Image.Format.RGBA8
* @param inputStream the InputStream to load the image data from
* @return the loaded Image
*/
private static native Image loadImageData(Format format, InputStream inputStream);
}

@ -0,0 +1,73 @@
/*
* Copyright (c) 2009-2012 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.ios;
import com.jme3.util.JmeFormatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
/**
*
* @author normenhansen
*/
public class IosLogHandler extends Handler {
JmeFormatter formatter = new JmeFormatter();
public IosLogHandler() {
}
@Override
public void publish(LogRecord record) {
if (record.getLevel().equals(Level.SEVERE)) {
System.err.println(formatter.formatMessage(record));
}
else if (record.getLevel().equals(Level.WARNING)) {
System.err.println(formatter.formatMessage(record));
}
else {
System.err.println(formatter.formatMessage(record));
}
}
@Override
public void flush() {
// throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void close() throws SecurityException {
// throw new UnsupportedOperationException("Not supported yet.");
}
}

@ -0,0 +1,113 @@
/*
* Copyright (c) 2009-2012 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.ios;
import com.jme3.asset.AssetManager;
import com.jme3.audio.AudioRenderer;
import com.jme3.system.AppSettings;
import com.jme3.system.JmeContext;
import com.jme3.system.JmeSystemDelegate;
import com.jme3.system.NullContext;
import com.jme3.texture.Image;
import com.jme3.texture.image.ImageRaster;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.logging.Logger;
/**
*
* @author normenhansen
*/
public class JmeIosSystem extends JmeSystemDelegate {
@Override
public void writeImageFile(OutputStream outStream, String format, ByteBuffer imageData, int width, int height) throws IOException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public AssetManager newAssetManager(URL configFile) {
return new IosAssetManager(configFile);
}
@Override
public AssetManager newAssetManager() {
return new IosAssetManager();
}
@Override
public void showErrorDialog(String message) {
showDialog(message);
System.err.println("JME APPLICATION ERROR:" + message);
}
private native void showDialog(String message);
@Override
public boolean showSettingsDialog(AppSettings sourceSettings, boolean loadFromRegistry) {
return true;
}
@Override
public JmeContext newContext(AppSettings settings, JmeContext.Type contextType) {
initialize(settings);
JmeContext ctx = null;
if (settings.getRenderer() == null
|| settings.getRenderer().equals("NULL")
|| contextType == JmeContext.Type.Headless) {
ctx = new NullContext();
ctx.setSettings(settings);
} else {
ctx = new NullContext();
ctx.setSettings(settings);
}
return ctx;
}
@Override
public AudioRenderer newAudioRenderer(AppSettings settings) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void initialize(AppSettings settings) {
Logger.getLogger("").addHandler(new IosLogHandler());
// throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public ImageRaster createImageRaster(Image image, int slice) {
throw new UnsupportedOperationException("Not supported yet.");
}
}

@ -0,0 +1,106 @@
#include <jni.h>
#import <UIKit/UIKit.h>
#define JNIEXPORT __attribute__ ((visibility("default"))) \
__attribute__ ((used))
BOOL checkJNIException(JNIEnv *e){
if ((*e)->ExceptionCheck(e)) {
(*e)->ExceptionDescribe(e);
(*e)->ExceptionClear(e);
return YES;
}
return NO;
}
#ifndef _Included_com_jme3_system_ios_IosImageLoader
#define _Included_com_jme3_system_ios_IosImageLoader
#endif
JNIEXPORT jobject JNICALL
Java_com_jme3_system_ios_IosImageLoader_loadImageData(JNIEnv* e, jclass obj, jobject imageFormat, jobject inputStream){
// prepare java classes and method pointers
jclass imageClass = (*e)->FindClass(e, "com.jme3.texture.Image");
jclass inputStreamClass = (*e)->FindClass(e, "java.io.InputStream");
jclass bufferUtilsClass = (*e)->FindClass(e, "com.jme3.util.BufferUtils");
jmethodID imageConstructor = (*e)->GetMethodID(e, imageClass, "<init>", "(Lcom/jme3/texture/Image$Format;IILjava/nio/ByteBuffer;)V");
jmethodID readMethod = (*e)->GetMethodID(e, inputStreamClass, "read", "([B)I");
jmethodID newBufferMethod = (*e)->GetStaticMethodID(e, bufferUtilsClass, "createByteBuffer", "(I)Ljava/nio/ByteBuffer;");
if (checkJNIException(e)) {
return nil;
}
// read data from inputstream via byteArray to NSMutableData
jbyteArray tempArray = (*e)->NewByteArray (e, 1000);
NSMutableData *inData = [[NSMutableData alloc] init];
jint size = (*e)->CallIntMethod(e, inputStream, readMethod, tempArray);
if (checkJNIException(e)) {
[inData release];
return nil;
}
while (size != -1) {
jbyte *data;
data = (*e)->GetByteArrayElements(e, tempArray, false);
[inData appendBytes:data length:size];
(*e)->ReleaseByteArrayElements(e, tempArray, data, JNI_ABORT);
size = (*e)->CallIntMethod(e, inputStream, readMethod, tempArray);
if (checkJNIException(e)) {
[inData release];
return nil;
}
}
(*e)->DeleteLocalRef(e, tempArray);
if (checkJNIException(e)) {
[inData release];
return nil;
}
// decode image data
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage* inputImage = [UIImage imageWithData:inData];
if(inputImage == nil){
[inData release];
return nil;
}
CGImageRef inImage = [inputImage CGImage];
int ht = CGImageGetWidth(inImage);
int wdth = CGImageGetHeight(inImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// NewDirectByteBuffer seems to fail? -> Creating ByteBuffer in java
jobject nativeBuffer = (*e)->CallStaticObjectMethod(e, bufferUtilsClass, newBufferMethod, ht*wdth*4);
if (checkJNIException(e)) {
CGColorSpaceRelease(colorSpace);
[inData release];
return nil;
}
void *rawData = (*e)->GetDirectBufferAddress(e, nativeBuffer);
NSUInteger bytesPerRowImg = CGImageGetBytesPerRow(inImage);
NSUInteger bitsPerComponentImg = CGImageGetBitsPerComponent(inImage);
CGContextRef context = CGBitmapContextCreate(rawData,ht,wdth,bitsPerComponentImg,bytesPerRowImg,colorSpace,kCGImageAlphaPremultipliedLast| kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context,CGRectMake(0,0,wdth,ht), inImage);
CGContextRelease(context);
[inData release];
[pool release];
//create image
jobject imageObject = (*e)->NewObject(e, imageClass, imageConstructor, imageFormat, wdth, ht, nativeBuffer);
return imageObject;
}
#ifndef _Included_com_jme3_system_ios_JmeIosSystem
#define _Included_com_jme3_system_ios_JmeIosSystem
#endif
JNIEXPORT void JNICALL
Java_com_jme3_system_ios_JmeIosSystem_showDialog(JNIEnv* e, jobject c, jstring text) {
const char* chars = (*e)->GetStringUTFChars(e, text, 0);
NSString* string = [[NSString alloc] initWithUTF8String : chars];
(*e)->ReleaseStringUTFChars(e, text, chars);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle : @"Error"
message : string
delegate : nil
cancelButtonTitle : @"OK"
otherButtonTitles : nil];
[alert show];
[alert release];
[string release];
}
Loading…
Cancel
Save