Kaynağa Gözat

- add current iOS code

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9914 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
nor..67 13 yıl önce
ebeveyn
işleme
b3dc16535f

+ 15 - 0
engine/build.xml

@@ -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>
     
     <!--

+ 14 - 5
engine/nbproject/build-impl.xml

@@ -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>

+ 1 - 1
engine/nbproject/bullet-native.properties

@@ -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

+ 2 - 2
engine/nbproject/genfiles.properties

@@ -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/[email protected]
 nbproject/profiler-build-impl.xml.data.CRC32=aff514c1
 nbproject/profiler-build-impl.xml.script.CRC32=abda56ed

+ 5 - 3
engine/nbproject/project.properties

@@ -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

+ 1 - 0
engine/nbproject/project.xml

@@ -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"/>

+ 7 - 4
engine/src/core/com/jme3/system/JmeSystem.java

@@ -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) {

+ 129 - 0
engine/src/ios/com/jme3/system/ios/IosAssetManager.java

@@ -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;
+    }
+}

+ 59 - 0
engine/src/ios/com/jme3/system/ios/IosHarness.java

@@ -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();
+    }
+    
+}

+ 68 - 0
engine/src/ios/com/jme3/system/ios/IosImageLoader.java

@@ -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);
+}

+ 73 - 0
engine/src/ios/com/jme3/system/ios/IosLogHandler.java

@@ -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.");
+    }
+    
+}

+ 113 - 0
engine/src/ios/com/jme3/system/ios/JmeIosSystem.java

@@ -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.");
+    }
+}

+ 106 - 0
engine/src/ios/jme-ios.m

@@ -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];
+}