Forráskód Böngészése

made imgui work on pika

vlod 3 éve
szülő
commit
8820455808

+ 3 - 2
Pika/core/pikaRuntime/dllLoader/dllLoader.h

@@ -2,13 +2,14 @@
 #include <filesystem>
 #include <GLFW/glfw3.h>
 #include <imgui.h>
+#include <pikaImgui/pikaImgui.h>
 
-#define TESTSTART(x) void x(GLFWwindow *wind, ImGuiContext *imguiContext)
+#define TESTSTART(x) void x(pika::ImguiAndGlfwContext pikaContext)
 typedef TESTSTART(testStart_t);
 //extern "C" __declspec(dllexport) TESTPRINT(gameLogic);
 #undef TESTSTART
 
-#define TESTUPDATE(x) void x(GLFWwindow *wind)
+#define TESTUPDATE(x) void x(pika::ImguiAndGlfwContext pikaContext)
 typedef TESTUPDATE(testUpdate_t);
 #undef TESTUPDATE
 

+ 13 - 7
Pika/core/pikaRuntime/pikaImgui/pikaImgui.cpp

@@ -1,7 +1,7 @@
 #include <glad/glad.h>
 #include <pikaImgui/pikaImgui.h>
 
-ImGuiContext *pika::initImgui(GLFWwindow *wind)
+ImGuiContext *pika::initImgui(ImguiAndGlfwContext imguiAndGlfwContext)
 {
 	auto context = ImGui::CreateContext();
 	//ImGui::StyleColorsDark();
@@ -23,14 +23,20 @@ ImGuiContext *pika::initImgui(GLFWwindow *wind)
 		style.Colors[ImGuiCol_DockingEmptyBg].w = 0.f;
 	}
 	
-	ImGui_ImplGlfw_InitForOpenGL(wind, true);
+	ImGui_ImplGlfw_InitForOpenGL(imguiAndGlfwContext.wind, true);
 	ImGui_ImplOpenGL3_Init("#version 330");
 
 	return context;
 }
 
-void pika::imguiStartFrame()
+void pika::setContext(ImguiAndGlfwContext imguiAndGlfwContext)
 {
+	ImGui::SetCurrentContext(imguiAndGlfwContext.ImGuiContext);
+}
+
+void pika::imguiStartFrame(ImguiAndGlfwContext imguiAndGlfwContext)
+{
+	setContext(imguiAndGlfwContext);
 	ImGui_ImplOpenGL3_NewFrame();
 	ImGui_ImplGlfw_NewFrame();
 	ImGui::NewFrame();
@@ -38,11 +44,12 @@ void pika::imguiStartFrame()
 }
 
 
-void pika::imguiEndFrame(GLFWwindow *wind)
+void pika::imguiEndFrame(ImguiAndGlfwContext imguiAndGlfwContext)
 {
+	setContext(imguiAndGlfwContext);
 	ImGui::Render();
 	int display_w = 0, display_h = 0;
-	glfwGetFramebufferSize(wind, &display_w, &display_h);
+	glfwGetFramebufferSize(imguiAndGlfwContext.wind, &display_w, &display_h);
 	glViewport(0, 0, display_w, display_h);
 	ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
 
@@ -58,10 +65,9 @@ void pika::imguiEndFrame(GLFWwindow *wind)
 		//ImGui::RenderPlatformWindowsDefault();
 		//glfwMakeContextCurrent(backup_current_context);
 
-		GLFWwindow *backup_current_context = glfwGetCurrentContext();
 		ImGui::UpdatePlatformWindows();
 		ImGui::RenderPlatformWindowsDefault();
-		glfwMakeContextCurrent(backup_current_context);
+		imguiAndGlfwContext.glfwMakeContextCurrentPtr(imguiAndGlfwContext.wind); //idea create a class with some functions
 
 	
 	}

+ 13 - 4
Pika/core/pikaRuntime/pikaImgui/pikaImgui.h

@@ -12,10 +12,19 @@
 namespace pika
 {
 
-
-	ImGuiContext *initImgui(GLFWwindow *wind);
-	void imguiStartFrame();
-	void imguiEndFrame(GLFWwindow *wind);
+	struct ImguiAndGlfwContext
+	{
+		using glfwMakeContextCurrent_t = decltype(glfwMakeContextCurrent);
+
+		glfwMakeContextCurrent_t *glfwMakeContextCurrentPtr = {};
+		GLFWwindow *wind = {};
+		ImGuiContext *ImGuiContext = {};
+	};
+
+	ImGuiContext *initImgui(ImguiAndGlfwContext imguiAndGlfwContext);
+	void setContext(ImguiAndGlfwContext imguiAndGlfwContext);
+	void imguiStartFrame(ImguiAndGlfwContext imguiAndGlfwContext);
+	void imguiEndFrame(ImguiAndGlfwContext imguiAndGlfwContext);
 
 
 };

