@@ -177,11 +177,11 @@ CListValue<CStringValue> *BL_BlenderConverter::GetInactiveSceneNames()
177
177
return list;
178
178
}
179
179
180
- void BL_BlenderConverter::ConvertScene (KX_Scene *destinationscene, RAS_Rasterizer *rasty, RAS_ICanvas *canvas , bool libloading)
180
+ void BL_BlenderConverter::ConvertScene (BL_BlenderSceneConverter& converter , bool libloading)
181
181
{
182
-
182
+ KX_Scene *scene = converter. GetScene ();
183
183
// Find out which physics engine
184
- Scene *blenderscene = destinationscene ->GetBlenderScene ();
184
+ Scene *blenderscene = scene ->GetBlenderScene ();
185
185
186
186
PHY_IPhysicsEnvironment *phy_env = nullptr ;
187
187
@@ -214,31 +214,34 @@ void BL_BlenderConverter::ConvertScene(KX_Scene *destinationscene, RAS_Rasterize
214
214
}
215
215
}
216
216
217
- destinationscene->SetPhysicsEnvironment (phy_env);
218
-
219
- BL_BlenderSceneConverter sceneConverter;
217
+ scene->SetPhysicsEnvironment (phy_env);
220
218
221
219
BL_ConvertBlenderObjects (
222
220
m_maggie,
223
- destinationscene ,
221
+ scene ,
224
222
m_ketsjiEngine,
225
223
physics_engine,
226
- rasty ,
227
- canvas ,
228
- sceneConverter ,
224
+ m_ketsjiEngine-> GetRasterizer () ,
225
+ m_ketsjiEngine-> GetCanvas () ,
226
+ converter ,
229
227
m_alwaysUseExpandFraming,
230
228
libloading);
231
229
232
- m_sceneSlots.emplace (destinationscene, sceneConverter);
230
+ m_sceneSlots.emplace (scene, converter);
231
+ }
232
+
233
+ void BL_BlenderConverter::InitSceneShaders (const BL_BlenderSceneConverter& converter, KX_Scene *mergeScene)
234
+ {
235
+ for (KX_BlenderMaterial *mat : converter.m_materials ) {
236
+ // Do this after lights are available so materials can use the lights in shaders.
237
+ mat->InitScene (mergeScene);
238
+ }
239
+ for (RAS_MeshObject *meshobj : converter.m_meshobjects ) {
240
+ // Generate mesh to material attribute's layers since the materials are constructed now.
241
+ meshobj->GenerateAttribLayers ();
242
+ }
233
243
}
234
244
235
- /* * This function removes all entities stored in the converter for that scene
236
- * It should be used instead of direct delete scene
237
- * Note that there was some provision for sharing entities (meshes...) between
238
- * scenes but that is now disabled so all scene will have their own copy
239
- * and we can delete them here. If the sharing is reactivated, change this code too..
240
- * (see BL_BlenderConverter::ConvertScene)
241
- */
242
245
void BL_BlenderConverter::RemoveScene (KX_Scene *scene)
243
246
{
244
247
KX_WorldInfo *world = scene->GetWorldInfo ();
@@ -310,16 +313,15 @@ void BL_BlenderConverter::MergeAsyncLoads()
310
313
m_threadinfo.m_mutex .Lock ();
311
314
312
315
for (KX_LibLoadStatus *libload : m_mergequeue) {
313
- std::vector<KX_Scene *> *mergeScenes = (std::vector<KX_Scene *> *)libload->GetData ();
314
-
315
- for (KX_Scene *scene : *mergeScenes) {
316
- MergeScene (libload->GetMergeScene (), scene);
316
+ KX_Scene *mergeScene = libload->GetMergeScene ();
317
+ for (const BL_BlenderSceneConverter& converter : libload->GetSceneConverters ()) {
318
+ KX_Scene *scene = converter.GetScene ();
319
+ MergeScene (mergeScene, scene);
320
+ // Finalize material and mesh conversion.
321
+ InitSceneShaders (converter, mergeScene);
317
322
delete scene;
318
323
}
319
324
320
- delete mergeScenes;
321
- libload->SetData (nullptr );
322
-
323
325
libload->Finish ();
324
326
}
325
327
@@ -345,23 +347,22 @@ void BL_BlenderConverter::AddScenesToMergeQueue(KX_LibLoadStatus *status)
345
347
346
348
static void async_convert (TaskPool *pool, void *ptr, int UNUSED (threadid))
347
349
{
348
- KX_Scene *new_scene = nullptr ;
349
- KX_LibLoadStatus *status = (KX_LibLoadStatus *)ptr;
350
- std::vector<Scene *> *scenes = (std::vector<Scene *> *)status->GetData ();
351
- std::vector<KX_Scene *> *merge_scenes = new std::vector<KX_Scene *>(); // Deleted in MergeAsyncLoads
350
+ KX_LibLoadStatus *status = static_cast <KX_LibLoadStatus *>(ptr);
351
+ KX_KetsjiEngine *engine = status->GetEngine ();
352
+ BL_BlenderConverter *converter = status->GetConverter ();
352
353
353
- for (unsigned int i = 0 ; i < scenes->size (); ++i) {
354
- new_scene = status->GetEngine ()->CreateScene ((*scenes)[i], true );
354
+ const std::vector<Scene *>& blenderScenes = status->GetBlenderScenes ();
355
355
356
- if (new_scene) {
357
- merge_scenes->push_back (new_scene);
358
- }
356
+ for (Scene *blenderScene : blenderScenes) {
357
+ KX_Scene *scene = engine->CreateScene (blenderScene);
359
358
360
- status->AddProgress ((1 .0f / scenes->size ()) * 0 .9f ); // We'll call conversion 90% and merging 10% for now
361
- }
359
+ BL_BlenderSceneConverter sceneConverter (scene);
360
+ converter->ConvertScene (sceneConverter, true );
361
+
362
+ status->AddSceneConverter (std::move (sceneConverter));
362
363
363
- delete scenes;
364
- status-> SetData (merge_scenes);
364
+ status-> AddProgress (( 1 . 0f / blenderScenes. size ()) * 0 . 9f ); // We'll call conversion 90% and merging 10% for now
365
+ }
365
366
366
367
status->GetConverter ()->AddScenesToMergeQueue (status);
367
368
}
@@ -465,14 +466,17 @@ KX_LibLoadStatus *BL_BlenderConverter::LinkBlendFile(BlendHandle *bpy_openlib, c
465
466
// Convert all new meshes into BGE meshes
466
467
ID *mesh;
467
468
468
- BL_BlenderSceneConverter sceneConverter;
469
+ BL_BlenderSceneConverter sceneConverter (scene_merge) ;
469
470
for (mesh = (ID *)main_newlib->mesh .first ; mesh; mesh = (ID *)mesh->next ) {
470
471
if (options & LIB_LOAD_VERBOSE) {
471
472
CM_Debug (" mesh name: " << mesh->name + 2 );
472
473
}
473
- RAS_MeshObject *meshobj = BL_ConvertMesh ((Mesh *)mesh, nullptr , scene_merge, sceneConverter, false ); // For now only use the libloading option for scenes, which need to handle materials/shaders
474
+ RAS_MeshObject *meshobj = BL_ConvertMesh ((Mesh *)mesh, nullptr , scene_merge, sceneConverter);
474
475
scene_merge->GetLogicManager ()->RegisterMeshName (meshobj->GetName (), meshobj);
475
476
}
477
+
478
+ // Finalize material and mesh conversion.
479
+ InitSceneShaders (sceneConverter, scene_merge);
476
480
m_sceneSlots[scene_merge].Merge (sceneConverter);
477
481
}
478
482
else if (idcode == ID_AC) {
@@ -488,32 +492,42 @@ KX_LibLoadStatus *BL_BlenderConverter::LinkBlendFile(BlendHandle *bpy_openlib, c
488
492
}
489
493
else if (idcode == ID_SCE) {
490
494
// Merge all new linked in scene into the existing one
491
- ID *scene;
492
- // scenes gets deleted by the thread when it's done using it (look in async_convert())
493
- std::vector<Scene *> *scenes = (options & LIB_LOAD_ASYNC) ? new std::vector<Scene *>() : nullptr ;
494
495
495
- for (scene = (ID *)main_newlib->scene .first ; scene; scene = (ID *)scene->next ) {
496
- if (options & LIB_LOAD_VERBOSE) {
497
- CM_Debug (" scene name: " << scene->name + 2 );
498
- }
496
+ if (options & LIB_LOAD_ASYNC) {
497
+ std::vector<Scene *> blenderScenes;
498
+ for (Scene *scene = (Scene *)main_newlib->scene .first ; scene; scene = (Scene *)scene->id .next ) {
499
+ if (options & LIB_LOAD_VERBOSE) {
500
+ CM_Debug (" scene name: " << scene->id .name + 2 );
501
+ }
499
502
500
- if (options & LIB_LOAD_ASYNC) {
501
- scenes-> push_back ((Scene *) scene);
503
+ // Build list of scene to convert.
504
+ blenderScenes. push_back (scene);
502
505
}
503
- else {
506
+
507
+ status->SetBlenderScenes (blenderScenes);
508
+ BLI_task_pool_push (m_threadinfo.m_pool , async_convert, (void *)status, false , TASK_PRIORITY_LOW);
509
+ }
510
+ else {
511
+ for (Scene *scene = (Scene *)main_newlib->scene .first ; scene; scene = (Scene *)scene->id .next ) {
512
+ if (options & LIB_LOAD_VERBOSE) {
513
+ CM_Debug (" scene name: " << scene->id .name + 2 );
514
+ }
515
+
504
516
// merge into the base scene
505
- KX_Scene *other = m_ketsjiEngine->CreateScene ((Scene *)scene, true );
517
+ KX_Scene *other = m_ketsjiEngine->CreateScene (scene);
518
+
519
+ BL_BlenderSceneConverter sceneConverter (other);
520
+ ConvertScene (sceneConverter, true );
521
+
506
522
MergeScene (scene_merge, other);
507
523
524
+ // Finalize material and mesh conversion.
525
+ InitSceneShaders (sceneConverter, scene_merge);
526
+
508
527
delete other;
509
528
}
510
529
}
511
530
512
- if (options & LIB_LOAD_ASYNC) {
513
- status->SetData (scenes);
514
- BLI_task_pool_push (m_threadinfo.m_pool , async_convert, (void *)status, false , TASK_PRIORITY_LOW);
515
- }
516
-
517
531
#ifdef WITH_PYTHON
518
532
// Handle any text datablocks
519
533
if (options & LIB_LOAD_LOAD_SCRIPTS) {
@@ -733,18 +747,7 @@ void BL_BlenderConverter::MergeScene(KX_Scene *to, KX_Scene *from)
733
747
{
734
748
to->MergeScene (from);
735
749
736
- SceneSlot& sceneSlotFrom = m_sceneSlots[from];
737
-
738
- for (std::unique_ptr<KX_BlenderMaterial>& mat : sceneSlotFrom.m_materials ) {
739
- // Do this after lights are merged so materials can use the lights in shaders.
740
- mat->ReplaceScene (to);
741
- }
742
- for (std::unique_ptr<RAS_MeshObject>& meshobj : sceneSlotFrom.m_meshobjects ) {
743
- // Generate mesh to material attribute's layers since the materials are constructed now.
744
- meshobj->GenerateAttribLayers ();
745
- }
746
-
747
- m_sceneSlots[to].Merge (sceneSlotFrom);
750
+ m_sceneSlots[to].Merge (m_sceneSlots[from]);
748
751
m_sceneSlots.erase (from);
749
752
750
753
// Delete from scene's world info.
@@ -827,11 +830,13 @@ RAS_MeshObject *BL_BlenderConverter::ConvertMeshSpecial(KX_Scene *kx_scene, Main
827
830
}
828
831
}
829
832
830
- BL_BlenderSceneConverter sceneConverter;
833
+ BL_BlenderSceneConverter sceneConverter (kx_scene) ;
831
834
832
- RAS_MeshObject *meshobj = BL_ConvertMesh ((Mesh *)me, nullptr , kx_scene, sceneConverter, false );
835
+ RAS_MeshObject *meshobj = BL_ConvertMesh ((Mesh *)me, nullptr , kx_scene, sceneConverter);
833
836
kx_scene->GetLogicManager ()->RegisterMeshName (meshobj->GetName (), meshobj);
834
837
838
+ // Finalize material and mesh conversion.
839
+ InitSceneShaders (sceneConverter, kx_scene);
835
840
m_sceneSlots[kx_scene].Merge (sceneConverter);
836
841
837
842
return meshobj;
0 commit comments