From 464a555101890741ad4d9c538feb37bd5b0eee45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Tue, 19 Feb 2019 22:42:46 -0800 Subject: [PATCH] texturev: Added winapi support for openFileSelectionDialog. --- scripts/texturev.lua | 1 + src/renderer_d3d12.cpp | 2 - tools/texturev/texturev.cpp | 144 ++++++++++++++++++++++++++++++++++-- 3 files changed, 140 insertions(+), 7 deletions(-) diff --git a/scripts/texturev.lua b/scripts/texturev.lua index 8d17034c6..f73a7295d 100644 --- a/scripts/texturev.lua +++ b/scripts/texturev.lua @@ -80,6 +80,7 @@ project ("texturev") configuration { "vs20* or mingw*" } links { + "comdlg32", "gdi32", "psapi", } diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 64ef576ef..77aa4c23b 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -785,8 +785,6 @@ namespace bgfx { namespace d3d12 if (SUCCEEDED(hr) ) { - uint32_t debugFlags = 0; - if (_init.debug) { #if BX_PLATFORM_WINDOWS diff --git a/tools/texturev/texturev.cpp b/tools/texturev/texturev.cpp index cd3e4d925..0fa763629 100644 --- a/tools/texturev/texturev.cpp +++ b/tools/texturev/texturev.cpp @@ -250,6 +250,75 @@ struct FileSelectionDialogType }; }; +#if BX_PLATFORM_WINDOWS +extern "C" void* __stdcall GetModuleHandleA(const char* _moduleName); +extern "C" uint32_t __stdcall GetModuleFileNameA(void* _module, char* _outFilePath, uint32_t _size); + +typedef uintptr_t (__stdcall *LPOFNHOOKPROC)(void*, uint32_t, uintptr_t, uint64_t); + +struct OPENFILENAMEA +{ + uint32_t structSize; + void* hwndOwner; + void* hinstance; + const char* filter; + const char* customFilter; + uint32_t maxCustomFilter; + uint32_t filterIndex; + const char* file; + uint32_t maxFile; + const char* fileTitle; + uint32_t maxFileTitle; + const char* initialDir; + const char* title; + uint32_t flags; + uint16_t fileOffset; + uint16_t fileExtension; + const char* defExt; + uint64_t customData; + LPOFNHOOKPROC hook; + const char* templateName; + void* reserved0; + uint32_t reserved1; + uint32_t flagsEx; +}; + +extern "C" bool __stdcall GetOpenFileNameA(OPENFILENAMEA* _ofn); + +#endif // BX_PLATFORM_WINDOWS + +class Split +{ +public: + Split(const bx::StringView& _str, char _ch) + : m_str(_str) + , m_token(_str.getPtr(), bx::strFind(_str, _ch).getPtr() ) + , m_ch(_ch) + { + } + + bx::StringView next() + { + bx::StringView result = m_token; + m_token = bx::strTrim( + bx::StringView(m_token.getTerm()+1 + , bx::strFind(bx::StringView(m_token.getTerm()+1, m_str.getTerm() ), m_ch).getPtr() ) + , " \t\n" + ); + return result; + } + + bool isDone() const + { + return m_token.isEmpty(); + } + +private: + const bx::StringView& m_str; + bx::StringView m_token; + char m_ch; +}; + bool openFileSelectionDialog( bx::FilePath& _inOutFilePath , FileSelectionDialogType::Enum _type @@ -296,6 +365,76 @@ bool openFileSelectionDialog( } } } +#elif BX_PLATFORM_WINDOWS + BX_UNUSED(_type); + + char out[bx::kMaxFilePath] = { '\0' }; + + OPENFILENAMEA ofn; + bx::memSet(&ofn, 0, sizeof(ofn) ); + ofn.structSize = sizeof(OPENFILENAMEA); + ofn.initialDir = _inOutFilePath.getCPtr(); + ofn.file = out; + ofn.maxFile = sizeof(out); + ofn.flags = 0 + | /* OFN_EXPLORER */ 0x00080000 + | /* OFN_FILEMUSTEXIST */ 0x00001000 + | /* OFN_DONTADDTORECENT */ 0x02000000 + ; + + char tmp[4096]; + bx::StaticMemoryBlockWriter writer(tmp, sizeof(tmp) ); + + bx::Error err; + + ofn.title = tmp; + bx::write(&writer, &err, "%.*s", _title.getLength(), _title.getPtr() ); + bx::write(&writer, '\0', &err); + + ofn.filter = tmp + uint32_t(bx::seek(&writer) ); + + for (bx::LineReader lr(_filter); !lr.isDone() && err.isOk();) + { + const bx::StringView line = lr.next(); + const bx::StringView sep = bx::strFind(line, '|'); + + if (!sep.isEmpty() ) + { + bx::write(&writer, bx::strTrim(bx::StringView(line.getPtr(), sep.getPtr() ), " "), &err); + bx::write(&writer, '\0', &err); + + bool first = true; + + for (Split split(bx::strTrim(bx::StringView(sep.getPtr()+1, line.getTerm() ), " "), ' '); !split.isDone() && err.isOk();) + { + const bx::StringView token = split.next(); + if (!first) + { + bx::write(&writer, ';', &err); + } + + first = false; + bx::write(&writer, token, &err); + } + + bx::write(&writer, '\0', &err); + } + else + { + bx::write(&writer, line, &err); + bx::write(&writer, '\0', &err); + bx::write(&writer, '\0', &err); + } + } + + bx::write(&writer, '\0', &err); + + if (err.isOk() + && GetOpenFileNameA(&ofn) ) + { + _inOutFilePath.set(ofn.file); + return true; + } #else BX_UNUSED(_inOutFilePath, _type, _title, _filter); #endif // BX_PLATFORM_LINUX || BX_PLATFORM_OSX @@ -1177,11 +1316,6 @@ void keyBindingHelp(const char* _bindings, const char* _description) ImGui::Text(_description); } -#if BX_PLATFORM_WINDOWS -extern "C" void* _stdcall GetModuleHandleA(const char* _moduleName); -extern "C" uint32_t _stdcall GetModuleFileNameA(void* _module, char* _outFilePath, uint32_t _size); -#endif // BX_PLATFORM_WINDOWS - void associate() { #if BX_PLATFORM_WINDOWS