Skip to content

Commit c90975b

Browse files
jnyfahJennifer Chukwu
andauthored
feat: Convert enviroment cube texture to engine format for fast loading (JeanPhilippeKernel#523)
* add UI * EnvironmentMapImporter * use assetimporter * format * fix file already exists * checkin zenvmap --------- Co-authored-by: Jennifer Chukwu <v-jchukwu@microsoft.com>
1 parent 95797b5 commit c90975b

11 files changed

Lines changed: 502 additions & 70 deletions

File tree

96 MB
Binary file not shown.

Tetragrama/Components/DockspaceUIComponent.cpp

Lines changed: 176 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
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

1516
namespace 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

Tetragrama/Components/DockspaceUIComponent.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ namespace Tetragrama::Components
3434
static void OnAssetImporterError(void* const, std::string_view);
3535
static void OnAssetImporterLog(void* const, std::string_view);
3636

37+
/*
38+
* Environment Map Importer Funcs
39+
*/
40+
void RenderEnvironmentMapImporter();
41+
void ResetEnvironmentMapImporterBuffers();
42+
std::future<void> OnImportEnvironmentMapAsync(const char* filename);
43+
static void OnEnvMapImporterComplete(void* const context, ZEngine::Core::Containers::ArrayView<ZEngine::Importers::AssetImporterOutput> result);
44+
static void OnEnvMapImporterProgress(void* const, float value);
45+
static void OnEnvMapImporterError(void* const, std::string_view);
46+
static void OnEnvMapImporterLog(void* const, std::string_view);
47+
3748
/*
3849
* Editor Scene Funcs
3950
*/
@@ -60,8 +71,13 @@ namespace Tetragrama::Components
6071
static char s_save_as_input_buffer[1024];
6172
static float s_editor_scene_serializer_progress;
6273

74+
static ImVec4 s_env_map_importer_report_msg_color;
75+
static std::string s_env_map_importer_report_msg;
76+
static char s_env_map_importer_input_buffer[1024];
77+
6378
private:
6479
bool m_open_asset_importer{false};
80+
bool m_open_env_map_importer{false};
6581
bool m_open_exit{false};
6682
bool m_pending_shutdown{false};
6783
bool m_open_save_scene{false};
@@ -71,6 +87,7 @@ namespace Tetragrama::Components
7187
ImGuiWindowFlags m_window_flags;
7288
ZEngine::Importers::ImportConfiguration m_default_import_configuration;
7389
ZRawPtr(ZEngine::Importers::IAssetImporter) m_asset_importer;
90+
ZRawPtr(ZEngine::Importers::IAssetImporter) m_env_map_importer;
7491
ZRawPtr(Serializers::EditorSceneSerializer) m_editor_serializer;
7592
};
7693
} // namespace Tetragrama::Components

0 commit comments

Comments
 (0)