assimp/port/jAssimp/jni_bridge/jbridge_Mesh.cpp

130 lines
4.0 KiB
C++

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