Browse Source

trying to implement console

vlod 3 years ago
parent
commit
c66cfed3ff

+ 1 - 1
Pika/core/coreConfig/pikaConfig.h

@@ -46,7 +46,7 @@
 
 #define PIKA_REMOVE_PUSH_NOTIFICATION_IN_PRODUCTION 0
 
-#define PIKA_ENABLE_CONSOLE 1
+#define PIKA_ENABLE_CONSOLE_IN_PRODUCTION 1
 
 
 #define PIKA_CLEAR_SCREEN_BY_ENGINE_IN_PRODUCTION 0

+ 3 - 3
Pika/core/pikaEditor/containersWindow/containersWindow.cpp

@@ -192,7 +192,7 @@ void pika::ContainersWindow::update(pika::LogManager &logManager, bool &open, pi
 											if (c != 0)
 											{
 												if (!containerManager.setSnapshotToContainer(c,
-													s.c_str(), logManager))
+													s.c_str(), logManager, imguiIdsManager))
 												{
 													containerManager.destroyContainer(c, loadedDll, logManager);
 												}
@@ -471,7 +471,7 @@ void pika::ContainersWindow::update(pika::LogManager &logManager, bool &open, pi
 										{
 											if (!containerManager.setSnapshotToContainer(
 												containerIds[itemCurrentCreatedContainers],
-												snapshots[currentSelectedSnapshot].c_str(), logManager
+												snapshots[currentSelectedSnapshot].c_str(), logManager, imguiIdsManager
 												))
 											{
 												logManager.log("Failed to assign snapshot", pika::logError);
@@ -596,7 +596,7 @@ void pika::ContainersWindow::update(pika::LogManager &logManager, bool &open, pi
 									{
 										if (!containerManager.setRecordingToContainer(
 											containerIds[itemCurrentCreatedContainers],
-											recordings[currentSelectedSnapshot].c_str(), logManager
+											recordings[currentSelectedSnapshot].c_str(), logManager, imguiIdsManager
 											))
 										{
 											logManager.log("Failed to assign recording", pika::logError);

+ 13 - 2
Pika/core/pikaEditor/editor/editor.cpp

@@ -17,8 +17,9 @@
 #define CONTAINERS_SHORTCUTS ICON_FK_MICROCHIP " Containers window"
 #define RELOAD_DLL_SHORTCUTS ICON_FK_REFRESH " Reload dll"
 #define TRANSPARENT_EDITOR_WINDOW ICON_FK_EYE "Transparent Editor window"
+#define CONSOLE_WINDOW ICON_FK_TERMINAL "Console window"
 
-void pika::Editor::init(pika::ShortcutManager &shortcutManager, pika::pikaImgui::ImGuiIdsManager &imguiIDManager)
+void pika::Editor::init(pika::ShortcutManager &shortcutManager, pika::pikaImgui::ImGuiIdsManager &imguiIDManager, std::streambuf *buffer)
 {
 
 	shortcutManager.registerShortcut(DOCK_MAIN_WINDOW_SHORTCUT, "Ctrl+Alt+D", &optionsFlags.hideMainWindow);
@@ -27,13 +28,14 @@ void pika::Editor::init(pika::ShortcutManager &shortcutManager, pika::pikaImgui:
 	shortcutManager.registerShortcut(CONTAINERS_SHORTCUTS, "Ctrl+M", &windowFlags.containerManager);
 	shortcutManager.registerShortcut(RELOAD_DLL_SHORTCUTS, "Ctrl+Alt+R", &shouldReloadDll);
 	shortcutManager.registerShortcut(TRANSPARENT_EDITOR_WINDOW, "Ctrl+Alt+T", &windowFlags.transparentWindow);
+	shortcutManager.registerShortcut(CONSOLE_WINDOW, "Ctrl+C", &windowFlags.consoleWindow);
 
 	imguiId = imguiIDManager.getImguiIds(1);
 
 	logWindow.init(imguiIDManager);
 	editShortcutsWindow.init(imguiIDManager);
 	containersWindow.init(imguiIDManager);
-
+	consoleWindow.init(imguiIDManager, buffer);
 	
 	if (sfs::safeLoad(&optionsFlags, sizeof(optionsFlags), PIKA_ENGINE_SAVES_PATH "options", false) != sfs::noError)
 	{
@@ -154,6 +156,9 @@ void pika::Editor::update(const pika::Input &input,
 					ImGui::MenuItem(pika::ContainersWindow::ICON_NAME,
 						shortcutManager.getShortcut(CONTAINERS_SHORTCUTS), &windowFlags.containerManager);
 
+					ImGui::MenuItem(pika::ConsoleWindow::ICON_NAME,
+						shortcutManager.getShortcut(CONSOLE_WINDOW), &windowFlags.consoleWindow);
+
 					ImGui::EndMenu();
 
 				}
@@ -218,6 +223,12 @@ void pika::Editor::update(const pika::Input &input,
 	}
 #pragma endregion
 
+#pragma region console
+	if (windowFlags.consoleWindow)
+	{
+		consoleWindow.update(logs, windowFlags.consoleWindow);
+	}
+#pragma endregion
 
 
 

+ 5 - 1
Pika/core/pikaEditor/editor/editor.h

@@ -12,6 +12,7 @@
 #include <editShortcuts/editShortcuts.h>
 #include <pushNotification/pushNotification.h>
 #include <containersWindow/containersWindow.h>
+#include <pikaConsoleManager/pikaConsoleWindow.h>
 
 namespace pika
 {
@@ -19,7 +20,8 @@ namespace pika
 	struct Editor
 	{
 
-		void init(pika::ShortcutManager &shortcutManager, pika::pikaImgui::ImGuiIdsManager &imguiIDManager);
+		void init(pika::ShortcutManager &shortcutManager, pika::pikaImgui::ImGuiIdsManager &imguiIDManager,
+			std::streambuf *buffer);
 
 		void update(const pika::Input &input, pika::ShortcutManager &shortcutManager
 			,pika::LogManager &logs, pika::PushNotificationManager &pushNotificationManager,
@@ -39,11 +41,13 @@ namespace pika
 			bool editShortcutsWindow = 0;
 			bool containerManager = 0;
 			bool transparentWindow = 0;
+			bool consoleWindow = 0;
 		}windowFlags;
 
 		pika::LogWindow logWindow;
 		pika::EditShortcutsWindow editShortcutsWindow;
 		pika::ContainersWindow containersWindow;
+		pika::ConsoleWindow consoleWindow;
 
 		bool lastHideWindowState = optionsFlags.hideMainWindow;
 

+ 64 - 0
Pika/core/pikaEditor/pikaConsoleManager/pikaConsoleWindow.cpp

@@ -0,0 +1,64 @@
+#include "pikaConsoleWindow.h"
+#include <logs/assert.h>
+#include <iostream>
+
+namespace pika
+{
+
+
+	void ConsoleWindow::init(pika::pikaImgui::ImGuiIdsManager &idManager, std::streambuf *buffer)
+	{
+		this->buffer = buffer;
+		imguiId = idManager.getImguiIds();
+	}
+
+	void ConsoleWindow::update(pika::LogManager &logManager, bool &open)
+	{
+		PIKA_DEVELOPMENT_ONLY_ASSERT(buffer, "invalid buffer");
+
+		//s += buffer->get;
+		//*buffer = std::streambuf();
+
+		s += std::string{(std::istreambuf_iterator<char>(buffer)),
+			std::istreambuf_iterator<char>()};
+
+		constexpr int SIZE = 3000; //todo
+		
+		if (s.size() > SIZE)
+		{
+			s.erase(0, s.size() - SIZE);
+		}
+
+		ImGui::PushID(imguiId);
+
+		if (!ImGui::Begin(ICON_NAME, &open))
+		{
+			ImGui::End();
+			ImGui::PopID();
+			return;
+		}
+
+		
+		ImGui::BeginChild("##console scrolling", ImVec2(0, 0), false);
+
+
+		ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
+		
+		ImGui::TextWrapped(s.c_str());
+		//ImGui::TextUnformatted(s.c_str());
+
+		ImGui::PopStyleVar();
+
+		if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY())
+			ImGui::SetScrollHereY(1.0f);
+
+		ImGui::EndChild();
+
+
+		ImGui::End();
+		ImGui::PopID();
+
+	}
+
+};
+

+ 26 - 0
Pika/core/pikaEditor/pikaConsoleManager/pikaConsoleWindow.h

@@ -0,0 +1,26 @@
+#pragma once
+#include <pikaImgui/pikaImgui.h>
+#include <logs/log.h>
+
+namespace pika
+{
+
+	struct ConsoleWindow
+	{
+
+		void init(pika::pikaImgui::ImGuiIdsManager &idManager, std::streambuf *buffer);
+
+		void update(pika::LogManager &logManager, bool &open);
+
+		static constexpr char *ICON = ICON_FK_TERMINAL;
+		static constexpr char *NAME = "console";
+		static constexpr char *ICON_NAME = ICON_FK_TERMINAL " console";
+
+		int imguiId = 0;
+
+		std::streambuf *buffer = 0;
+		std::string s;
+	};
+
+
+};

+ 23 - 8
Pika/core/pikaRuntime/containerManager/containerManager.cpp

@@ -31,7 +31,8 @@ pika::containerId_t pika::ContainerManager::createContainer(std::string containe
 	return 0;
 }
 
-bool pika::ContainerManager::setSnapshotToContainer(pika::containerId_t containerId, const char *snapshotName, pika::LogManager &logManager)
+bool pika::ContainerManager::setSnapshotToContainer(pika::containerId_t containerId, const char *snapshotName, pika::LogManager &logManager
+	, pika::pikaImgui::ImGuiIdsManager &imguiIdManager)
 {
 	auto c = runningContainers.find(containerId);
 	if (c == runningContainers.end())
@@ -66,11 +67,15 @@ bool pika::ContainerManager::setSnapshotToContainer(pika::containerId_t containe
 	pika::readEntireFile(file.c_str(), c->second.getBaseAdress(),
 		c->second.totalSize, sizeof(pika::RuntimeContainer));
 
+	//c->second.requestedContainerInfo.requestedImguiIds 
+	//	= imguiIdManager.getImguiIds(c->second.requestedContainerInfo.imguiTotalRequestedIds);
+
 	logManager.log("Loaded snapshot");
 	return true;
 }
 
-bool pika::ContainerManager::setRecordingToContainer(pika::containerId_t containerId, const char *recordingName, pika::LogManager &logManager)
+bool pika::ContainerManager::setRecordingToContainer(pika::containerId_t containerId, const char *recordingName, 
+	pika::LogManager &logManager, pika::pikaImgui::ImGuiIdsManager &imguiIdManager)
 {
 	auto c = runningContainers.find(containerId);
 	if (c == runningContainers.end())
@@ -80,8 +85,8 @@ bool pika::ContainerManager::setRecordingToContainer(pika::containerId_t contain
 			pika::logError);
 		return false;
 	}
-
-	if (!setSnapshotToContainer(containerId, recordingName, logManager))
+	//todo not reset imgui id on input recording
+	if (!setSnapshotToContainer(containerId, recordingName, logManager, imguiIdManager))
 	{
 		return false;
 	}
@@ -213,6 +218,9 @@ pika::containerId_t pika::ContainerManager::createContainer
 
 	container.requestedContainerInfo.mainAllocator = &container.allocator;
 	container.requestedContainerInfo.bonusAllocators = &container.bonusAllocators;
+	container.requestedContainerInfo.requestedImguiIds =
+		imguiIDsManager.getImguiIds(containerInformation.containerStaticInfo.requestImguiIds);
+	container.requestedContainerInfo.imguiTotalRequestedIds = containerInformation.containerStaticInfo.requestImguiIds;
 
 #pragma endregion
 
@@ -233,7 +241,7 @@ void pika::ContainerManager::init()
 }
 
 void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow &window,
-	pika::LogManager &logs)
+	pika::LogManager &logs, pika::pikaImgui::ImGuiIdsManager &imguiIdManager, std::streambuf *consoleBuffer)
 {
 	PIKA_DEVELOPMENT_ONLY_ASSERT(loadedDll.dllHand != 0, "dll not loaded when trying to update containers");
 
@@ -244,7 +252,8 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
 
 	if (loadedDll.shouldReloadDll())
 	{
-		reloadDll(loadedDll, window, logs); //todo return 0 on fail
+		reloadDll(loadedDll, window, logs, consoleBuffer); //todo return 0 on fail
+		consoleBuffer = loadedDll.getConsoleBuffer_();
 
 		//todo mark shouldCallReaload or just call reload
 		
@@ -308,7 +317,7 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
 				if (c.second.flags.frameNumber * sizeof(pika::Input) >= s && s != 0)
 				{
 					//todo optional logs here
-					if (!setSnapshotToContainer(c.first, c.second.flags.recordingName, logs)) 
+					if (!setSnapshotToContainer(c.first, c.second.flags.recordingName, logs, imguiIdManager))
 					{
 						logs.log((std::string("Stopped container playback because we couldn't assign it's snapshot on frame 0")
 							+ std::to_string(c.first)).c_str(),
@@ -413,7 +422,8 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
 
 }
 
-void pika::ContainerManager::reloadDll(pika::LoadedDll &loadedDll, pika::PikaWindow &window, pika::LogManager &logs)
+void pika::ContainerManager::reloadDll(pika::LoadedDll &loadedDll, pika::PikaWindow &window, pika::LogManager &logs,
+	std::streambuf *consoleBuffer)
 {
 
 	std::this_thread::sleep_for(std::chrono::milliseconds(200)); // make sure that the compiler had enough time 
@@ -940,6 +950,11 @@ bool pika::checkIfSnapshotIsCompatible(pika::RuntimeContainer &info, const char
 		return false;
 	}
 
+	if (loadedInfo.requestedContainerInfo.imguiTotalRequestedIds != info.requestedContainerInfo.imguiTotalRequestedIds)
+	{
+		return false;
+	}
+
 	if (loadedInfo.arena.containerStructMemory.block != info.arena.containerStructMemory.block)
 	{
 		return false;

+ 7 - 4
Pika/core/pikaRuntime/containerManager/containerManager.h

@@ -33,10 +33,10 @@ namespace pika
 			pika::pikaImgui::ImGuiIdsManager &imguiIDsManager, size_t memoryPos = 0);
 
 		bool setSnapshotToContainer(pika::containerId_t containerId, const char* snapshotName,
-			pika::LogManager &logManager);
+			pika::LogManager &logManager, pika::pikaImgui::ImGuiIdsManager &imguiIdManager);
 
 		bool setRecordingToContainer(pika::containerId_t containerId, const char *recordingName,
-			pika::LogManager &logManager);
+			pika::LogManager &logManager, pika::pikaImgui::ImGuiIdsManager &imguiIdManager);
 
 		void* allocateContainerMemory(pika::RuntimeContainer &container, pika::ContainerInformation containerInformation, void *memPos = 0);
 
@@ -53,11 +53,14 @@ namespace pika
 		void update(
 			pika::LoadedDll &loadedDll,
 			pika::PikaWindow &window,
-			pika::LogManager &logs);
+			pika::LogManager &logs,
+			pika::pikaImgui::ImGuiIdsManager &imguiIdManager,
+			std::streambuf *consoleBuffer);
 
 		void reloadDll(pika::LoadedDll &loadedDll,
 			pika::PikaWindow &window,
-			pika::LogManager &logs);
+			pika::LogManager &logs,
+			std::streambuf *consoleBuffer);
 
 		bool destroyContainer(containerId_t id, pika::LoadedDll &loadedDll,
 			pika::LogManager &logManager);

+ 5 - 0
Pika/core/pikaRuntime/dllLoader/dllLoader.cpp

@@ -141,6 +141,7 @@ bool pika::LoadedDll::loadDll(int id, pika::LogManager &logs)
 	bindAllocator_ = (bindAllocator_t *)GetProcAddress(dllHand, "bindAllocator");
 	resetAllocator_ = (resetAllocator_t *)GetProcAddress(dllHand, "resetAllocator");
 	dissableAllocators_ = (dissableAllocators_t *)GetProcAddress(dllHand, "dissableAllocators");
+	getConsoleBuffer_ = (getConsoleBuffer_t *)GetProcAddress(dllHand, "getConsoleBuffer");
 
 	if (!gameplayStart_) { return false; }
 	if (!gameplayReload_) { return false; }
@@ -150,6 +151,7 @@ bool pika::LoadedDll::loadDll(int id, pika::LogManager &logs)
 	if (!bindAllocator_) { return false; }
 	if (!resetAllocator_) { return false; }
 	if (!dissableAllocators_) { return false; }
+	if (!getConsoleBuffer_) { return false; }
 
 	//get container info
 	getContainerInfoAndCheck(logs);
@@ -216,6 +218,8 @@ void pika::LoadedDll::unloadDll()
 
 	//dissableAllocators_();
 
+	resetAllocatorDllRealm();
+
 	FreeLibrary(dllHand);
 	dllHand = {};
 	filetime = {};
@@ -258,6 +262,7 @@ bool pika::LoadedDll::loadDll(int id, pika::LogManager &logs)
 	bindAllocator_ = bindAllocator;
 	resetAllocator_ = resetAllocator;
 	dissableAllocators_ = dissableAllocators;
+	getConsoleBuffer_ = getConsoleBuffer;
 	getContainerInfoAndCheck(logs);
 	this->id = id;
 

+ 8 - 0
Pika/core/pikaRuntime/dllLoader/dllLoader.h

@@ -9,6 +9,7 @@
 #include <memoryArena/memoryArena.h>
 #include <runtimeContainer/runtimeContainer.h>
 #include <logs/log.h>
+#include <sstream>
 
 #define GAMEPLAYSTART(x) void x(pika::PikaContext &pikaContext)
 typedef GAMEPLAYSTART(gameplayStart_t);
@@ -42,6 +43,12 @@ typedef RESETALLOCATOR(resetAllocator_t)
 typedef DISSABLEALLOCATORS(dissableAllocators_t)
 #undef DISSABLEALLOCATORS
 
+#define GETCONSOLEBUFFER(x) std::streambuf * x();
+typedef GETCONSOLEBUFFER(getConsoleBuffer_t)
+#undef GETCONSOLEBUFFER
+
+
+
 #ifdef PIKA_WINDOWS
 #define NOMINMAX
 #define WIN32_LEAN_AND_MEAN
@@ -62,6 +69,7 @@ struct LoadedDll
 	bindAllocator_t *bindAllocator_ = {};
 	resetAllocator_t *resetAllocator_ = {};
 	dissableAllocators_t *dissableAllocators_ = {};
+	getConsoleBuffer_t *getConsoleBuffer_ = {};
 
 #ifdef PIKA_WINDOWS
 	FILETIME filetime = {};

+ 42 - 10
Pika/core/pikaRuntime/pikaMain.cpp

@@ -49,10 +49,28 @@ BOOL WINAPI customConsoleHandlerRoutine(
 int main()
 {
 
-#if defined(PIKA_WINDOWS)
+#pragma region Console
+
+	
+#ifdef PIKA_DEVELOPMENT
+	//internal console
+
+	{
+
+
+		//std::streambuf *old = std::cout.rdbuf(consoleBuffer.rdbuf());
 
-#if PIKA_ENABLE_CONSOLE
+		//std::cout << "Bla" << std::endl;
+		//printf("test\n");
+		//std::cout.sync_with_stdio();
 
+		//std::string text = buffer.str();
+	}
+
+#else
+	//normal console if enabeled
+#if defined(PIKA_WINDOWS)
+#if PIKA_ENABLE_CONSOLE_IN_PRODUCTION
 	{
 		AllocConsole();
 		(void)freopen("conin$", "r", stdin);
@@ -63,15 +81,18 @@ int main()
 		//HWND hwnd = GetConsoleWindow(); //dissable console x button
 		//HMENU hmenu = GetSystemMenu(hwnd, FALSE);
 		//EnableMenuItem(hmenu, SC_CLOSE, MF_GRAYED);
-		
+
 		SetConsoleCtrlHandler(0, true); //dissable ctrl+c shortcut in console
 		SetConsoleCtrlHandler(customConsoleHandlerRoutine, true); //custom exti function on clicking x button on console
 	}
-
 #endif
-
 #endif
-	
+#endif
+
+
+#pragma endregion
+
+
 
 #pragma region init global variables stuff
 	pika::initShortcutApi();
@@ -126,6 +147,7 @@ int main()
 #pragma endregion
 
 #pragma region init dll reaml
+
 	loadedDll.gameplayStart_(window.context);
 
 	
@@ -140,7 +162,10 @@ int main()
 #pragma region editor
 #if !PIKA_SHOULD_REMOVE_EDITOR
 	pika::Editor editor; 
-	editor.init(shortcutManager, imguiIdsManager);
+	
+	std::streambuf *consoleBuffer = loadedDll.getConsoleBuffer_();
+
+	editor.init(shortcutManager, imguiIdsManager, consoleBuffer);
 #endif
 #pragma endregion
 
@@ -197,11 +222,18 @@ int main()
 		if (editor.shouldReloadDll)
 		{
 			editor.shouldReloadDll = false;
-			containerManager.reloadDll(loadedDll, window, logs);
+			consoleBuffer = loadedDll.getConsoleBuffer_();
+			containerManager.reloadDll(loadedDll, window, logs, consoleBuffer);
 		}
 	#endif
-		
-		containerManager.update(loadedDll, window, logs);
+
+	#ifdef PIKA_DEVELOPMENT
+		containerManager.update(loadedDll, window, logs, imguiIdsManager, consoleBuffer);
+		consoleBuffer = loadedDll.getConsoleBuffer_();
+	#else
+		containerManager.update(loadedDll, window, logs, imguiIdsManager, nullptr);
+	#endif
+
 
 	#pragma endregion
 

+ 1 - 1
Pika/core/pikaRuntime/runtimeContainer/runtimeContainer.h

@@ -32,7 +32,7 @@ struct RuntimeContainer
 	pika::StaticVector<pika::memory::FreeListAllocator, MaxAllocatorsCount> bonusAllocators = {};
 
 	RequestedContainerInfo requestedContainerInfo = {};
-	
+
 	int imguiWindowId = 0;
 
 	struct FLAGS

+ 7 - 1
Pika/core/sharedRuntime/baseContainer.h

@@ -30,6 +30,9 @@ struct RequestedContainerInfo
 
 	pika::GL::PikaFramebuffer requestedFBO = {};
 
+	int requestedImguiIds = 0;
+	int imguiTotalRequestedIds = 0;
+
 	//todo implement
 	bool readEntireFile(const char *name, void *buffer, size_t size)
 	{
@@ -64,6 +67,8 @@ struct ContainerStaticInfo
 	//in release that fbo will just be the default framebuffer
 	bool requestImguiFbo = 0;
 
+	unsigned int requestImguiIds = 0;
+
 	bool _internalNotImplemented = 0;
 
 	bool operator==(const ContainerStaticInfo &other)
@@ -75,7 +80,8 @@ struct ContainerStaticInfo
 			this->bonusAllocators == other.bonusAllocators &&
 			this->_internalNotImplemented == other._internalNotImplemented &&
 			this->requestImguiFbo == other.requestImguiFbo;
-			;
+			this->requestImguiIds == other.requestImguiIds;
+		;
 	}
 
 	bool operator!=(const ContainerStaticInfo &other)

+ 2 - 0
Pika/core/sharedRuntime/pikaImgui/pikaImgui.h

@@ -53,6 +53,8 @@ namespace pika
 			//if you want 5 ids and the function returns 10, then ids 10 11 12 13 14 will be reserved.
 			int getImguiIds(unsigned int count = 1)
 			{
+				if (count == 0) { return 0; }
+
 				return counter + count;
 			}
 		};

BIN
Pika/engineResources/engineSaves/window1.bin


BIN
Pika/engineResources/engineSaves/window2.bin


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

@@ -68,7 +68,15 @@ struct Gameplay : public Container
 		{
 			std::cout << "save\n";
 		}
-		
+
+		//std::cout << "save\n";
+
+
+		if (input.buttons[pika::Button::P].held())
+		{
+			std::cout << input.deltaTime;
+		}
+
 
 		gl2d::enableNecessaryGLFeatures();
 		renderer.updateWindowMetrics(windowState.w, windowState.h);

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

@@ -58,6 +58,7 @@ PIKA_API void dissableAllocators()
 PIKA_API void gameplayStart(pika::PikaContext &pikaContext)
 {
 	pika::pikaImgui::setImguiAllocator(pikaContext.imguiAllocator);
+	//pika::initShortcutApi(); //todo
 
 	//todo user should have functions to specify this
 #pragma region init stuff
@@ -72,12 +73,32 @@ PIKA_API void gameplayStart(pika::PikaContext &pikaContext)
 }
 
 
+static std::stringstream buff;
+static std::streambuf *old = 0;
+
+PIKA_API std::streambuf *getConsoleBuffer()
+{
+	if (old == nullptr)
+	{
+		old = std::cout.rdbuf(buff.rdbuf());
+	}
+	else 
+	{
+		std::cout.rdbuf(buff.rdbuf());
+	}
+
+	return buff.rdbuf();
+}
+
+
+
 //this won't be ever called in production so we can remove the code
 PIKA_API void gameplayReload(pika::PikaContext &pikaContext)
 {
 #ifdef PIKA_DEVELOPMENT	
 
 	pika::pikaImgui::setImguiAllocator(pikaContext.imguiAllocator); //todo check if really needed
+	//pika::initShortcutApi();
 
 
 	PIKA_PERMA_ASSERT(gladLoadGL(), "Problem initializing glad from dll");
@@ -86,4 +107,53 @@ PIKA_API void gameplayReload(pika::PikaContext &pikaContext)
 	gl2d::init();
 
 #endif
-}
+}
+
+#if PIKA_WINDOWS
+#ifdef PIKA_DEVELOPMENT
+
+
+#include <Windows.h>
+//https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain
+BOOL WINAPI DllMain(
+	HINSTANCE hinstDLL,  // handle to DLL module
+	DWORD fdwReason,     // reason for calling function
+	LPVOID lpvReserved)  // reserved
+{
+	// Perform actions based on the reason for calling.
+	switch (fdwReason)
+	{
+	case DLL_PROCESS_ATTACH:
+	// Initialize once for each new process.
+	// Return FALSE to fail DLL load.
+	break;
+
+	case DLL_THREAD_ATTACH:
+	// Do thread-specific initialization.
+	break;
+
+	case DLL_THREAD_DETACH:
+	// Do thread-specific cleanup.
+	break;
+
+	case DLL_PROCESS_DETACH:
+
+	if (lpvReserved != nullptr)
+	{
+		break; // do not do cleanup if process termination scenario
+	}
+
+	if (old)
+	{
+		std::cout.rdbuf(old);
+	}
+
+	// Perform any necessary cleanup.
+	break;
+	}
+	return TRUE;  // Successful DLL_PROCESS_ATTACH.
+}
+
+
+#endif
+#endif

+ 2 - 0
Pika/gameplay/dll/dllMain.h

@@ -13,8 +13,10 @@
 #include <vector>
 #include <memoryArena/memoryArena.h>
 #include <pikaAllocator/freeListAllocator.h>
+#include <sstream>
 
 PIKA_API void gameplayStart(pika::PikaContext &pikaContext);
+PIKA_API std::streambuf *getConsoleBuffer();
 PIKA_API void gameplayReload(pika::PikaContext &pikaContext);
 PIKA_API void getContainersInfo(std::vector<pika::ContainerInformation> &info);
 PIKA_API bool constructContainer(Container **c, pika::memory::MemoryArena *arena, const char *name);

+ 32 - 12
Pika/pluggins/pluggins/immageViewer.h

@@ -14,6 +14,7 @@ struct ImmageViewer: public Container
 {
 
 	gl2d::Texture texture;
+	float zoom = 1.f;
 
 	static ContainerStaticInfo containerInfo()
 	{
@@ -36,30 +37,49 @@ struct ImmageViewer: public Container
 		}
 		pika::memory::setGlobalAllocator(requestedInfo.mainAllocator);
 
-		//texture.cleanup();
-		//GLuint b = 0;
-		//glGenBuffers(1, &b);
-
-		//malloc(100);
-		//new int[100];
+		
 	}
 
 	void update(pika::Input input, pika::WindowState windowState,
 		RequestedContainerInfo &requestedInfo)
 	{
-
 		
-		if(!ImGui::Begin("immage viewer"))
+		
+		if(!ImGui::Begin("Immage title"))
 		{
 			ImGui::End();
 			return;
 		}
 
-		float xsize = 400.f;
-		float aspect = 1.f;
+		ImGui::Text("Immage title; %d, %d", 100, 100);
 
-		ImGui::Image((void *)texture.id, {xsize,xsize / aspect},
-			{0, 1}, {1, 0});
+		auto s = ImGui::GetContentRegionMax();
+		
+		ImGui::SetItemUsingMouseWheel();
+
+		float wheel = ImGui::GetIO().MouseWheel;
+
+		//todo standard out
+
+		if (ImGui::GetIO().KeysData[ImGuiKey_LeftCtrl].Down || ImGui::GetIO().KeysData[ImGuiKey_RightCtrl].Down)
+		{
+			zoom += wheel * 0.2;
+		}
+
+		zoom = std::min(zoom, 10.f);
+		zoom = std::max(zoom, 0.2f);
+
+		if (ImGui::BeginChild(6996, {}, false, ImGuiWindowFlags_HorizontalScrollbar))
+		{
+
+			float xsize = std::max((int)(s.x*zoom) - 10, (int)(100*zoom));
+			float aspect = 1.f;
+
+			ImGui::Image((void *)texture.id, {xsize,xsize / aspect},
+				{0, 1}, {1, 0});
+
+			ImGui::EndChild();
+		}
 
 
 		ImGui::End();

+ 1 - 6
Pika/resources/logs.txt

@@ -1,6 +1 @@
-#2022-10-21 13:32:05: Created container: Gameplay
-#2022-10-21 13:32:25: Loaded snapshot
-#2022-10-21 13:32:27: Loaded snapshot
-#2022-10-21 13:32:30: Loaded snapshot
-#2022-10-21 13:32:36: Loaded snapshot
-#2022-10-21 13:32:37: Destroyed continer: Gameplay #1
+#2022-10-22 23:02:42: Created container: Gameplay