| 483 | } |
| 484 | |
| 485 | static jobject CreateJavaScene(JNIEnv* env, const dmModelImporter::Scene* scene) |
| 486 | { |
| 487 | dmLogDebug("CreateJavaScene: env = %p\n", env); |
| 488 | dmModelImporter::jni::ScopedContext jni_scope(env); |
| 489 | dmModelImporter::jni::TypeInfos* types = &jni_scope.m_TypeInfos; |
| 490 | |
| 491 | jobject obj = env->AllocObject(types->m_SceneJNI.cls); |
| 492 | |
| 493 | dmArray<jobject> models; |
| 494 | dmArray<jobject> skins; |
| 495 | dmArray<jobject> nodes; |
| 496 | dmArray<jobject> materials; |
| 497 | dmArray<jobject> roots; |
| 498 | dmHashTable64<jobject> object_cache; |
| 499 | |
| 500 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.buffers, CreateBufferArray(env, types, scene->m_Buffers.Begin(), scene->m_Buffers.Size(), object_cache)); |
| 501 | |
| 502 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.images, CreateImagesArray(env, types, scene->m_Images.Size(), scene->m_Images.Begin(), object_cache)); |
| 503 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.samplers, CreateSamplersArray(env, types, scene->m_Samplers.Size(), scene->m_Samplers.Begin(), object_cache)); |
| 504 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.textures, CreateTexturesArray(env, types, scene->m_Textures.Size(), scene->m_Textures.Begin(), object_cache)); |
| 505 | |
| 506 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.materials, CreateMaterialsArray(env, types, |
| 507 | scene->m_Materials.Size(), scene->m_Materials.Begin(), |
| 508 | scene->m_DynamicMaterials.Size(), scene->m_DynamicMaterials.Begin(), |
| 509 | materials)); |
| 510 | |
| 511 | |
| 512 | // Creates all nodes, but doesn't set setting skins/models |
| 513 | CreateNodes(env, types, scene, nodes); |
| 514 | CreateSkins(env, types, scene, skins); |
| 515 | CreateModels(env, types, scene, materials, models); |
| 516 | CreateBones(env, types, scene, skins, nodes, object_cache); |
| 517 | |
| 518 | // Set the skin+model to the nodes |
| 519 | FixupNodeReferences(env, types, scene, skins, models, nodes); |
| 520 | FixupModelBones(env, types, scene, models, object_cache); |
| 521 | |
| 522 | //env->EnsureLocalCapacity(8192); // TODO: Set this in the "C2J_Create*Array" functions |
| 523 | |
| 524 | { |
| 525 | uint32_t count = scene->m_RootNodes.Size(); |
| 526 | roots.SetCapacity(count); |
| 527 | for (uint32_t i = 0; i < count; ++i) |
| 528 | { |
| 529 | const dmModelImporter::Node* root = scene->m_RootNodes[i]; |
| 530 | roots.Push(nodes[root->m_Index]); |
| 531 | } |
| 532 | } |
| 533 | |
| 534 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.rootNodes, CreateObjectArray(env, types->m_NodeJNI.cls, roots)); |
| 535 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.nodes, CreateObjectArray(env, types->m_NodeJNI.cls, nodes)); |
| 536 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.skins, CreateObjectArray(env, types->m_SkinJNI.cls, skins)); |
| 537 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.models, CreateObjectArray(env, types->m_ModelJNI.cls, models)); |
| 538 | dmJNI::SetObjectDeref(env, obj, types->m_SceneJNI.animations, CreateAnimationsArray(env, types, scene->m_Animations.Begin(), scene->m_Animations.Size(), nodes)); |
| 539 | |
| 540 | DeleteLocalRefs(env, nodes); |
| 541 | DeleteLocalRefs(env, skins); |
| 542 | DeleteLocalRefs(env, models); |
no test coverage detected