| 605 | } |
| 606 | |
| 607 | SceneResult Do(Context& context) override |
| 608 | { |
| 609 | // Reloading scripts workflow: |
| 610 | // - save scenes (to temporary files) |
| 611 | // - unload scenes |
| 612 | // - unload user assemblies |
| 613 | // - load user assemblies |
| 614 | // - load scenes (from temporary files) |
| 615 | // Note: we don't want to override original scene files |
| 616 | |
| 617 | PROFILE_CPU_NAMED("Level.ReloadScripts"); |
| 618 | PROFILE_MEM(Level); |
| 619 | LOG(Info, "Scripts reloading start"); |
| 620 | const auto startTime = DateTime::NowUTC(); |
| 621 | |
| 622 | // Cache data |
| 623 | struct SceneData |
| 624 | { |
| 625 | Guid ID; |
| 626 | String Name; |
| 627 | rapidjson_flax::StringBuffer Data; |
| 628 | |
| 629 | SceneData() = default; |
| 630 | |
| 631 | SceneData(const SceneData& other) |
| 632 | { |
| 633 | CRASH; |
| 634 | } |
| 635 | |
| 636 | const SceneData& operator=(SceneData&) const |
| 637 | { |
| 638 | CRASH; |
| 639 | return *this; |
| 640 | } |
| 641 | |
| 642 | void Init(Scene* scene) |
| 643 | { |
| 644 | ID = scene->GetID(); |
| 645 | Name = scene->GetName(); |
| 646 | } |
| 647 | }; |
| 648 | const int32 scenesCount = Level::Scenes.Count(); |
| 649 | Array<SceneData> scenes; |
| 650 | scenes.Resize(scenesCount); |
| 651 | for (int32 i = 0; i < scenesCount; i++) |
| 652 | scenes[i].Init(Level::Scenes[i]); |
| 653 | |
| 654 | // Fire event |
| 655 | Level::ScriptsReloadStart(); |
| 656 | |
| 657 | // Save scenes (to memory) |
| 658 | for (int32 i = 0; i < scenesCount; i++) |
| 659 | { |
| 660 | const auto scene = Level::Scenes[i]; |
| 661 | LOG(Info, "Caching scene {0}", scenes[i].Name); |
| 662 | |
| 663 | // Serialize to json |
| 664 | if (saveScene(scene, scenes[i].Data, false)) |
nothing calls this directly
no test coverage detected