+ 17 - 8
Pika/core/pikaRuntime/pikaMain.cpp

@@ -24,27 +24,36 @@ int main()
 
 	//glfwSetErrorCallback(error_callback); todo
 
-	GLFWwindow *window = glfwCreateWindow(640, 480, "Pika", NULL, NULL);
-	if (!window)
+	pika::ImguiAndGlfwContext context = {};
+
+	context.wind = glfwCreateWindow(640, 480, "Pika", NULL, NULL);
+	if (!context.wind)
 	{
 		std::cout << "problem initializing window";
 	}
 
-	glfwMakeContextCurrent(window);
+	glfwMakeContextCurrent(context.wind);
 
 	PIKA_PERMA_ASSERT(gladLoadGL(), "Problem initializing glad");
 
-	auto imguiContext = pika::initImgui(window);
+	context.ImGuiContext = pika::initImgui(context);
+
+	context.glfwMakeContextCurrentPtr = glfwMakeContextCurrent;
 
-	testStart(window, imguiContext);
+	testStart(context);
 
-	while (!glfwWindowShouldClose(window))
+	while (!glfwWindowShouldClose(context.wind))
 	{
 
 		glClear(GL_COLOR_BUFFER_BIT);
 
-		testUpdate(window);
+		pika::imguiStartFrame(context);
+
+		testUpdate(context);
+
+		pika::imguiEndFrame(context);
 
+		//pika::setContext(context);
 		//pika::imguiStartFrame();
 		//ImGui::Begin("test");
 		//ImGui::End();
@@ -52,7 +61,7 @@ int main()
 
 
 		glfwPollEvents();
-		glfwSwapBuffers(window);
+		glfwSwapBuffers(context.wind);
 	}
 
 

+ 18 - 10
Pika/gameplay/dllMain.cpp

@@ -8,9 +8,8 @@
 #include <gl2d/gl2d.h>
 gl2d::Renderer2D renderer;
 
-ImGuiContext *imguiContextGlobal = 0;
 
-PIKA_API void testStart(GLFWwindow *wind, ImGuiContext *imguiContext)
+PIKA_API void testStart(pika::ImguiAndGlfwContext pikaContext)
 {
 	
 	//PIKA_PERMA_ASSERT(glfwInit(), "Problem initializing glfw from dll");
@@ -18,29 +17,38 @@ PIKA_API void testStart(GLFWwindow *wind, ImGuiContext *imguiContext)
 
 	PIKA_PERMA_ASSERT(gladLoadGL(), "Problem initializing glad from dll");
 	//printf("%s\n", glGetString(GL_VERSION));
-	//pika::initImgui(wind);
+	//pika::initImgui(pikaContext);
 
-	imguiContextGlobal = imguiContext;
-	ImGui::SetCurrentContext(imguiContextGlobal);
-	//ImGui::SetAllocatorFunctions()
 
 	gl2d::init();
 	renderer.create();
 
 }
 
+void *userMalloc(size_t sz, void *)
+{
+	return malloc(sz);
+}
+
+void userFree(void *ptr, void *)
+{
+	free(ptr);
+}
 
-PIKA_API void testUpdate(GLFWwindow *wind)
+PIKA_API void testUpdate(pika::ImguiAndGlfwContext pikaContext)
 {
 	gl2d::enableNecessaryGLFeatures();
 	renderer.updateWindowMetrics(640, 480);
 	renderer.renderRectangle({10,10, 100, 100}, Colors_Magenta);
 	renderer.flush();
 
-	ImGui::SetCurrentContext(imguiContextGlobal);
+	//ImGui::SetCurrentContext(imguiContextGlobal);
+
+//	ImGui::SetAllocatorFunctions(userMalloc, userFree);
+
+	pika::setContext(pikaContext);
 
-	pika::imguiStartFrame();
 	ImGui::Begin("test");
 	ImGui::End();
-	pika::imguiEndFrame(wind);
+
 }

+ 3 - 2
Pika/gameplay/dllMain.h

@@ -2,6 +2,7 @@
 #include <pikaConfig.h>
 #include <GLFW/glfw3.h>
 #include <imgui.h>
+#include <pikaImgui/pikaImgui.h>
 
-PIKA_API void testStart(GLFWwindow *wind, ImGuiContext *imguiContext);
-PIKA_API void testUpdate(GLFWwindow *wind);
+PIKA_API void testStart(pika::ImguiAndGlfwContext pikaContext);
+PIKA_API void testUpdate(pika::ImguiAndGlfwContext pikaContext);