281 lines
9.2 KiB
C++
281 lines
9.2 KiB
C++
/*
|
|
---------------------------------------------------------------------------
|
|
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 the header files generated by javah
|
|
#include "assimp_Importer.h"
|
|
#include "assimp_Animation.h"
|
|
#include "assimp_Node.h"
|
|
#include "assimp_Texture.h"
|
|
#include "assimp_Mesh.h"
|
|
#include "assimp_Material.h"
|
|
|
|
// 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 "../DefaultLogger.h"
|
|
|
|
using namespace Assimp;
|
|
|
|
#include <list>
|
|
|
|
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)
|
|
{
|
|
ai_assert(NULL != jvmenv && NULL != 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
|
|
return context;
|
|
}
|
|
// ------------------------------------------------------------------------------------------------
|
|
/*
|
|
* Class: assimp_Importer
|
|
* Method: _NativeFreeContext
|
|
* Signature: (I)I
|
|
*/
|
|
JNIEXPORT jint JNICALL Java_assimp_Importer__1NativeFreeContext
|
|
(JNIEnv * jvmenv, jobject jvmthis, jlong jvmcontext)
|
|
{
|
|
ai_assert(NULL != jvmenv && NULL != jvmthis);
|
|
|
|
#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
|
|
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)
|
|
{
|
|
ai_assert(NULL != jvmenv && NULL != jvmthis);
|
|
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 = jvmenv->GetStringUTFChars(jvmpath,NULL);
|
|
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;
|
|
|
|
// and load the file. The aiScene object itself remains accessible
|
|
// via Importer.GetScene().
|
|
if(NULL == pcImp->ReadFile(std::string(szPath),(unsigned int)jvmflags))
|
|
{
|
|
DefaultLogger::get()->error("[jnibridge] Unable to load asset");
|
|
|
|
// release the path again
|
|
jvmenv->ReleaseStringUTFChars(jvmpath,szPath);
|
|
return AI_JNI_ERROR_RETURN;
|
|
}
|
|
// release the path again
|
|
jvmenv->ReleaseStringUTFChars(jvmpath,szPath);
|
|
return iRet;
|
|
}
|
|
// ------------------------------------------------------------------------------------------------
|
|
/*
|
|
* Class: assimp_Scene
|
|
* Method: _NativeGetNumMeshes
|
|
* Signature: (I)I
|
|
*/
|
|
JNIEXPORT jint JNICALL Java_assimp_Scene__1NativeGetNumMeshes
|
|
(JNIEnv *jvmenv, jobject jvmthis, jlong jvmcontext)
|
|
{
|
|
ai_assert(NULL != jvmenv && NULL != jvmthis);
|
|
// we need a valid scene for this
|
|
Assimp::Importer* pcImp = jGetValidImporterScenePair(jvmcontext);
|
|
if (!pcImp)return AI_JNI_ERROR_RETURN;
|
|
return (jint)pcImp->GetScene()->mNumMeshes;
|
|
}
|
|
// ------------------------------------------------------------------------------------------------
|
|
/*
|
|
* Class: assimp_Scene
|
|
* Method: _NativeGetNumAnimations
|
|
* Signature: (I)I
|
|
*/
|
|
JNIEXPORT jint JNICALL Java_assimp_Scene__1NativeGetNumAnimations
|
|
(JNIEnv *jvmenv, jobject jvmthis, jlong jvmcontext)
|
|
{
|
|
|
|
ai_assert(NULL != jvmenv && NULL != jvmthis);
|
|
// we need a valid scene for this
|
|
Assimp::Importer* pcImp = jGetValidImporterScenePair(jvmcontext);
|
|
if (!pcImp)return AI_JNI_ERROR_RETURN;
|
|
return (jint)pcImp->GetScene()->mNumAnimations;
|
|
}
|
|
// ------------------------------------------------------------------------------------------------
|
|
/*
|
|
* Class: assimp_Scene
|
|
* Method: _NativeGetNumTextures
|
|
* Signature: (I)I
|
|
*/
|
|
JNIEXPORT jint JNICALL Java_assimp_Scene__1NativeGetNumTextures
|
|
(JNIEnv *jvmenv, jobject jvmthis, jlong jvmcontext)
|
|
{
|
|
ai_assert(NULL != jvmenv && NULL != jvmthis);
|
|
// we need a valid scene for this
|
|
Assimp::Importer* pcImp = jGetValidImporterScenePair(jvmcontext);
|
|
if (!pcImp)return AI_JNI_ERROR_RETURN;
|
|
return (jint)pcImp->GetScene()->mNumTextures;
|
|
}
|
|
// ------------------------------------------------------------------------------------------------
|
|
/*
|
|
* Class: assimp_Scene
|
|
* Method: _NativeGetNumMaterials
|
|
* Signature: (I)I
|
|
*/
|
|
JNIEXPORT jint JNICALL Java_assimp_Scene__1NativeGetNumMaterials
|
|
(JNIEnv *jvmenv, jobject jvmthis, jlong jvmcontext)
|
|
{
|
|
ai_assert(NULL != jvmenv && NULL != jvmthis);
|
|
// we need a valid scene for this
|
|
Assimp::Importer* pcImp = jGetValidImporterScenePair(jvmcontext);
|
|
if (!pcImp)return AI_JNI_ERROR_RETURN;
|
|
return (jint)pcImp->GetScene()->mNumMaterials;
|
|
}
|
|
|
|
}; //! namespace JNIBridge
|
|
}; //! namespace Assimp
|
|
#endif // !ASSIMP_JNI_EXPORT
|