Parcourir la source

feat: 恢复 ImGUI 的绑定事件

NiceTry12138 il y a 10 mois
Parent
commit
0425da07bc

+ 2 - 17
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/imgui.ini

@@ -3,23 +3,8 @@ Pos=60,60
 Size=400,400
 Collapsed=0
 
-[Window][Global Settings]
-Pos=194,295
-Size=124,77
-Collapsed=0
-
-[Window][ClearColor]
-Pos=755,32
-Size=391,97
-Collapsed=0
-
-[Window][Rotate]
-Pos=615,4
-Size=291,161
-Collapsed=0
-
 [Window][Camera]
-Pos=281,42
-Size=339,96
+Pos=356,21
+Size=339,117
 Collapsed=0
 

+ 35 - 5
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestCamera.cpp

@@ -69,10 +69,9 @@ void TestCamera::OnEnter(GLFWwindow* window)
 
 	m_Shader.UnBind();
 
-	// 设置鼠标捕获和隐藏
-	glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
-	glfwSetWindowUserPointer(window, this);
-	glfwSetCursorPosCallback(window, &TestCamera::StaticMouseCallback);
+	//std::cout << glfwGetInputMode(window, GLFW_CURSOR) << std::endl;
+	BindMouse(window);
+
 }
 
 void TestCamera::OnExit(GLFWwindow* window)
@@ -129,6 +128,7 @@ void TestCamera::InputProcess(GLFWwindow* window)
 {
 	TestBase::InputProcess(window);
 
+
 	if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
 	{
 		m_CameraLocation -= glm::normalize(glm::cross(m_CameraForward, m_CameraUp)) * m_MoveSpeed;
@@ -145,6 +145,18 @@ void TestCamera::InputProcess(GLFWwindow* window)
 	{
 		m_CameraLocation -= m_CameraForward * m_MoveSpeed;
 	}
+	
+	
+	if (glfwGetKey(window, GLFW_KEY_LEFT_ALT) == GLFW_PRESS)
+	{
+		m_bLeftAltPress = true;
+		UnBindMouse(window);
+	}
+	else if(m_bLeftAltPress) {
+		// 因为当前状况 如果不按下 左 alt,每帧都会导致该函数触发,加个判断防止重复触发
+		m_bLeftAltPress = false;
+		BindMouse(window);
+	}
 }
 
 void TestCamera::StaticMouseCallback(GLFWwindow* window, double xpos, double ypos)
@@ -189,6 +201,24 @@ void TestCamera::MouseCallback(GLFWwindow* window, double xpos, double ypos)
 	front.y = sin(glm::radians(m_CameraPitch));
 	front.z = sin(glm::radians(m_CameraYaw)) * cos(glm::radians(m_CameraPitch));
 	m_CameraForward = glm::normalize(front);
+}
+
+void TestCamera::BindMouse(GLFWwindow* window)
+{
+	m_isFirstMouse = true;
+	// 设置鼠标捕获和隐藏
+	glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
+	glfwSetWindowUserPointer(window, this);
+	glfwSetCursorPosCallback(window, &TestCamera::StaticMouseCallback);
+}
+
+void TestCamera::UnBindMouse(GLFWwindow* window)
+{
+	m_isFirstMouse = false;
+
+	glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
 
-	std::cout << "x " << m_CameraForward.r << " y " << m_CameraForward.g << " z " << m_CameraForward.b << std::endl;
+	// 因为设置自己的鼠标绑定把 ImGUI 的鼠标绑定覆盖了 所以退出自己的鼠标绑定时 重新让 ImGUI 绑定
+	ImGui_ImplGlfw_RestoreCallbacks(window);	
+	ImGui_ImplGlfw_InstallCallbacks(window);
 }

+ 7 - 1
图形学/OpenGL学习/src/OpenGLDemo/OpenGLDemo/src/testModule/TestCamera.h

@@ -23,6 +23,10 @@ public:
 
 	void MouseCallback(GLFWwindow* window, double xpos, double ypos);
 
+protected:
+	void BindMouse(GLFWwindow* window);
+	void UnBindMouse(GLFWwindow* window);
+
 private:
 	GLuint m_VBO{ GL_ZERO };
 	GLuint m_VAO{ GL_ZERO };
@@ -52,6 +56,8 @@ private:
 
 	float m_LastMousePosX;
 	float m_LastMousePosY;
-	bool m_isFirstMouse = true;
+	bool m_isFirstMouse = true;			// 防止鼠标进入捕获状态时 突然闪烁
+
+	bool m_bLeftAltPress = false;
 };