Browse Source

updated immage viewer

meemknight 2 years ago
parent
commit
cbf47e6de1

+ 9 - 4
Pika/core/pikaRuntime/containerManager/containerManager.cpp

@@ -231,6 +231,7 @@ pika::containerId_t pika::ContainerManager::createContainer
 	container.requestedContainerInfo.pushImguiIdForMe = imguiIDsManager.getImguiIds(containerInformation.containerStaticInfo.pushAnImguiIdForMe);
 
 	container.requestedContainerInfo.consoleWindow = consoleWindow;
+	container.requestedContainerInfo.logManager = &logManager;
 #pragma endregion
 
 	pika::StaticString<256> cmdArgs = {}; //todo magic number
@@ -301,6 +302,7 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
 	{
 
 		c.second.requestedContainerInfo.consoleWindow = consoleWindow;
+		c.second.requestedContainerInfo.logManager = &logs;
 		c.second.requestedContainerInfo.internal.containersToCreate = &containersToCreate;
 
 
@@ -474,7 +476,7 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
 
 			bool rez = 0;
 
-			if (c.second.imguiWindowId && !isProduction)
+			if (c.second.imguiWindowId && !isProduction) //todo remove is in production here and replace with remove imgui option
 			{
 
 			#pragma region imguiwindow
@@ -525,6 +527,7 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
 
 				auto s = ImGui::GetContentRegionMax();
 
+				//todo try set borders here at 0,0, easiest thing to do probably
 				ImGui::Image((void *)c.second.requestedContainerInfo.requestedFBO.texture, s, {0, 1}, {1, 0},
 					{1,1,1,1}, {0,0,0,1});
 
@@ -536,9 +539,11 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
 			#pragma endregion
 
 				auto windowState = window.windowState;
-				windowState.w = s.x;
-				windowState.h = s.y;
-				c.second.requestedContainerInfo.requestedFBO.resizeFramebuffer(windowState.w, windowState.h);
+				windowState.windowW = s.x;
+				windowState.windowH = s.y;
+				windowState.frameBufferW = s.x;
+				windowState.frameBufferH = s.y;
+				c.second.requestedContainerInfo.requestedFBO.resizeFramebuffer(windowState.windowW, windowState.windowH);
 
 				c.second.requestedContainerInfo.internal.mainWindow = 0;
 				c.second.requestedContainerInfo.internal.window = window.context.wind;

+ 1 - 1
Pika/core/pikaRuntime/pikaMain.cpp

@@ -143,7 +143,7 @@ int main()
 	pika::PikaWindow window = {};
 	window.create();
 
-	PIKA_PERMA_ASSERT(gladLoadGL(), "Problem initializing glad");
+	PIKA_PERMA_ASSERT(gladLoadGLLoader((GLADloadproc)glfwGetProcAddress), "Problem initializing glad");
 
 	//logs.log((const char*)glGetString(GL_VERSION));
 

+ 1 - 1
Pika/core/pikaSTD/logs/assert.cpp

@@ -11,7 +11,7 @@ namespace pika
 
 	namespace assert
 	{
-		//todo noreturn
+		[[noreturn]]
 		inline void terminate(...)
 		{
 			std::abort();

+ 10 - 3
Pika/core/sharedRuntime/baseContainer.h

@@ -48,10 +48,8 @@ struct RequestedContainerInfo
 
 	pika::ConsoleWindow *consoleWindow = nullptr;
 
+	pika::LogManager *logManager = nullptr;
 
-	//todo add logs here
-
-	//todo probably remove
 	void setMousePositionRelevantToWindow(int x, int y) 
 	{
 		if (internal.mainWindow)
@@ -114,6 +112,15 @@ struct RequestedContainerInfo
 
 	}
 
+	bool log(const char* l, int type)
+	{
+		//do not allocate memory here!
+		//log is from core realm
+
+		if (!logManager) { return false; }
+		logManager->log(l, type);
+	}
+
 	//returns true if succeded (can return false if console is disabeled)
 	bool consoleWrite(const char* c)
 	{

+ 4 - 4
Pika/core/sharedRuntime/windowSystemm/window.cpp

@@ -93,8 +93,8 @@ void pika::PikaWindow::saveWindowPositions()
 
 	glfwGetWindowPos(context.wind, &wr.x, &wr.y);
 
-	wr.z = windowState.w;
-	wr.w = windowState.h;
+	wr.z = windowState.windowW;
+	wr.w = windowState.windowH;
 
 	sfs::safeSave(&wr, sizeof(wr), PIKA_ENGINE_SAVES_PATH "windowPos", false);
 
@@ -148,8 +148,8 @@ void pika::PikaWindow::update()
 		int h = 0;
 		glfwGetWindowSize(context.wind, &w, &h);
 
-		windowState.w = w;
-		windowState.h = h;
+		windowState.windowW = w;
+		windowState.windowH = h;
 
 	}
 

+ 6 - 2
Pika/core/sharedRuntime/windowSystemm/window.h

@@ -11,9 +11,13 @@ namespace pika
 	
 	struct WindowState
 	{
-		int w = 0;
-		int h = 0;
+		//might differ from framebuffer w, h
+		int windowW = 0;
+		int windowH = 0;
 
+		//you should probably use this one
+		int frameBufferW = 0;
+		int frameBufferH = 0;
 
 	};
 	

BIN
Pika/engineResources/engineSaves/window1.bin


BIN
Pika/engineResources/engineSaves/window2.bin


+ 7 - 7
Pika/gameplay/containers.h

@@ -22,9 +22,9 @@ Container *getContainer(const char* name, pika::memory::MemoryArena *memoryArena
 #include "pluggins/immageviewer.h"
 #include "pluggins/threeDEditor.h"
 #include "pluggins/pikatextEditor.h"
-//#include "containers/minecraftDungeons/mcDungeonsEditor.h"
-//#include "containers/minecraftDungeons/mcDungeonsgameplay.h"
-//#include "containers/minecraftDungeons/mcDungeonsMenu.h"
+#include "containers/minecraftDungeons/mcDungeonsEditor.h"
+#include "containers/minecraftDungeons/mcDungeonsgameplay.h"
+#include "containers/minecraftDungeons/mcDungeonsMenu.h"
 
 #if PIKA_PRODUCTION == 1
 
@@ -43,9 +43,9 @@ Container *getContainer(const char* name, pika::memory::MemoryArena *memoryArena
 	PIKA_DECLARE_CONTAINER(Mario) \
 	PIKA_DECLARE_CONTAINER(MarioEditor) \
 	PIKA_DECLARE_CONTAINER(MarioNeuralTrainer) \
-	PIKA_DECLARE_CONTAINER(MarioNeuralVizualizer)// \
-	//PIKA_DECLARE_CONTAINER(McDungeonsEditor) \
-	//PIKA_DECLARE_CONTAINER(McDungeonsGameplay) \
-	//PIKA_DECLARE_CONTAINER(McDungeonsMenu) 
+	PIKA_DECLARE_CONTAINER(MarioNeuralVizualizer) \
+	PIKA_DECLARE_CONTAINER(McDungeonsEditor) \
+	PIKA_DECLARE_CONTAINER(McDungeonsGameplay) \
+	PIKA_DECLARE_CONTAINER(McDungeonsMenu) 
 
 #endif

+ 2 - 3
Pika/gameplay/containers/mario/marioCommon.h

@@ -216,11 +216,10 @@ struct GameplayRenderer
 		{
 			glClear(GL_COLOR_BUFFER_BIT);
 			gl2d::enableNecessaryGLFeatures();
-			renderer.updateWindowMetrics(windowState.w, windowState.h);
+			renderer.updateWindowMetrics(windowState.windowW, windowState.windowH);
 		}
 
 		float wheel = ImGui::GetIO().MouseWheel;
-		//todo standard out
 
 		if ((ImGui::GetIO().KeysData[ImGuiKey_LeftCtrl].Down || ImGui::GetIO().KeysData[ImGuiKey_RightCtrl].Down) && input.hasFocus)
 		{
@@ -265,7 +264,7 @@ struct GameplayRenderer
 	void followPlayer(mario::Player &p, pika::Input &input, pika::WindowState &windowState)
 	{
 		//todo update gl2d this function
-		renderer.currentCamera.follow(p.position.getCenter(), input.deltaTime * 3, 0.0001, 0.2, windowState.w, windowState.h);
+		renderer.currentCamera.follow(p.position.getCenter(), input.deltaTime * 3, 0.0001, 0.2, windowState.windowW, windowState.windowH);
 
 
 	}

+ 4 - 4
Pika/gameplay/containers/mario/marioEditor.h

@@ -43,7 +43,7 @@ struct MarioEditor: public Container
 		info.requestImguiFbo = true;
 		info.requestImguiIds = 1;
 		info.pushAnImguiIdForMe = true;
-
+		
 		info.extensionsSuported = {".mario"};
 
 		return info;
@@ -82,7 +82,7 @@ struct MarioEditor: public Container
 		{
 			glClear(GL_COLOR_BUFFER_BIT);
 			gl2d::enableNecessaryGLFeatures();
-			renderer.updateWindowMetrics(windowState.w, windowState.h);
+			renderer.updateWindowMetrics(windowState.windowW, windowState.windowH);
 		}
 		
 		{
@@ -128,7 +128,7 @@ struct MarioEditor: public Container
 
 			//todo update gl2d this function
 
-			renderer.currentCamera.follow(pos, input.deltaTime * speed * 0.9f, 0.0001, 0.2, windowState.w, windowState.h);
+			renderer.currentCamera.follow(pos, input.deltaTime * speed * 0.9f, 0.0001, 0.2, windowState.windowW, windowState.windowH);
 
 		}
 		auto viewRect = renderer.getViewRect();
@@ -166,7 +166,7 @@ struct MarioEditor: public Container
 			};
 
 			blockPosition = lerp(glm::vec2(viewRect.x, viewRect.y),
-				glm::vec2(viewRect.x + viewRect.z, viewRect.y + viewRect.w), glm::vec2(mousePos) / glm::vec2(windowState.w, windowState.h));
+				glm::vec2(viewRect.x + viewRect.z, viewRect.y + viewRect.w), glm::vec2(mousePos) / glm::vec2(windowState.windowW, windowState.windowH));
 
 			if (blockPosition.x >= maxV.x || blockPosition.y >= maxV.y || blockPosition.x < minV.x || blockPosition.y < minV.y)
 			{

+ 5 - 5
Pika/gameplay/containers/minecraftDungeons/mcDungeonsEditor.h

@@ -489,7 +489,7 @@ struct McDungeonsEditor: public Container
 		RequestedContainerInfo &requestedInfo)
 	{
 
-		renderer2d.updateWindowMetrics(windowState.w, windowState.h);
+		renderer2d.updateWindowMetrics(windowState.windowW, windowState.windowH);
 
 		renderer.setErrorCallback(&errorCallbackCustom, &requestedInfo);
 		renderer.fileOpener.userData = &requestedInfo;
@@ -504,11 +504,11 @@ struct McDungeonsEditor: public Container
 		glDisable(GL_MULTISAMPLE);
 
 
-		renderer.updateWindowMetrics(windowState.w, windowState.h);
-		renderer.camera.aspectRatio = (float)windowState.w / windowState.h; //todo do this in update
+		renderer.updateWindowMetrics(windowState.windowW, windowState.windowH);
+		renderer.camera.aspectRatio = (float)windowState.windowW / windowState.windowH; //todo do this in update
 
 
-		editor.update(requestedInfo.requestedImguiIds, renderer, input, 4, requestedInfo, {windowState.w,windowState.h});
+		editor.update(requestedInfo.requestedImguiIds, renderer, input, 4, requestedInfo, {windowState.windowW,windowState.windowH});
 	
 		bool shouldRecreate = 0;
 
@@ -661,7 +661,7 @@ struct McDungeonsEditor: public Container
 		glDisable(GL_DEPTH_TEST);
 
 
-		renderer2d.renderRectangle({windowState.w / 2 - 5, windowState.h / 2 - 5,10,10}, Colors_Orange);
+		renderer2d.renderRectangle({windowState.windowW / 2 - 5, windowState.windowH / 2 - 5,10,10}, Colors_Orange);
 
 
 		renderer2d.flush();

+ 1 - 1
Pika/gameplay/containers/minecraftDungeons/mcDungeonsMenu.h

@@ -54,7 +54,7 @@ struct McDungeonsMenu : public Container
 
 
 
-		renderer.updateWindowMetrics(windowState.w, windowState.h);
+		renderer.updateWindowMetrics(windowState.windowW, windowState.windowH);
 
 		
 		ui.Begin(69);

+ 5 - 6
Pika/gameplay/containers/minecraftDungeons/mcDungeonsgameplay.h

@@ -20,7 +20,6 @@ struct McDungeonsGameplay: public Container
 
 	PL::AverageProfiler profiler;
 
-	//todo user can request imgui ids; shortcut manager context; allocators
 	static ContainerStaticInfo containerInfo()
 	{
 		ContainerStaticInfo info = {};
@@ -603,7 +602,7 @@ struct McDungeonsGameplay: public Container
 			profilerCounter = 0;
 		}
 
-		renderer2d.updateWindowMetrics(windowState.w, windowState.h);
+		renderer2d.updateWindowMetrics(windowState.windowW, windowState.windowH);
 
 		renderer.setErrorCallback(&errorCallbackCustom, &requestedInfo);
 		renderer.fileOpener.userData = &requestedInfo;
@@ -620,8 +619,8 @@ struct McDungeonsGameplay: public Container
 		glDisable(GL_MULTISAMPLE);
 
 
-		renderer.updateWindowMetrics(windowState.w, windowState.h);
-		renderer.camera.aspectRatio = (float)windowState.w / windowState.h; //todo do this in update
+		renderer.updateWindowMetrics(windowState.windowW, windowState.windowH);
+		renderer.camera.aspectRatio = (float)windowState.windowW / windowState.windowH; //todo do this in update
 
 
 	
@@ -956,7 +955,7 @@ struct McDungeonsGameplay: public Container
 			}
 			else
 			{
-				editor.update(requestedInfo.requestedImguiIds, renderer, input, 4, requestedInfo, {windowState.w,windowState.h});
+				editor.update(requestedInfo.requestedImguiIds, renderer, input, 4, requestedInfo, {windowState.windowW,windowState.windowH});
 			}
 			
 
@@ -1027,7 +1026,7 @@ struct McDungeonsGameplay: public Container
 
 		if(1)
 		{
-			glui::Frame screen({0,0,windowState.w, windowState.h});
+			glui::Frame screen({0,0,windowState.windowW, windowState.windowH});
 
 			{
 				glui::Frame diamondBox(glui::Box().xLeft(10).yTop(20).xDimensionPercentage(0.2).yAspectRatio(0.5)());

+ 1 - 1
Pika/gameplay/containers/pikaGameplay.h

@@ -89,7 +89,7 @@ struct Gameplay : public Container
 		}
 
 		gl2d::enableNecessaryGLFeatures();
-		renderer.updateWindowMetrics(windowState.w, windowState.h);
+		renderer.updateWindowMetrics(windowState.windowW, windowState.windowH);
 
 		*r += input.deltaTime * 4.f;
 

+ 22 - 12
Pika/gameplay/containers/threedtest.h

@@ -19,7 +19,7 @@ struct ThreeDTest: public Container
 	static ContainerStaticInfo containerInfo()
 	{
 		ContainerStaticInfo info = {};
-		info.defaultHeapMemorySize = pika::MB(20);
+		info.defaultHeapMemorySize = pika::MB(100);
 
 		info.requestImguiFbo = true;
 		info.requestImguiIds = 1;
@@ -48,24 +48,34 @@ struct ThreeDTest: public Container
 
 		renderer.init(1, 1, PIKA_RESOURCES_PATH "BRDFintegrationMap.png", requestedInfo.requestedFBO.fbo);
 
+		renderer.adaptiveResolution.useAdaptiveResolution = false;
+
 		//renderer.skyBox = renderer.atmosfericScattering({0.2,1,0.3}, {0.9,0.1,0.1}, {0.4, 0.4, 0.8}, 0.8f); //todo a documentation
 		//todo api for skybox stuff
 		//renderer.skyBox.color = {0.2,0.3,0.9};
 
-		const char *names[6] =
-		{	PIKA_RESOURCES_PATH "/skyBoxes/ocean/right.jpg",
-			PIKA_RESOURCES_PATH "/skyBoxes/ocean/left.jpg",
-			PIKA_RESOURCES_PATH "/skyBoxes/ocean/top.jpg",
-			PIKA_RESOURCES_PATH "/skyBoxes/ocean/bottom.jpg",
-			PIKA_RESOURCES_PATH "/skyBoxes/ocean/front.jpg",
-			PIKA_RESOURCES_PATH "/skyBoxes/ocean/back.jpg"};
-
-		renderer.skyBox = renderer.loadSkyBox(names);
+		//const char *names[6] =
+		//{	PIKA_RESOURCES_PATH "/skyBoxes/ocean/right.jpg",
+		//	PIKA_RESOURCES_PATH "/skyBoxes/ocean/left.jpg",
+		//	PIKA_RESOURCES_PATH "/skyBoxes/ocean/top.jpg",
+		//	PIKA_RESOURCES_PATH "/skyBoxes/ocean/bottom.jpg",
+		//	PIKA_RESOURCES_PATH "/skyBoxes/ocean/front.jpg",
+		//	PIKA_RESOURCES_PATH "/skyBoxes/ocean/back.jpg"};
+		//
+		//renderer.skyBox = renderer.loadSkyBox(names);
 		//renderer.skyBox.color = {0.2,0.3,0.8};
 
+		renderer.skyBox = renderer.loadHDRSkyBox(PIKA_RESOURCES_PATH "/skyBoxes/canary_wharf_2k.hdr");
+		renderer.skyBox.color = {0.4,0.4,0.4};
+
+
 		helmetModel = renderer.loadModel(PIKA_RESOURCES_PATH "helmet/helmet.obj", gl3d::TextureLoadQuality::maxQuality, 1.f);
 		//helmetModel = renderer.loadModel(PIKA_RESOURCES_PATH "/knight/uploads_files_1950170_Solus_the_knight.gltf", 1.f);
 
+		
+		renderer.createDirectionalLight({-1,-0.5,-0.2});
+
+
 		gl3d::Transform t;
 		t.position = {0, 0, -3};
 		t.rotation = {1.5, 0 , 0};
@@ -90,8 +100,8 @@ struct ThreeDTest: public Container
 		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 		glEnable(GL_DEPTH_TEST);
 
-		renderer.updateWindowMetrics(windowState.w, windowState.h);
-		renderer.camera.aspectRatio = (float)windowState.w / windowState.h; //todo do this in update
+		renderer.updateWindowMetrics(windowState.windowW, windowState.windowH);
+		renderer.camera.aspectRatio = (float)windowState.windowW / windowState.windowH; //todo do this in update
 		
 		{
 			static glm::dvec2 lastMousePos = {};

+ 6 - 1
Pika/gameplay/dll/dllMain.cpp

@@ -56,6 +56,10 @@ PIKA_API void dissableAllocators()
 	pika::memory::dissableAllocators();
 }
 
+void gl2dErrorFuncStub(const char *msg) //todo
+{
+}
+
 //used to initialize libraries 
 PIKA_API void gameplayStart(pika::PikaContext &pikaContext)
 {
@@ -70,6 +74,7 @@ PIKA_API void gameplayStart(pika::PikaContext &pikaContext)
 #endif
 
 	gl2d::init();
+	gl2d::setErrorFuncCallback(gl2dErrorFuncStub);
 
 #pragma endregion
 }
@@ -88,7 +93,7 @@ PIKA_API void gameplayReload(pika::PikaContext &pikaContext)
 	pika::pikaImgui::setImguiContext(pikaContext);
 
 	gl2d::init();
-
+	gl2d::setErrorFuncCallback(gl2dErrorFuncStub);
 #endif
 }
 

+ 29 - 22
Pika/pluggins/pluggins/immageViewer.h

@@ -31,39 +31,42 @@ struct ImmageViewer: public Container
 		return info;
 	}
 
+	std::string file;
+
 	bool create(RequestedContainerInfo &requestedInfo, pika::StaticString<256> commandLineArgument) override
 	{
+
 		//todo logs from containers
 		//requestedInfo.
 
-		std::string file = commandLineArgument.to_string();
-
-		//pika::memory::setGlobalAllocatorToStandard();
-		//{
-		//	texture.loadFromFile(PIKA_RESOURCES_PATH "map.png", true, true);
-		//}
-		//pika::memory::setGlobalAllocator(requestedInfo.mainAllocator);
+		file = commandLineArgument.to_string();
 
-		size_t size = 0;
-		if (!requestedInfo.getFileSizeBinary(file.c_str(), size))
-		{
-			return 0; //todo
-		}
-		
-		unsigned char *buffer = new unsigned char[size];
-		
-		if (!requestedInfo.readEntireFileBinary(file.c_str(), buffer, size))
+		pika::memory::setGlobalAllocatorToStandard();
 		{
-			delete[] buffer;
-			return 0; //todo
+			texture.loadFromFile(file.c_str(), true, true);
 		}
+		pika::memory::setGlobalAllocator(requestedInfo.mainAllocator);
+
+		//size_t size = 0;
+		//if (!requestedInfo.getFileSizeBinary(file.c_str(), size))
+		//{
+		//	return 0; //todo
+		//}
+		//
+		//unsigned char *buffer = new unsigned char[size];
+		//
+		//if (!requestedInfo.readEntireFileBinary(file.c_str(), buffer, size))
+		//{
+		//	delete[] buffer;
+		//	return 0; //todo
+		//}
 		
-		texture.createFromFileData(buffer, size, true, true);
+		//texture.createFromFileData(buffer, size, true, true);
 		
 		immageSize = texture.GetSize();
+		if (immageSize == glm::ivec2{0, 0}) { return 0; }
 
-
-		delete[] buffer;
+		//delete[] buffer;
 
 		return true;
 	}
@@ -99,7 +102,7 @@ struct ImmageViewer: public Container
 		}
 
 
-		ImGui::Text("Immage title; %d, %d", 100, 100);
+		ImGui::Text("%s; %d, %d",file.c_str(), immageSize.x, immageSize.y);
 
 		auto s = ImGui::GetContentRegionMax();
 		
@@ -137,4 +140,8 @@ struct ImmageViewer: public Container
 		return true;
 	}
 
+	void destruct() override
+	{
+		texture.cleanup();
+	}
 };

+ 3 - 3
Pika/pluggins/pluggins/threeDEditor.h

@@ -94,11 +94,11 @@ struct ThreeDEditor: public Container
 
 		
 
-		renderer.updateWindowMetrics(windowState.w, windowState.h);
-		renderer.camera.aspectRatio = (float)windowState.w / windowState.h; //todo do this in update
+		renderer.updateWindowMetrics(windowState.windowW, windowState.windowH);
+		renderer.camera.aspectRatio = (float)windowState.windowW / windowState.windowH; //todo do this in update
 
 			
-		editor.update(requestedInfo.requestedImguiIds, renderer, input, 4, requestedInfo, {windowState.w,windowState.h});
+		editor.update(requestedInfo.requestedImguiIds, renderer, input, 4, requestedInfo, {windowState.windowW,windowState.windowH});
 
 
 		renderer.render(input.deltaTime);

+ 18 - 1
Pika/resources/logs.txt

@@ -1 +1,18 @@
-#2023-04-27 18:19:59: Reloaded dll
+#2023-05-22 12:13:38: Created container: ImmageViewer
+#2023-05-22 12:13:42: Terminated container because it returned 0: ImmageViewer #1
+#2023-05-22 12:13:42: Destroyed continer: ImmageViewer #1
+#2023-05-22 12:13:45: Created container: PikaTextEditor
+#2023-05-22 12:13:49: Terminated container because it returned 0: PikaTextEditor #2
+#2023-05-22 12:13:49: Destroyed continer: PikaTextEditor #2
+#2023-05-22 12:13:54: Created container: ImmageViewer
+#2023-05-22 12:13:58: Terminated container because it returned 0: ImmageViewer #3
+#2023-05-22 12:13:58: Destroyed continer: ImmageViewer #3
+#2023-05-22 12:13:58: Created container: ImmageViewer
+#2023-05-22 12:14:00: Terminated container because it returned 0: ImmageViewer #4
+#2023-05-22 12:14:00: Destroyed continer: ImmageViewer #4
+#2023-05-22 12:14:01: Created container: ImmageViewer
+#2023-05-22 12:14:18: Terminated container because it returned 0: ImmageViewer #5
+#2023-05-22 12:14:18: Destroyed continer: ImmageViewer #5
+#2023-05-22 12:14:22: Created container: ImmageViewer
+#2023-05-22 12:14:39: Terminated container because it returned 0: ImmageViewer #6
+#2023-05-22 12:14:39: Destroyed continer: ImmageViewer #6