diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 14e64e707f..fce00f3817 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -15,7 +15,11 @@ option(BUILD_EXTENSION_COCOSTUDIO "Build extension cocostudio" ON) option(BUILD_EXTENSION_FAIRYGUI "Build extension FairyGUI" ON) -option(BUILD_EXTENSION_IMGUIEXT "Build extension ImGuiEXT" OFF) +if(WINDOWS OR MACOSX) + option(BUILD_EXTENSION_IMGUIEXT "Build extension ImGuiEXT" ON) +else() + set(BUILD_EXTENSION_IMGUIEXT OFF) +endif() function(setup_cocos_extension_config target_name) if(ANDROID) diff --git a/extensions/ImGuiEXT/CCImGuiEXT.cpp b/extensions/ImGuiEXT/CCImGuiEXT.cpp index 73e53332af..6e52d69534 100644 --- a/extensions/ImGuiEXT/CCImGuiEXT.cpp +++ b/extensions/ImGuiEXT/CCImGuiEXT.cpp @@ -1,5 +1,7 @@ #include "CCImGuiEXT.h" +#include #include "imgui_impl_cocos2dx.h" +#include "imgui_internal.h" NS_CC_EXT_BEGIN @@ -125,17 +127,6 @@ public: static ImGuiEXT* _instance = nullptr; std::function ImGuiEXT::_onInit; -void ImGuiEXT::init() -{ - ImGui_ImplCocos2dx_Init(true); - - ImGui::StyleColorsClassic(); - - auto eventDispatcher = Director::getInstance()->getEventDispatcher(); - eventDispatcher->addCustomEventListener(Director::EVENT_BEFORE_DRAW, [=](EventCustom*) { beginFrame(); }); - eventDispatcher->addCustomEventListener(Director::EVENT_AFTER_VISIT, [=](EventCustom*) { endFrame(); }); -} - ImGuiEXT* ImGuiEXT::getInstance() { if (_instance == nullptr) @@ -152,21 +143,64 @@ void ImGuiEXT::destroyInstance() { if (_instance) { - auto eventDispatcher = Director::getInstance()->getEventDispatcher(); - eventDispatcher->removeCustomEventListeners(Director::EVENT_AFTER_VISIT); - eventDispatcher->removeCustomEventListeners(Director::EVENT_BEFORE_DRAW); - - ImGui_ImplCocos2dx_Shutdown(); + _instance->cleanup(); delete _instance; _instance = nullptr; } } +void ImGuiEXT::init() +{ + ImGui_ImplCocos2dx_Init(true); + ImGui_ImplCocos2dx_SetCustomFontLoader(&ImGuiEXT::loadCustomFonts, this); + + ImGui::StyleColorsClassic(); + + auto eventDispatcher = Director::getInstance()->getEventDispatcher(); + eventDispatcher->addCustomEventListener(Director::EVENT_BEFORE_DRAW, [=](EventCustom*) { beginFrame(); }); + eventDispatcher->addCustomEventListener(Director::EVENT_AFTER_VISIT, [=](EventCustom*) { endFrame(); }); +} + +void ImGuiEXT::cleanup() +{ + auto eventDispatcher = Director::getInstance()->getEventDispatcher(); + eventDispatcher->removeCustomEventListeners(Director::EVENT_AFTER_VISIT); + eventDispatcher->removeCustomEventListeners(Director::EVENT_BEFORE_DRAW); + + ImGui_ImplCocos2dx_SetCustomFontLoader(nullptr, nullptr); + ImGui_ImplCocos2dx_Shutdown(); + + CC_SAFE_RELEASE_NULL(_fontsTexture); +} + void ImGuiEXT::setOnInit(const std::function& callBack) { _onInit = callBack; } +void ImGuiEXT::loadCustomFonts(void* ud) +{ + auto thiz = (ImGuiEXT*)ud; + + auto imFonts = ImGui::GetIO().Fonts; + imFonts->Clear(); + + auto contentZoomFactor = thiz->_contentZoomFactor; + for (auto& fontInfo : thiz->_fontsInfoMap) { + const ImWchar* imChars = nullptr; + switch (fontInfo.second.glyphRange) { + case CHS_GLYPH_RANGE::GENERAL: + imChars = imFonts->GetGlyphRangesChineseSimplifiedCommon(); + break; + case CHS_GLYPH_RANGE::FULL: + imChars = imFonts->GetGlyphRangesChineseFull(); + break; + } + + imFonts->AddFontFromFileTTF(fontInfo.first.c_str(), fontInfo.second.fontSize * contentZoomFactor, nullptr, imChars); + } +} + float ImGuiEXT::scaleAllByDPI(float userScale) { // Gets scale @@ -186,7 +220,7 @@ float ImGuiEXT::scaleAllByDPI(float userScale) } // Destory font informations, let implcocos2dx recreate at newFrame - ImGui_ImplCocos2dx_DestroyDeviceObjects(); + ImGui_ImplCocos2dx_SetDeviceObjectsDirty(); ImGui::GetStyle().ScaleAllSizes(zoomFactor); @@ -198,23 +232,28 @@ float ImGuiEXT::scaleAllByDPI(float userScale) void ImGuiEXT::addFont(const std::string& fontFile, float fontSize, CHS_GLYPH_RANGE glyphRange) { - auto imFonts = ImGui::GetIO().Fonts; - const ImWchar* imChars = nullptr; - switch (glyphRange) { - case CHS_GLYPH_RANGE::GENERAL: - imChars = imFonts->GetGlyphRangesChineseSimplifiedCommon(); - break; - case CHS_GLYPH_RANGE::FULL: - imChars = imFonts->GetGlyphRangesChineseFull(); - break; + if (FileUtils::getInstance()->isFileExistInternal(fontFile)) { + _fontsInfoMap.emplace(fontFile, FontInfo{ fontSize, glyphRange }); } - imFonts->AddFontFromFileTTF(fontFile.c_str(), fontSize * _contentZoomFactor, nullptr, imChars); + ImGui_ImplCocos2dx_SetDeviceObjectsDirty(); +} + +void ImGuiEXT::removeFont(const std::string& fontFile) +{ + auto count = _fontsInfoMap.size(); + _fontsInfoMap.erase(fontFile); + if(count != _fontsInfoMap.size()) + ImGui_ImplCocos2dx_SetDeviceObjectsDirty(); } void ImGuiEXT::clearFonts() { - ImGui::GetIO().Fonts->Clear(); + _fontsInfoMap.clear(); + ImGui_ImplCocos2dx_SetDeviceObjectsDirty(); + + // auto drawData = ImGui::GetDrawData(); + // if(drawData) drawData->Clear(); } /* @@ -222,22 +261,39 @@ void ImGuiEXT::clearFonts() */ void ImGuiEXT::beginFrame() { - // create frame - ImGui_ImplCocos2dx_NewFrame(); + if (!_renderPiplines.empty()) { + // create frame + ImGui_ImplCocos2dx_NewFrame(); - // draw all gui - this->update(); + // move to endFrame? + _fontsTexture = (Texture2D*)ImGui_ImplCocos2dx_GetFontsTexture(); + assert(_fontsTexture != nullptr); + _fontsTexture->retain(); - // render - ImGui::Render(); + // draw all gui + this->update(); + + ++_beginFrames; + } } /* * flush ImGui draw data to engine */ void ImGuiEXT::endFrame() { - ImGui_ImplCocos2dx_RenderDrawData(ImGui::GetDrawData()); - ImGui_ImplCocos2dx_RenderPlatform(); + if (_beginFrames > 0) { + // render + ImGui::Render(); + + auto drawData = ImGui::GetDrawData(); + if (drawData) + ImGui_ImplCocos2dx_RenderDrawData(drawData); + + ImGui_ImplCocos2dx_RenderPlatform(); + --_beginFrames; + + CC_SAFE_RELEASE_NULL(_fontsTexture); + } } void ImGuiEXT::update() @@ -284,6 +340,23 @@ void ImGuiEXT::removeRenderLoop(const std::string& id) delete tracker; _renderPiplines.erase(iter); } + + if (_renderPiplines.empty()) + deactiveImGuiViewports(); +} + +void ImGuiEXT::deactiveImGuiViewports() { + ImGuiContext& g = *GImGui; + if (!(g.ConfigFlagsCurrFrame & ImGuiConfigFlags_ViewportsEnable)) + return; + + // Create/resize/destroy platform windows to match each active viewport. + // Skip the main viewport (index 0), which is always fully handled by the application! + for (int i = 1; i < g.Viewports.Size; i++) + { + ImGuiViewportP* viewport = g.Viewports[i]; + viewport->Window->Active = false; + } } static std::tuple getTextureUV(Sprite* sp) diff --git a/extensions/ImGuiEXT/CCImGuiEXT.h b/extensions/ImGuiEXT/CCImGuiEXT.h index d8444ec5f4..e69e4b716d 100644 --- a/extensions/ImGuiEXT/CCImGuiEXT.h +++ b/extensions/ImGuiEXT/CCImGuiEXT.h @@ -1,10 +1,12 @@ #pragma once +#include +#include + #include "cocos2d.h" #include "ExtensionMacros.h" #include "imgui/imgui.h" -#include // #define HAVE_IMGUI_MARKDOWN 1 @@ -15,6 +17,7 @@ class ImGuiEXT { friend class ImGuiEXTRenderer; void init(); + void cleanup(); public: enum class CHS_GLYPH_RANGE { @@ -46,6 +49,7 @@ public: /// /// void addFont(const std::string& fontFile, float fontSize = DEFAULT_FONT_SIZE, CHS_GLYPH_RANGE glyphRange = CHS_GLYPH_RANGE::NONE); + void removeFont(const std::string& fontFile); void clearFonts(); /// @@ -128,11 +132,15 @@ public: #endif private: + static void loadCustomFonts(void*); + // perform draw ImGui stubs void beginFrame(); void update(); void endFrame(); + static void deactiveImGuiViewports(); + private: static std::function _onInit; @@ -149,6 +157,17 @@ private: std::unordered_map> glyphRanges; float _contentZoomFactor = 1.0f; + + int64_t _beginFrames = 0; + + Texture2D* _fontsTexture = nullptr; + + struct FontInfo { + float fontSize; + CHS_GLYPH_RANGE glyphRange; + }; + + std::unordered_map _fontsInfoMap; }; NS_CC_EXT_END diff --git a/extensions/ImGuiEXT/imgui_impl_cocos2dx.cpp b/extensions/ImGuiEXT/imgui_impl_cocos2dx.cpp index fd8454dc36..af561e1b1f 100644 --- a/extensions/ImGuiEXT/imgui_impl_cocos2dx.cpp +++ b/extensions/ImGuiEXT/imgui_impl_cocos2dx.cpp @@ -51,12 +51,16 @@ static GLFWcharfun g_PrevUserCallbackChar = nullptr; static GLFWmonitorfun g_PrevUserCallbackMonitor = nullptr; +static ImGuiImplCocos2dxLoadFontFun g_loadCustomFont = nullptr; +static void* g_loadCustomFontUserData = nullptr; // Forward Declarations static void ImGui_ImplGlfw_InitPlatformInterface(); static void ImGui_ImplGlfw_ShutdownPlatformInterface(); static void ImGui_ImplGlfw_UpdateMonitors(); +static bool ImGui_ImplCocos2dx_createShaderPrograms(); + #endif // CC_PLATFORM_PC // fps macro @@ -78,6 +82,7 @@ struct ProgramInfo }; static ProgramInfo g_ProgramInfo; static ProgramInfo g_ProgramFontInfo; +static bool g_fontDeviceObjectsDirty = false; static Texture2D* g_FontTexture = nullptr; static Mat4 g_Projection; constexpr IndexFormat g_IndexFormat = sizeof(ImDrawIdx) == 2 ? IndexFormat::U_SHORT : IndexFormat::U_INT; @@ -367,39 +372,42 @@ void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor*, int) #endif -bool ImGui_ImplCocos2dx_CreateFontsTexture() +void ImGui_ImplCocos2dx_SetCustomFontLoader(ImGuiImplCocos2dxLoadFontFun fun, void* userdata) { - // Build texture atlas - ImGuiIO& io = ImGui::GetIO(); - unsigned char* pixels; - int width, height; - // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) - // because it is more likely to be compatible with user's existing shaders. - // If your ImTextureId represent a higher-level concept than just a GL texture id, - // consider calling GetTexDataAsAlpha8() instead to save on GPU memory. - io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height); - - CC_SAFE_RELEASE(g_FontTexture); - g_FontTexture = new Texture2D(); - - g_FontTexture->setAntiAliasTexParameters(); - g_FontTexture->initWithData(pixels, width*height, - backend::PixelFormat::A8, width, height, Size(width, height)); - io.Fonts->TexID = (ImTextureID)g_FontTexture; - return true; + g_loadCustomFont = fun; + g_loadCustomFontUserData = userdata; } -void ImGui_ImplCocos2dx_DestroyFontsTexture() +void* ImGui_ImplCocos2dx_GetFontsTexture() { - if (g_FontTexture) - { - ImGui::GetIO().Fonts->TexID = nullptr; - CC_SAFE_DELETE(g_FontTexture); - } + return g_FontTexture; +} + +void ImGui_ImplCocos2dx_SetDeviceObjectsDirty() +{ + g_fontDeviceObjectsDirty = true; } bool ImGui_ImplCocos2dx_CreateDeviceObjects() { + if (g_loadCustomFont) + g_loadCustomFont(g_loadCustomFontUserData); + + ImGui_ImplCocos2dx_createShaderPrograms(); + ImGui_ImplCocos2dx_CreateFontsTexture(); + + g_fontDeviceObjectsDirty = false; + return true; +} + +void ImGui_ImplCocos2dx_DestroyDeviceObjects() +{ + CC_SAFE_RELEASE_NULL(g_ProgramInfo.program); + CC_SAFE_RELEASE_NULL(g_ProgramFontInfo.program); + ImGui_ImplCocos2dx_DestroyFontsTexture(); +} + +static bool ImGui_ImplCocos2dx_createShaderPrograms() { static auto vertex_shader = "uniform mat4 u_MVPMatrix;\n" "attribute vec2 a_position;\n" @@ -470,15 +478,38 @@ bool ImGui_ImplCocos2dx_CreateDeviceObjects() layout.setLayout(sizeof(ImDrawVert)); } - ImGui_ImplCocos2dx_CreateFontsTexture(); - return true; + return true; } -void ImGui_ImplCocos2dx_DestroyDeviceObjects() +bool ImGui_ImplCocos2dx_CreateFontsTexture() { - CC_SAFE_RELEASE_NULL(g_ProgramInfo.program); - CC_SAFE_RELEASE_NULL(g_ProgramFontInfo.program); - ImGui_ImplCocos2dx_DestroyFontsTexture(); + // Build texture atlas + ImGuiIO& io = ImGui::GetIO(); + unsigned char* pixels; + int width, height; + // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) + // because it is more likely to be compatible with user's existing shaders. + // If your ImTextureId represent a higher-level concept than just a GL texture id, + // consider calling GetTexDataAsAlpha8() instead to save on GPU memory. + io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height); + + CC_SAFE_RELEASE(g_FontTexture); + g_FontTexture = new Texture2D(); + + g_FontTexture->setAntiAliasTexParameters(); + g_FontTexture->initWithData(pixels, width * height, + backend::PixelFormat::A8, width, height, Size(width, height)); + io.Fonts->TexID = (ImTextureID)g_FontTexture; + return true; +} + +void ImGui_ImplCocos2dx_DestroyFontsTexture() +{ + if (g_FontTexture) + { + ImGui::GetIO().Fonts->TexID = nullptr; + CC_SAFE_RELEASE_NULL(g_FontTexture); + } } //-------------------------------------------------------------------------------------------------------- @@ -962,6 +993,11 @@ void ImGui_ImplCocos2dx_NewFrame() if (!g_FontTexture) ImGui_ImplCocos2dx_CreateDeviceObjects(); + else if(g_fontDeviceObjectsDirty) + { // recreate device objects, fonts also should be device objects + ImGui_ImplCocos2dx_DestroyDeviceObjects(); + ImGui_ImplCocos2dx_CreateDeviceObjects(); + } ImGuiIO& io = ImGui::GetIO(); IM_ASSERT(io.Fonts->IsBuilt() && diff --git a/extensions/ImGuiEXT/imgui_impl_cocos2dx.h b/extensions/ImGuiEXT/imgui_impl_cocos2dx.h index d831b03893..a546d60d9b 100644 --- a/extensions/ImGuiEXT/imgui_impl_cocos2dx.h +++ b/extensions/ImGuiEXT/imgui_impl_cocos2dx.h @@ -1,6 +1,8 @@ #pragma once #include "imgui/imgui.h" +typedef void (*ImGuiImplCocos2dxLoadFontFun)(void* userdata); + IMGUI_IMPL_API bool ImGui_ImplCocos2dx_Init(bool install_callbacks); IMGUI_IMPL_API void ImGui_ImplCocos2dx_Shutdown(); IMGUI_IMPL_API void ImGui_ImplCocos2dx_NewFrame(); @@ -8,7 +10,18 @@ IMGUI_IMPL_API void ImGui_ImplCocos2dx_RenderDrawData(ImDrawData* draw_data) IMGUI_IMPL_API void ImGui_ImplCocos2dx_RenderPlatform(); // Called by Init/NewFrame/Shutdown +// TODO: maybe hide for internal use only IMGUI_IMPL_API bool ImGui_ImplCocos2dx_CreateDeviceObjects(); IMGUI_IMPL_API void ImGui_ImplCocos2dx_DestroyDeviceObjects(); + +// TODO: check whether needs public this API IMGUI_IMPL_API bool ImGui_ImplCocos2dx_CreateFontsTexture(); IMGUI_IMPL_API void ImGui_ImplCocos2dx_DestroyFontsTexture(); + + +// Get FontTexture object cocos2d::Texture2D* +IMGUI_IMPL_API void ImGui_ImplCocos2dx_SetCustomFontLoader(ImGuiImplCocos2dxLoadFontFun fun, void* userdata); +IMGUI_IMPL_API void* ImGui_ImplCocos2dx_GetFontsTexture(); + +// Sets Device objects dirty +IMGUI_IMPL_API void ImGui_ImplCocos2dx_SetDeviceObjectsDirty(); diff --git a/tests/cpp-tests/Classes/AppDelegate.cpp b/tests/cpp-tests/Classes/AppDelegate.cpp index ad6b543c50..5075470ac3 100644 --- a/tests/cpp-tests/Classes/AppDelegate.cpp +++ b/tests/cpp-tests/Classes/AppDelegate.cpp @@ -65,7 +65,7 @@ bool AppDelegate::applicationDidFinishLaunching() auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { - glview = GLViewImpl::create("Cpp Tests"); + glview = GLViewImpl::createWithRect("Cpp Tests", Rect(0, 0, 1280, 720)); director->setOpenGLView(glview); } @@ -80,7 +80,7 @@ bool AppDelegate::applicationDidFinishLaunching() if (screenSize.height > 320) { - auto resourceSize = Size(960, 640); + auto resourceSize = Size(1280, 720); searchPaths.push_back("hd"); searchPaths.push_back("ccs-res/hd"); searchPaths.push_back("ccs-res"); diff --git a/tests/cpp-tests/Classes/ImGuiEXTTest/ImGuiEXTTest.cpp b/tests/cpp-tests/Classes/ImGuiEXTTest/ImGuiEXTTest.cpp new file mode 100644 index 0000000000..1bc36850a5 --- /dev/null +++ b/tests/cpp-tests/Classes/ImGuiEXTTest/ImGuiEXTTest.cpp @@ -0,0 +1,69 @@ +#include "platform/CCPlatformConfig.h" +#include "ImGuiEXTTest.h" + +#include "ImGuiEXT/CCImGuiEXT.h" + +USING_NS_CC; +USING_NS_CC_EXT; + +#if defined(CC_PLATFORM_PC) + +static bool show_test_window = true; +static bool show_another_window = false; +static ImVec4 clear_color = ImColor(114, 144, 154); + +ImGuiEXTTests::ImGuiEXTTests() +{ + ADD_TEST_CASE(ImGuiEXTTest); +} + +void ImGuiEXTTest::onEnter() +{ + TestCase::onEnter(); + + ImGuiEXT::getInstance()->addFont(FileUtils::getInstance()->fullPathForFilename("fonts/arial.ttf")); + ImGuiEXT::getInstance()->addRenderLoop("#test", CC_CALLBACK_0(ImGuiEXTTest::onDrawImGui, this), this); +} + +void ImGuiEXTTest::onExit() +{ + ImGuiEXT::getInstance()->removeRenderLoop("#test"); + ImGuiEXT::getInstance()->clearFonts(); + + ImGuiEXT::destroyInstance(); + + TestCase::onExit(); +} + +void ImGuiEXTTest::onDrawImGui() +{ + // 1. Show a simple window + // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug" + { + static float f = 0.0f; + ImGui::Text("Hello, world!"); + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); + ImGui::ColorEdit3("clear color", (float*)&clear_color); + if (ImGui::Button("Test Window")) show_test_window ^= 1; + if (ImGui::Button("Another Window")) show_another_window ^= 1; + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + } + + // 2. Show another simple window, this time using an explicit Begin/End pair + if (show_another_window) + { + ImGui::SetNextWindowSize(ImVec2(200, 100), ImGuiCond_FirstUseEver); + ImGui::Begin("Another Window", &show_another_window); + + ImGui::Text("Hello"); + ImGui::End(); + } + + // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow() + if (show_test_window) + { + ImGui::ShowDemoWindow(); + } +} + +#endif diff --git a/tests/cpp-tests/Classes/ImGuiEXTTest/ImGuiEXTTest.h b/tests/cpp-tests/Classes/ImGuiEXTTest/ImGuiEXTTest.h new file mode 100644 index 0000000000..32a25f9c59 --- /dev/null +++ b/tests/cpp-tests/Classes/ImGuiEXTTest/ImGuiEXTTest.h @@ -0,0 +1,50 @@ +/**************************************************************************** + Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. + Copyright (c) 2020 c4games.com + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef _IMGUIEXT_TEST_H_ +#define _IMGUIEXT_TEST_H_ + +#include "cocos2d.h" +#include "../BaseTest.h" + +#if defined(CC_PLATFORM_PC) + +DEFINE_TEST_SUITE(ImGuiEXTTests); + +class ImGuiEXTTest : public TestCase +{ +public: + CREATE_FUNC(ImGuiEXTTest); + + std::string title() const { return "ImGuiEXT Test"; } + + void onEnter() override; + void onDrawImGui(); + void onExit() override; +}; + +#endif + +#endif // _CURL_TEST_H_ diff --git a/tests/cpp-tests/Classes/controller.cpp b/tests/cpp-tests/Classes/controller.cpp index 6916288c41..64e127403d 100644 --- a/tests/cpp-tests/Classes/controller.cpp +++ b/tests/cpp-tests/Classes/controller.cpp @@ -44,6 +44,9 @@ public: RootTests() { // addTest("Node: Scene3D", [](){return new (std::nothrow) Scene3DTests(); }); +#if defined(CC_PLATFORM_PC) + addTest("ImGuiEXT", []() {return new ImGuiEXTTests(); }); +#endif addTest("Texture2D", []() {return new Texture2DTests(); }); addTest("ActionManager", [](){return new (std::nothrow) ActionManagerTests(); }); addTest("Actions - Basic", [](){ return new (std::nothrow) ActionsTests(); }); diff --git a/tests/cpp-tests/Classes/tests.h b/tests/cpp-tests/Classes/tests.h index 25af534fdf..47d7b89856 100644 --- a/tests/cpp-tests/Classes/tests.h +++ b/tests/cpp-tests/Classes/tests.h @@ -119,4 +119,7 @@ #include "ZwoptexTest/ZwoptexTest.h" #include "SpriteFrameCacheTest/SpriteFrameCacheTest.h" #include "ZipTest/ZipTests.h" +#if defined(CC_PLATFORM_PC) +#include "ImGuiEXTTest/ImGuiEXTTest.h" +#endif #endif