22#include < Editor.h>
33#include < Helpers/UIDispatcher.h>
44#include < Importers/AssimpImporter.h>
5+ #include < Importers/EnvironmentMapImporter.h>
56#include < MessageToken.h>
67#include < Messengers/Messenger.h>
78#include < ZEngine/Logging/LoggerDefinition.h>
@@ -14,15 +15,19 @@ using namespace ZEngine::Helpers;
1415
1516namespace Tetragrama ::Components
1617{
17- ImVec4 DockspaceUIComponent::s_asset_importer_report_msg_color = {1 , 1 , 1 , 1 };
18- char DockspaceUIComponent::s_asset_importer_input_buffer[1024 ] = {0 };
19- char DockspaceUIComponent::s_save_as_input_buffer[1024 ] = {0 };
20- std::string DockspaceUIComponent::s_asset_importer_report_msg = " " ;
21- float DockspaceUIComponent::s_editor_scene_serializer_progress = 0 .0f ;
18+ ImVec4 DockspaceUIComponent::s_asset_importer_report_msg_color = {1 , 1 , 1 , 1 };
19+ char DockspaceUIComponent::s_asset_importer_input_buffer[1024 ] = {0 };
20+ char DockspaceUIComponent::s_save_as_input_buffer[1024 ] = {0 };
21+ std::string DockspaceUIComponent::s_asset_importer_report_msg = " " ;
22+ float DockspaceUIComponent::s_editor_scene_serializer_progress = 0 .0f ;
2223
23- static bool s_is_scene_loading = false ;
24- static char s_scene_serializer_log[DEFAULT_STR_BUFFER ] = {0 };
25- static ImVec4 s_scene_serializer_log_color = {1 , 1 , 1 , 1 };
24+ ImVec4 DockspaceUIComponent::s_env_map_importer_report_msg_color = {1 , 1 , 1 , 1 };
25+ char DockspaceUIComponent::s_env_map_importer_input_buffer[1024 ] = {0 };
26+ std::string DockspaceUIComponent::s_env_map_importer_report_msg = " " ;
27+
28+ static bool s_is_scene_loading = false ;
29+ static char s_scene_serializer_log[DEFAULT_STR_BUFFER ] = {0 };
30+ static ImVec4 s_scene_serializer_log_color = {1 , 1 , 1 , 1 };
2631
2732 DockspaceUIComponent::DockspaceUIComponent () {}
2833
@@ -35,17 +40,20 @@ namespace Tetragrama::Components
3540 parent->LocalArena .CreateSubArena (ZMega (1 ), &LocalArena);
3641
3742 m_asset_importer = ZPushStructCtor (parent->Arena , ZEngine::Importers::AssimpImporter);
43+ m_env_map_importer = ZPushStructCtor (parent->Arena , ZEngine::Importers::EnvironmentMapImporter);
3844 m_editor_serializer = ZPushStructCtor (parent->Arena , Serializers::EditorSceneSerializer);
3945
4046 m_editor_serializer->Initialize (parent->Arena );
4147 m_asset_importer->Initialize (parent->Arena );
48+ m_env_map_importer->Initialize (parent->Arena );
4249
4350 m_dockspace_node_flag = ImGuiDockNodeFlags_NoWindowMenuButton | static_cast <decltype (ImGuiDockNodeFlags_NoWindowMenuButton)>(ImGuiDockNodeFlags_PassthruCentralNode);
4451 m_window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
4552
4653 auto app = reinterpret_cast <EditorPtr>(ParentLayer->CurrentApp );
4754 m_editor_serializer->Context = app;
4855 m_asset_importer->Context = app;
56+ m_env_map_importer->Context = app;
4957
5058 auto editor_serializer_default_output = fmt::format (" {0}{1}{2}" , app->Configuration ->WorkingSpacePath .c_str (), PLATFORM_OS_BACKSLASH , app->Configuration ->ScenePath .c_str ());
5159
@@ -60,6 +68,11 @@ namespace Tetragrama::Components
6068 m_asset_importer->SetOnProgressCallback (OnAssetImporterProgress);
6169 m_asset_importer->SetOnLogCallback (OnAssetImporterLog);
6270 m_asset_importer->SetOnErrorCallback (OnAssetImporterError);
71+
72+ m_env_map_importer->SetOnCompleteCallback (OnEnvMapImporterComplete);
73+ m_env_map_importer->SetOnProgressCallback (OnEnvMapImporterProgress);
74+ m_env_map_importer->SetOnLogCallback (OnEnvMapImporterLog);
75+ m_env_map_importer->SetOnErrorCallback (OnEnvMapImporterError);
6376 }
6477
6578 void DockspaceUIComponent::Update (ZEngine::Core::TimeStep dt) {}
@@ -120,6 +133,7 @@ namespace Tetragrama::Components
120133 RenderSaveSceneAs ();
121134
122135 RenderImporter ();
136+ RenderEnvironmentMapImporter ();
123137
124138 RenderExitPopup ();
125139
@@ -423,6 +437,158 @@ namespace Tetragrama::Components
423437 ZEngine::Helpers::secure_memset (s_asset_importer_input_buffer, 0 , IM_ARRAYSIZE (s_asset_importer_input_buffer), IM_ARRAYSIZE (s_asset_importer_input_buffer));
424438 }
425439
440+ void DockspaceUIComponent::RenderEnvironmentMapImporter ()
441+ {
442+ if (!m_open_env_map_importer)
443+ {
444+ std::string_view buffer_view = s_env_map_importer_input_buffer;
445+ if (!buffer_view.empty ())
446+ {
447+ ResetEnvironmentMapImporterBuffers ();
448+ }
449+ return ;
450+ }
451+
452+ const char * str_id = " Environment Map Importer" ;
453+ ImGui::OpenPopup (str_id);
454+ ImVec2 center = ImGui::GetMainViewport ()->GetCenter ();
455+ ImGui::SetNextWindowPos (center, ImGuiCond_Always, ImVec2 (0 .5f , 0 .5f ));
456+ ImGui::SetNextWindowSize (ImVec2 (700 , 100 ), ImGuiCond_Always);
457+
458+ if (ImGui::BeginPopupModal (str_id, NULL , ImGuiWindowFlags_AlwaysAutoResize))
459+ {
460+ ImGui::PushItemWidth (620 );
461+ ImGui::InputText (" ##EnvMapImporterUI" , s_env_map_importer_input_buffer, IM_ARRAYSIZE (s_env_map_importer_input_buffer), ImGuiInputTextFlags_ReadOnly);
462+ ImGui::PopItemWidth ();
463+
464+ ImGui::SameLine ();
465+
466+ if (ImGui::Button (" ..." , ImVec2 (50 , 0 )))
467+ {
468+ Helpers::UIDispatcher::RunAsync ([this ]() -> std::future<void > {
469+ if (ParentLayer && ParentLayer->CurrentApp )
470+ {
471+ auto window = ParentLayer->CurrentApp ->CurrentWindow ;
472+ std::vector<std::string_view> filters{" .hdr" , " .exr" };
473+ std::string filename = co_await window->OpenFileDialogAsync (filters);
474+
475+ if (!filename.empty ())
476+ {
477+ ZEngine::Helpers::secure_memset (s_env_map_importer_input_buffer, 0 , IM_ARRAYSIZE (s_env_map_importer_input_buffer), IM_ARRAYSIZE (s_env_map_importer_input_buffer));
478+ ZEngine::Helpers::secure_memcpy (s_env_map_importer_input_buffer, IM_ARRAYSIZE (s_env_map_importer_input_buffer), filename.c_str (), filename.size ());
479+ }
480+ }
481+ });
482+ }
483+
484+ ImGui::Separator ();
485+
486+ ImGui::SetCursorPosX (ImGui::GetWindowSize ().x - 180 );
487+ ImGui::SetCursorPosY (ImGui::GetWindowSize ().y - ImGui::GetFrameHeightWithSpacing () - 5 );
488+
489+ bool is_import_button_enabled = !std::string_view (s_env_map_importer_input_buffer).empty () && !m_env_map_importer->IsImporting ();
490+
491+ if (!is_import_button_enabled)
492+ {
493+ ImGui::PushStyleColor (ImGuiCol_Button, ImVec4 (0 .5f , 0 .5f , 0 .5f , 1 .0f ));
494+ ImGui::PushStyleColor (ImGuiCol_ButtonHovered, ImVec4 (0 .5f , 0 .5f , 0 .5f , 1 .0f ));
495+ ImGui::PushStyleColor (ImGuiCol_ButtonActive, ImVec4 (0 .5f , 0 .5f , 0 .5f , 1 .0f ));
496+ }
497+
498+ if (ImGui::Button (" Import" , ImVec2 (80 , 0 )) && is_import_button_enabled)
499+ {
500+ Helpers::UIDispatcher::RunAsync ([this ]() -> std::future<void > { co_await OnImportEnvironmentMapAsync (s_env_map_importer_input_buffer); });
501+ }
502+
503+ if (!is_import_button_enabled)
504+ {
505+ ImGui::PopStyleColor (3 );
506+ }
507+
508+ if (m_env_map_importer->IsImporting ())
509+ {
510+ ImGui::SameLine ();
511+ ImGui::TextDisabled (" (importing...)" );
512+ }
513+
514+ ImGui::SameLine ();
515+ if (ImGui::Button (" Close" , ImVec2 (80 , 0 )))
516+ {
517+ m_open_env_map_importer = false ;
518+ ResetEnvironmentMapImporterBuffers ();
519+ ImGui::CloseCurrentPopup ();
520+ }
521+
522+ ImGui::PushFont (ImGui::GetIO ().Fonts ->Fonts [0 ]);
523+ ImGui::SetCursorPos (ImVec2 (10 , ImGui::GetWindowSize ().y - 30 ));
524+ ImGui::TextColored (s_env_map_importer_report_msg_color, " %s" , s_env_map_importer_report_msg.c_str ());
525+ ImGui::PopFont ();
526+
527+ ImGui::EndPopup ();
528+ }
529+ }
530+
531+ void DockspaceUIComponent::ResetEnvironmentMapImporterBuffers ()
532+ {
533+ s_env_map_importer_report_msg = " " ;
534+ s_env_map_importer_report_msg_color = {1 .0f , 1 .0f , 1 .0f , 1 .0f };
535+ ZEngine::Helpers::secure_memset (s_env_map_importer_input_buffer, 0 , IM_ARRAYSIZE (s_env_map_importer_input_buffer), IM_ARRAYSIZE (s_env_map_importer_input_buffer));
536+ }
537+
538+ std::future<void > DockspaceUIComponent::OnImportEnvironmentMapAsync (const char * filename)
539+ {
540+ if (ZEngine::Helpers::secure_strlen (filename) == 0 || m_env_map_importer->IsImporting ())
541+ {
542+ co_return ;
543+ }
544+
545+ LocalArena.Clear ();
546+
547+ auto app = reinterpret_cast <EditorPtr>(ParentLayer->CurrentApp );
548+ auto arena = &LocalArena;
549+ auto asset_name = fs::path (filename).filename ().replace_extension ().string ();
550+ auto output_file = fmt::format (" {}.zenvmap" , asset_name.c_str ());
551+
552+ auto config = ZPushStruct (arena, ZEngine::Importers::ImportConfiguration);
553+ config->OutputWorkingSpacePath .init (arena, app->Configuration ->WorkingSpacePath .c_str ());
554+ config->OutputAssetsPath .init (arena, " Settings/EnvironmentMaps" );
555+ config->AssetName .init (arena, asset_name.c_str ());
556+ config->OutputAssetFile .init (arena, output_file.c_str ());
557+
558+ s_env_map_importer_report_msg_color = {1 .0f , 1 .0f , 1 .0f , 1 .0f };
559+ s_env_map_importer_report_msg = " Importing..." ;
560+
561+ m_env_map_importer->ImportAsync (filename, *config);
562+ co_return ;
563+ }
564+
565+ void DockspaceUIComponent::OnEnvMapImporterComplete (void * const , ZEngine::Core::Containers::ArrayView<ZEngine::Importers::AssetImporterOutput> result)
566+ {
567+ if (result.size () > 0 )
568+ {
569+ s_env_map_importer_report_msg_color = {0 .0f , 1 .0f , 0 .0f , 1 .0f };
570+ s_env_map_importer_report_msg = fmt::format (" Saved" );
571+ }
572+ }
573+
574+ void DockspaceUIComponent::OnEnvMapImporterProgress (void * const , float value)
575+ {
576+ s_env_map_importer_report_msg_color = {1 .0f , 1 .0f , 1 .0f , 1 .0f };
577+ s_env_map_importer_report_msg = fmt::format (" Progress: {:.0f}%%" , value * 100 .f );
578+ }
579+
580+ void DockspaceUIComponent::OnEnvMapImporterError (void * const , std::string_view msg)
581+ {
582+ s_env_map_importer_report_msg_color = {1 .0f , 0 .0f , 0 .0f , 1 .0f };
583+ s_env_map_importer_report_msg = msg;
584+ }
585+
586+ void DockspaceUIComponent::OnEnvMapImporterLog (void * const , std::string_view msg)
587+ {
588+ s_env_map_importer_report_msg_color = {1 .0f , 1 .0f , 1 .0f , 1 .0f };
589+ s_env_map_importer_report_msg = msg;
590+ }
591+
426592 void DockspaceUIComponent::ResetSaveAsBuffers ()
427593 {
428594 ZEngine::Helpers::secure_memset (s_save_as_input_buffer, 0 , IM_ARRAYSIZE (s_save_as_input_buffer), IM_ARRAYSIZE (s_save_as_input_buffer));
@@ -516,6 +682,8 @@ namespace Tetragrama::Components
516682 if (ImGui::MenuItem (" Renderer" ))
517683 {
518684 }
685+
686+ ImGui::MenuItem (" Import Environment Map" , NULL , &m_open_env_map_importer);
519687 ImGui::EndMenu ();
520688 }
521689
0 commit comments