From b3dc16535f4d31a45885493f4773edda60bb8a88 Mon Sep 17 00:00:00 2001 From: "nor..67" Date: Mon, 29 Oct 2012 22:15:26 +0000 Subject: [PATCH] - add current iOS code git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9914 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- engine/build.xml | 15 ++ engine/nbproject/build-impl.xml | 19 ++- engine/nbproject/bullet-native.properties | 2 +- engine/nbproject/genfiles.properties | 4 +- engine/nbproject/project.properties | 8 +- engine/nbproject/project.xml | 1 + .../src/core/com/jme3/system/JmeSystem.java | 11 +- .../com/jme3/system/ios/IosAssetManager.java | 129 ++++++++++++++++++ .../ios/com/jme3/system/ios/IosHarness.java | 59 ++++++++ .../com/jme3/system/ios/IosImageLoader.java | 68 +++++++++ .../com/jme3/system/ios/IosLogHandler.java | 73 ++++++++++ .../ios/com/jme3/system/ios/JmeIosSystem.java | 113 +++++++++++++++ engine/src/ios/jme-ios.m | 106 ++++++++++++++ 13 files changed, 593 insertions(+), 15 deletions(-) create mode 100644 engine/src/ios/com/jme3/system/ios/IosAssetManager.java create mode 100644 engine/src/ios/com/jme3/system/ios/IosHarness.java create mode 100644 engine/src/ios/com/jme3/system/ios/IosImageLoader.java create mode 100644 engine/src/ios/com/jme3/system/ios/IosLogHandler.java create mode 100644 engine/src/ios/com/jme3/system/ios/JmeIosSystem.java create mode 100644 engine/src/ios/jme-ios.m diff --git a/engine/build.xml b/engine/build.xml index d8943e20c..f7eed2850 100644 --- a/engine/build.xml +++ b/engine/build.xml @@ -34,6 +34,7 @@ + Compile Core + Compile iOS + + + + + Compile Tests + Building TestData JAR file.. @@ -237,6 +249,7 @@ + @@ -261,6 +274,8 @@ + + @@ -1345,6 +1348,9 @@ is divided into following sections: + + + @@ -1415,6 +1421,9 @@ is divided into following sections: + + + diff --git a/engine/nbproject/bullet-native.properties b/engine/nbproject/bullet-native.properties index 4828e24a0..436e9857d 100644 --- a/engine/nbproject/bullet-native.properties +++ b/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 diff --git a/engine/nbproject/genfiles.properties b/engine/nbproject/genfiles.properties index 186e5e48b..dafa7723e 100644 --- a/engine/nbproject/genfiles.properties +++ b/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/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 diff --git a/engine/nbproject/project.properties b/engine/nbproject/project.properties index ce4a6ca8b..b3f3d74d7 100644 --- a/engine/nbproject/project.properties +++ b/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 diff --git a/engine/nbproject/project.xml b/engine/nbproject/project.xml index d68e84cbc..d90be8fd4 100644 --- a/engine/nbproject/project.xml +++ b/engine/nbproject/project.xml @@ -32,6 +32,7 @@ + diff --git a/engine/src/core/com/jme3/system/JmeSystem.java b/engine/src/core/com/jme3/system/JmeSystem.java index 17dd57b75..07cbc3659 100644 --- a/engine/src/core/com/jme3/system/JmeSystem.java +++ b/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) { diff --git a/engine/src/ios/com/jme3/system/ios/IosAssetManager.java b/engine/src/ios/com/jme3/system/ios/IosAssetManager.java new file mode 100644 index 000000000..9c4ed49e1 --- /dev/null +++ b/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 loader = (Class) 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; + } +} diff --git a/engine/src/ios/com/jme3/system/ios/IosHarness.java b/engine/src/ios/com/jme3/system/ios/IosHarness.java new file mode 100644 index 000000000..382bd42ce --- /dev/null +++ b/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(); + } + +} diff --git a/engine/src/ios/com/jme3/system/ios/IosImageLoader.java b/engine/src/ios/com/jme3/system/ios/IosImageLoader.java new file mode 100644 index 000000000..4ec649086 --- /dev/null +++ b/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); +} diff --git a/engine/src/ios/com/jme3/system/ios/IosLogHandler.java b/engine/src/ios/com/jme3/system/ios/IosLogHandler.java new file mode 100644 index 000000000..8e8f51b35 --- /dev/null +++ b/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."); + } + +} diff --git a/engine/src/ios/com/jme3/system/ios/JmeIosSystem.java b/engine/src/ios/com/jme3/system/ios/JmeIosSystem.java new file mode 100644 index 000000000..935dc8e77 --- /dev/null +++ b/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."); + } +} \ No newline at end of file diff --git a/engine/src/ios/jme-ios.m b/engine/src/ios/jme-ios.m new file mode 100644 index 000000000..e53a7b2a8 --- /dev/null +++ b/engine/src/ios/jme-ios.m @@ -0,0 +1,106 @@ +#include +#import + + +#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, "", "(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]; +}