Pārlūkot izejas kodu

feat: 添加自动化测试管理模块,无需修改 main 中 TestApp 的类型,直接通过 Manager 自动注册、手动选择即可

NiceTry12138 10 mēneši atpakaļ
vecāks
revīzija
3d61c4804d
17 mainītis faili ar 215 papildinājumiem un 19 dzēšanām
  1. 2 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/OpenGLDemo.vcxproj
  2. 6 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/OpenGLDemo.vcxproj.filters
  3. 15 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/imgui.ini
  4. 3 18
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/main.cpp
  5. 12 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestBase.cpp
  6. 5 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestBase.h
  7. 3 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestCamera.cpp
  8. 6 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestCamera.h
  9. 5 1
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestClearColor.cpp
  10. 5 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestClearColor.h
  11. 2 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestLight.cpp
  12. 5 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestLight.h
  13. 108 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestModuleManager.cpp
  14. 29 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestModuleManager.h
  15. 2 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestPosition.cpp
  16. 5 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestPosition.h
  17. 2 0
      图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestWithMouseBase.h

+ 2 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/OpenGLDemo.vcxproj

@@ -133,6 +133,7 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="src\testModule\TestModuleManager.cpp" />
     <ClCompile Include="src\testModule\TestWithMouseBase.cpp" />
     <ClCompile Include="src\Util\Camera.cpp" />
     <ClCompile Include="src\testModule\TestCamera.cpp" />
@@ -157,6 +158,7 @@
     <ClCompile Include="src\Util\Texture.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="src\testModule\TestModuleManager.h" />
     <ClInclude Include="src\testModule\TestWithMouseBase.h" />
     <ClInclude Include="src\Util\Camera.h" />
     <ClInclude Include="src\testModule\TestCamera.h" />

+ 6 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/OpenGLDemo.vcxproj.filters

@@ -81,6 +81,9 @@
     <ClCompile Include="src\testModule\TestWithMouseBase.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="src\testModule\TestModuleManager.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="src\third\imgui\imstb_truetype.h">
@@ -998,6 +1001,9 @@
     <ClInclude Include="src\testModule\TestWithMouseBase.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="src\testModule\TestModuleManager.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="res\shader\TextPosition\Vertex.vert" />

+ 15 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/imgui.ini

@@ -8,3 +8,18 @@ Pos=356,21
 Size=339,117
 Collapsed=0
 
+[Window][Common Test Title]
+Pos=5,5
+Size=174,184
+Collapsed=0
+
+[Window][ClearColor]
+Pos=330,30
+Size=339,117
+Collapsed=0
+
+[Window][Rotate]
+Pos=422,11
+Size=351,197
+Collapsed=0
+

+ 3 - 18
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/main.cpp

@@ -11,10 +11,7 @@
 
 #include "Util/RenderSettings.h"
 
-#include "testModule/TestClearColor.h"
-#include "testModule/TestPosition.h"
-#include "testModule/TestCamera.h"
-#include "testModule/TestLight.h"
+#include "testModule/TestModuleManager.h"
 
 
 // 定义回调函数
@@ -108,13 +105,6 @@ int main()
 
     InitImGUI(window);
 
-    //TestClearColor TestApp;
-    //TestPosition TestApp;
-    //TestCamera TestApp;
-    TestLight TestApp;
-
-    TestApp.OnEnter(window);
-
     auto prevTime = std::chrono::high_resolution_clock::now();
 
     glEnable(GL_BLEND);
@@ -127,18 +117,13 @@ int main()
         float deltaTime = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - prevTime).count() / 1000.0f;
         prevTime = std::move(currentTime);
 
-        TestApp.InputProcess(window);
-        TestApp.Update(window, deltaTime);
-
-        TestApp.ClearRender(window);
-        TestApp.RenderImGUI(window);
-        TestApp.Render(window);
+        TestModuleManager::GetInstance()->Update(window, deltaTime);
 
         glfwSwapBuffers(window);    // 交换缓冲区
         glfwPollEvents();           // 检查触发的事件
     }
 
-    TestApp.OnExit(window);
+    //TestApp.OnExit(window);
 
     glfwTerminate();
 	return 0;

+ 12 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestBase.cpp

@@ -1,4 +1,11 @@
 #include "TestBase.h"
