Explorar o código

Finalize the console

Panagiotis Christopoulos Charitos %!s(int64=6) %!d(string=hai) anos
pai
achega
462e5008a4

+ 9 - 5
src/anki/core/App.cpp

@@ -267,11 +267,12 @@ App::~App()
 
 
 void App::cleanup()
 void App::cleanup()
 {
 {
+	m_statsUi.reset(nullptr);
+	m_console.reset(nullptr);
+
 	m_heapAlloc.deleteInstance(m_scene);
 	m_heapAlloc.deleteInstance(m_scene);
 	m_heapAlloc.deleteInstance(m_script);
 	m_heapAlloc.deleteInstance(m_script);
 	m_heapAlloc.deleteInstance(m_renderer);
 	m_heapAlloc.deleteInstance(m_renderer);
-	m_statsUi.reset(nullptr);
-	m_console.reset(nullptr);
 	m_heapAlloc.deleteInstance(m_ui);
 	m_heapAlloc.deleteInstance(m_ui);
 	m_heapAlloc.deleteInstance(m_resources);
 	m_heapAlloc.deleteInstance(m_resources);
 	m_heapAlloc.deleteInstance(m_resourceFs);
 	m_heapAlloc.deleteInstance(m_resourceFs);
@@ -447,9 +448,6 @@ Error App::initInternal(const ConfigSet& config_, AllocAlignedCallback allocCb,
 	m_ui = m_heapAlloc.newInstance<UiManager>();
 	m_ui = m_heapAlloc.newInstance<UiManager>();
 	ANKI_CHECK(m_ui->init(m_allocCb, m_allocCbData, m_resources, m_gr, m_stagingMem, m_input));
 	ANKI_CHECK(m_ui->init(m_allocCb, m_allocCbData, m_resources, m_gr, m_stagingMem, m_input));
 
 
-	ANKI_CHECK(m_ui->newInstance<StatsUi>(m_statsUi));
-	ANKI_CHECK(m_ui->newInstance<DeveloperConsole>(m_console, m_allocCb, m_allocCbData));
-
 	//
 	//
 	// Renderer
 	// Renderer
 	//
 	//
@@ -482,6 +480,12 @@ Error App::initInternal(const ConfigSet& config_, AllocAlignedCallback allocCb,
 	m_script->setRenderer(m_renderer);
 	m_script->setRenderer(m_renderer);
 	m_script->setSceneGraph(m_scene);
 	m_script->setSceneGraph(m_scene);
 
 
+	//
+	// Misc
+	//
+	ANKI_CHECK(m_ui->newInstance<StatsUi>(m_statsUi));
+	ANKI_CHECK(m_ui->newInstance<DeveloperConsole>(m_console, m_allocCb, m_allocCbData, m_script));
+
 	ANKI_CORE_LOGI("Application initialized");
 	ANKI_CORE_LOGI("Application initialized");
 
 
 	return Error::NONE;
 	return Error::NONE;

+ 21 - 3
src/anki/core/DeveloperConsole.cpp

@@ -21,7 +21,7 @@ DeveloperConsole::~DeveloperConsole()
 	}
 	}
 }
 }
 
 
-Error DeveloperConsole::init(AllocAlignedCallback allocCb, void* allocCbUserData)
+Error DeveloperConsole::init(AllocAlignedCallback allocCb, void* allocCbUserData, ScriptManager* scriptManager)
 {
 {
 	m_alloc = HeapAllocator<U8>(allocCb, allocCbUserData);
 	m_alloc = HeapAllocator<U8>(allocCb, allocCbUserData);
 	zeroMemory(m_inputText);
 	zeroMemory(m_inputText);
@@ -31,6 +31,8 @@ Error DeveloperConsole::init(AllocAlignedCallback allocCb, void* allocCbUserData
 	// Add a new callback to the logger
 	// Add a new callback to the logger
 	LoggerSingleton::get().addMessageHandler(this, loggerCallback);
 	LoggerSingleton::get().addMessageHandler(this, loggerCallback);
 
 
+	ANKI_CHECK(m_scriptEnv.init(scriptManager));
+
 	return Error::NONE;
 	return Error::NONE;
 }
 }
 
 
@@ -83,18 +85,32 @@ void DeveloperConsole::build(CanvasPtr ctx)
 
 
 		ImGui::PopStyleColor();
 		ImGui::PopStyleColor();
 	}
 	}
-	ImGui::SetScrollHereY(1.0f);
+
+	const U32 timestamp = m_logItemsTimestamp.get();
+	const Bool scrollToLast = m_logItemsTimestampConsumed < timestamp;
+
+	if(scrollToLast)
+	{
+		ImGui::SetScrollHereY(1.0f);
+		++m_logItemsTimestampConsumed;
+	}
 	ImGui::PopStyleVar();
 	ImGui::PopStyleVar();
 	ImGui::EndChild();
 	ImGui::EndChild();
 
 
 	// Commands
 	// Commands
 	ImGui::Separator();
 	ImGui::Separator();
