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