+#include "TestModuleManager.h"
+
+TestBase::TestBase(const std::string& TestModuleName)
+{
+	m_TestModuleName = TestModuleName;
+	TestModuleManager::GetInstance()->AddTestModule(m_TestModuleName, this);
+}
 
 void TestBase::OnEnter(GLFWwindow* window)
 {
@@ -30,6 +37,11 @@ void TestBase::RenderImGUI(GLFWwindow* window)
 	ImGui_ImplGlfw_NewFrame();
 	ImGui::NewFrame();
 
+	ImGui::Begin("Common Test Title");
+	if (ImGui::Button("Back Test"))
+		TestModuleManager::GetInstance()->NoSelectTestModule(window);
+	ImGui::End();
+
 	UpdateImGUI(window);
 
 	// 绘制 ImGUI

+ 5 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestBase.h

@@ -5,6 +5,8 @@
 class TestBase
 {
 public:
+	TestBase(const std::string& TestModuleName);
+
 	virtual ~TestBase() = default;
 
 	// 进入测试 初始化逻辑
@@ -31,5 +33,8 @@ public:
 
 	// 输出监听事件
 	virtual void InputProcess(GLFWwindow* window);
+
+protected:
+	std::string m_TestModuleName;
 };
 

+ 3 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestCamera.cpp

@@ -1,5 +1,8 @@
 #include "TestCamera.h"
 #include "../Util/RenderSettings.h"
+#include "TestModuleManager.h"
+
+TestCamera TestCamera::_self;
 
 void TestCamera::OnEnter(GLFWwindow* window)
 {

+ 6 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestCamera.h

@@ -7,6 +7,9 @@
 
 class TestCamera : public TestBase
 {
+public:
+	TestCamera() : TestBase("TestCamera") {}
+
 public:
 	virtual void OnEnter(GLFWwindow* window) override;
 	virtual void OnExit(GLFWwindow* window) override;
@@ -59,5 +62,8 @@ private:
 	bool m_isFirstMouse = true;			// 防止鼠标进入捕获状态时 突然闪烁
 
 	bool m_bLeftAltPress = false;
+
+private:
+	static TestCamera _self;			// 静态对象 编译时构造 自动注册
 };
 

+ 5 - 1
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestClearColor.cpp

@@ -1,4 +1,7 @@
 #include "TestClearColor.h"
+#include "TestModuleManager.h"
+
+TestClearColor TestClearColor::_self;
 
 void TestClearColor::OnEnter(GLFWwindow* window)
 {
@@ -7,7 +10,8 @@ void TestClearColor::OnEnter(GLFWwindow* window)
 
 void TestClearColor::OnExit(GLFWwindow* window)
 {
-
+	glClearColor(0.0f, 0.0f , 0.0f, 1.0f);
+	glClear(GL_COLOR_BUFFER_BIT);
 }
 
 void TestClearColor::UpdateLogic(float delayTime)

+ 5 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestClearColor.h

@@ -3,6 +3,9 @@
 
 class TestClearColor : public TestBase
 {
+public:
+	TestClearColor() : TestBase("TestClearColor") {}
+
 public:
 	virtual void OnEnter(GLFWwindow* window) override;
 	virtual void OnExit(GLFWwindow* window) override;
@@ -17,5 +20,7 @@ private:
 	bool m_UseImGUI = true;
 
 	bool m_IsAdd = true;
+
+	static TestClearColor _self;
 };
 

+ 2 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestLight.cpp

@@ -1,6 +1,8 @@
 #include "TestLight.h"
 #include "../Util/RenderSettings.h"
 
+TestLight TestLight::_self;
+
 void TestLight::OnEnter(GLFWwindow* window)
 {
 	//					 坐标					颜色						UV 坐标			贴图序号

+ 5 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestLight.h

@@ -8,6 +8,9 @@
 
 class TestLight : public TestWithMouseBase
 {
+public:
+	TestLight() : TestWithMouseBase("TestLight") {}
+
 public:
 	virtual void OnEnter(GLFWwindow* window) override;
 	virtual void OnExit(GLFWwindow* window) override;
@@ -46,5 +49,7 @@ private:
 
 	Camera m_Camera;
 	bool m_bLeftAltPress = false;
+
+	static TestLight _self;
 };
 

+ 108 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestModuleManager.cpp

@@ -0,0 +1,108 @@
+#include "TestModuleManager.h"
+
+void TestModuleManager::AddTestModule(const std::string& Title, TestBase* TestModule)
+{
+	if (m_TestModules.find(Title) != m_TestModules.end())
+	{
+		std::cout << "Error: Had Added TestModule. Title = " << Title << std::endl;
+		return;
+	}
+
+	m_TestModules[Title] = TestModule;
+}
+
+void TestModuleManager::NoSelectTestModule(GLFWwindow* window)
+{
+	auto TestModule = FindTestModule(m_CurrentTitle);
+	if (TestModule)
+	{
+		TestModule->OnExit(window);
+	}
+	m_CurrentTitle.clear();
+}
+
+void TestModuleManager::OnEnter(GLFWwindow* window)
+{
+}
+
+void TestModuleManager::OnExit(GLFWwindow* window)
+{
+	auto TestModule = FindTestModule(m_CurrentTitle);
+	if (TestModule == nullptr)
+	{
+		return;
+	}
+	TestModule->OnExit(window);
+}
+
+void TestModuleManager::Update(GLFWwindow* window, float deltaTime)
+{
+	if (m_CurrentTitle.empty()) {
+		RenderImGUI(window, deltaTime);
+	}
+	else {
+		TestModuleRun(window, deltaTime);
+	}
+}
+
+TestBase* TestModuleManager::FindTestModule(const std::string& Title)
+{
+	if (m_TestModules.find(Title) != m_TestModules.end())
+	{
+		return m_TestModules[Title];
+	}
+
+	return nullptr;
+}
+
+void TestModuleManager::RenderImGUI(GLFWwindow* window, float deltaTime)
+{
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	// 设置 ImGUI 新一帧
+	ImGui_ImplOpenGL3_NewFrame();
+	ImGui_ImplGlfw_NewFrame();
+	ImGui::NewFrame();
+
+	ImGui::Begin("Common Test Title");
+	for (const auto& Item : m_TestModules)
+	{
+		if (ImGui::Button(Item.first.c_str()))
+		{
+			SelectTestModule(Item.first, window);
+		}
+	}
+	ImGui::End();
+
+	// 绘制 ImGUI
+	ImGui::Render();
+	ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
+}
+
+void TestModuleManager::SelectTestModule(const std::string& Title, GLFWwindow* window)
+{
+	m_CurrentTitle = Title;
+	auto TestModule = FindTestModule(Title);
+	if (TestModule == nullptr)
+	{
+		return;
+	}
+
+	TestModule->OnEnter(window);
+}
+
+void TestModuleManager::TestModuleRun(GLFWwindow* window, float deltaTime)
+{
+	auto TestModule = FindTestModule(m_CurrentTitle);
+	if (TestModule == nullptr)
+	{
+		return;
+	}
+
+	TestModule->InputProcess(window);
+	TestModule->Update(window, deltaTime);
+
+	TestModule->ClearRender(window);
+	TestModule->RenderImGUI(window);
+	TestModule->Render(window);
+}

+ 29 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestModuleManager.h

@@ -0,0 +1,29 @@
+#pragma once
+
+#include "../Util/CommonHead.h"
+#include "../Util/UtilTemplate.h"
+#include "TestBase.h"
+
+class TestModuleManager : public Instance<TestModuleManager>
+{
+public:
+	void AddTestModule(const std::string& Title, TestBase* TestModule);
+	void NoSelectTestModule(GLFWwindow* window);
+	
+	void OnEnter(GLFWwindow* window);
+	void OnExit(GLFWwindow* window);
+	void Update(GLFWwindow* window, float deltaTime);
+
+protected:
+	TestBase* FindTestModule(const std::string& Title);
+
+	void RenderImGUI(GLFWwindow* window, float deltaTime);
+	void SelectTestModule(const std::string& Title, GLFWwindow* window);
+
+	void TestModuleRun(GLFWwindow* window, float deltaTime);
+
+private:
+	std::string m_CurrentTitle;
+	std::map<std::string, TestBase*> m_TestModules;
+};
+

+ 2 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestPosition.cpp

@@ -1,6 +1,8 @@
 #include "TestPosition.h"
 #include "../Util/RenderSettings.h"
 
+TestPosition TestPosition::_self;
+
 void TestPosition::OnEnter(GLFWwindow* window)
 {
 	//					 坐标					颜色						UV 坐标			贴图序号

+ 5 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestPosition.h

@@ -7,6 +7,9 @@
 
 class TestPosition : public TestBase
 {
+public:
+	TestPosition() : TestBase("TestPosition") {}
+
 public:
 	virtual void OnEnter(GLFWwindow* window) override;
 	virtual void OnExit(GLFWwindow* window) override;
@@ -39,5 +42,7 @@ private:
 	bool m_RotateX = true;
 	bool m_RotateY = false;
 	bool m_RotateZ = false;
+
+	static TestPosition _self;
 };
 

+ 2 - 0
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestWithMouseBase.h

@@ -6,6 +6,8 @@
 class TestWithMouseBase : public TestBase
 {
 public:
+	TestWithMouseBase(const std::string& ModleName) : TestBase(ModleName) {}
+
 	virtual void BindMouse(GLFWwindow* window);
 	virtual void UnBindMouse(GLFWwindow* window);