+	ImGui::PushItemWidth(-1.0f); // Use the whole size
 	if(ImGui::InputText(
 	if(ImGui::InputText(
 		   "", &m_inputText[0], m_inputText.getSizeInBytes(), ImGuiInputTextFlags_EnterReturnsTrue, nullptr, nullptr))
 		   "", &m_inputText[0], m_inputText.getSizeInBytes(), ImGuiInputTextFlags_EnterReturnsTrue, nullptr, nullptr))
 	{
 	{
-		ANKI_LOGI("Command: %s", &m_inputText[0]);
+		const Error err = m_scriptEnv.evalString(&m_inputText[0]);
+		if(!err)
+		{
+			ANKI_CORE_LOGI("Script run without errors");
+		}
 		m_inputText[0] = '\0';
 		m_inputText[0] = '\0';
 	}
 	}
+	ImGui::PopItemWidth();
 
 
 	ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget
 	ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget
 
 
@@ -135,6 +151,8 @@ void DeveloperConsole::newLogItem(const LoggerMessageInfo& inf)
 	// Push it back
 	// Push it back
 	m_logItems.pushBack(newLogItem);
 	m_logItems.pushBack(newLogItem);
 	++m_logItemCount;
 	++m_logItemCount;
+
+	m_logItemsTimestamp.fetchAdd(1);
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 8 - 1
src/anki/core/DeveloperConsole.h

@@ -6,7 +6,9 @@
 #pragma once
 #pragma once
 
 
 #include <anki/Ui.h>
 #include <anki/Ui.h>
+#include <anki/core/Common.h>
 #include <anki/util/List.h>
 #include <anki/util/List.h>
+#include <anki/script/ScriptEnvironment.h>
 
 
 namespace anki
 namespace anki
 {
 {
@@ -25,7 +27,7 @@ public:
 
 
 	~DeveloperConsole();
 	~DeveloperConsole();
 
 
-	ANKI_USE_RESULT Error init(AllocAlignedCallback allocCb, void* allocCbUserData);
+	ANKI_USE_RESULT Error init(AllocAlignedCallback allocCb, void* allocCbUserData, ScriptManager* scriptManager);
 
 
 	void build(CanvasPtr ctx) override;
 	void build(CanvasPtr ctx) override;
 
 
@@ -49,6 +51,11 @@ private:
 	U32 m_logItemCount = 0;
 	U32 m_logItemCount = 0;
 	Array<char, 256> m_inputText;
 	Array<char, 256> m_inputText;
 
 
+	Atomic<U32> m_logItemsTimestamp = {1};
+	U32 m_logItemsTimestampConsumed = 0;
+
+	ScriptEnvironment m_scriptEnv;
+
 	void newLogItem(const LoggerMessageInfo& inf);
 	void newLogItem(const LoggerMessageInfo& inf);
 
 
 	static void loggerCallback(void* userData, const LoggerMessageInfo& info)
 	static void loggerCallback(void* userData, const LoggerMessageInfo& info)

+ 1 - 0
src/anki/gr/Enums.h

@@ -45,6 +45,7 @@ enum class FillMode : U8
 
 
 enum class FaceSelectionBit : U8
 enum class FaceSelectionBit : U8
 {
 {
+	NONE = 0,
 	FRONT = 1 << 0,
 	FRONT = 1 << 0,
 	BACK = 1 << 1,
 	BACK = 1 << 1,
 	FRONT_AND_BACK = FRONT | BACK
 	FRONT_AND_BACK = FRONT | BACK

+ 3 - 0
src/anki/gr/vulkan/Common.cpp

@@ -100,6 +100,9 @@ VkCullModeFlags convertCullMode(FaceSelectionBit ak)
 	VkCullModeFlags out = 0;
 	VkCullModeFlags out = 0;
 	switch(ak)
 	switch(ak)
 	{
 	{
+	case FaceSelectionBit::NONE:
+		out = VK_CULL_MODE_NONE;
+		break;
 	case FaceSelectionBit::FRONT:
 	case FaceSelectionBit::FRONT:
 		out = VK_CULL_MODE_FRONT_BIT;
 		out = VK_CULL_MODE_FRONT_BIT;
 		break;
 		break;

+ 3 - 1
src/anki/ui/Canvas.cpp

@@ -227,7 +227,7 @@ void Canvas::appendToCommandBufferInternal(CommandBufferPtr& cmdb)
 	}
 	}
 
 
 	cmdb->setBlendFactors(0, BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA);
 	cmdb->setBlendFactors(0, BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA);
-	cmdb->setCullMode(FaceSelectionBit::FRONT);
+	cmdb->setCullMode(FaceSelectionBit::NONE);
 
 
 	const U fbWidth = drawData.DisplaySize.x * drawData.FramebufferScale.x;
 	const U fbWidth = drawData.DisplaySize.x * drawData.FramebufferScale.x;
 	const U fbHeight = drawData.DisplaySize.y * drawData.FramebufferScale.y;
 	const U fbHeight = drawData.DisplaySize.y * drawData.FramebufferScale.y;
@@ -314,7 +314,9 @@ void Canvas::appendToCommandBufferInternal(CommandBufferPtr& cmdb)
 		vertOffset += cmdList.VtxBuffer.Size;
 		vertOffset += cmdList.VtxBuffer.Size;
 	}
 	}
 
 
+	// Restore state
 	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
 	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
+	cmdb->setCullMode(FaceSelectionBit::BACK);
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki