diff --git a/code/res/assimp.rc b/code/res/assimp.rc index 60ceaef3d..a12f3f6ed 100644 --- a/code/res/assimp.rc +++ b/code/res/assimp.rc @@ -30,8 +30,6 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN // Version // -#if (!defined ASSIMP_JNI_EXPORT) - VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,SVNRevision, 0 PRODUCTVERSION 1,0,SVNRevision,0 @@ -54,7 +52,7 @@ BEGIN VALUE "FileDescription", "Open Asset Import Library" VALUE "FileVersion", 1,0,SVNRevision,0 VALUE "InternalName", "assimp " - VALUE "LegalCopyright", "Copyright (C) 2008" + VALUE "LegalCopyright", "Copyright (C) 2006-2009" VALUE "OriginalFilename", "assimpNN.dll" VALUE "ProductName", "Open Asset Import Library" VALUE "ProductVersion", 1,0,SVNRevision,0 @@ -67,21 +65,16 @@ BEGIN END END - -#endif // !!ASSIMP_JNI_EXPORT - #endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// - #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // - ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED diff --git a/port/jAssimp/DONT_USE_JASSIMP_YET b/port/jAssimp/DONT_USE_JASSIMP_YET new file mode 100644 index 000000000..1fbca56a8 --- /dev/null +++ b/port/jAssimp/DONT_USE_JASSIMP_YET @@ -0,0 +1 @@ +... it's under development, it doesn't work yet. \ No newline at end of file diff --git a/port/jAssimp/README b/port/jAssimp/README index e69de29bb..72e36ba05 100644 --- a/port/jAssimp/README +++ b/port/jAssimp/README @@ -0,0 +1,54 @@ + +.................................................................................. +README for jAssimp +.................................................................................. + +Last updated: May 2009 + + +ABSTRACT +.................................................................................. + +jAssimp is a Java port of the full interface of the Open Asset Import Library. +It features almost everything and provides a Java interface that is quite +similar to the core C++ interface. However, some improvements on thread-safety +and type-safety were included. jAssimp doesn't provide any rendering +functionality. It loads 3d files and returns their data, but further processing +is left to the user. jAssimp has been developed and tested with JRE 1.6, but at +least JRE 1.5 should work fine as well. + +Of course, using C++ components in Java applications is not really 'portable'. +However, you can achieve acceptable portability by building the native jAssimp +modules for all platforms you wish your application to run on. The Java Runtime +will always load the right module for the right platform. + +CUSTOM BUILD +.................................................................................. + +In order to use jAssimp, you'll need to compile both the native Assimp library +and the Java bridge module (assimpjbridge) for all target platforms. + +If you're using Visual Studio 2005 or 2008 (or any later version to be supported +in future releases), go to workspaces/vc8 (or vc9 or vc10, ..), open the solution +and compile both 'assimp' and 'assimpjbridge' as 'release-dll' (Win32 and/or x64). +Note that assimpjbridge doesn't work together with -noboost builds of the core Assimp +library, in other words you'll need boost for compiling. See the 'Installation +Page' of the C/C++ documentation for more information. it's not that difficult :-) + +Makefile guys (either gcc or mingw) simply need to do a + ... to be continued + ... + +NOTE: in order to compile assimpjbridge, 'JDK DIR' must point to your local copy of +the Java Development Kit. + + +TROUBLESHOOTING +.................................................................................. + +>> assimp.Importer keeps throwing assimp.NativeException. +The native library is probably not in the root directory of your application, +or it isn't compatible with your platform. + + + diff --git a/port/jAssimp/assimp.iml b/port/jAssimp/assimp.iml deleted file mode 100644 index c208f5980..000000000 --- a/port/jAssimp/assimp.iml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/port/jAssimp/jni_bridge/BuildHeader.bat b/port/jAssimp/jni_bridge/BuildHeader.bat index dc63ce67e..29a355a26 100644 --- a/port/jAssimp/jni_bridge/BuildHeader.bat +++ b/port/jAssimp/jni_bridge/BuildHeader.bat @@ -1,2 +1,2 @@ -javah -classpath ".\..\classes" -d "." "assimp.Importer" +javah -classpath ".\..\java\bin" -d "." "assimp.Importer" diff --git a/port/jAssimp/jni_bridge/JNIAnimation.cpp b/port/jAssimp/jni_bridge/JNIAnimation.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/port/jAssimp/jni_bridge/JNIBone.cpp b/port/jAssimp/jni_bridge/JNIBone.cpp deleted file mode 100644 index 9d7968f7a..000000000 --- a/port/jAssimp/jni_bridge/JNIBone.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team - -All rights reserved. -See the disclaimer in JNIEnvironment.h for licensing and distribution -conditions. ---------------------------------------------------------------------------- -*/ - -/** @file Implementation of the JNI API for jAssimp */ - -#include "JNIEnvironment.h" -#include "JNILogger.h" - -using namespace Assimp; - -namespace Assimp { -namespace JNIBridge { - -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_Bone::Initialize() -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - // load a handle to the class - if(!(Class = pc->FindClass("assimp.Bone"))) - JNIEnvironment::Get()->ThrowNativeError("Unable to load class assimp.Bone"); - - DefaultCtor = pc->GetMethodID(Class,"",""); - - // load all fields of the class - name = pc->GetFieldID(Class,"name", "Ljava.lang.String;"); - weights = pc->GetFieldID(Class,"weights", "[Lassimp.Bone.Weight;"); - - // check whether all fields have been loaded properly - if (!name || !weights) - JNIEnvironment::Get()->ThrowNativeError("Unable to load all fields of class assimp.Bone"); - - Weight.Initialize(); -} -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_Bone::Fill(jobject obj,const aiBone* pcSrc) -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; -} - - -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_Bone::_Weight::Initialize() -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - // load a handle to the class - if(!(Class = pc->FindClass("assimp.Bone.Weight"))) - JNIEnvironment::Get()->ThrowNativeError("Unable to load class assimp.Bone.Weights"); - - DefaultCtor = pc->GetMethodID(Class,"",""); - - // load all fields of the class - index = pc->GetFieldID(Class,"index", "I"); - weight = pc->GetFieldID(Class,"weight", "F"); - - // check whether all fields have been loaded properly - if (!index || !weight) - JNIEnvironment::Get()->ThrowNativeError("Unable to load all fields of class assimp.Bone.Weight"); -} -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_Bone::_Weight::Fill(jobject obj,const aiVertexWeight* pcSrc) -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - pc->SetIntField(obj,index,(jint)pcSrc->mVertexId); - pc->SetFloatField(obj,index,(jfloat)pcSrc->mWeight); -} - - -}} \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/JNIBoneAnim.cpp b/port/jAssimp/jni_bridge/JNIBoneAnim.cpp deleted file mode 100644 index bbdeffbbf..000000000 --- a/port/jAssimp/jni_bridge/JNIBoneAnim.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team - -All rights reserved. -See the disclaimer in JNIEnvironment.h for licensing and distribution -conditions. ---------------------------------------------------------------------------- -*/ - -/** @file Implementation of the JNI API for jAssimp */ - -#include "JNIEnvironment.h" -#include "JNILogger.h" - -using namespace Assimp; - -namespace Assimp { -namespace JNIBridge { - -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_BoneAnim::Initialize() -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - // load a handle to the class - if(!(Class = pc->FindClass("assimp.BoneAnim"))) - JNIEnvironment::Get()->ThrowNativeError("Unable to load class assimp.BoneAnim"); - - DefaultCtor = pc->GetMethodID(Class,"",""); - - // load all fields of the class - mName = pc->GetFieldID(Class,"mName","Lassimp.Node;"); - mPosKeys = pc->GetFieldID(Class,"mPosKeys", "[Lassimp.BoneAnim.Keyframe<[F>;"); - mScalingKeys = pc->GetFieldID(Class,"mScalingKeys","[Lassimp.BoneAnim.Keyframe<[F>;"); - mQuatKeys = pc->GetFieldID(Class,"mQuatKeys","[Lassimp.BoneAnim.Keyframe;"); - - - - // check whether all fields have been loaded properly - if (!mName || !mPosKeys || !mScalingKeys || !mQuatKeys) - JNIEnvironment::Get()->ThrowNativeError("Unable to load all fields of class assimp.BoneAnim"); -} -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_BoneAnim::Fill(jobject obj,const aiNodeAnim* pcSrc) -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - -} -}} \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/JNICalls.cpp b/port/jAssimp/jni_bridge/JNICalls.cpp deleted file mode 100644 index 63f3942e6..000000000 --- a/port/jAssimp/jni_bridge/JNICalls.cpp +++ /dev/null @@ -1,316 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team - -All rights reserved. - -Redistribution and use of this software 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 the ASSIMP team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the ASSIMP Development Team. - -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. ---------------------------------------------------------------------------- -*/ - -/** @file Implementation of the JNI API for jAssimp */ - - -// include the header files generated by javah -#include "assimp_Importer.h" - -// include assimp -#include -#include -#include -#include -#include -#include -#include -#include - -// include all jAssimp internal header files -#include "JNIEnvironment.h" -#include "JNILogger.h" - -using namespace Assimp; - -#include - -namespace Assimp { -namespace JNIBridge { - -// used as error return code -#define AI_JNI_ERROR_RETURN 0xffffffff - -// typedef for a jassimp context, used to uniquely identify -// the Importer object which belongs to a java Importer - -typedef uint64_t JASSIMP_CONTEXT; - -#if (defined _DEBUG) - - typedef std::list< JASSIMP_CONTEXT > ImporterContextList; - static ImporterContextList g_listActiveContexts; - -// ------------------------------------------------------------------------------------------------ -/* Used in debug builds to validate a context -*/ -bool jValidateContext (JASSIMP_CONTEXT context) -{ - for (ImporterContextList::const_iterator - i = g_listActiveContexts.begin(); - i != g_listActiveContexts.end();++i) - { - if (context == *i)return true; - } - DefaultLogger::get()->error("[jnibridge] Invalid context"); - return false; -} - -// ------------------------------------------------------------------------------------------------ -/* Used in debug builds to validate a given scene -*/ -bool jValidateScene (const aiScene* scene) -{ - if (!scene) - { - DefaultLogger::get()->error("[jnibridge] No asset loaded at the moment"); - return false; - } - return true; -} - -#endif // ! ASSIMP_DEBUG - -// ------------------------------------------------------------------------------------------------ -/* Used in debug builds to validate a given scene -*/ -Assimp::Importer* jGetValidImporterScenePair (JASSIMP_CONTEXT jvmcontext) -{ -#if (defined _DEBUG) - if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext))return NULL; -#endif // ! ASSIMP_DEBUG - - // get the importer instance from the context - Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; - -#if (defined _DEBUG) - if (!jValidateScene(pcImp->GetScene()))return NULL; -#endif // ! ASSIMP_DEBUG - return pcImp; -} - -// ------------------------------------------------------------------------------------------------ -/* - * Class: assimp_Importer - * Method: _NativeInitContext - * Signature: ()I - */ -JNIEXPORT jlong JNICALL Java_assimp_Importer__1NativeInitContext - (JNIEnv * jvmenv, jobject jvmthis) -{ - // 2^64-1 indicates error - JASSIMP_CONTEXT context = 0xffffffffffffffffL; - - // create a new Importer instance - Assimp::Importer* pcImp = new Assimp::Importer(); - context = (JASSIMP_CONTEXT)(uintptr_t)pcImp; - -#if (defined _DEBUG) - g_listActiveContexts.push_back(context); -#endif // ! ASSIMP_DEBUG - - // need to setup the logger - JNILogDispatcher* pcLogger; - if (DefaultLogger::isNullLogger()) - { - pcLogger = new JNILogDispatcher(); - DefaultLogger::set (pcLogger); - } - else - { - JNILogDispatcher* pcLogger = ( JNILogDispatcher* )DefaultLogger::get(); - pcLogger->AddRef(); - } - - // setup the JNI environment ... - // simply setup the newest JNIEnv* - if(!JNIEnvironment::Get()->AttachToCurrentThread(jvmenv)) - return 0xffffffffffffffffL; - - return context; -} - -// ------------------------------------------------------------------------------------------------ -/* - * Class: assimp_Importer - * Method: _NativeFreeContext - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeFreeContext - (JNIEnv * jvmenv, jobject jvmthis, jlong jvmcontext) -{ - -#if (defined _DEBUG) - if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext))return AI_JNI_ERROR_RETURN; -#endif // ! ASSIMP_DEBUG - - // delete the Importer instance - Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; - delete pcImp; - -#if (defined _DEBUG) - g_listActiveContexts.remove(jvmcontext); -#endif // ! ASSIMP_DEBUG - - JNIEnvironment::Get()->DetachFromCurrentThread(); - return 0; -} - -// ------------------------------------------------------------------------------------------------ -/* - * Class: assimp_Importer - * Method: _NativeLoad - * Signature: (Ljava/lang/String;II)I - */ -JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeLoad - (JNIEnv *jvmenv, jobject jvmthis, jstring jvmpath, jint jvmflags, jlong jvmcontext) -{ - jint iRet = 0; - -#if (defined _DEBUG) - if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext))return AI_JNI_ERROR_RETURN; -#endif // ! ASSIMP_DEBUG - - // get the path from the jstring - const char* szPath = JNU_GetStringNativeChars(jvmenv,jvmpath); - if (!szPath) - { - DefaultLogger::get()->error("[jnibridge] Unable to get path string from the java vm"); - return AI_JNI_ERROR_RETURN; - } - // get the importer instance from the context - Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; - const aiScene* pcOut; - - // and load the file. The aiScene object itself remains accessible - // via Importer.GetScene(). - if(!(pcOut = pcImp->ReadFile(std::string(szPath),(unsigned int)jvmflags))) - { - DefaultLogger::get()->error("[jnibridge] Unable to load asset"); - - // release the path again - free((void*)szPath); - return AI_JNI_ERROR_RETURN; - } - - // release the path again - ::free((void*)szPath); - - // allocate a new assimp.Scene object to be returned by the importer - jobject jScene; - if(!(jScene = jvmenv->AllocObject(AIJ_GET_HANDLE(assimp.Importer.Class)))) - { - DefaultLogger::get()->error("[jnibridge] Unable to allocate output scene"); - return AI_JNI_ERROR_RETURN; - } - - // fill the assimp.Scene instance - JNIEnvironment::Get()->assimp.Scene.Fill(jScene,pcOut); - - // and store it in the Importer instance - jvmenv->SetObjectField(jvmthis,AIJ_GET_HANDLE(assimp.Importer.scene),jScene); - return iRet; -} - -// ------------------------------------------------------------------------------------------------ -/* - * Class: assimp_Importer - * Method: _NativeSetPropertyInt - * Signature: (Ljava/lang/String;IJ)I - */ -JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeSetPropertyInt - (JNIEnv * jvmenv, jobject _this, jstring name, jint value, jlong jvmcontext) -{ -#if (defined _DEBUG) - if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext))return AI_JNI_ERROR_RETURN; -#endif // ! ASSIMP_DEBUG - - Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; - const char* sz = JNU_GetStringNativeChars(jvmenv,name); - pcImp->SetPropertyInteger(sz,(int)value,NULL); - ::free((void*)sz); - return 0; -} - - -// ------------------------------------------------------------------------------------------------ -/* - * Class: assimp_Importer - * Method: _NativeSetPropertyFloat - * Signature: (Ljava/lang/String;FJ)I - */ -JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeSetPropertyFloat - (JNIEnv * jvmenv, jobject _this, jstring name, jfloat value, jlong jvmcontext) -{ -#if (defined _DEBUG) - if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext))return AI_JNI_ERROR_RETURN; -#endif // ! ASSIMP_DEBUG - - Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; - const char* sz = JNU_GetStringNativeChars(jvmenv,name); - pcImp->SetPropertyFloat(sz,(float)value,NULL); - ::free((void*)sz); - return 0; -} - -// ------------------------------------------------------------------------------------------------ -/* - * Class: assimp_Importer - * Method: _NativeSetPropertyString - * Signature: (Ljava/lang/String;Ljava/lang/String;J)I - */ -JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeSetPropertyString - (JNIEnv * jvmenv, jobject _this, jstring name, jstring value, jlong jvmcontext) -{ -#if (defined _DEBUG) - if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext))return AI_JNI_ERROR_RETURN; -#endif // ! ASSIMP_DEBUG - - Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; - const char* sz = JNU_GetStringNativeChars(jvmenv,name); - const char* sz2 = JNU_GetStringNativeChars(jvmenv,value); - pcImp->SetPropertyString(sz,sz2,NULL); - ::free((void*)sz);::free((void*)sz2); - return 0; -} - -}; //! namespace JNIBridge -}; //! namespace Assimp diff --git a/port/jAssimp/jni_bridge/JNIEnvironment.h b/port/jAssimp/jni_bridge/JNIEnvironment.h deleted file mode 100644 index b3a649c66..000000000 --- a/port/jAssimp/jni_bridge/JNIEnvironment.h +++ /dev/null @@ -1,516 +0,0 @@ -/* -Open Asset Import Library (ASSIMP) ----------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team -All rights reserved. - -Redistribution and use of this software 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 the ASSIMP team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the ASSIMP Development Team. - -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. - ----------------------------------------------------------------------- -*/ - -#if (!defined AI_JNIENVIRONMENT_H_INCLUDED) -#define AI_JNIENVIRONMENT_H_INCLUDED - - -#include -#include - -#include -#include - -#include -#include -#include - - -namespace Assimp { -namespace JNIBridge { - - -#define AIJ_GET_HANDLE(__handle__) \ - (JNIEnvironment::Get()-> __handle__) - -#define AIJ_GET_DEFAULT_CTOR_HANDLE(__handle__) \ - (JNIEnvironment::Get()-> __handle__ . DefaultCtor) - -#define AIJ_GET_CLASS_HANDLE(__handle__) \ - (JNIEnvironment::Get()-> __handle__.Class) - -// --------------------------------------------------------------------------- -/** @class JNIThreadData - * @brief Manages a list of JNI data structures that are - * private to a thread. - */ - // --------------------------------------------------------------------------- -struct JNIThreadData -{ - //! Default constructor - JNIThreadData() : m_pcEnv(NULL), m_iNumRef(1) {} - - //! Construction from an existing JNIEnv - JNIThreadData(JNIEnv* env) : m_pcEnv(env), m_iNumRef(1) {} - - //! JNI environment, is attached to the thread - JNIEnv* m_pcEnv; - - //! Number of Importer instances that have been - //! created by this thread - unsigned int m_iNumRef; -}; - - -// --------------------------------------------------------------------------- -/** @class JNIEnvironment - * @brief Helper class to manage the JNI environment for multithreaded - * use of the library. - */ -// --------------------------------------------------------------------------- -class JNIEnvironment -{ -private: - - JNIEnvironment() : m_iRefCnt(1) {} - -public: - - //! Create the JNI environment class - //! refcnt = 1 - static JNIEnvironment* Create() - { - if (NULL == s_pcEnv) - { - s_pcEnv = new JNIEnvironment(); - } - else s_pcEnv->AddRef(); - return s_pcEnv; - } - - //! static getter for the singleton instance - //! doesn't hange the reference counter - static JNIEnvironment* Get() - { - ai_assert(NULL != s_pcEnv); - return s_pcEnv; - } - - //! COM-style reference counting mechanism - unsigned int AddRef() - { - return ++this->m_iRefCnt; - } - - //! COM-style reference counting mechanism - unsigned int Release() - { - unsigned int iNew = --this->m_iRefCnt; - if (0 == iNew)delete this; - return iNew; - } - - //! Attach to the current thread - bool AttachToCurrentThread (JNIEnv* pcEnv); - - //! Detach from the current thread - bool DetachFromCurrentThread (); - - //! Get the thread local data of the current thread - JNIThreadData* GetThread(); - - //! Throw an NativeEror exception with the specified error message - //! The error message is optional. - void ThrowNativeError(const char* msg = NULL); - -public: - - - struct _java - { - inline void Initialize() - { - lang.Initialize(); - } - - struct _lang - { - inline void Initialize() - { - String.Initialize(); - } - - struct _String - { - void Initialize(); - - //! Handle to the java.lang.String class - static jclass Class; - - //! Handle to the java.lang.String.getBytes() class - static jmethodID getBytes; - - //! Handle to the java.lang.String.String(byte[]) c'tor - static jmethodID constructor_ByteArray; - - } String; - - - struct _Array - { - void Initialize(); - - jclass FloatArray_Class; - jclass IntArray_Class; - - } Array; - - } lang; - } java; - - - struct _Base - { - virtual void Fill(jobject obj,const void* pcSrc) = 0; - - jclass Class; - jmethodID DefaultCtor; - }; - -#define AIJ_SET_INPUT_TYPE(__type__) \ - \ - void Fill(jobject obj,const __type__* pcSrc); \ - \ - inline void Fill(jobject obj,const void* pcSrc) \ - {Fill(obj,(const __type__*)pcSrc);} - - //! Represents the JNI interface to the package assimp - struct _assimp - { - //! Initializes the package assimp for use with jAssimp - inline void Initialize() - { - // the NativeException class must be initialized first as it - // is used by all other class initializers - NativeException.Initialize(); - - // now initialize all other classes, the rder doesn't care. - Scene.Initialize(); - Importer.Initialize(); - Mesh.Initialize(); - Bone.Initialize(); - Animation.Initialize(); - BoneAnim.Initialize(); - Texture.Initialize(); - CompressedTexture.Initialize(); - Matrix3x3.Initialize(); - Matrix4x4.Initialize(); - Quaternion.Initialize(); - Node.Initialize(); - Material.Initialize(); - }; - - //! Represents the JNI interface to class assimp.NativeException - struct _NativeException - { - void Initialize(); - - jclass Class; - - } NativeException; - - - //! Represents the JNI interface to class assimp.Importer - struct _Importer - { - void Initialize(); - - jclass Class; - - jfieldID scene; - - } Importer; - - - //! Represents the JNI interface to class assimp.Scene - struct _Scene : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiScene); - - - jfieldID m_vMeshes; - jfieldID m_vTextures; - jfieldID m_vMaterials; - jfieldID m_vAnimations; - jfieldID m_rootNode; - jfieldID flags; - - } Scene; - - - //! Represents the JNI interface to class assimp.Mesh - struct _Mesh : public _Base - { - AIJ_SET_INPUT_TYPE(aiMesh); - void Initialize(); - - jfieldID m_vVertices; - jfieldID m_vTangents; - jfieldID m_vBitangents; - jfieldID m_vNormals; - jfieldID m_avUVs; - jfieldID m_vFaces; - jfieldID m_avColors; - jfieldID m_aiNumUVComponents; - jfieldID m_vBones; - jfieldID m_iMaterialIndex; - - } Mesh; - - //! Represents the JNI interface to class assimp.Bone - struct _Bone : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiBone); - - jfieldID name; - jfieldID weights; - - - //! Represents the JNI interface to class assimp.Bone.Weight - struct _Weight : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiVertexWeight); - - jfieldID index; - jfieldID weight; - - } Weight; - - } Bone; - - //! Represents the JNI interface to class assimp.Animation - struct _Animation : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiAnimation); - - jfieldID name; - jfieldID mDuration; - jfieldID mTicksPerSecond; - jfieldID boneAnims; - - } Animation; - - //! Represents the JNI interface to class assimp.BoneAnim - struct _BoneAnim : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiNodeAnim); - - //! Represents the JNI interface to class assimp.BoneAnim.KeyFrame - struct _KeyFrame - { - jclass Class; - - jmethodID DefaultCtor; - - jfieldID time; - jfieldID value; - - } KeyFrame; - - jfieldID mName; - jfieldID mQuatKeys; - jfieldID mPosKeys; - jfieldID mScalingKeys; - - } BoneAnim; - - //! Represents the JNI interface to class assimp.Texture - struct _Texture : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiTexture); - - jfieldID width; - jfieldID height; - jfieldID data; - - } Texture; - - //! Represents the JNI interface to class assimp.CompressedTexture - struct _CompressedTexture : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiTexture); - - jfieldID m_format; - - } CompressedTexture; - - //! Represents the JNI interface to class assimp.Material - struct _Material : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiMaterial); - - //! Represents the JNI interface to class assimp.Material.Property - struct _Property : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiMaterialProperty); - - jfieldID key; - jfieldID value; - - } Property; - jfieldID properties; - - } Material; - - //! Represents the JNI interface to class assimp.Matrix4x4 - struct _Matrix4x4 : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiMatrix4x4); - jfieldID coeff; - - } Matrix4x4; - - //! Represents the JNI interface to class assimp.Matrix3x3 - struct _Matrix3x3 : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiMatrix3x3); - jfieldID coeff; - - } Matrix3x3; - - //! Represents the JNI interface to class assimp.Quaternion - struct _Quaternion : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiQuaternion); - - jfieldID x; - jfieldID y; - jfieldID z; - jfieldID w; - - } Quaternion; - - //! Represents the JNI interface to class assimp.Node - struct _Node : public _Base - { - void Initialize(); - AIJ_SET_INPUT_TYPE(aiNode); - - jfieldID meshIndices; - jfieldID nodeTransform; - jfieldID name; - jfieldID children; - jfieldID parent; - - } Node; - - } assimp; - - inline void Initialize() - { - assimp.Initialize(); - java.Initialize(); - } - -private: - - //! Singleton instance - static JNIEnvironment* s_pcEnv; - - //! TLS data - boost::thread_specific_ptr ptr; - - //! Reference counter of the whole class - unsigned int m_iRefCnt; -}; - -// --------------------------------------------------------------------------- -/** @brief Helper function to copy data to a Java array - * - * @param pc JNI env handle - * @param jfl Java array - * @param data Input data - * @param size Size of data to be copied, in bytes - */ -void JNU_CopyDataToArray(JNIEnv* pc, jarray jfl, void* data, unsigned int size); - -// --------------------------------------------------------------------------- -/** @brief Helper function to create a java.lang.String from - * a native char*. - * - * This function has been taken from - * http://java.sun.com/docs/books/jni/html/other.html#26021 - * I am not sure whether it is really necessary, but I trust the source - */ -jstring JNU_NewStringNative(JNIEnv *env, const char *str); - - -// --------------------------------------------------------------------------- -/** @brief Helper function to create a char* from - * a managed jstring - * - * This function has been taken from - * http://java.sun.com/docs/books/jni/html/other.html#26021 - * I am not sure whether it is really necessary, but I trust the source - */ -char* JNU_GetStringNativeChars(JNIEnv *env, jstring jstr); - - -// --------------------------------------------------------------------------- -/** @brief Helper function to copy a whole object array to the VM - * - * @param pc JNI env handle - * @param in Input object array - * @param num Size of input array - * @param type Type of input - * @param out Output object - */ -// --------------------------------------------------------------------------- -void JNU_CopyObjectArrayToVM(JNIEnv* pc, const void** in, unsigned int num, - JNIEnvironment::_Base& type, jobjectArray& out); - -};}; - - -#endif //! AI_JNIENVIRONMENT_H_INCLUDED - - diff --git a/port/jAssimp/jni_bridge/JNIIOStream.cpp b/port/jAssimp/jni_bridge/JNIIOStream.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/port/jAssimp/jni_bridge/JNIIOSystem.cpp b/port/jAssimp/jni_bridge/JNIIOSystem.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/port/jAssimp/jni_bridge/JNILogger.cpp b/port/jAssimp/jni_bridge/JNILogger.cpp deleted file mode 100644 index 04492d707..000000000 --- a/port/jAssimp/jni_bridge/JNILogger.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team - -All rights reserved. - -Redistribution and use of this software 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 the ASSIMP team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the ASSIMP Development Team. - -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. ---------------------------------------------------------------------------- -*/ - -/** @file Implementation of the JNI API for jAssimp */ - -#if (defined ASSIMP_JNI_EXPORT) - - -// include assimp -#include "../../include/aiTypes.h" -#include "../../include/aiMesh.h" -#include "../../include/aiAnim.h" -#include "../../include/aiScene.h" -#include "../../include/aiAssert.h" -#include "../../include/aiPostProcess.h" -#include "../../include/assimp.hpp" - -#include "../../include/DefaultLogger.h" - -#include "JNIEnvironment.h" -#include "JNILogger.h" - -using namespace Assimp; - - -namespace Assimp { -namespace JNIBridge { - - -// ------------------------------------------------------------------------------------------------ -bool JNILogDispatcher::OnAttachToCurrentThread(JNIThreadData* pcData) -{ - ai_assert(NULL != pcData); - //this->AddRef(); - done at another position - - // there is much error handling code in this function. - // However, it is not impossible that the jAssimp package - // loaded by the JVM is incomplete ... - JNIEnv* jvmenv = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - // get a handle to the assimp.DefaultLogger class - if (NULL == this->m_pcClass) - { - if( NULL == (this->m_pcClass = jvmenv->FindClass("assimp.DefaultLogger"))) - { - return false; - } - } - // get handles to the logging functions - if (NULL == this->m_pcMethodError) - { - if( NULL == (this->m_pcMethodError = jvmenv->GetStaticMethodID( - this->m_pcClass,"_NativeCallWriteError","(Ljava/lang/String;)V"))) - { - return false; - } - } - if (NULL == this->m_pcMethodWarn) - { - if( NULL == (this->m_pcMethodWarn = jvmenv->GetStaticMethodID( - this->m_pcClass,"_NativeCallWriteWarn","(Ljava/lang/String;)V"))) - { - return false; - } - } - if (NULL == this->m_pcMethodInfo) - { - if( NULL == (this->m_pcMethodInfo = jvmenv->GetStaticMethodID( - this->m_pcClass,"_NativeCallWriteInfo","(Ljava/lang/String;)V"))) - { - return false; - } - } - if (NULL == this->m_pcMethodDebug) - { - if( NULL == (this->m_pcMethodDebug = jvmenv->GetStaticMethodID( - this->m_pcClass,"_NativeCallWriteDebug","(Ljava/lang/String;)V"))) - { - return false; - } - } - return true; -} -// ------------------------------------------------------------------------------------------------ -bool JNILogDispatcher::OnDetachFromCurrentThread(JNIThreadData* pcData) -{ - ai_assert(NULL != pcData); - - this->Release(); - return true; -} -// ------------------------------------------------------------------------------------------------ -void JNILogDispatcher::debug(const std::string &message) -{ - JNIEnv* jvmenv = JNIEnvironment::Get()->GetThread()->m_pcEnv; - jstring jstr = JNU_NewStringNative(jvmenv,message.c_str()); - jvmenv->CallStaticVoidMethod(this->m_pcClass,this->m_pcMethodDebug,jstr); - jvmenv->DeleteLocalRef(jstr); -} -// ------------------------------------------------------------------------------------------------ -void JNILogDispatcher::info(const std::string &message) -{ - JNIEnv* jvmenv = JNIEnvironment::Get()->GetThread()->m_pcEnv; - jstring jstr = JNU_NewStringNative(jvmenv,message.c_str()); - jvmenv->CallStaticVoidMethod(this->m_pcClass,this->m_pcMethodInfo,jstr); - jvmenv->DeleteLocalRef(jstr); -} -// ------------------------------------------------------------------------------------------------ -void JNILogDispatcher::warn(const std::string &message) -{ - JNIEnv* jvmenv = JNIEnvironment::Get()->GetThread()->m_pcEnv; - jstring jstr = JNU_NewStringNative(jvmenv,message.c_str()); - jvmenv->CallStaticVoidMethod(this->m_pcClass,this->m_pcMethodWarn,jstr); - jvmenv->DeleteLocalRef(jstr); -} -// ------------------------------------------------------------------------------------------------ -void JNILogDispatcher::error(const std::string &message) -{ - JNIEnv* jvmenv = JNIEnvironment::Get()->GetThread()->m_pcEnv; - jstring jstr = JNU_NewStringNative(jvmenv,message.c_str()); - jvmenv->CallStaticVoidMethod(this->m_pcClass,this->m_pcMethodError,jstr); - jvmenv->DeleteLocalRef(jstr); -} - - -};}; - -#endif // jni \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/JNILogger.h b/port/jAssimp/jni_bridge/JNILogger.h deleted file mode 100644 index 025ec4db3..000000000 --- a/port/jAssimp/jni_bridge/JNILogger.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -Open Asset Import Library (ASSIMP) ----------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team -All rights reserved. - -Redistribution and use of this software 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 the ASSIMP team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the ASSIMP Development Team. - -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. - ----------------------------------------------------------------------- -*/ - -#if (!defined AI_JNILOGGER_H_INCLUDED) -#define AI_JNILOGGER_H_INCLUDED - - -#include "../../../include/Logger.h" -#include "../../../include/DefaultLogger.h" -#include - -#include - -namespace Assimp { -namespace JNIBridge { - -// --------------------------------------------------------------------------- -class IOStream; -struct LogStreamInfo; - - -// --------------------------------------------------------------------------- -/** @class JNILogDispatcher - * @brief Logging system implementation that is used to send all - * log messages generated by native code to the Java logging system. - */ -class JNILogDispatcher : public Logger -{ - friend class JNIEnvironment; - -public: - - //! Default constructor - JNILogDispatcher() : m_iRefCnt(1) {} - - /** @brief Logs a debug message */ - void debug(const std::string &message); - - /** @brief Logs an info message */ - void info(const std::string &message); - - /** @brief Logs a warning message */ - void warn(const std::string &message); - - /** @brief Logs an error message */ - void error(const std::string &message); - - /** @brief Log severity setter */ - void setLogSeverity(LogSeverity log_severity) {} - - /** @brief Detach a still attached stream from logger */ - void attachStream(LogStream *pStream, unsigned int severity) {} - - /** @brief Detach a still attached stream from logger */ - void detatchStream(LogStream *pStream, unsigned int severity) {} - - //! COM-style reference counting mechanism - unsigned int AddRef() - { - return ++this->m_iRefCnt; - } - - //! COM-style reference counting mechanism - unsigned int Release() - { - unsigned int iNew = --this->m_iRefCnt; - if (0 == iNew) - { - delete this; - // don't forget to reset the logger to the default implementation - DefaultLogger::set(NULL); - } - return iNew; - } - -private: - - //! Called by JNIEnvironment - bool OnAttachToCurrentThread(JNIThreadData* pcData); - bool OnDetachFromCurrentThread(JNIThreadData* pcData); - -private: - - //! Handle to assimp.DefaultLogger class - jclass m_pcClass; - - //! Handle to the static assimp.DefaultLogger._NativeCallWriteError() method - jmethodID m_pcMethodError; - - //! Handle to the static assimp.DefaultLogger._NativeCallWriteInfo() method - jmethodID m_pcMethodInfo; - - //! Handle to the static assimp.DefaultLogger._NativeCallWriteDebug() method - jmethodID m_pcMethodDebug; - - //! Handle to the static assimp.DefaultLogger._NativeCallWriteWarn() method - jmethodID m_pcMethodWarn; - - //! Reference counter of the logger - unsigned int m_iRefCnt; -}; - -};}; - -#endif // AI_JNILOGGER_H_INCLUDED \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/JNIMaterial.cpp b/port/jAssimp/jni_bridge/JNIMaterial.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/port/jAssimp/jni_bridge/JNIMesh.cpp b/port/jAssimp/jni_bridge/JNIMesh.cpp deleted file mode 100644 index 8c45e4d4c..000000000 --- a/port/jAssimp/jni_bridge/JNIMesh.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team - -All rights reserved. - -Redistribution and use of this software 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 the ASSIMP team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the ASSIMP Development Team. - -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. ---------------------------------------------------------------------------- -*/ - -/** @file Implementation of the JNI API for jAssimp */ - -#include "JNIEnvironment.h" -#include "JNILogger.h" - -using namespace Assimp; - -namespace Assimp { -namespace JNIBridge { - -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_Mesh::Initialize() -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - // load a handle to the class - if(!(this->Class = pc->FindClass("assimp.Mesh"))) - JNIEnvironment::Get()->ThrowNativeError("Unable to load class assimp.mesh"); - - DefaultCtor = pc->GetMethodID(Class,"",""); - - // load all fields of the class - this->m_vVertices = pc->GetFieldID(Class,"m_vVertices","[F"); - this->m_vNormals = pc->GetFieldID(Class,"m_vNormals","[F"); - this->m_vTangents = pc->GetFieldID(Class,"m_vTangents","[F"); - this->m_vBitangents = pc->GetFieldID(Class,"m_vBitangents","[F"); - this->m_avColors = pc->GetFieldID(Class,"m_avColors","[[F"); - this->m_avUVs = pc->GetFieldID(Class,"m_avColors","[[F"); - this->m_vFaces = pc->GetFieldID(Class,"m_vFaces","[I"); - this->m_vBones = pc->GetFieldID(Class,"m_vBones","[Lassimp.Bone;"); - - this->m_aiNumUVComponents = pc->GetFieldID(Class,"m_aiNumUVComponents","[I"); - this->m_iMaterialIndex = pc->GetFieldID(Class,"m_iMaterialIndex","I"); - - // check whether all fields have been loaded properly - if (!this->m_vVertices || !this->m_vNormals || !this->m_vTangents || - !this->m_vBitangents || !this->m_avColors || !this->m_avUVs || - !this->m_vFaces || !this->m_vBones || !this->m_aiNumUVComponents || - !this->m_iMaterialIndex) - { - JNIEnvironment::Get()->ThrowNativeError("Unable to load all fields of class assimp.mesh"); - } -} -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_Mesh::Fill(jobject obj,const aiMesh* pcSrc) -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - // set the material index - pc->SetIntField(obj,this->m_iMaterialIndex,pcSrc->mMaterialIndex); - - - // allocate the arrays and fill them - const unsigned int size = pcSrc->mNumVertices*12; - const unsigned int size2 = pcSrc->mNumVertices*3; - - // copy vertex positions - if (pcSrc->HasPositions()) - { - jfloatArray jfl = pc->NewFloatArray(size2); - JNU_CopyDataToArray(pc,jfl,pcSrc->mVertices,size); - - pc->SetObjectField(obj,this->m_vVertices,jfl); - } - // copy vertex normals - if (pcSrc->HasNormals()) - { - // allocate and copy data - jfloatArray jfl = pc->NewFloatArray(size2); - JNU_CopyDataToArray(pc,jfl,pcSrc->mNormals,size); - - pc->SetObjectField(obj,this->m_vNormals,jfl); - } - // copy tangents and bitangents - if (pcSrc->HasTangentsAndBitangents()) - { - jfloatArray jfl = pc->NewFloatArray(size2); - JNU_CopyDataToArray(pc,jfl,pcSrc->mTangents,size); - - pc->SetObjectField(obj,this->m_vTangents,jfl); - - jfl = pc->NewFloatArray(size2); - JNU_CopyDataToArray(pc,jfl,pcSrc->mBitangents,size); - pc->SetObjectField(obj,this->m_vBitangents,jfl); - } - // copy texture coordinates - if (pcSrc->HasTextureCoords(0)) - { - jobjectArray jobjarr = pc->NewObjectArray(AI_MAX_NUMBER_OF_TEXTURECOORDS, - AIJ_GET_HANDLE(java.lang.Array.FloatArray_Class),0); - - unsigned int channel = 0; - while (pcSrc->HasTextureCoords(channel)) - { - jfloatArray jfl = pc->NewFloatArray(size2); - JNU_CopyDataToArray(pc,jfl,pcSrc->mTextureCoords[channel],size); - - pc->SetObjectArrayElement(jobjarr,channel,jfl); - ++channel; - } - - // set the corresponding field in the java object - pc->SetObjectField(obj,this->m_avUVs,jobjarr); - - jobjarr = (jobjectArray) pc->NewIntArray(AI_MAX_NUMBER_OF_TEXTURECOORDS); - pc->SetIntArrayRegion((jintArray)jobjarr,0,channel,(const jint*)&pcSrc->mNumUVComponents); - pc->SetObjectField(obj,this->m_aiNumUVComponents,jobjarr); - } - // copy vertex colors - if (pcSrc->HasVertexColors(0)) - { - const unsigned int size = pcSrc->mNumVertices<<4; - const unsigned int size2 = pcSrc->mNumVertices<<2; - - jobjectArray jobjarr = pc->NewObjectArray(AI_MAX_NUMBER_OF_COLOR_SETS, - AIJ_GET_HANDLE(java.lang.Array.FloatArray_Class),0); - - unsigned int channel = 0; - while (pcSrc->HasVertexColors(channel)) - { - jfloatArray jfl = pc->NewFloatArray(size2); - JNU_CopyDataToArray(pc,jfl,pcSrc->mColors[channel],size); - - pc->SetObjectArrayElement(jobjarr,channel,jfl); - ++channel; - } - - // set the corresponding field in the java object - pc->SetObjectField(obj,this->m_avColors,jobjarr); - } - - - // copy faces - if (0 < pcSrc->mNumFaces) // just for safety - { - const unsigned int size = pcSrc->mNumFaces*12; - const unsigned int size2 = pcSrc->mNumFaces*3; - - // allocate and copy data - jintArray jil = pc->NewIntArray(size2); - - uint32_t* pf; - jboolean iscopy = FALSE; - - if(!(pf = (uint32_t*)pc->GetPrimitiveArrayCritical(jil,&iscopy))) - JNIEnvironment::Get()->ThrowNativeError("Unable to lock face array"); - - const aiFace* const pcEnd = pcSrc->mFaces+pcSrc->mNumFaces; - for (const aiFace* pcCur = pcSrc->mFaces;pcCur != pcEnd;++pcCur) - { - ai_assert(3 == pcCur->mNumIndices); - *pf++ = pcCur->mIndices[0]; - *pf++ = pcCur->mIndices[1]; - *pf++ = pcCur->mIndices[2]; - } - - pc->ReleasePrimitiveArrayCritical(jil,pf,0); - pc->SetObjectField(obj,this->m_vFaces,jil); - } - - // copy bones - if (pcSrc->mNumBones) - { - jobjectArray ja; - JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mBones,pcSrc->mNumBones, - AIJ_GET_HANDLE(assimp.Bone),ja); - pc->SetObjectField(obj,m_vBones,ja); - } -} - -}} \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/JNINativeError.cpp b/port/jAssimp/jni_bridge/JNINativeError.cpp deleted file mode 100644 index 6f680b7a7..000000000 --- a/port/jAssimp/jni_bridge/JNINativeError.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team - -All rights reserved. -See the disclaimer in JNIEnvironment.h for licensing and distribution -conditions. ---------------------------------------------------------------------------- -*/ - -/** @file Implementation of the JNI API for jAssimp */ - -#include "JNIEnvironment.h" -#include "JNILogger.h" - -using namespace Assimp; - -namespace Assimp { -namespace JNIBridge { - -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_NativeException::Initialize() -{ - // get a handle to the JNI context for this thread - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - // load a handle to the class - if(!(this->Class = pc->FindClass("assimp.NativeException"))) - { - // if this fails we have no exception class we could use ... - // throw an java.lang.Error instance - this->Class = pc->FindClass("java.lang.Exception"); - pc->ThrowNew(this->Class,"Unable to load class assimp.NativeException (severe failure!)"); - this->Class = NULL; - } -} - - -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::ThrowNativeError(const char* msg /*= NULL*/) -{ - // get a handle to the JNI context for this thread - JNIEnv* pc = this->GetThread()->m_pcEnv; - - // throw a new NativeException - pc->ThrowNew(this->assimp.NativeException.Class, - msg ? msg - : "An unspecified error occured in the native interface to Assimp."); -} -}} \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/JNINode.cpp b/port/jAssimp/jni_bridge/JNINode.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/port/jAssimp/jni_bridge/JNIScene.cpp b/port/jAssimp/jni_bridge/JNIScene.cpp deleted file mode 100644 index a933d5321..000000000 --- a/port/jAssimp/jni_bridge/JNIScene.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development Team - -All rights reserved. -See the disclaimer in JNIEnvironment.h for licensing and distribution -conditions. ---------------------------------------------------------------------------- -*/ - -/** @file Implementation of the JNI API for jAssimp */ - -#include "JNIEnvironment.h" -#include "JNILogger.h" - -using namespace Assimp; - -namespace Assimp { -namespace JNIBridge { - -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_Scene::Initialize() -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - - // load a handle to the class - if(!(Class = pc->FindClass("assimp.Scene"))) - JNIEnvironment::Get()->ThrowNativeError("Unable to load class assimp.Scene"); - - DefaultCtor = pc->GetMethodID(Class,"",""); - - // load all fields of the class - m_rootNode = pc->GetFieldID(Class,"m_rootNode","Lassimp.Node;"); - m_vAnimations = pc->GetFieldID(Class,"m_vAnimations","[Lassimp.Animation;"); - m_vMaterials = pc->GetFieldID(Class,"m_vMaterials","[Lassimp.Material;"); - m_vMeshes = pc->GetFieldID(Class,"m_vMeshes","[Lassimp.Mesh;"); - m_vTextures = pc->GetFieldID(Class,"m_vTextures","[Lassimp.Texture;"); - flags = pc->GetFieldID(Class,"flags","I"); - - - // check whether all fields have been loaded properly - if (!m_vAnimations || !m_rootNode || !m_vMaterials || !m_vMeshes || !m_vTextures || !flags) - JNIEnvironment::Get()->ThrowNativeError("Unable to load all fields of class assimp.Scene"); -} -// ------------------------------------------------------------------------------------------------ -void JNIEnvironment::_assimp::_Scene::Fill(jobject obj,const aiScene* pcSrc) -{ - JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; - jobjectArray ja; - - // copy meshes - if (pcSrc->mNumMeshes) - { - JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mMeshes,pcSrc->mNumMeshes, - AIJ_GET_HANDLE(assimp.Mesh),ja); - pc->SetObjectField(obj,m_vMeshes,ja); - } - - // copy textures - if (pcSrc->mNumTextures) - { - JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mTextures,pcSrc->mNumTextures, - AIJ_GET_HANDLE(assimp.Texture),ja); - pc->SetObjectField(obj,m_vTextures,ja); - } - - // copy materials - if (pcSrc->mNumMeshes) - { - JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mMaterials,pcSrc->mNumMaterials, - AIJ_GET_HANDLE(assimp.Material),ja); - pc->SetObjectField(obj,m_vMaterials,ja); - } - - // copy animations - if (pcSrc->mNumAnimations) - { - JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mAnimations,pcSrc->mNumAnimations, - AIJ_GET_HANDLE(assimp.Animation),ja); - pc->SetObjectField(obj,m_vAnimations,ja); - } - - // copy flags - pc->SetIntField(obj,flags,(jint)pcSrc->mFlags); - - // copy the root node - jobject root = pc->NewObject(AIJ_GET_CLASS_HANDLE(assimp.Node), - AIJ_GET_DEFAULT_CTOR_HANDLE(assimp.Node)); - - AIJ_GET_HANDLE(assimp.Node).Fill(root,pcSrc->mRootNode); - pc->SetObjectField(obj,m_rootNode,root); -} -}} \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/JNITexture.cpp b/port/jAssimp/jni_bridge/JNITexture.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/port/jAssimp/jni_bridge/assimp_Importer.h b/port/jAssimp/jni_bridge/assimp_Importer.h index 547bb0163..00766a7df 100644 --- a/port/jAssimp/jni_bridge/assimp_Importer.h +++ b/port/jAssimp/jni_bridge/assimp_Importer.h @@ -9,12 +9,16 @@ extern "C" { #endif #undef assimp_Importer_PROPERTY_WAS_NOT_EXISTING #define assimp_Importer_PROPERTY_WAS_NOT_EXISTING -1L + +#undef assimp_Importer_ABI_VERSION +#define assimp_Importer_ABI_VERSION 1 + /* * Class: assimp_Importer * Method: _NativeInitContext * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeInitContext +JNIEXPORT jlong JNICALL Java_assimp_Importer__1NativeInitContext (JNIEnv *, jobject, jint); /* @@ -28,10 +32,10 @@ JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeFreeContext /* * Class: assimp_Importer * Method: _NativeLoad - * Signature: (Ljava/lang/String;IJ)I + * Signature: (Ljava/lang/String;JJ)I */ JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeLoad - (JNIEnv *, jobject, jstring, jint, jlong); + (JNIEnv *, jobject, jstring, jlong, jlong); /* * Class: assimp_Importer diff --git a/port/jAssimp/jni_bridge/assimp_Importer_DefaultIOStream.h b/port/jAssimp/jni_bridge/assimp_Importer_DefaultIOStream.h deleted file mode 100644 index 4394acc20..000000000 --- a/port/jAssimp/jni_bridge/assimp_Importer_DefaultIOStream.h +++ /dev/null @@ -1,13 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class assimp_Importer_DefaultIOStream */ - -#ifndef _Included_assimp_Importer_DefaultIOStream -#define _Included_assimp_Importer_DefaultIOStream -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif diff --git a/port/jAssimp/jni_bridge/assimp_Importer_DefaultIOSystem.h b/port/jAssimp/jni_bridge/assimp_Importer_DefaultIOSystem.h deleted file mode 100644 index 8197b8f06..000000000 --- a/port/jAssimp/jni_bridge/assimp_Importer_DefaultIOSystem.h +++ /dev/null @@ -1,13 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class assimp_Importer_DefaultIOSystem */ - -#ifndef _Included_assimp_Importer_DefaultIOSystem -#define _Included_assimp_Importer_DefaultIOSystem -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif diff --git a/port/jAssimp/jni_bridge/assimp_Importer_Property.h b/port/jAssimp/jni_bridge/assimp_Importer_Property.h deleted file mode 100644 index 435c4b4e1..000000000 --- a/port/jAssimp/jni_bridge/assimp_Importer_Property.h +++ /dev/null @@ -1,13 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class assimp_Importer_Property */ - -#ifndef _Included_assimp_Importer_Property -#define _Included_assimp_Importer_Property -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif diff --git a/port/jAssimp/jni_bridge/jbridge_Animation.cpp b/port/jAssimp/jni_bridge/jbridge_Animation.cpp new file mode 100644 index 000000000..63cdb7836 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Animation.cpp @@ -0,0 +1,41 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Animation::Initialize() +{ + AIJ_LOAD_CLASS(); + + AIJ_LOAD_FIELD(name); + AIJ_LOAD_FIELD(mDuration); + AIJ_LOAD_FIELD(mTicksPerSecond); + AIJ_LOAD_FIELD(nodeAnims); +} +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Animation::Fill(jobject obj,const aiAnimation* pcSrc) +{ + jobjectArray ja; + JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; + pc->SetObjectField(obj,name,JNU_NewStringNative(pc,pcSrc->mName.data)); + pc->SetDoubleField(obj,mDuration,pcSrc->mDuration); + pc->SetDoubleField(obj,mTicksPerSecond,pcSrc->mTicksPerSecond); + + // copy node animations + if (pcSrc->mNumChannels) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mChannels,pcSrc->mNumChannels, + AIJ_GET_HANDLE(assimp.NodeAnim),ja); + pc->SetObjectField(obj,nodeAnims,ja); + } +} diff --git a/port/jAssimp/jni_bridge/jbridge_Bone.cpp b/port/jAssimp/jni_bridge/jbridge_Bone.cpp new file mode 100644 index 000000000..d2deb48a1 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Bone.cpp @@ -0,0 +1,66 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; + + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Bone::Initialize() +{ + AIJ_LOAD_CLASS(); + + AIJ_LOAD_FIELD(name); + AIJ_LOAD_FIELD(weights); + + Weight.Initialize(); +} +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Bone::Fill(jobject obj,const aiBone* pcSrc) +{ + JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; + + // copy bone weights + if (pcSrc->mNumWeights) { + + jobjectArray jarr = pc->NewObjectArray(pcSrc->mNumWeights,Weight.Class,0); + for (unsigned int i = 0; i < pcSrc->mNumWeights;++i) { + jobject jobj = pc->NewObject(Weight.Class,Weight.DefaultCtor); + + Weight.Fill(jobj,&pcSrc->mWeights[i]); + pc->SetObjectArrayElement(jarr,i,jobj); + } + pc->SetObjectField(obj,weights,jarr); + } + pc->SetObjectField(obj,name,JNU_NewStringNative(pc,pcSrc->mName.data)); + + jobject matrix = pc->NewObject(AIJ_GET_CLASS_HANDLE(assimp.Matrix4x4),AIJ_GET_DEFAULT_CTOR_HANDLE(assimp.Matrix4x4)); + AIJ_GET_HANDLE(assimp.Matrix4x4).Fill(matrix,&pcSrc->mOffsetMatrix); + pc->SetObjectField(obj,name,matrix); +} + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Bone::_Weight::Initialize() +{ + AIJ_LOAD_CLASS(); + AIJ_LOAD_FIELD(index); + AIJ_LOAD_FIELD(weight); +} + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Bone::_Weight::Fill(jobject obj,const aiVertexWeight* pcSrc) +{ + JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; + + pc->SetIntField(obj,index,(jint)pcSrc->mVertexId); + pc->SetFloatField(obj,weight,(jfloat)pcSrc->mWeight); +} diff --git a/port/jAssimp/jni_bridge/jbridge_BoneAnim.cpp b/port/jAssimp/jni_bridge/jbridge_BoneAnim.cpp new file mode 100644 index 000000000..01f01f838 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_BoneAnim.cpp @@ -0,0 +1,56 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_NodeAnim::Initialize() +{ + AIJ_LOAD_CLASS(); + + AIJ_LOAD_FIELD(mName); + AIJ_LOAD_FIELD(mPosKeys); + AIJ_LOAD_FIELD(mScalingKeys); + AIJ_LOAD_FIELD(mQuatKeys); + + VectorKey.Initialize(); + QuatKey.Initialize(); +} +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_NodeAnim::Fill(jobject obj,const aiNodeAnim* pcSrc) +{ + jobjectArray ja; + JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; + pc->SetObjectField(obj,mName,JNU_NewStringNative(pc,pcSrc->mNodeName.data)); + + // copy position keys + if (pcSrc->mNumPositionKeys) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mPositionKeys,pcSrc->mNumPositionKeys, + AIJ_GET_HANDLE(assimp.NodeAnim.VectorKey),ja); + pc->SetObjectField(obj,mPosKeys,ja); + } + + // copy scaling keys + if (pcSrc->mNumScalingKeys) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mScalingKeys,pcSrc->mNumScalingKeys, + AIJ_GET_HANDLE(assimp.NodeAnim.VectorKey),ja); + pc->SetObjectField(obj,mScalingKeys,ja); + } + + // copy rotation keys + if (pcSrc->mNumRotationKeys) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mRotationKeys,pcSrc->mNumRotationKeys, + AIJ_GET_HANDLE(assimp.NodeAnim.QuatKey),ja); + pc->SetObjectField(obj,mQuatKeys,ja); + } +} diff --git a/port/jAssimp/jni_bridge/jbridge_Camera.cpp b/port/jAssimp/jni_bridge/jbridge_Camera.cpp new file mode 100644 index 000000000..4445a04c8 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Camera.cpp @@ -0,0 +1,14 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; diff --git a/port/jAssimp/jni_bridge/JNIEnvironment.cpp b/port/jAssimp/jni_bridge/jbridge_Environment.cpp similarity index 65% rename from port/jAssimp/jni_bridge/JNIEnvironment.cpp rename to port/jAssimp/jni_bridge/jbridge_Environment.cpp index ee738d1f2..35165c29b 100644 --- a/port/jAssimp/jni_bridge/JNIEnvironment.cpp +++ b/port/jAssimp/jni_bridge/jbridge_Environment.cpp @@ -1,121 +1,117 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- -Copyright (c) 2006-2008, ASSIMP Development Team - -All rights reserved. -See the disclaimer in JNIEnvironment.h for licensing and distribution -conditions. ---------------------------------------------------------------------------- -*/ - -/** @file Implementation of the JNI API for jAssimp */ - -#include "JNIEnvironment.h" -#include "JNILogger.h" +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ +#include "jbridge_pch.h" using namespace Assimp; -namespace Assimp { -namespace JNIBridge { - // ------------------------------------------------------------------------------------------------ bool JNIEnvironment::AttachToCurrentThread (JNIEnv* pcEnv) { ai_assert(NULL != pcEnv); // now initialize the thread-local storage - if (NULL == this->ptr.get()) - { + if (!ptr.get()) { // attach to the current thread JavaVM* vm; pcEnv->GetJavaVM(&vm); vm->AttachCurrentThread((void **) &pcEnv, NULL); - this->ptr.reset(new JNIThreadData(pcEnv)); + ptr.reset(new JNIThreadData(pcEnv)); } // increase the reference counter - else this->ptr->m_iNumRef++; + else ptr->m_iNumRef++; // attach the logger - ((JNILogDispatcher*)DefaultLogger::get())->OnAttachToCurrentThread(this->ptr.get()); - + ((JNILogDispatcher*)DefaultLogger::get())->OnAttachToCurrentThread(ptr.get()); // get handles to all methods/fields/classes - this->Initialize(); - + Initialize(); return true; } + // ------------------------------------------------------------------------------------------------ bool JNIEnvironment::DetachFromCurrentThread () { ai_assert(NULL != pcEnv); // detach the logger - ((JNILogDispatcher*)DefaultLogger::get())->OnDetachFromCurrentThread(this->ptr.get()); + ((JNILogDispatcher*)DefaultLogger::get())->OnDetachFromCurrentThread(ptr.get()); // decrease the reference counter - if (NULL != this->ptr.get()) - { - this->ptr->m_iNumRef--; - if (0 == this->ptr->m_iNumRef) - { + if (NULL != ptr.get()) { + + ptr->m_iNumRef--; + if (0 == ptr->m_iNumRef) { + JavaVM* vm; - this->ptr->m_pcEnv->GetJavaVM(&vm); + ptr->m_pcEnv->GetJavaVM(&vm); vm->DetachCurrentThread(); } } return true; } + // ------------------------------------------------------------------------------------------------ JNIThreadData* JNIEnvironment::GetThread() { - ai_assert(NULL != this->ptr.get()); - return this->ptr.get(); + ai_assert(NULL != ptr.get()); + return ptr.get(); } + // ------------------------------------------------------------------------------------------------ void JNIEnvironment::_java::_lang::_String::Initialize() { JNIEnv* pcEnv = JNIEnvironment::Get()->GetThread()->m_pcEnv; // first initialize some members - if( !(this->Class = pcEnv->FindClass("java.lang.String"))) - JNIEnvironment::Get()->ThrowNativeError("Unable to get handle of class java.lang.String"); - - if( !(this->getBytes = pcEnv->GetMethodID(this->Class,"getBytes","()[byte"))) - JNIEnvironment::Get()->ThrowNativeError("Unable to get handle of class java.lang.String"); + if( !(Class = pcEnv->FindClass("java.lang.String"))) { + JNIEnvironment::Get()->ThrowNativeError("Can't get handle of class java.lang.String"); + } - if( !(this->constructor_ByteArray = pcEnv->GetStaticMethodID( - this->Class,"","([byte)V"))) - JNIEnvironment::Get()->ThrowNativeError("Unable to get handle of class java.lang.String"); + if( !(getBytes = pcEnv->GetMethodID(Class,"getBytes","()[byte"))) { + JNIEnvironment::Get()->ThrowNativeError("Can't get handle of class java.lang.String"); + } + + if( !(constructor_ByteArray = pcEnv->GetStaticMethodID(Class,"","([byte)V"))) { + JNIEnvironment::Get()->ThrowNativeError("Can't get handle of class java.lang.String"); + } } + // ------------------------------------------------------------------------------------------------ void JNIEnvironment::_java::_lang::_Array::Initialize() { JNIEnv* pcEnv = JNIEnvironment::Get()->GetThread()->m_pcEnv; - if( !(this->FloatArray_Class = pcEnv->FindClass("[F"))) + if( !(FloatArray_Class = pcEnv->FindClass("[F"))) JNIEnvironment::Get()->ThrowNativeError("Unable to get handle of class float[]"); - if( !(this->IntArray_Class = pcEnv->FindClass("[I"))) + if( !(IntArray_Class = pcEnv->FindClass("[I"))) JNIEnvironment::Get()->ThrowNativeError("Unable to get handle of class int[]"); } + // ------------------------------------------------------------------------------------------------ jstring JNU_NewStringNative(JNIEnv *env, const char *str) { jstring result; jbyteArray bytes = 0; int len; - if (env->EnsureLocalCapacity( 2) < 0) - { + if (env->EnsureLocalCapacity( 2) < 0) { return NULL; /* out of memory error */ } + len = (int)::strlen(str); bytes = env->NewByteArray(len); - if (bytes != NULL) - { + if (bytes != NULL) { + env->SetByteArrayRegion(bytes, 0, len, (jbyte *)str); result = (jstring)env->NewObject(AIJ_GET_HANDLE(java.lang.String.Class), @@ -125,21 +121,20 @@ jstring JNU_NewStringNative(JNIEnv *env, const char *str) } /* else fall through */ return NULL; } + // ------------------------------------------------------------------------------------------------ char *JNU_GetStringNativeChars(JNIEnv *env, jstring jstr) { jbyteArray bytes = 0; jthrowable exc; char *result = 0; - if (env->EnsureLocalCapacity(2) < 0) - { + if (env->EnsureLocalCapacity(2) < 0) { return 0; /* out of memory error */ } bytes = (jbyteArray)env->CallObjectMethod(jstr,AIJ_GET_HANDLE(java.lang.String.getBytes)); exc = env->ExceptionOccurred(); - if (!exc) - { + if (!exc) { jint len = env->GetArrayLength(bytes); result = (char *)malloc(len + 1); if (result == 0) @@ -151,36 +146,36 @@ char *JNU_GetStringNativeChars(JNIEnv *env, jstring jstr) (jbyte *)result); result[len] = 0; /* NULL-terminate */ } - else - { + else { env->DeleteLocalRef(exc); } env->DeleteLocalRef(bytes); return result; } + // ------------------------------------------------------------------------------------------------ void JNU_CopyDataToArray(JNIEnv* pc, jarray jfl, void* data, unsigned int size) { void* pf; - jboolean iscopy = FALSE; + jboolean iscopy = false; // lock the array and get direct access to its buffer - if(!(pf = pc->GetPrimitiveArrayCritical(jfl,&iscopy))) + if(!(pf = pc->GetPrimitiveArrayCritical(jfl,&iscopy))) { JNIEnvironment::Get()->ThrowNativeError("Unable to lock array"); - + } // copy the data to the array - ::memcpy(pf,data,size); + memcpy(pf,data,size); // release our reference to the array pc->ReleasePrimitiveArrayCritical(jfl,pf,0); } + // ------------------------------------------------------------------------------------------------ void JNU_CopyObjectArrayToVM(JNIEnv* pc, const void** in, unsigned int num, JNIEnvironment::_Base& type, jobjectArray& out) { jobjectArray jarr = pc->NewObjectArray(num,type.Class,0); - for (unsigned int i = 0; i < num;++i) - { + for (unsigned int i = 0; i < num;++i) { jobject jobj = pc->NewObject(type.Class,type.DefaultCtor); type.Fill(jobj,in[i]); @@ -189,6 +184,3 @@ void JNU_CopyObjectArrayToVM(JNIEnv* pc, const void** in, unsigned int num, out = jarr; } -};}; - - diff --git a/port/jAssimp/jni_bridge/jbridge_Environment.h b/port/jAssimp/jni_bridge/jbridge_Environment.h new file mode 100644 index 000000000..6860b09c2 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Environment.h @@ -0,0 +1,506 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#ifndef INCLUDED_JBRIDGE_ENVIRONMENT_H +#define INCLUDED_JBRIDGE_ENVIRONMENT_H + +namespace Assimp { +namespace jbridge { + +// ----------------------------------------------------------------------------------------- +// Nasty macros. One day I'll probably switch to a generic and beautiful solution, but +// this day is still far, far away +// ----------------------------------------------------------------------------------------- + +#define _AI_CONCAT(a,b) a ## b +#define AI_CONCAT(a,b) _AI_CONCAT(a,b) + +#define AIJ_GET_JNIENV() JNIEnvironment::Get()->GetThread()->m_pcEnv + +#define AIJ_BEGIN_CLASS(name) \ + struct AI_CONCAT(_,name) : public _Base { \ + void Initialize(); \ + +#define AIJ_END_CLASS(name) \ + } name ; + +#define AIJ_SET_FIELD_TYPE(field,type) \ + const char* AI_CONCAT(QueryFieldString_,field) () { \ + return type; \ + } \ + jfieldID field; + +#define AIJ_SET_CLASS_TYPE(ctype,jtype) \ + const char* QueryClassString() { \ + return jtype; \ + } \ + void Fill(jobject obj,const ctype* pcSrc); \ + \ + inline void Fill(jobject obj,const void* pcSrc) { \ + Fill(obj,(const ctype*)pcSrc); \ + } + +#define AIJ_LOAD_CLASS() \ + JNIEnv* pc = AIJ_GET_JNIENV(); \ + \ + if(!(Class = pc->FindClass(QueryClassString()))) { \ + JNIEnvironment::Get()->ThrowNativeError(std::string("Failed to load class ") + \ + QueryClassString()); \ + } \ + DefaultCtor = pc->GetMethodID(Class,"",""); + +#define AIJ_LOAD_FIELD(name) { \ + const char* t = AI_CONCAT(QueryFieldString_,name)(); \ + name = pc->GetFieldID(Class,# name,t); \ + if (!name) \ + JNIEnvironment::Get()->ThrowNativeError(std::string("Failed to load ") + \ + QueryClassString() + "#" + t); \ + } + +// ----------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------- + +#define AIJ_GET_HANDLE(h) (JNIEnvironment::Get()->h) +#define AIJ_GET_DEFAULT_CTOR_HANDLE(h) (JNIEnvironment::Get()->h.DefaultCtor) +#define AIJ_GET_CLASS_HANDLE(h) (JNIEnvironment::Get()->h.Class) + +// ----------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------- +/** + * @brief Manages a list of JNI data structures private to a thread. + */ +struct JNIThreadData +{ + //! Default constructor + JNIThreadData() + : m_pcEnv(NULL), m_iNumRef(1) {} + + //! Construction from an existing JNIEnv + JNIThreadData(JNIEnv* env) : m_pcEnv(env), m_iNumRef(1) {} + + //! JNI environment, is attached to the thread + JNIEnv* m_pcEnv; + + //! Number of Importer instances that have been created by this thread + unsigned int m_iNumRef; +}; + + +// ----------------------------------------------------------------------------------------- +/** @brief Helper class to manage the JNI environment for multithreaded calls. + * + * It's not so simple. Java users have to create multiple instances of assimp.Importer + * to access Assimp from multiple threads, but we need to synchronize everything to a + * single Java logging implementation. + */ +class JNIEnvironment +{ +private: + + JNIEnvironment() + : m_iRefCnt(1) {} + +public: + + /** Attach a new thread to the environment */ + static JNIEnvironment* Create() { + if (NULL == s_pcEnv) { + s_pcEnv = new JNIEnvironment(); + } + else s_pcEnv->AddRef(); + return s_pcEnv; + } + + /** Static getter */ + static JNIEnvironment* Get() { + ai_assert(NULL != s_pcEnv); + return s_pcEnv; + } + + /** Add a reference to the environment */ + unsigned int AddRef() { + return ++m_iRefCnt; + } + + /** Remove a reference from the environment */ + unsigned int Release() { + + const unsigned int iNew = --m_iRefCnt; + if (0 == iNew) { + delete this; + } + return iNew; + } + + /** Attach a JNIEnv to the current thread */ + bool AttachToCurrentThread (JNIEnv* pcEnv); + + /** Detach from the current thread */ + bool DetachFromCurrentThread (); + + /** Get the thread local data of the current thread */ + JNIThreadData* GetThread(); + + /** Throw an NativeException exception with the specified error message + * The error message itself is optional. */ + void ThrowNativeError(const std::string& msg = std::string("Unknown error")); + +public: + + + // ------------------------------------------------------------------------------------ + // Reflects the part of the Java class library which we need for our dealings + // + struct _java + { + void Initialize() { + lang.Initialize(); + } + + struct _lang + { + void Initialize() { + String.Initialize(); + } + + struct _String + { + void Initialize(); + + //! Handle to the java.lang.String class + static jclass Class; + + //! Handle to the java.lang.String.getBytes() class + static jmethodID getBytes; + + //! Handle to the java.lang.String.String(byte[]) c'tor + static jmethodID constructor_ByteArray; + + } String; + + struct _Array { + void Initialize(); + + jclass FloatArray_Class; + jclass IntArray_Class; + + } Array; + + } lang; + } java; + + struct _Base { + virtual void Fill(jobject obj,const void* pcSrc) {} + + //! Handle to class + jclass Class; + + //! Handle to default c'tor + jmethodID DefaultCtor; + }; + + // ------------------------------------------------------------------------------------ + // Reflects the classes of the assimp package. + // + struct _assimp + { + //! Initializes the package assimp for use with our bridge module + inline void Initialize() { + + // The NativeException class must be initialized first as it + // is used by all other class initializion routines + NativeException.Initialize(); + Importer.Initialize(); + + // now initialize all other classes, the order doesn't care. + Face.Initialize(); + Scene.Initialize(); + Importer.Initialize(); + Mesh.Initialize(); + Bone.Initialize(); + Animation.Initialize(); + NodeAnim.Initialize(); + Texture.Initialize(); + CompressedTexture.Initialize(); + Matrix3x3.Initialize(); + Matrix4x4.Initialize(); + Quaternion.Initialize(); + Node.Initialize(); + Material.Initialize(); + Camera.Initialize(); + Light.Initialize(); + }; + + //! Represents the JNI interface to class assimp.NativeException + AIJ_BEGIN_CLASS(NativeException) + AIJ_END_CLASS(NativeException) + + //! Represents the JNI interface to class assimp.Importer + AIJ_BEGIN_CLASS(Importer) + AIJ_SET_CLASS_TYPE(Assimp::Importer,"assimp.Importer"); + AIJ_SET_FIELD_TYPE(scene,"Lassimp.Scene"); + + AIJ_END_CLASS(Importer) + + //! Represents the JNI interface to class assimp.Scene + AIJ_BEGIN_CLASS(Scene) + AIJ_SET_CLASS_TYPE(aiScene,"assimp.Scene"); + + AIJ_SET_FIELD_TYPE(m_vTextures,"[Lassimp.Texture"); + AIJ_SET_FIELD_TYPE(m_vCameras,"[Lassimp.Camera"); + AIJ_SET_FIELD_TYPE(m_vLights,"[Lassimp.Light"); + AIJ_SET_FIELD_TYPE(m_vMeshes,"[Lassimp.Mesh"); + AIJ_SET_FIELD_TYPE(m_vMaterials,"[Lassimp.Material"); + AIJ_SET_FIELD_TYPE(m_vAnimations,"[Lassimp.Animation"); + AIJ_SET_FIELD_TYPE(m_rootNode,"[Lassimp.Node"); + AIJ_SET_FIELD_TYPE(flags,"I"); + + AIJ_END_CLASS(Scene) + + //! Represents the JNI interface to class assimp.Mesh + AIJ_BEGIN_CLASS(Mesh) + AIJ_SET_CLASS_TYPE(aiMesh,"assimp.Mesh"); + + AIJ_SET_FIELD_TYPE(m_iPrimitiveTypes,"I"); + AIJ_SET_FIELD_TYPE(m_vVertices,"[[F"); + AIJ_SET_FIELD_TYPE(m_vTangents,"[[F"); + AIJ_SET_FIELD_TYPE(m_vBitangents,"[[F"); + AIJ_SET_FIELD_TYPE(m_vNormals,"[[F"); + AIJ_SET_FIELD_TYPE(m_avUVs,"[[F"); + AIJ_SET_FIELD_TYPE(m_vFaces,"[[F"); + AIJ_SET_FIELD_TYPE(m_avColors,"[[F"); + AIJ_SET_FIELD_TYPE(m_aiNumUVComponents,"[I"); + AIJ_SET_FIELD_TYPE(m_vBones,"[Lassimp.Bone"); + AIJ_SET_FIELD_TYPE(m_iMaterialIndex,"I"); + AIJ_END_CLASS(Mesh) + + //! Represents the JNI interface to class assimp.Face + AIJ_BEGIN_CLASS(Face) + AIJ_SET_CLASS_TYPE(aiFace,"assimp.Face"); + + AIJ_SET_FIELD_TYPE(indices,"LI"); + AIJ_END_CLASS(Face) + + //! Represents the JNI interface to class assimp.Bone + AIJ_BEGIN_CLASS(Bone) + AIJ_SET_CLASS_TYPE(aiBone,"assimp.Bone"); + + AIJ_SET_FIELD_TYPE(name,"Ljava.lang.String"); + AIJ_SET_FIELD_TYPE(weights,"[Lassimp.Bone.Weight"); + + //! Represents the JNI interface to class assimp.Bone.Weight + AIJ_BEGIN_CLASS(Weight) + AIJ_SET_CLASS_TYPE(aiVertexWeight,"assimp.Bone.Weight"); + + AIJ_SET_FIELD_TYPE(index,"I"); + AIJ_SET_FIELD_TYPE(weight,"F"); + AIJ_END_CLASS(Weight) + AIJ_END_CLASS(Bone) + + //! Represents the JNI interface to class assimp.Animation + AIJ_BEGIN_CLASS(Animation) + AIJ_SET_CLASS_TYPE(aiAnimation,"assimp.Animation"); + + AIJ_SET_FIELD_TYPE(name,"Ljava.lang.String"); + AIJ_SET_FIELD_TYPE(mDuration,"D"); + AIJ_SET_FIELD_TYPE(mTicksPerSecond,"D"); + AIJ_SET_FIELD_TYPE(nodeAnims,"[Lassimp.NodeAnim"); + AIJ_END_CLASS(Animation) + + //! Represents the JNI interface to class assimp.NodeAnim + AIJ_BEGIN_CLASS(NodeAnim) + AIJ_SET_CLASS_TYPE(aiNodeAnim,"assimp.NodeAnim"); + + //! Represents the JNI interface to class assimp.BoneAnim.KeyFrame + AIJ_BEGIN_CLASS(VectorKey) + AIJ_SET_CLASS_TYPE(aiVectorKey,"Lassimp.NodeAnim.KeyFrame<[F>"); + + AIJ_SET_FIELD_TYPE(time,"D"); + AIJ_SET_FIELD_TYPE(value,"[F"); + AIJ_END_CLASS(VectorKey) + + //! Represents the JNI interface to class assimp.BoneAnim.KeyFrame + AIJ_BEGIN_CLASS(QuatKey) + AIJ_SET_CLASS_TYPE(aiQuatKey,"Lassimp.NodeAnim.KeyFrame"); + + AIJ_SET_FIELD_TYPE(time,"D"); + AIJ_SET_FIELD_TYPE(value,"Lassimp.Quaternion"); + AIJ_END_CLASS(QuatKey) + + AIJ_SET_FIELD_TYPE(mName,"Ljava.lang.String"); + AIJ_SET_FIELD_TYPE(mQuatKeys,"[Lassimp.NodeAnim.KeyFrame"); + AIJ_SET_FIELD_TYPE(mPosKeys, "[Lassimp.NodeAnim.KeyFrame<[F>"); + AIJ_SET_FIELD_TYPE(mScalingKeys,"[Lassimp.NodeAnim.KeyFrame<[F>"); + AIJ_END_CLASS(NodeAnim) + + //! Represents the JNI interface to class assimp.Texture + AIJ_BEGIN_CLASS(Texture) + AIJ_SET_CLASS_TYPE(aiTexture,"assimp.Texture"); + + AIJ_SET_FIELD_TYPE(width,"I"); + AIJ_SET_FIELD_TYPE(height,"I"); + AIJ_SET_FIELD_TYPE(data,"[b"); + AIJ_END_CLASS(Texture) + + //! Represents the JNI interface to class assimp.CompressedTexture + AIJ_BEGIN_CLASS(CompressedTexture) + AIJ_SET_CLASS_TYPE(aiTexture,"assimp.CompressedTexture"); + AIJ_SET_FIELD_TYPE(m_format,"Ljava.lang.String"); + AIJ_END_CLASS(CompressedTexture) + + //! Represents the JNI interface to class assimp.Material + AIJ_BEGIN_CLASS(Material) + AIJ_SET_CLASS_TYPE(aiMaterial,"assimp.Material"); + + //! Represents the JNI interface to class assimp.Material.Property + AIJ_BEGIN_CLASS(Property) + AIJ_SET_CLASS_TYPE(aiMaterialProperty,"assimp.Material.Property"); + + AIJ_SET_FIELD_TYPE(key,"L.java.lang.String"); + AIJ_SET_FIELD_TYPE(value,"Ljava.lang.Object"); + AIJ_END_CLASS(Property) + + AIJ_SET_FIELD_TYPE(properties,"[Lassimp.Material.Property"); + AIJ_END_CLASS(Material) + + //! Represents the JNI interface to class assimp.Matrix4x4 + AIJ_BEGIN_CLASS(Matrix4x4) + AIJ_SET_CLASS_TYPE(aiMatrix4x4,"assimp.Matrix4x4"); + AIJ_SET_FIELD_TYPE(coeff,"[F"); + AIJ_END_CLASS(Matrix4x4) + + //! Represents the JNI interface to class assimp.Matrix3x3 + AIJ_BEGIN_CLASS(Matrix3x3) + AIJ_SET_CLASS_TYPE(aiMatrix3x3,"assimp.Matrix3x3"); + AIJ_SET_FIELD_TYPE(coeff,"[F"); + AIJ_END_CLASS(Matrix3x3) + + //! Represents the JNI interface to class assimp.Quaternion + AIJ_BEGIN_CLASS(Quaternion) + AIJ_SET_CLASS_TYPE(aiQuaternion,"assimp.Quaternion"); + + AIJ_SET_FIELD_TYPE(x,"F"); + AIJ_SET_FIELD_TYPE(y,"F"); + AIJ_SET_FIELD_TYPE(z,"F"); + AIJ_SET_FIELD_TYPE(w,"F"); + AIJ_END_CLASS(Quaternion) + + //! Represents the JNI interface to class assimp.Node + AIJ_BEGIN_CLASS(Node) + AIJ_SET_CLASS_TYPE(aiNode,"assimp.Node"); + + AIJ_SET_FIELD_TYPE(meshIndices,"[I"); + AIJ_SET_FIELD_TYPE(name,"Ljava.lang.String"); + AIJ_SET_FIELD_TYPE(children,"[Lassimp.Node"); + AIJ_SET_FIELD_TYPE(nodeTransform,"Lassimp.Matrix4x4"); + AIJ_SET_FIELD_TYPE(parent,"Lassimp.Node"); + AIJ_END_CLASS(Node) + + //! Represents the JNI interface to class assimp.Camera + AIJ_BEGIN_CLASS(Camera) + AIJ_SET_CLASS_TYPE(aiCamera,"assimp.Camera"); + + AIJ_SET_FIELD_TYPE(mName,"Ljava.lang.String"); + AIJ_SET_FIELD_TYPE(mPosition,"[F"); + AIJ_SET_FIELD_TYPE(mUp,"[F"); + AIJ_SET_FIELD_TYPE(mLookAt,"[F"); + AIJ_SET_FIELD_TYPE(mHorizontalFOV,"F"); + AIJ_SET_FIELD_TYPE(mClipPlaneNear,"F"); + AIJ_SET_FIELD_TYPE(mClipPlaneFar,"F"); + AIJ_SET_FIELD_TYPE(mAspect,"F"); + AIJ_END_CLASS(Camera) + + //! Represents the JNI interface to class assimp.Light + AIJ_BEGIN_CLASS(Light) + AIJ_SET_CLASS_TYPE(aiLight,"assimp.Light"); + + AIJ_SET_FIELD_TYPE(mName,"[I"); + AIJ_SET_FIELD_TYPE(mType,"I"); + AIJ_SET_FIELD_TYPE(mPosition,"[F"); + AIJ_SET_FIELD_TYPE(mDirection,"[F"); + AIJ_SET_FIELD_TYPE(mAttenuationConstant,"F"); + AIJ_SET_FIELD_TYPE(mAttenuationLinear,"F"); + AIJ_SET_FIELD_TYPE(mAttenuationQuadratic,"F"); + AIJ_SET_FIELD_TYPE(mColorDiffuse,"[F"); + AIJ_SET_FIELD_TYPE(mColorSpecular,"[F"); + AIJ_SET_FIELD_TYPE(mColorAmbient,"[F"); + AIJ_SET_FIELD_TYPE(mAngleInnerCone,"F"); + AIJ_SET_FIELD_TYPE(mAngleOuterCone,"F"); + AIJ_END_CLASS(Light) + } assimp; + + //! Master initialization of all stuff we need + void Initialize() + { + assimp.Initialize(); + java.Initialize(); + } + +private: + + //! Singleton instance + static JNIEnvironment* s_pcEnv; + + //! TLS data + boost::thread_specific_ptr ptr; + + //! Reference counter of the whole class + unsigned int m_iRefCnt; +}; + +// --------------------------------------------------------------------------- +/** @brief Helper function to copy data to a Java array + * + * @param pc JNI env handle + * @param jfl Java array + * @param data Input data + * @param size Size of data to be copied, in bytes + */ +void JNU_CopyDataToArray(JNIEnv* pc, jarray jfl, void* data, unsigned int size); + +// --------------------------------------------------------------------------- +/** @brief Helper function to create a java.lang.String from a native char*. + * + * This function has been taken from + * http://java.sun.com/docs/books/jni/html/other.html#26021 + */ +jstring JNU_NewStringNative(JNIEnv *env, const char *str); + +// --------------------------------------------------------------------------- +/** @brief Helper function to create a char* from a managed jstring + * + * This function has been taken from + * http://java.sun.com/docs/books/jni/html/other.html#26021 + */ +char* JNU_GetStringNativeChars(JNIEnv *env, jstring jstr); + +// --------------------------------------------------------------------------- +/** @brief Helper function to copy a whole object array to the VM + * + * @param pc JNI env handle + * @param in Input object array + * @param num Size of input array + * @param type Type of input + * @param out Output object + */ +// --------------------------------------------------------------------------- +void JNU_CopyObjectArrayToVM(JNIEnv* pc, const void** in, unsigned int num, + JNIEnvironment::_Base& type, jobjectArray& out); + +}} // end namespaces + +using namespace Assimp; +using namespace Assimp::jbridge; + +#include "jbridge_Logger.h" +#endif //! AI_JNIENVIRONMENT_H_INCLUDED + diff --git a/port/jAssimp/jni_bridge/jbridge_IOStream.cpp b/port/jAssimp/jni_bridge/jbridge_IOStream.cpp new file mode 100644 index 000000000..4445a04c8 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_IOStream.cpp @@ -0,0 +1,14 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; diff --git a/port/jAssimp/jni_bridge/jbridge_IOSystem.cpp b/port/jAssimp/jni_bridge/jbridge_IOSystem.cpp new file mode 100644 index 000000000..4445a04c8 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_IOSystem.cpp @@ -0,0 +1,14 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; diff --git a/port/jAssimp/jni_bridge/jbridge_Importer.cpp b/port/jAssimp/jni_bridge/jbridge_Importer.cpp new file mode 100644 index 000000000..31e321f09 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Importer.cpp @@ -0,0 +1,283 @@ +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; + +// include the header files generated by javah +#include "assimp_Importer.h" +#include + +// used as error return code +#define AI_JNI_ERROR_RETURN 0xffffffff + +//////////////////////////////////////////////////////////////////////////////////// +/* typedef for a jassimp context, used to identify the Importer object which + * belongs to a particular java Importer. + */ +//////////////////////////////////////////////////////////////////////////////////// + +typedef uint64_t JASSIMP_CONTEXT; + +#ifdef JASSIMP_DEBUG_CHECKS + typedef std::list< JASSIMP_CONTEXT > ImporterContextList; + static ImporterContextList g_listActiveContexts; + +// ------------------------------------------------------------------------------------------------ +/* DEBUG: Check the validity of a particular context. +*/ +bool jValidateContext (JASSIMP_CONTEXT context) +{ + ImporterContextList::const_iterator t = std::find( g_listActiveContexts.begin(),g_listActiveContexts.end(),context); + if (t != g_listActiveContexts.end() { + return true; + } + + DefaultLogger::get()->error("[jnibridge] Invalid context"); + return false; +} + +// ------------------------------------------------------------------------------------------------ +/* DEBUG: Check the validity of a particular scene +*/ +bool jValidateScene (const aiScene* scene) +{ + if (!scene) { + DefaultLogger::get()->error("[jnibridge] There's not asset"); + return false; + } + return true; +} +#endif // ! ASSIMP_DEBUG + +// ------------------------------------------------------------------------------------------------ +/* Get the #Assimp::Importer for a particular JASSIMP_CONTEXT +*/ +Assimp::Importer* jGetValidImporterScenePair (JASSIMP_CONTEXT jvmcontext) +{ +#ifdef JASSIMP_DEBUG_CHECKS + if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext)) { + return NULL; + } +#endif // ! ASSIMP_DEBUG + + // get the importer instance from the context + Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; + +#ifdef DEBUG + if (!jValidateScene(pcImp->GetScene())) { + return NULL; + } +#endif // ! ASSIMP_DEBUG + return pcImp; +} + +// ------------------------------------------------------------------------------------------------ +/* +* Class: assimp_Importer +* Method: _NativeInitContext +* Signature: ()I +*/ +JNIEXPORT jlong JNICALL Java_assimp_Importer__1NativeInitContext +(JNIEnv * jvmenv, jobject jvmthis, jint version) { + // 2^64-1 indicates error + JASSIMP_CONTEXT context = 0xffffffffffffffffL; + + if (version != assimp_Importer_ABI_VERSION) { + return context; + } + + // create a new Importer instance + Assimp::Importer* pcImp = new Assimp::Importer(); + context = (JASSIMP_CONTEXT)(uintptr_t)pcImp; + +#ifdef JASSIMP_DEBUG_CHECKS + g_listActiveContexts.push_back(context); +#endif // ! ASSIMP_DEBUG + + // need to setup the logger ... or did we already initialize it? + JNILogDispatcher* pcLogger; + if (DefaultLogger::isNullLogger()) { + pcLogger = new JNILogDispatcher(); + DefaultLogger::set (pcLogger); + } + else { + JNILogDispatcher* pcLogger = ( JNILogDispatcher* )DefaultLogger::get(); + pcLogger->AddRef(); + } + + // setup the JNI environment + if(!JNIEnvironment::Get()->AttachToCurrentThread(jvmenv)) { + return 0xffffffffffffffffL; + } + + // return our native context handle to the caller + return context; +} + +// ------------------------------------------------------------------------------------------------ +/* +* Class: assimp_Importer +* Method: _NativeFreeContext +* Signature: (I)I +*/ +JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeFreeContext +(JNIEnv * jvmenv, jobject jvmthis, jlong jvmcontext) +{ + +#ifdef JASSIMP_DEBUG_CHECKS + if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext)) { + return AI_JNI_ERROR_RETURN; + } +#endif // ! ASSIMP_DEBUG + + // delete the underlying Importer instance + Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; + delete pcImp; + +#ifdef JASSIMP_DEBUG_CHECKS + g_listActiveContexts.remove(jvmcontext); +#endif // ! ASSIMP_DEBUG + + JNIEnvironment::Get()->DetachFromCurrentThread(); + return 0; +} + +// ------------------------------------------------------------------------------------------------ +/* +* Class: assimp_Importer +* Method: _NativeLoad +* Signature: (Ljava/lang/String;II)I +*/ +JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeLoad +(JNIEnv *jvmenv, jobject jvmthis, jstring jvmpath, jint jvmflags, jlong jvmcontext) +{ + jint iRet = 0; + +#ifdef JASSIMP_DEBUG_CHECKS + if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext)) { + return AI_JNI_ERROR_RETURN; + } +#endif // ! ASSIMP_DEBUG + + // get the path from the jstring + const char* szPath = JNU_GetStringNativeChars(jvmenv,jvmpath); + if (!szPath) { + DefaultLogger::get()->error("[jnibridge] Unable to get path string from the java vm"); + return AI_JNI_ERROR_RETURN; + } + // get the importer instance from the context + Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; + const aiScene* pcOut; + + // and load the file. The aiScene object itself remains accessible via Importer.GetScene(). + if(!(pcOut = pcImp->ReadFile(std::string(szPath),(unsigned int)jvmflags))) { + + DefaultLogger::get()->error("[jnibridge] Unable to load asset"); + free((void*)szPath); + return AI_JNI_ERROR_RETURN; + } + + free((void*)szPath); + + // allocate a new assimp.Scene object to be returned by the importer + jobject jScene; + if(!(jScene = jvmenv->AllocObject(AIJ_GET_HANDLE(assimp.Importer.Class)))) { + + DefaultLogger::get()->error("[jnibridge] Unable to allocate output scene"); + return AI_JNI_ERROR_RETURN; + } + + // fill the assimp.Scene instance with our data ... + JNIEnvironment::Get()->assimp.Scene.Fill(jScene,pcOut); + + // ... and store it in the Importer instance + jvmenv->SetObjectField(jvmthis,AIJ_GET_HANDLE(assimp.Importer.scene),jScene); + + // .. and finally we don't need th scene anymore + pcImp->FreeScene(); + return iRet; +} + +// ------------------------------------------------------------------------------------------------ +/* +* Class: assimp_Importer +* Method: _NativeSetPropertyInt +* Signature: (Ljava/lang/String;IJ)I +*/ +JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeSetPropertyInt +(JNIEnv * jvmenv, jobject _this, jstring name, jint value, jlong jvmcontext) +{ +#ifdef JASSIMP_DEBUG_CHECKS + if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext)) { + return AI_JNI_ERROR_RETURN; + } +#endif // ! ASSIMP_DEBUG + + Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; + const char* sz = JNU_GetStringNativeChars(jvmenv,name); + + // set the property + pcImp->SetPropertyInteger(sz,(int)value,NULL); + free((void*)sz); + return 0; +} + + +// ------------------------------------------------------------------------------------------------ +/* +* Class: assimp_Importer +* Method: _NativeSetPropertyFloat +* Signature: (Ljava/lang/String;FJ)I +*/ +JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeSetPropertyFloat +(JNIEnv * jvmenv, jobject _this, jstring name, jfloat value, jlong jvmcontext) +{ +#ifdef JASSIMP_DEBUG_CHECKS + if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext)) { + return AI_JNI_ERROR_RETURN; + } +#endif // ! ASSIMP_DEBUG + + Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; + const char* sz = JNU_GetStringNativeChars(jvmenv,name); + + // set the property + pcImp->SetPropertyFloat(sz,(float)value,NULL); + free((void*)sz); + return 0; +} + +// ------------------------------------------------------------------------------------------------ +/* +* Class: assimp_Importer +* Method: _NativeSetPropertyString +* Signature: (Ljava/lang/String;Ljava/lang/String;J)I +*/ +JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeSetPropertyString +(JNIEnv * jvmenv, jobject _this, jstring name, jstring value, jlong jvmcontext) +{ +#ifdef JASSIMP_DEBUG_CHECKS + if (!jValidateContext((JASSIMP_CONTEXT)jvmcontext)) { + return AI_JNI_ERROR_RETURN; + } +#endif // ! ASSIMP_DEBUG + + Assimp::Importer* pcImp = (Assimp::Importer*)jvmcontext; + const char* sz = JNU_GetStringNativeChars(jvmenv,name); + const char* sc = JNU_GetStringNativeChars(jvmenv,value); + + // set the property + pcImp->SetPropertyString(sz,sc,NULL); + free((void*)sz); + free((void*)sc); + return 0; +} diff --git a/port/jAssimp/jni_bridge/jbridge_Light.cpp b/port/jAssimp/jni_bridge/jbridge_Light.cpp new file mode 100644 index 000000000..4445a04c8 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Light.cpp @@ -0,0 +1,14 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; diff --git a/port/jAssimp/jni_bridge/jbridge_Logger.cpp b/port/jAssimp/jni_bridge/jbridge_Logger.cpp new file mode 100644 index 000000000..e260f01aa --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Logger.cpp @@ -0,0 +1,102 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; + + +// ------------------------------------------------------------------------------------------------ +bool JNILogDispatcher::OnAttachToCurrentThread(JNIThreadData* pcData) +{ + ai_assert(NULL != pcData); + //this->AddRef(); - done at another location + + // There is much error handling code in this function. We do it to be absolutely sure that the + // interface is of the same version on both sides. + JNIEnv* jvmenv = AIJ_GET_JNIENV(); + + // get a handle to the assimp.DefaultLogger class + if (!m_pcClass) { + if( NULL == (m_pcClass = jvmenv->FindClass("assimp.DefaultLogger"))) { + return false; + } + } + // get handles to the logging functions + if (!m_pcMethodError) { + if( !(m_pcMethodError = jvmenv->GetStaticMethodID(m_pcClass,"_NativeCallWriteError","(Ljava/lang/String;)V"))) { + return false; + } + } + if (!m_pcMethodWarn) { + if( !(m_pcMethodWarn = jvmenv->GetStaticMethodID(m_pcClass,"_NativeCallWriteWarn","(Ljava/lang/String;)V"))) { + return false; + } + } + if (!m_pcMethodInfo) { + if( !(m_pcMethodInfo = jvmenv->GetStaticMethodID(m_pcClass,"_NativeCallWriteInfo","(Ljava/lang/String;)V"))) { + return false; + } + } + if (!m_pcMethodDebug) { + if( !(m_pcMethodDebug = jvmenv->GetStaticMethodID(m_pcClass,"_NativeCallWriteDebug","(Ljava/lang/String;)V"))) { + return false; + } + } + return true; +} + +// ------------------------------------------------------------------------------------------------ +bool JNILogDispatcher::OnDetachFromCurrentThread(JNIThreadData* pcData) +{ + Release(); + return true; +} + +// ------------------------------------------------------------------------------------------------ +void JNILogDispatcher::debug(const std::string &message) +{ + JNIEnv* jvmenv = AIJ_GET_JNIENV(); + jstring jstr = JNU_NewStringNative(jvmenv,message.c_str()); + + jvmenv->CallStaticVoidMethod(m_pcClass,m_pcMethodDebug,jstr); + jvmenv->DeleteLocalRef(jstr); +} + +// ------------------------------------------------------------------------------------------------ +void JNILogDispatcher::info(const std::string &message) +{ + JNIEnv* jvmenv = AIJ_GET_JNIENV(); + jstring jstr = JNU_NewStringNative(jvmenv,message.c_str()); + + jvmenv->CallStaticVoidMethod(m_pcClass,m_pcMethodInfo,jstr); + jvmenv->DeleteLocalRef(jstr); +} + +// ------------------------------------------------------------------------------------------------ +void JNILogDispatcher::warn(const std::string &message) +{ + JNIEnv* jvmenv = AIJ_GET_JNIENV(); + jstring jstr = JNU_NewStringNative(jvmenv,message.c_str()); + + jvmenv->CallStaticVoidMethod(m_pcClass,m_pcMethodWarn,jstr); + jvmenv->DeleteLocalRef(jstr); +} + +// ------------------------------------------------------------------------------------------------ +void JNILogDispatcher::error(const std::string &message) +{ + JNIEnv* jvmenv = AIJ_GET_JNIENV(); + jstring jstr = JNU_NewStringNative(jvmenv,message.c_str()); + + jvmenv->CallStaticVoidMethod(m_pcClass,m_pcMethodError,jstr); + jvmenv->DeleteLocalRef(jstr); +} diff --git a/port/jAssimp/jni_bridge/jbridge_Logger.h b/port/jAssimp/jni_bridge/jbridge_Logger.h new file mode 100644 index 000000000..8abd1e6a1 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Logger.h @@ -0,0 +1,114 @@ +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +/** @file jbridge_Logger.h + * Declaration of a log dispatching service to send all log messages to Java + */ +#ifndef INCLUDED_JBRIDGE_LOGGER_H +#define INCLUDED_JBRIDGE_LOGGER_H + +#include + +namespace Assimp { +namespace jbridge { + +// --------------------------------------------------------------------------- +class IOStream; +struct LogStreamInfo; + +// --------------------------------------------------------------------------- +/** @class JNILogDispatcher + * @brief Logging system implementation that is used to send all + * log messages generated by native code to the Java logging system. + */ +class JNILogDispatcher : public Logger +{ + friend class JNIEnvironment; + +public: + + //! Default constructor + JNILogDispatcher() + : m_iRefCnt(1) {} + + /** @brief Logs a debug message */ + void OnDebug(const char* msg); + + /** @brief Logs an info message */ + void OnInfo(const char* msg); + + /** @brief Logs a warning message */ + void OnWarn(const char* msg); + + /** @brief Logs an error message */ + void OnError(const char* msg); + + /** @brief Log severity setter */ + void setLogSeverity(LogSeverity log_severity) {} + + /** @brief Detach a still attached stream from logger */ + bool attachStream(LogStream *pStream, unsigned int severity) { + return false; + } + + /** @brief Detach a still attached stream from logger */ + bool detatchStream(LogStream *pStream, unsigned int severity) { + return false; + } + + //! COM-style reference counting mechanism + unsigned int AddRef() + { + return ++m_iRefCnt; + } + + //! COM-style reference counting mechanism + unsigned int Release() + { + const unsigned int n = --m_iRefCnt; + if (n == 0) + { + delete this; + // don't forget to reset the logger to the default implementation + DefaultLogger::set(NULL); + } + return n; + } + +private: + + //! Called by JNIEnvironment + bool OnAttachToCurrentThread(JNIThreadData* pcData); + bool OnDetachFromCurrentThread(JNIThreadData* pcData); + +private: + + //! Handle to assimp.DefaultLogger class + jclass m_pcClass; + + //! Handle to the static assimp.DefaultLogger._NativeCallWriteError() method + jmethodID m_pcMethodError; + + //! Handle to the static assimp.DefaultLogger._NativeCallWriteInfo() method + jmethodID m_pcMethodInfo; + + //! Handle to the static assimp.DefaultLogger._NativeCallWriteDebug() method + jmethodID m_pcMethodDebug; + + //! Handle to the static assimp.DefaultLogger._NativeCallWriteWarn() method + jmethodID m_pcMethodWarn; + + //! Reference counter of the logger + unsigned int m_iRefCnt; +}; +}} + +#endif // !! INCLUDED_JBRIDGE_LOGGER_H diff --git a/port/jAssimp/jni_bridge/jbridge_Material.cpp b/port/jAssimp/jni_bridge/jbridge_Material.cpp new file mode 100644 index 000000000..4445a04c8 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Material.cpp @@ -0,0 +1,14 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; diff --git a/port/jAssimp/jni_bridge/jbridge_Mesh.cpp b/port/jAssimp/jni_bridge/jbridge_Mesh.cpp new file mode 100644 index 000000000..74a872bd7 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Mesh.cpp @@ -0,0 +1,129 @@ + +/** @file Implementation of the JNI API for jAssimp */ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; + + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Mesh::Initialize() +{ + AIJ_LOAD_CLASS(); + + AIJ_LOAD_FIELD(m_iPrimitiveTypes); + AIJ_LOAD_FIELD(m_vVertices); + AIJ_LOAD_FIELD(m_vBitangents); + AIJ_LOAD_FIELD(m_vTangents); + AIJ_LOAD_FIELD(m_vNormals); + AIJ_LOAD_FIELD(m_avUVs); + AIJ_LOAD_FIELD(m_vFaces); + AIJ_LOAD_FIELD(m_avColors); + AIJ_LOAD_FIELD(m_aiNumUVComponents); + AIJ_LOAD_FIELD(m_vBones); + AIJ_LOAD_FIELD(m_iMaterialIndex); +} +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Mesh::Fill(jobject obj,const aiMesh* pcSrc) +{ + jobjectArray ja; + JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; + + pc->SetIntField(obj,m_iMaterialIndex,pcSrc->mMaterialIndex); + const unsigned int vsize = pcSrc->mNumVertices*12, nsize = pcSrc->mNumVertices*3; + + // copy vertex positions + if (pcSrc->HasPositions()) { + jfloatArray jfl = pc->NewFloatArray(nsize); + JNU_CopyDataToArray(pc,jfl,pcSrc->mVertices,vsize); + + pc->SetObjectField(obj,m_vVertices,jfl); + } + + // copy vertex normals + if (pcSrc->HasNormals()) { + jfloatArray jfl = pc->NewFloatArray(nsize); + JNU_CopyDataToArray(pc,jfl,pcSrc->mNormals,vsize); + + pc->SetObjectField(obj,m_vNormals,jfl); + } + + // copy tangents and bitangents + if (pcSrc->HasTangentsAndBitangents()) { + jfloatArray jfl = pc->NewFloatArray(nsize); + JNU_CopyDataToArray(pc,jfl,pcSrc->mTangents,vsize); + pc->SetObjectField(obj,m_vTangents,jfl); + + + jfl = pc->NewFloatArray(nsize); + JNU_CopyDataToArray(pc,jfl,pcSrc->mBitangents,vsize); + pc->SetObjectField(obj,m_vBitangents,jfl); + } + + + // copy texture coordinates + if (pcSrc->HasTextureCoords(0)) { + jobjectArray jobjarr = pc->NewObjectArray(AI_MAX_NUMBER_OF_TEXTURECOORDS, + AIJ_GET_HANDLE(java.lang.Array.FloatArray_Class),0); + + unsigned int channel = 0; + while (pcSrc->HasTextureCoords(channel)) { + jfloatArray jfl = pc->NewFloatArray(nsize); + JNU_CopyDataToArray(pc,jfl,pcSrc->mTextureCoords[channel],vsize); + + pc->SetObjectArrayElement(jobjarr,channel,jfl); + ++channel; + } + + // set the corresponding field in the java object + pc->SetObjectField(obj,m_avUVs,jobjarr); + + jobjarr = (jobjectArray) pc->NewIntArray(AI_MAX_NUMBER_OF_TEXTURECOORDS); + pc->SetIntArrayRegion((jintArray)jobjarr,0,channel,(const jint*)&pcSrc->mNumUVComponents); + pc->SetObjectField(obj,m_aiNumUVComponents,jobjarr); + } + // copy vertex colors + if (pcSrc->HasVertexColors(0)) { + jobjectArray jobjarr = pc->NewObjectArray(AI_MAX_NUMBER_OF_COLOR_SETS, + AIJ_GET_HANDLE(java.lang.Array.FloatArray_Class),0); + + unsigned int channel = 0; + while (pcSrc->HasVertexColors(channel)) { + + jfloatArray jfl = pc->NewFloatArray(pcSrc->mNumVertices*4); + JNU_CopyDataToArray(pc,jfl,pcSrc->mColors[channel],pcSrc->mNumVertices*16); + + pc->SetObjectArrayElement(jobjarr,channel,jfl); + ++channel; + } + + // set the corresponding field in the java object + pc->SetObjectField(obj,m_avColors,jobjarr); + } + + // copy faces + if (pcSrc->mNumFaces) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mFaces,pcSrc->mNumFaces, + AIJ_GET_HANDLE(assimp.Face),ja); + pc->SetObjectField(obj,m_vFaces,ja); + } + + // copy bones + if (pcSrc->mNumBones) { + + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mBones,pcSrc->mNumBones, + AIJ_GET_HANDLE(assimp.Bone),ja); + pc->SetObjectField(obj,m_vBones,ja); + } +} + diff --git a/port/jAssimp/jni_bridge/jbridge_NativeException.cpp b/port/jAssimp/jni_bridge/jbridge_NativeException.cpp new file mode 100644 index 000000000..fc49f3a39 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_NativeException.cpp @@ -0,0 +1,36 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_NativeException::Initialize() +{ + // get a handle to the JNI context for this thread + JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; + + // and load a handle to the class + if(!(Class = pc->FindClass("assimp.NativeException"))) { + pc->ThrowNew(pc->FindClass("java.lang.Exception"),"Unable to load class assimp.NativeException"); // :-) + } +} + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::ThrowNativeError(const std::string& msg) +{ + // get a handle to the JNI context for this thread ... + JNIEnv* pc = GetThread()->m_pcEnv; + + // and throw a new assimp.NativeException + pc->ThrowNew(assimp.NativeException.Class,msg.c_str()); +} diff --git a/port/jAssimp/jni_bridge/jbridge_Node.cpp b/port/jAssimp/jni_bridge/jbridge_Node.cpp new file mode 100644 index 000000000..fb7881587 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Node.cpp @@ -0,0 +1,14 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/jbridge_Scene.cpp b/port/jAssimp/jni_bridge/jbridge_Scene.cpp new file mode 100644 index 000000000..7fe4cbc36 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Scene.cpp @@ -0,0 +1,88 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Scene::Initialize() +{ + AIJ_LOAD_CLASS(); + + AIJ_LOAD_FIELD(m_rootNode); + AIJ_LOAD_FIELD(m_vAnimations); + AIJ_LOAD_FIELD(m_vMaterials); + AIJ_LOAD_FIELD(m_vMeshes); + AIJ_LOAD_FIELD(m_vTextures); + AIJ_LOAD_FIELD(m_vLights); + AIJ_LOAD_FIELD(m_vCameras); + AIJ_LOAD_FIELD(flags); +} + +// ------------------------------------------------------------------------------------------------ +void JNIEnvironment::_assimp::_Scene::Fill(jobject obj,const aiScene* pcSrc) +{ + JNIEnv* pc = JNIEnvironment::Get()->GetThread()->m_pcEnv; + jobjectArray ja; + + // copy meshes + if (pcSrc->mNumMeshes) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mMeshes,pcSrc->mNumMeshes, + AIJ_GET_HANDLE(assimp.Mesh),ja); + pc->SetObjectField(obj,m_vMeshes,ja); + } + + // copy textures + if (pcSrc->mNumTextures) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mTextures,pcSrc->mNumTextures, + AIJ_GET_HANDLE(assimp.Texture),ja); + pc->SetObjectField(obj,m_vTextures,ja); + } + + // copy materials + if (pcSrc->mNumMeshes) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mMaterials,pcSrc->mNumMaterials, + AIJ_GET_HANDLE(assimp.Material),ja); + pc->SetObjectField(obj,m_vMaterials,ja); + } + + // copy animations + if (pcSrc->mNumAnimations) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mAnimations,pcSrc->mNumAnimations, + AIJ_GET_HANDLE(assimp.Animation),ja); + pc->SetObjectField(obj,m_vAnimations,ja); + } + + // copy lights + if (pcSrc->mNumLights) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mLights,pcSrc->mNumLights, + AIJ_GET_HANDLE(assimp.Light),ja); + pc->SetObjectField(obj,m_vLights,ja); + } + + // copy cameras + if (pcSrc->mNumCameras) { + JNU_CopyObjectArrayToVM(pc,(const void**)pcSrc->mCameras,pcSrc->mNumCameras, + AIJ_GET_HANDLE(assimp.Camera),ja); + pc->SetObjectField(obj,m_vCameras,ja); + } + + // copy scene flags + pc->SetIntField(obj,flags,(jint)pcSrc->mFlags); + + // copy the root node + jobject root = pc->NewObject(AIJ_GET_CLASS_HANDLE(assimp.Node), + AIJ_GET_DEFAULT_CTOR_HANDLE(assimp.Node)); + + AIJ_GET_HANDLE(assimp.Node).Fill(root,pcSrc->mRootNode); + pc->SetObjectField(obj,m_rootNode,root); +} diff --git a/port/jAssimp/jni_bridge/jbridge_Texture.cpp b/port/jAssimp/jni_bridge/jbridge_Texture.cpp new file mode 100644 index 000000000..fb7881587 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_Texture.cpp @@ -0,0 +1,14 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" +using namespace Assimp; \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/jbridge_pch.cpp b/port/jAssimp/jni_bridge/jbridge_pch.cpp new file mode 100644 index 000000000..b7aa6d768 --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_pch.cpp @@ -0,0 +1,15 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#include "jbridge_pch.h" + +// PCH unit \ No newline at end of file diff --git a/port/jAssimp/jni_bridge/jbridge_pch.h b/port/jAssimp/jni_bridge/jbridge_pch.h new file mode 100644 index 000000000..633c14a1e --- /dev/null +++ b/port/jAssimp/jni_bridge/jbridge_pch.h @@ -0,0 +1,31 @@ + +/* -------------------------------------------------------------------------------- + * + * Open Asset Import Library (ASSIMP) (http://assimp.sourceforge.net) + * Assimp2Java bridge + * + * Copyright (c) 2006-2009, ASSIMP Development Team + * All rights reserved. See the LICENSE file for more information. + * + * -------------------------------------------------------------------------------- + */ + +#ifdef DEBUG +# define JASSIMP_DEBUG_CHECKS +#endif + +// Assimp's public headers don't include it anymore, but we need it for uint64_t +#include "Compiler/pstdint.h" + +#include +#include + +#include +#include + +#include +#include "assimp.hpp" + +#include "jbridge_Environment.h" +#include "jbridge_Logger.h" + diff --git a/port/jAssimp/jni_bridge/res/jAssimp.rc b/port/jAssimp/jni_bridge/res/jAssimp.rc index d3a1398f3..f509e0c39 100644 --- a/port/jAssimp/jni_bridge/res/jAssimp.rc +++ b/port/jAssimp/jni_bridge/res/jAssimp.rc @@ -1,6 +1,7 @@ // Microsoft Visual C++ generated resource script. // #include "resource.h" +#include "..\..\..\..\mkutil\revision.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// @@ -29,11 +30,9 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN // Version // -#if (defined ASSIMP_JNI_EXPORT) - VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 + FILEVERSION 1,0,SVNRevision, 0 + PRODUCTVERSION 1,0,SVNRevision,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -50,13 +49,14 @@ BEGIN BEGIN VALUE "Comments", "Licensed under a 3-clause BSD license" VALUE "CompanyName", "ASSIMP Development Team" - VALUE "FileDescription", "ASSIMP-JNI bridge module" - VALUE "FileVersion", "1, 0, 0, 0" - VALUE "InternalName", "jassimp" - VALUE "LegalCopyright", "Copyright (C) 2008" - VALUE "OriginalFilename", "jAssimpNN.dll" - VALUE "ProductName", "ASSIMP-JNI bridge module" - VALUE "ProductVersion", "1, 0, 0, 0" + VALUE "FileDescription", "Assimp2Java Bridge Module" + VALUE "FileVersion", 1,0,SVNRevision,0 + VALUE "InternalName", "assimp " + VALUE "LegalCopyright", "Copyright (C) 2006-2009" + VALUE "OriginalFilename", "assimpNN.dll" + VALUE "ProductName", "Assimp2Java Bridge Module" + VALUE "ProductVersion", 1,0,SVNRevision,0 + ,0 END END BLOCK "VarFileInfo" @@ -65,13 +65,10 @@ BEGIN END END -#endif // !!ASSIMP_JNI_EXPORT - #endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// - #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // diff --git a/port/jAssimp/module_assimp.xml b/port/jAssimp/module_assimp.xml deleted file mode 100644 index 7a06ca3d9..000000000 --- a/port/jAssimp/module_assimp.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/workspaces/vc8/assimp_jbridge.vcproj b/workspaces/vc8/assimp_jbridge.vcproj new file mode 100644 index 000000000..490c3fdf7 --- /dev/null +++ b/workspaces/vc8/assimp_jbridge.vcproj @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/workspaces/vc8/jAssimp.vcproj b/workspaces/vc8/jAssimp.vcproj deleted file mode 100644 index 33c58e969..000000000 --- a/workspaces/vc8/jAssimp.vcproj +++ /dev/null @@ -1,1696 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -