Ref, Scope
- Changed all std::unique_ptr/shared_ptr stuff to use Ref/Scope - Fixed the Logger.h include in Base.h problem
This commit is contained in:
		
							parent
							
								
									0360d094d2
								
							
						
					
					
						commit
						55869f6106
					
				
					 65 changed files with 261 additions and 234 deletions
				
			
		| 
						 | 
				
			
			@ -1,14 +1,43 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#ifndef LOGGER_H
 | 
			
		||||
	#include "Debug/Logger.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "Debug/Exceptions.h"
 | 
			
		||||
#include "Utility/Stringifier.h"
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	// Ref (Ref)
 | 
			
		||||
	template<typename T>
 | 
			
		||||
	using Ref = std::shared_ptr<T>;
 | 
			
		||||
 | 
			
		||||
	template<typename T, typename... Args>
 | 
			
		||||
	constexpr Ref<T> CreateRef(Args&&... args)
 | 
			
		||||
	{
 | 
			
		||||
		return std::make_shared<T>(std::forward<Args>(args)...);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	template<typename T>
 | 
			
		||||
	constexpr Ref<T> MakeRef(T* rawPointer)
 | 
			
		||||
	{
 | 
			
		||||
		return std::shared_ptr<T>(T);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Scope (std::unique_ptr)
 | 
			
		||||
	template<typename T>
 | 
			
		||||
	using Scope = std::unique_ptr<T>;
 | 
			
		||||
 | 
			
		||||
	template<typename T, typename... Args>
 | 
			
		||||
	constexpr std::unique_ptr<T> CreateScope(Args&&... args)
 | 
			
		||||
	{
 | 
			
		||||
		return std::make_unique<T>(std::forward<Args>(args)...);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	template<typename T>
 | 
			
		||||
	constexpr std::unique_ptr<T> MakeScope(T* rawPointer)
 | 
			
		||||
	{
 | 
			
		||||
		return std::unique_ptr<T>(rawPointer);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// platform	
 | 
			
		||||
#define LT_WIN(x) // windows
 | 
			
		||||
#define LT_LIN(x) // linux
 | 
			
		||||
| 
						 | 
				
			
			@ -44,42 +73,6 @@
 | 
			
		|||
	#define LT_CLIENT_ASSERT(x, ...) { if(!(x)) { LT_CLIENT_CRITICAL(__VA_ARGS__); LT_BREAK(); throw ::Light::FailedClientAssertion(__FILE__, __LINE__); } }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	// Ref (std::shared_ptr)
 | 
			
		||||
	template<typename T> 
 | 
			
		||||
	using Ref = std::shared_ptr<T>;
 | 
			
		||||
 | 
			
		||||
	template<typename T, typename... Args>
 | 
			
		||||
	constexpr std::shared_ptr<T> CreateRef(Args... args)
 | 
			
		||||
	{
 | 
			
		||||
		return std::make_shared<T>(std::forward<Args>(args)...);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	template<typename T>
 | 
			
		||||
	constexpr std::shared_ptr<T> MakeRef(T* rawPointer)
 | 
			
		||||
	{
 | 
			
		||||
		return std::shared_ptr<T>(T);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Scope (std::unique_ptr)
 | 
			
		||||
	template<typename T>
 | 
			
		||||
	using Scope = std::unique_ptr<T>;
 | 
			
		||||
 | 
			
		||||
	template<typename T, typename... Args>
 | 
			
		||||
	constexpr std::unique_ptr<T> CreateScope(Args... args)
 | 
			
		||||
	{
 | 
			
		||||
		return std::make_unique<T>(std::forward<Args>(args)...);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	template<typename T>
 | 
			
		||||
	constexpr std::unique_ptr<T> MakeScope(T* rawPointer)
 | 
			
		||||
	{
 | 
			
		||||
		return std::unique_ptr<T>(rawPointer);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///*** [  PORTABLES  ] ***///
 | 
			
		||||
//** PORTABLE_DEBUG_BREAK **//
 | 
			
		||||
// copied from: https://github.com/nemequ/portable-snippets/tree/master/debug-trap
 | 
			
		||||
| 
						 | 
				
			
			@ -157,3 +150,11 @@ namespace Light {
 | 
			
		|||
//** PORTABLE_DEBUG_BREAK **//
 | 
			
		||||
///*** [  PORTABLES  ] ***///
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef LT_LOGGER_H
 | 
			
		||||
#include "Debug/Logger.h"
 | 
			
		||||
#define LT_LOGGER_H
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "Debug/Exceptions.h"
 | 
			
		||||
#include "Utility/Stringifier.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -22,10 +22,12 @@ namespace Light {
 | 
			
		|||
	Application::Application()
 | 
			
		||||
	{
 | 
			
		||||
		Logger::Initialize();
 | 
			
		||||
		m_Instrumentor = std::unique_ptr<Instrumentor>(Instrumentor::Create());
 | 
			
		||||
		m_Instrumentor = Instrumentor::Create();
 | 
			
		||||
		m_LayerStack = LayerStack::Create();
 | 
			
		||||
		m_Input = Input::Create();
 | 
			
		||||
 | 
			
		||||
		m_Instrumentor->BeginSession("Logs/ProfileResults_Startup.json");
 | 
			
		||||
		m_Window = std::unique_ptr<Light::Window>(Light::Window::Create(std::bind(&Light::Application::OnEvent, this, std::placeholders::_1)));
 | 
			
		||||
		m_Window = Window::Create(std::bind(&Application::OnEvent, this, std::placeholders::_1));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Application::~Application()
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +61,7 @@ namespace Light {
 | 
			
		|||
				// update layers
 | 
			
		||||
				LT_PROFILE_SCOPE("GameLoop::Update");
 | 
			
		||||
 | 
			
		||||
				for (auto it = m_LayerStack.begin(); it != m_LayerStack.end(); it++)
 | 
			
		||||
				for (auto it = m_LayerStack->begin(); it != m_LayerStack->end(); it++)
 | 
			
		||||
					(*it)->OnUpdate(deltaTimer.GetDeltaTime());
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +70,7 @@ namespace Light {
 | 
			
		|||
				LT_PROFILE_SCOPE("GameLoop::Render");
 | 
			
		||||
				m_Window->GetGfxContext()->GetRenderer()->BeginFrame();
 | 
			
		||||
 | 
			
		||||
				for (auto it = m_LayerStack.begin(); it != m_LayerStack.end(); it++)
 | 
			
		||||
				for (auto it = m_LayerStack->begin(); it != m_LayerStack->end(); it++)
 | 
			
		||||
					(*it)->OnRender();
 | 
			
		||||
 | 
			
		||||
				m_Window->GetGfxContext()->GetRenderer()->EndFrame();
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +81,7 @@ namespace Light {
 | 
			
		|||
				LT_PROFILE_SCOPE("GameLoop::UserInterface");
 | 
			
		||||
				m_Window->GetGfxContext()->GetUserInterface()->Begin();
 | 
			
		||||
 | 
			
		||||
				for (auto it = m_LayerStack.begin(); it != m_LayerStack.end(); it++)
 | 
			
		||||
				for (auto it = m_LayerStack->begin(); it != m_LayerStack->end(); it++)
 | 
			
		||||
					(*it)->OnUserInterfaceUpdate();
 | 
			
		||||
 | 
			
		||||
				m_Window->GetGfxContext()->GetUserInterface()->End();
 | 
			
		||||
| 
						 | 
				
			
			@ -112,14 +114,14 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
		// input
 | 
			
		||||
		if (event.HasCategory(InputEventCategory))
 | 
			
		||||
			m_Input.OnEvent(event);
 | 
			
		||||
			m_Input->OnEvent(event);
 | 
			
		||||
 | 
			
		||||
		// layers
 | 
			
		||||
		// return if the event is an input event and 'Input' has disabled the game events
 | 
			
		||||
		if (event.HasCategory(InputEventCategory) && !m_Input.IsReceivingGameEvents()) 
 | 
			
		||||
		if (event.HasCategory(InputEventCategory) && !m_Input->IsReceivingGameEvents()) 
 | 
			
		||||
			return;
 | 
			
		||||
 | 
			
		||||
		for (auto it = m_LayerStack.rbegin(); it != m_LayerStack.rend(); it++)
 | 
			
		||||
		for (auto it = m_LayerStack->rbegin(); it != m_LayerStack->rend(); it++)
 | 
			
		||||
			if ((*it)->OnEvent(event)) return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,12 +18,12 @@ namespace Light {
 | 
			
		|||
	class Application
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::unique_ptr<Instrumentor> m_Instrumentor = nullptr;
 | 
			
		||||
		LayerStack m_LayerStack;
 | 
			
		||||
		Input m_Input;
 | 
			
		||||
		Scope<Instrumentor> m_Instrumentor = nullptr;
 | 
			
		||||
		Scope<LayerStack> m_LayerStack;
 | 
			
		||||
		Scope<Input> m_Input;
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
		std::unique_ptr<Window> m_Window = nullptr;
 | 
			
		||||
		Scope<Window> m_Window = nullptr;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		Application(const Application&) = delete;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,12 +19,12 @@ namespace Light {
 | 
			
		|||
	class Window
 | 
			
		||||
	{
 | 
			
		||||
	protected:
 | 
			
		||||
		std::unique_ptr<GraphicsContext> m_GraphicsContext;
 | 
			
		||||
		Scope<GraphicsContext> m_GraphicsContext;
 | 
			
		||||
		WindowProperties m_Properties = {};
 | 
			
		||||
		bool b_Closed = false;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		static Window* Create(std::function<void(Event&)> callback);
 | 
			
		||||
		static Scope<Window> Create(std::function<void(Event&)> callback);
 | 
			
		||||
 | 
			
		||||
		Window(const Window&) = delete;
 | 
			
		||||
		Window& operator=(const Window&) = delete;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,9 +5,9 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	Instrumentor* Instrumentor::s_Context = nullptr;
 | 
			
		||||
 | 
			
		||||
	Instrumentor* Instrumentor::Create()
 | 
			
		||||
	Scope<Instrumentor> Instrumentor::Create()
 | 
			
		||||
	{
 | 
			
		||||
		return new Instrumentor;
 | 
			
		||||
		return MakeScope<Instrumentor>(new Instrumentor);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	Instrumentor::Instrumentor()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ namespace Light {
 | 
			
		|||
		unsigned int m_CurrentSessionCount;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		static Instrumentor* Create();
 | 
			
		||||
		static Scope<Instrumentor> Create();
 | 
			
		||||
 | 
			
		||||
		static inline void BeginSession(const std::string& outputPath) { s_Context->BeginSessionImpl(outputPath); }
 | 
			
		||||
		static inline void EndSession() { s_Context->EndSessionImpl(); }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,9 +6,9 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	std::shared_ptr<spdlog::logger> Logger::s_EngineLogger = nullptr;
 | 
			
		||||
	std::shared_ptr<spdlog::logger> Logger::s_ClientLogger = nullptr;
 | 
			
		||||
	std::shared_ptr<spdlog::logger> Logger::s_FileLogger = nullptr;
 | 
			
		||||
	Ref<spdlog::logger> Logger::s_EngineLogger = nullptr;
 | 
			
		||||
	Ref<spdlog::logger> Logger::s_ClientLogger = nullptr;
 | 
			
		||||
	Ref<spdlog::logger> Logger::s_FileLogger = nullptr;
 | 
			
		||||
 | 
			
		||||
	std::string Logger::s_LogFilePath = LT_LOG_FILE_LOCATION;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#define LT_LOGGER_H
 | 
			
		||||
#include "Base.h"
 | 
			
		||||
 | 
			
		||||
#include <spdlog/spdlog.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -47,7 +48,7 @@ namespace Light {
 | 
			
		|||
	class Logger
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		static std::shared_ptr<spdlog::logger> s_EngineLogger, s_ClientLogger, s_FileLogger;
 | 
			
		||||
		static Ref<spdlog::logger> s_EngineLogger, s_ClientLogger, s_FileLogger;
 | 
			
		||||
		static std::string s_LogFilePath;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
| 
						 | 
				
			
			@ -55,11 +56,12 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
		static void Initialize();
 | 
			
		||||
 | 
			
		||||
		static inline std::shared_ptr<spdlog::logger> GetEngineLogger() { return s_EngineLogger; }
 | 
			
		||||
		static inline std::shared_ptr<spdlog::logger> GetClientLogger() { return s_ClientLogger; }
 | 
			
		||||
		static inline std::shared_ptr<spdlog::logger> GetFileLogger() { return s_FileLogger; }
 | 
			
		||||
		static inline Ref<spdlog::logger> GetEngineLogger() { return s_EngineLogger; }
 | 
			
		||||
		static inline Ref<spdlog::logger> GetClientLogger() { return s_ClientLogger; }
 | 
			
		||||
		static inline Ref<spdlog::logger> GetFileLogger() { return s_FileLogger; }
 | 
			
		||||
 | 
			
		||||
		static void LogDebugData();
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,15 +12,15 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	Blender* Blender::Create(std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Scope<Blender> Blender::Create(Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glBlender();
 | 
			
		||||
			return CreateScope<glBlender>();
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxBlender(std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateScope<dxBlender>(std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "Blender::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ namespace Light {
 | 
			
		|||
	private:
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		static Blender* Create(std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Scope<Blender> Create(Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		virtual void Enable(BlendFactor srcFactor, BlendFactor dstFactor) = 0;
 | 
			
		||||
		virtual void Disable() = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,32 +14,32 @@
 | 
			
		|||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	//* CONSTANT_BUFFER *//
 | 
			
		||||
	ConstantBuffer* ConstantBuffer::Create(ConstantBufferIndex index, unsigned int size, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Scope<ConstantBuffer> ConstantBuffer::Create(ConstantBufferIndex index, unsigned int size, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glConstantBuffer(index, size);
 | 
			
		||||
			return CreateScope<glConstantBuffer>(index, size);
 | 
			
		||||
 | 
			
		||||
		case  GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxConstantBuffer(index, size, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateScope<dxConstantBuffer>(index, size, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "VertexBuffer::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "ConstantBuffer::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
			return nullptr;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//* VERTEX_BUFFER *//
 | 
			
		||||
	VertexBuffer* VertexBuffer::Create(float* vertices, unsigned int stride, unsigned int count, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Ref<VertexBuffer> VertexBuffer::Create(float* vertices, unsigned int stride, unsigned int count, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glVertexBuffer(vertices, count);
 | 
			
		||||
			return CreateRef<glVertexBuffer>(vertices, count);
 | 
			
		||||
			
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxVertexBuffer(vertices, stride, count, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateRef<dxVertexBuffer>(vertices, stride, count, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "VertexBuffer::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			@ -48,15 +48,15 @@ namespace Light {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	//* INDEX_BUFFER *//
 | 
			
		||||
	IndexBuffer* IndexBuffer::Create(unsigned int* indices, unsigned int count, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Ref<IndexBuffer> IndexBuffer::Create(unsigned int* indices, unsigned int count, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glIndexBuffer(indices, count);
 | 
			
		||||
			return CreateRef<glIndexBuffer>(indices, count);
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxIndexBuffer(indices, count, std::dynamic_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateRef<dxIndexBuffer>(indices, count, std::dynamic_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "IndexBuffer::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,19 +15,22 @@ namespace Light {
 | 
			
		|||
	class ConstantBuffer
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		static ConstantBuffer* Create(ConstantBufferIndex index, unsigned int size, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Scope<ConstantBuffer> Create(ConstantBufferIndex index, unsigned int size, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		virtual void Bind() = 0;
 | 
			
		||||
 | 
			
		||||
		virtual void* Map() = 0;
 | 
			
		||||
		virtual void UnMap() = 0;
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
		ConstantBuffer() = default;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	//* VERTEX_BUFFER *//
 | 
			
		||||
	class VertexBuffer
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		static VertexBuffer* Create(float* vertices, unsigned int stride, unsigned int count, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Ref<VertexBuffer> Create(float* vertices, unsigned int stride, unsigned int count, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		virtual ~VertexBuffer() = default;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +48,7 @@ namespace Light {
 | 
			
		|||
	class IndexBuffer
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		static IndexBuffer* Create(unsigned int* indices, unsigned int count, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Ref<IndexBuffer> Create(unsigned int* indices, unsigned int count, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		virtual ~IndexBuffer() = default;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,15 +11,15 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	Framebuffer* Framebuffer::Create(const FramebufferSpecification& specification, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Ref<Framebuffer> Framebuffer::Create(const FramebufferSpecification& specification, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glFramebuffer(specification);
 | 
			
		||||
			return CreateRef<glFramebuffer>(specification);
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxFramebuffer(specification, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateRef<dxFramebuffer>(specification, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "Shader::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ namespace Light {
 | 
			
		|||
	class Framebuffer
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		static Framebuffer* Create(const FramebufferSpecification& specification, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Ref<Framebuffer> Create(const FramebufferSpecification& specification, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		virtual void* GetColorAttachment() = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,9 +17,9 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	GraphicsContext* GraphicsContext::s_Context = nullptr;
 | 
			
		||||
 | 
			
		||||
	GraphicsContext::~GraphicsContext() { }
 | 
			
		||||
	GraphicsContext::~GraphicsContext() {}
 | 
			
		||||
 | 
			
		||||
	GraphicsContext* GraphicsContext::Create(GraphicsAPI api, GLFWwindow* windowHandle)
 | 
			
		||||
	Scope<GraphicsContext> GraphicsContext::Create(GraphicsAPI api, GLFWwindow* windowHandle)
 | 
			
		||||
	{
 | 
			
		||||
		// terminate 'GraphicsContext' dependent classes
 | 
			
		||||
		if (s_Context)
 | 
			
		||||
| 
						 | 
				
			
			@ -43,14 +43,17 @@ namespace Light {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		// create gfx context
 | 
			
		||||
		Scope<GraphicsContext> scopeGfx;
 | 
			
		||||
		switch (api)
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			s_Context = new glGraphicsContext(windowHandle);
 | 
			
		||||
			scopeGfx = CreateScope<glGraphicsContext>(windowHandle);
 | 
			
		||||
			s_Context = scopeGfx.get();
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			s_Context = new dxGraphicsContext(windowHandle);
 | 
			
		||||
			scopeGfx = CreateScope<dxGraphicsContext>(windowHandle);
 | 
			
		||||
			s_Context = scopeGfx.get();
 | 
			
		||||
			break;)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
| 
						 | 
				
			
			@ -59,16 +62,16 @@ namespace Light {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		// create 'GraphicsContext' dependent classes
 | 
			
		||||
		s_Context->m_ResourceManager = std::unique_ptr<ResourceManager>(ResourceManager::Create(s_Context->m_SharedContext));
 | 
			
		||||
		s_Context->m_UserInterface = std::unique_ptr<UserInterface>(UserInterface::Create(windowHandle, s_Context->m_SharedContext));
 | 
			
		||||
		s_Context->m_Renderer = std::unique_ptr<Renderer>(Renderer::Create(windowHandle, s_Context->m_SharedContext));
 | 
			
		||||
		s_Context->m_ResourceManager = ResourceManager::Create(s_Context->m_SharedContext);
 | 
			
		||||
		s_Context->m_UserInterface = UserInterface::Create(windowHandle, s_Context->m_SharedContext);
 | 
			
		||||
		s_Context->m_Renderer = Renderer::Create(windowHandle, s_Context->m_SharedContext);
 | 
			
		||||
 | 
			
		||||
		// check
 | 
			
		||||
		LT_ENGINE_ASSERT(s_Context->m_ResourceManager, "GraphicsContext::Create: failed to create ResourceManager");
 | 
			
		||||
		LT_ENGINE_ASSERT(s_Context->m_UserInterface, "GraphicsContext::Create: failed to create UserInterface");
 | 
			
		||||
		LT_ENGINE_ASSERT(s_Context->m_Renderer, "GraphicsContext::Create: failed to create Renderer");
 | 
			
		||||
 | 
			
		||||
		return s_Context;
 | 
			
		||||
		return std::move(scopeGfx);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -28,16 +28,16 @@ namespace Light {
 | 
			
		|||
	private:
 | 
			
		||||
		static GraphicsContext* s_Context;
 | 
			
		||||
 | 
			
		||||
		std::unique_ptr<ResourceManager> m_ResourceManager;
 | 
			
		||||
		std::unique_ptr<UserInterface> m_UserInterface;
 | 
			
		||||
		std::unique_ptr<Renderer> m_Renderer;
 | 
			
		||||
		Scope<ResourceManager> m_ResourceManager;
 | 
			
		||||
		Scope<UserInterface> m_UserInterface;
 | 
			
		||||
		Scope<Renderer> m_Renderer;
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
		GraphicsAPI m_GraphicsAPI;
 | 
			
		||||
		std::shared_ptr<SharedContext> m_SharedContext = nullptr;
 | 
			
		||||
		Ref<SharedContext> m_SharedContext = nullptr;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		static GraphicsContext* Create(GraphicsAPI api, GLFWwindow* windowHandle);
 | 
			
		||||
		static Scope<GraphicsContext> Create(GraphicsAPI api, GLFWwindow* windowHandle);
 | 
			
		||||
 | 
			
		||||
		GraphicsContext(const GraphicsContext&) = delete;
 | 
			
		||||
		GraphicsContext& operator=(const GraphicsContext&) = delete;
 | 
			
		||||
| 
						 | 
				
			
			@ -47,15 +47,13 @@ namespace Light {
 | 
			
		|||
		virtual void LogDebugData() = 0;
 | 
			
		||||
 | 
			
		||||
		static inline GraphicsAPI GetGraphicsAPI() { return s_Context->m_GraphicsAPI; }
 | 
			
		||||
		static inline std::shared_ptr<SharedContext> GetSharedContext() { return s_Context->m_SharedContext; }
 | 
			
		||||
		static inline Ref<SharedContext> GetSharedContext() { return s_Context->m_SharedContext; }
 | 
			
		||||
 | 
			
		||||
		inline Renderer* GetRenderer() { return m_Renderer.get(); }
 | 
			
		||||
		inline UserInterface* GetUserInterface() { return m_UserInterface.get(); }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
		GraphicsContext() = default;
 | 
			
		||||
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -11,15 +11,15 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	RenderCommand* RenderCommand::Create(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Scope<RenderCommand> RenderCommand::Create(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glRenderCommand(windowHandle);
 | 
			
		||||
			return CreateScope<glRenderCommand>(windowHandle);
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxRenderCommand((std::static_pointer_cast<dxSharedContext>)(sharedContext));)
 | 
			
		||||
			return CreateScope<dxRenderCommand>((std::static_pointer_cast<dxSharedContext>)(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "RenderCommand::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ namespace Light {
 | 
			
		|||
	class RenderCommand
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		static RenderCommand* Create(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Scope<RenderCommand> Create(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		RenderCommand(const RenderCommand&) = delete;
 | 
			
		||||
		RenderCommand& operator=(const RenderCommand&) = delete;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,24 +19,24 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	Renderer* Renderer::s_Context = nullptr;
 | 
			
		||||
 | 
			
		||||
	Renderer::Renderer(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Renderer::Renderer(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext)
 | 
			
		||||
		: m_QuadRenderer(LT_MAX_QUAD_RENDERER_VERTICES, sharedContext),
 | 
			
		||||
		  m_TextureRenderer(LT_MAX_TEXTURE_RENDERER_VERTICES, sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		LT_ENGINE_ASSERT(!s_Context, "Renderer::Renderer: an instance of 'Renderer' already exists, do not construct this class!");
 | 
			
		||||
		s_Context = this;
 | 
			
		||||
 | 
			
		||||
		m_RenderCommand = std::unique_ptr<RenderCommand>(RenderCommand::Create(windowHandle, sharedContext));
 | 
			
		||||
		m_RenderCommand = RenderCommand::Create(windowHandle, sharedContext);
 | 
			
		||||
 | 
			
		||||
		m_ViewProjectionBuffer = std::unique_ptr<ConstantBuffer>(ConstantBuffer::Create(ConstantBufferIndex::ViewProjection, sizeof(glm::mat4), sharedContext));
 | 
			
		||||
		m_ViewProjectionBuffer = ConstantBuffer::Create(ConstantBufferIndex::ViewProjection, sizeof(glm::mat4), sharedContext);
 | 
			
		||||
 | 
			
		||||
		m_Blender = std::unique_ptr<Blender>(Blender::Create(sharedContext));
 | 
			
		||||
		m_Blender = Blender::Create(sharedContext);
 | 
			
		||||
		m_Blender->Enable(BlendFactor::SRC_ALPHA, BlendFactor::INVERSE_SRC_ALPHA);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Renderer* Renderer::Create(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Scope<Renderer> Renderer::Create(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		return new Renderer(windowHandle, sharedContext);
 | 
			
		||||
		return MakeScope<Renderer>(new Renderer(windowHandle, sharedContext));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Renderer::OnWindowResize(const WindowResizedEvent& event)
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +78,7 @@ namespace Light {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, std::shared_ptr<Texture> texture)
 | 
			
		||||
	void Renderer::DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, Ref<Texture> texture)
 | 
			
		||||
	{
 | 
			
		||||
		// #todo: implement a proper binding
 | 
			
		||||
		texture->Bind();
 | 
			
		||||
| 
						 | 
				
			
			@ -125,7 +125,7 @@ namespace Light {
 | 
			
		|||
		m_RenderCommand->ClearBackBuffer(m_Camera->GetClearColor());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Renderer::BeginSceneImpl(const std::shared_ptr<Camera>& camera, const std::shared_ptr<Framebuffer>& targetFrameBuffer /* = nullptr */)
 | 
			
		||||
	void Renderer::BeginSceneImpl(const Ref<Camera>& camera, const Ref<Framebuffer>& targetFrameBuffer /* = nullptr */)
 | 
			
		||||
	{
 | 
			
		||||
		m_TargetFramebuffer = targetFrameBuffer;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,24 +39,24 @@ namespace Light {
 | 
			
		|||
		TextureRendererProgram m_TextureRenderer;
 | 
			
		||||
 | 
			
		||||
		// constant buffers
 | 
			
		||||
		std::unique_ptr<ConstantBuffer> m_ViewProjectionBuffer;
 | 
			
		||||
		Scope<ConstantBuffer> m_ViewProjectionBuffer;
 | 
			
		||||
 | 
			
		||||
		std::unique_ptr<RenderCommand> m_RenderCommand;
 | 
			
		||||
		std::unique_ptr<Blender> m_Blender;
 | 
			
		||||
		Scope<RenderCommand> m_RenderCommand;
 | 
			
		||||
		Scope<Blender> m_Blender;
 | 
			
		||||
 | 
			
		||||
		std::shared_ptr<Framebuffer> m_TargetFramebuffer;
 | 
			
		||||
		Ref<Framebuffer> m_TargetFramebuffer;
 | 
			
		||||
 | 
			
		||||
		std::shared_ptr<Camera> m_Camera;
 | 
			
		||||
		Ref<Camera> m_Camera;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		static Renderer* Create(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Scope<Renderer> Create(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext);
 | 
			
		||||
		
 | 
			
		||||
		static inline void SetTargetFramebuffer(std::shared_ptr<Framebuffer> framebuffer) { s_Context->SetTargetFramebufferImpl(framebuffer); }
 | 
			
		||||
		static inline void SetTargetFramebuffer(Ref<Framebuffer> framebuffer) { s_Context->SetTargetFramebufferImpl(framebuffer); }
 | 
			
		||||
 | 
			
		||||
		static inline void DrawQuad(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint) { s_Context->DrawQuadImpl(position, size, tint); }
 | 
			
		||||
		static inline void DrawQuad(const glm::vec3& position, const glm::vec2& size, std::shared_ptr<Texture> texture) { s_Context->DrawQuadImpl(position, size, texture); }
 | 
			
		||||
		static inline void DrawQuad(const glm::vec3& position, const glm::vec2& size, Ref<Texture> texture) { s_Context->DrawQuadImpl(position, size, texture); }
 | 
			
		||||
 | 
			
		||||
		static inline void BeginScene(const std::shared_ptr<Camera>& camera, const std::shared_ptr<Framebuffer>& targetFrameBuffer = nullptr) { s_Context->BeginSceneImpl(camera, targetFrameBuffer); }
 | 
			
		||||
		static inline void BeginScene(const Ref<Camera>& camera, const Ref<Framebuffer>& targetFrameBuffer = nullptr) { s_Context->BeginSceneImpl(camera, targetFrameBuffer); }
 | 
			
		||||
		static inline void EndScene() { s_Context->EndSceneImpl(); }
 | 
			
		||||
		
 | 
			
		||||
		void OnWindowResize(const WindowResizedEvent& event);
 | 
			
		||||
| 
						 | 
				
			
			@ -65,14 +65,14 @@ namespace Light {
 | 
			
		|||
		void EndFrame();
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		Renderer(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		Renderer(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		void SetTargetFramebufferImpl(std::shared_ptr<Framebuffer> framebuffer);
 | 
			
		||||
		void SetTargetFramebufferImpl(Ref<Framebuffer> framebuffer);
 | 
			
		||||
 | 
			
		||||
		void DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, const glm::vec4& tint);
 | 
			
		||||
		void DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, std::shared_ptr<Texture> texture);
 | 
			
		||||
		void DrawQuadImpl(const glm::vec3& position, const glm::vec2& size, Ref<Texture> texture);
 | 
			
		||||
 | 
			
		||||
		void BeginSceneImpl(const std::shared_ptr<Camera>& camera, const std::shared_ptr<Framebuffer>& targetFrameBuffer = nullptr);
 | 
			
		||||
		void BeginSceneImpl(const Ref<Camera>& camera, const Ref<Framebuffer>& targetFrameBuffer = nullptr);
 | 
			
		||||
		void FlushScene();
 | 
			
		||||
		void EndSceneImpl();
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,15 +11,15 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	QuadRendererProgram::QuadRendererProgram(unsigned int maxVertices, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	QuadRendererProgram::QuadRendererProgram(unsigned int maxVertices, Ref<SharedContext> sharedContext)
 | 
			
		||||
		: m_MaxVertices(maxVertices)
 | 
			
		||||
	{
 | 
			
		||||
		ResourceManager::LoadShader("LT_ENGINE_RESOURCES_QUAD_SHADER", "../Engine/res/Shaders/Quad/Quad_VS", "../Engine//res/Shaders/Quad/Quad_PS");
 | 
			
		||||
 | 
			
		||||
		m_Shader = ResourceManager::GetShader("LT_ENGINE_RESOURCES_QUAD_SHADER");
 | 
			
		||||
		m_VertexBuffer = std::shared_ptr<VertexBuffer>(VertexBuffer::Create(nullptr, sizeof(QuadVertexData), maxVertices, sharedContext));
 | 
			
		||||
		m_IndexBuffer = std::shared_ptr<IndexBuffer>(IndexBuffer::Create(nullptr, (maxVertices / 4) * 6, sharedContext));
 | 
			
		||||
		m_VertexLayout = std::shared_ptr<VertexLayout>(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float3 },
 | 
			
		||||
		m_VertexBuffer = Ref<VertexBuffer>(VertexBuffer::Create(nullptr, sizeof(QuadVertexData), maxVertices, sharedContext));
 | 
			
		||||
		m_IndexBuffer = Ref<IndexBuffer>(IndexBuffer::Create(nullptr, (maxVertices / 4) * 6, sharedContext));
 | 
			
		||||
		m_VertexLayout = Ref<VertexLayout>(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float3 },
 | 
			
		||||
		                                                                                                { "COLOR"   , VertexElementType::Float4 }}, sharedContext));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,10 +26,10 @@ namespace Light {
 | 
			
		|||
		};
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<Shader> m_Shader;
 | 
			
		||||
		std::shared_ptr<VertexBuffer> m_VertexBuffer;
 | 
			
		||||
		std::shared_ptr<IndexBuffer> m_IndexBuffer;
 | 
			
		||||
		std::shared_ptr<VertexLayout> m_VertexLayout;
 | 
			
		||||
		Ref<Shader> m_Shader;
 | 
			
		||||
		Ref<VertexBuffer> m_VertexBuffer;
 | 
			
		||||
		Ref<IndexBuffer> m_IndexBuffer;
 | 
			
		||||
		Ref<VertexLayout> m_VertexLayout;
 | 
			
		||||
 | 
			
		||||
		QuadVertexData* m_MapCurrent = nullptr;
 | 
			
		||||
		QuadVertexData* m_MapEnd = nullptr;
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ namespace Light {
 | 
			
		|||
		unsigned int m_MaxVertices = 0u;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		QuadRendererProgram(unsigned int maxVertices, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		QuadRendererProgram(unsigned int maxVertices, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		bool Advance();
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,15 +11,15 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	TextureRendererProgram::TextureRendererProgram(unsigned int maxVertices, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	TextureRendererProgram::TextureRendererProgram(unsigned int maxVertices, Ref<SharedContext> sharedContext)
 | 
			
		||||
		: m_MaxVertices(maxVertices)
 | 
			
		||||
	{
 | 
			
		||||
		ResourceManager::LoadShader("LT_ENGINE_RESOURCES_TEXTURE_SHADER", "../Engine/res/Shaders/Texture/Texture_VS", "../Engine/res/Shaders/Texture/Texture_PS");
 | 
			
		||||
 | 
			
		||||
		m_Shader = ResourceManager::GetShader("LT_ENGINE_RESOURCES_TEXTURE_SHADER");
 | 
			
		||||
		m_VertexBuffer = std::shared_ptr<VertexBuffer>(VertexBuffer::Create(nullptr, sizeof(TextureVertexData), maxVertices, sharedContext));
 | 
			
		||||
		m_IndexBuffer = std::shared_ptr<IndexBuffer>(IndexBuffer::Create(nullptr, (maxVertices / 4) * 6, sharedContext));
 | 
			
		||||
		m_VertexLayout = std::shared_ptr<VertexLayout>(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float3 },
 | 
			
		||||
		m_VertexBuffer = Ref<VertexBuffer>(VertexBuffer::Create(nullptr, sizeof(TextureVertexData), maxVertices, sharedContext));
 | 
			
		||||
		m_IndexBuffer = Ref<IndexBuffer>(IndexBuffer::Create(nullptr, (maxVertices / 4) * 6, sharedContext));
 | 
			
		||||
		m_VertexLayout = Ref<VertexLayout>(VertexLayout::Create(m_VertexBuffer, m_Shader, { { "POSITION", VertexElementType::Float3 },
 | 
			
		||||
		                                                                                                { "TEXCOORD", VertexElementType::Float2 }}, sharedContext));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,10 +26,10 @@ namespace Light {
 | 
			
		|||
		};
 | 
			
		||||
		
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<Shader> m_Shader;
 | 
			
		||||
		std::shared_ptr<VertexBuffer> m_VertexBuffer;
 | 
			
		||||
		std::shared_ptr<IndexBuffer> m_IndexBuffer;
 | 
			
		||||
		std::shared_ptr<VertexLayout> m_VertexLayout;
 | 
			
		||||
		Ref<Shader> m_Shader;
 | 
			
		||||
		Ref<VertexBuffer> m_VertexBuffer;
 | 
			
		||||
		Ref<IndexBuffer> m_IndexBuffer;
 | 
			
		||||
		Ref<VertexLayout> m_VertexLayout;
 | 
			
		||||
 | 
			
		||||
		TextureVertexData* m_MapCurrent = nullptr;
 | 
			
		||||
		TextureVertexData* m_MapEnd = nullptr;
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ namespace Light {
 | 
			
		|||
		unsigned int m_MaxVertices = 0u;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		TextureRendererProgram(unsigned int maxVertices, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		TextureRendererProgram(unsigned int maxVertices, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		bool Advance();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,16 +11,16 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	Shader* Shader::Create(const std::string& vertexSource, const std::string& pixelSource, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Ref<Shader> Shader::Create(const std::string& vertexSource, const std::string& pixelSource, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		// load shader source
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glShader(vertexSource, pixelSource);
 | 
			
		||||
			return CreateRef<glShader>(vertexSource, pixelSource);
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxShader(vertexSource, pixelSource, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateRef<dxShader>(vertexSource, pixelSource, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "Shader::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,14 +11,13 @@ namespace Light {
 | 
			
		|||
	class Shader
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		static Shader* Create(const std::string& vertexPath, const std::string& pixelPath, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Ref<Shader> Create(const std::string& vertexPath, const std::string& pixelPath, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		virtual ~Shader() = default;
 | 
			
		||||
 | 
			
		||||
		virtual void Bind() = 0;
 | 
			
		||||
		virtual void UnBind() = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		//** #TEMP_SHADER_UNIFORMS_TEMP# **//
 | 
			
		||||
		virtual void SetUniformMat4(const std::string& name, const glm::mat4& value) = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,15 +11,15 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	Texture* Texture::Create(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Ref<Texture>Texture::Create(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glTexture(width, height, components, pixels);
 | 
			
		||||
			return CreateRef<glTexture>(width, height, components, pixels);
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxTexture(width, height, components, pixels, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateRef<dxTexture>(width, height, components, pixels, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "Texture::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,7 @@ namespace Light {
 | 
			
		|||
	class Texture
 | 
			
		||||
	{
 | 
			
		||||
	public:	
 | 
			
		||||
		static Texture* Create(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Ref<Texture> Create(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		Texture(const Texture&) = delete;
 | 
			
		||||
		Texture& operator=(const Texture&) = delete;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,15 +11,15 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	VertexLayout* VertexLayout::Create(std::shared_ptr<VertexBuffer> vertexBuffer, std::shared_ptr<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Ref<VertexLayout> VertexLayout::Create(Ref<VertexBuffer> vertexBuffer, Ref<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glVertexLayout(vertexBuffer, elements);
 | 
			
		||||
			return CreateRef<glVertexLayout>(vertexBuffer, elements);
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxVertexLayout(shader, elements, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateRef<dxVertexLayout>(shader, elements, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "VertexLayout::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ namespace Light {
 | 
			
		|||
	class VertexLayout
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		static VertexLayout* Create(std::shared_ptr<VertexBuffer> vertexBuffer, std::shared_ptr<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Ref<VertexLayout> Create(Ref<VertexBuffer> vertexBuffer, Ref<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		virtual ~VertexLayout() = default;;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,11 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	Input* Input::s_Context = nullptr;
 | 
			
		||||
 | 
			
		||||
	Scope<Input> Input::Create()
 | 
			
		||||
	{
 | 
			
		||||
		return MakeScope(new Input);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Input::Input()
 | 
			
		||||
	{
 | 
			
		||||
		LT_ENGINE_ASSERT(!s_Context, "Input::Input: an instance of 'Input' already exists, do not construct this class!");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ namespace Light {
 | 
			
		|||
		bool m_UserInterfaceEvents = true;
 | 
			
		||||
		bool m_GameEvents = true;
 | 
			
		||||
	public:
 | 
			
		||||
		Input();
 | 
			
		||||
		static Scope<Input> Create();
 | 
			
		||||
 | 
			
		||||
		static inline void ReceiveUserInterfaceEvents(bool receive, bool toggle = false) { s_Context->ReceiveUserInterfaceEventsImpl(receive, toggle); }
 | 
			
		||||
		static inline void ReceiveGameEvents(bool receive, bool toggle = false) { s_Context->ReceieveGameEventsImpl(receive, toggle); }
 | 
			
		||||
| 
						 | 
				
			
			@ -39,6 +39,8 @@ namespace Light {
 | 
			
		|||
		inline bool IsReceivingGameEvents() const { return m_GameEvents; }
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		Input();
 | 
			
		||||
 | 
			
		||||
		void ReceiveUserInterfaceEventsImpl(bool receive, bool toggle = false);
 | 
			
		||||
		void ReceieveGameEventsImpl(bool receive, bool toggle = false);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,14 +22,14 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	class Layer
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::string m_Name;
 | 
			
		||||
	protected:
 | 
			
		||||
		std::string m_LayerName;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		Layer(const std::string& name): m_Name(name) {}
 | 
			
		||||
		Layer(const std::string& name): m_LayerName(name) {}
 | 
			
		||||
		virtual ~Layer() = default;
 | 
			
		||||
 | 
			
		||||
		inline const std::string& GetName() const { return m_Name; }
 | 
			
		||||
		inline const std::string& GetName() const { return m_LayerName; }
 | 
			
		||||
 | 
			
		||||
		//** UPDATES //
 | 
			
		||||
		virtual void OnUpdate(float deltaTime) {}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,11 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	LayerStack* LayerStack::s_Context = nullptr;
 | 
			
		||||
 | 
			
		||||
	Scope<LayerStack> LayerStack::Create()
 | 
			
		||||
	{
 | 
			
		||||
		return MakeScope<LayerStack>(new LayerStack());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	LayerStack::LayerStack()
 | 
			
		||||
	{
 | 
			
		||||
		LT_ENGINE_ASSERT(!s_Context, "LayerStack::LayerStack: an instance of 'LayerStack' already exists, do not construct this class!")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,9 +18,14 @@ namespace Light {
 | 
			
		|||
		std::vector<Layer*>::iterator m_End;
 | 
			
		||||
		
 | 
			
		||||
	public:
 | 
			
		||||
		LayerStack();
 | 
			
		||||
		static Scope<LayerStack> Create();
 | 
			
		||||
 | 
			
		||||
		~LayerStack();
 | 
			
		||||
 | 
			
		||||
		// #todo: should we keep this?
 | 
			
		||||
		template<typename T, typename... Args>
 | 
			
		||||
		static inline void AttachLayer(Args&&... args) { s_Context->AttachLayerImpl(new T((args)...)); }
 | 
			
		||||
 | 
			
		||||
		static inline void AttachLayer(Layer* layer) { s_Context->AttachLayerImpl(layer); }
 | 
			
		||||
		static inline void DetachLayer(Layer* layer) { s_Context->DetachLayerImpl(layer); }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +37,8 @@ namespace Light {
 | 
			
		|||
		std::vector<Layer*>::reverse_iterator rend() { return m_Layers.rend(); }
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		LayerStack();
 | 
			
		||||
 | 
			
		||||
		void AttachLayerImpl(Layer* layer);
 | 
			
		||||
		void DetachLayerImpl(Layer* layer);
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	class Texture;
 | 
			
		||||
 | 
			
		||||
	// #todo: store a mat4 for transform
 | 
			
		||||
	struct TransformComponent
 | 
			
		||||
	{
 | 
			
		||||
		glm::vec2 position, size;
 | 
			
		||||
| 
						 | 
				
			
			@ -24,13 +25,13 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	struct SpriteRendererComponent
 | 
			
		||||
	{
 | 
			
		||||
		std::shared_ptr<Texture> texture;
 | 
			
		||||
		Ref<Texture> texture;
 | 
			
		||||
 | 
			
		||||
		SpriteRendererComponent() = default;
 | 
			
		||||
		SpriteRendererComponent(const SpriteRendererComponent&) = default;
 | 
			
		||||
		SpriteRendererComponent(std::shared_ptr<Texture> _texture) : texture(_texture) {}
 | 
			
		||||
		SpriteRendererComponent(Ref<Texture> _texture) : texture(_texture) {}
 | 
			
		||||
 | 
			
		||||
		operator std::shared_ptr<Texture>() { return texture; }
 | 
			
		||||
		operator Ref<Texture>() { return texture; }
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -17,15 +17,15 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	UserInterface* UserInterface::Create(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Scope<UserInterface> UserInterface::Create(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
			
		||||
		{
 | 
			
		||||
		case GraphicsAPI::OpenGL:
 | 
			
		||||
			return new glUserInterface(windowHandle);
 | 
			
		||||
			return CreateScope<glUserInterface>(windowHandle);
 | 
			
		||||
 | 
			
		||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
			
		||||
			return new dxUserInterface(windowHandle, std::dynamic_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
			return CreateScope<dxUserInterface>(windowHandle, std::dynamic_pointer_cast<dxSharedContext>(sharedContext));)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			LT_ENGINE_ASSERT(false, "UserInterface::Create: invalid/unsupported 'GraphicsAPI' {}", GraphicsContext::GetGraphicsAPI());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ namespace Light {
 | 
			
		|||
	class UserInterface
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		static UserInterface* Create(GLFWwindow* windowHandle, std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Scope<UserInterface> Create(GLFWwindow* windowHandle, Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		UserInterface(const UserInterface&) = delete;
 | 
			
		||||
		UserInterface& operator=(const UserInterface&) = delete;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,12 +11,12 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	ResourceManager* ResourceManager::s_Context = nullptr;
 | 
			
		||||
 | 
			
		||||
	ResourceManager* ResourceManager::Create(std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	Scope<ResourceManager> ResourceManager::Create(Ref<SharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		return new ResourceManager(sharedContext);
 | 
			
		||||
		return MakeScope(new ResourceManager(sharedContext));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ResourceManager::ResourceManager(std::shared_ptr<SharedContext> sharedContext)
 | 
			
		||||
	ResourceManager::ResourceManager(Ref<SharedContext> sharedContext)
 | 
			
		||||
		: m_SharedContext(sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		LT_ENGINE_ASSERT(!s_Context, "ResourceManager::ResourceManager: an instance of 'ResourceManager' already exists, do not construct this class!");
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ namespace Light {
 | 
			
		|||
		ResourceManager::ExtractShaderSource(psSource, delim);
 | 
			
		||||
 | 
			
		||||
		// create shader
 | 
			
		||||
		m_Shaders[name] = std::shared_ptr<Shader>(Shader::Create(vsSource, psSource, m_SharedContext));
 | 
			
		||||
		m_Shaders[name] = Ref<Shader>(Shader::Create(vsSource, psSource, m_SharedContext));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void ResourceManager::LoadShaderImpl(const std::string& name, const std::string& vertexPath, const std::string& pixelPath)
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +70,7 @@ namespace Light {
 | 
			
		|||
			psSS << line << '\n';
 | 
			
		||||
 | 
			
		||||
		// create shader
 | 
			
		||||
		m_Shaders[name] = std::shared_ptr<Shader>(Shader::Create(vsSS.str(), psSS.str(), m_SharedContext));
 | 
			
		||||
		m_Shaders[name] = Ref<Shader>(Shader::Create(vsSS.str(), psSS.str(), m_SharedContext));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void ResourceManager::LoadTextureImpl(const std::string& name, const std::string& path, unsigned int desiredComponents /* = 4u */)
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +88,7 @@ namespace Light {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		// create texture
 | 
			
		||||
		m_Textures[name] = std::shared_ptr<Texture>(Texture::Create(width, height, components, pixels, m_SharedContext));
 | 
			
		||||
		m_Textures[name] = Ref<Texture>(Texture::Create(width, height, components, pixels, m_SharedContext));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void ResourceManager::ExtractShaderSource(std::string& src, const std::string& delim)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,13 +15,13 @@ namespace Light {
 | 
			
		|||
	private:
 | 
			
		||||
		static ResourceManager* s_Context;
 | 
			
		||||
 | 
			
		||||
		std::unordered_map<std::string, std::shared_ptr<Shader>> m_Shaders;
 | 
			
		||||
		std::unordered_map<std::string, std::shared_ptr<Texture>> m_Textures;
 | 
			
		||||
		std::unordered_map<std::string, Ref<Shader>> m_Shaders;
 | 
			
		||||
		std::unordered_map<std::string, Ref<Texture>> m_Textures;
 | 
			
		||||
 | 
			
		||||
		std::shared_ptr<SharedContext> m_SharedContext;
 | 
			
		||||
		Ref<SharedContext> m_SharedContext;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		static ResourceManager* Create(std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		static Scope<ResourceManager> Create(Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		// #todo: add geometry shader support
 | 
			
		||||
		static inline void CreateShader(const std::string& name, const std::string& vertexSource, const std::string& pixelSource) { s_Context->CreateShaderImpl(name, vertexSource, pixelSource); }
 | 
			
		||||
| 
						 | 
				
			
			@ -29,11 +29,11 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
		static inline void LoadTexture(const std::string& name, const std::string& path, unsigned int desiredComponents = 4u) { s_Context->LoadTextureImpl(name, path, desiredComponents); }
 | 
			
		||||
 | 
			
		||||
		static inline std::shared_ptr<Shader> GetShader(const std::string& name) { return s_Context->m_Shaders[name]; }
 | 
			
		||||
		static inline std::shared_ptr<Texture> GetTexture(const std::string& name) { return s_Context->m_Textures[name]; }
 | 
			
		||||
		static inline Ref<Shader> GetShader(const std::string& name) { return s_Context->m_Shaders[name]; }
 | 
			
		||||
		static inline Ref<Texture> GetTexture(const std::string& name) { return s_Context->m_Textures[name]; }
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		ResourceManager(std::shared_ptr<SharedContext> sharedContext);
 | 
			
		||||
		ResourceManager(Ref<SharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		void CreateShaderImpl(const std::string& name, const std::string& vertexSource, const std::string& pixelSource);
 | 
			
		||||
		void LoadShaderImpl(const std::string& name, const std::string& vertexPath, const std::string& pixelPath);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	dxBlender::dxBlender(std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxBlender::dxBlender(Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Context(sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		// factor map
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ namespace Light {
 | 
			
		|||
	class dxBlender : public Blender
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
		std::unordered_map<BlendFactor, D3D11_BLEND> m_FactorMap;
 | 
			
		||||
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11BlendState> m_BlendState;
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ namespace Light {
 | 
			
		|||
		D3D11_BLEND_DESC m_Desc;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxBlender(std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxBlender(Ref<dxSharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		void Enable(BlendFactor srcFactor, BlendFactor dstFactor) override;
 | 
			
		||||
		void Disable() override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	dxConstantBuffer::dxConstantBuffer(ConstantBufferIndex index, unsigned int size, std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxConstantBuffer::dxConstantBuffer(ConstantBufferIndex index, unsigned int size, Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Context(sharedContext), m_Index((int)index)
 | 
			
		||||
	{
 | 
			
		||||
		D3D11_BUFFER_DESC bufferDesc = { };
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ namespace Light {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	//* VERTEX_BUFFER *//
 | 
			
		||||
	dxVertexBuffer::dxVertexBuffer(float* vertices, unsigned int stride, unsigned int count, std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxVertexBuffer::dxVertexBuffer(float* vertices, unsigned int stride, unsigned int count, Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Stride(stride), m_Context(sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		// buffer desc
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ namespace Light {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	//* INDEX_BUFFER *//
 | 
			
		||||
	dxIndexBuffer::dxIndexBuffer(unsigned int* indices, unsigned int count, std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxIndexBuffer::dxIndexBuffer(unsigned int* indices, unsigned int count, Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Context(sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		// generate indices if not provided
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ namespace Light {
 | 
			
		|||
	class dxConstantBuffer : public ConstantBuffer
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11Buffer> m_Buffer;
 | 
			
		||||
		D3D11_MAPPED_SUBRESOURCE m_Map;
 | 
			
		||||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ namespace Light {
 | 
			
		|||
		unsigned int m_Index;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxConstantBuffer(ConstantBufferIndex index, unsigned int size, std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxConstantBuffer(ConstantBufferIndex index, unsigned int size, Ref<dxSharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		void Bind() override;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -34,7 +34,7 @@ namespace Light {
 | 
			
		|||
	class dxVertexBuffer : public VertexBuffer
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11Buffer> m_Buffer;
 | 
			
		||||
		D3D11_MAPPED_SUBRESOURCE m_Map;
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ namespace Light {
 | 
			
		|||
		unsigned int m_Stride;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxVertexBuffer(float* vertices, unsigned int stride, unsigned int count, std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxVertexBuffer(float* vertices, unsigned int stride, unsigned int count, Ref<dxSharedContext> sharedContext);
 | 
			
		||||
		~dxVertexBuffer();
 | 
			
		||||
 | 
			
		||||
		void* Map() override;
 | 
			
		||||
| 
						 | 
				
			
			@ -56,12 +56,12 @@ namespace Light {
 | 
			
		|||
	class dxIndexBuffer : public IndexBuffer
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11Buffer> m_Buffer;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxIndexBuffer(unsigned int* indices, unsigned int count, std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxIndexBuffer(unsigned int* indices, unsigned int count, Ref<dxSharedContext> sharedContext);
 | 
			
		||||
		~dxIndexBuffer();
 | 
			
		||||
 | 
			
		||||
		void Bind() override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	dxFramebuffer::dxFramebuffer(const FramebufferSpecification& specification, std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxFramebuffer::dxFramebuffer(const FramebufferSpecification& specification, Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Specification(specification), m_Context(sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		HRESULT hr;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ namespace Light {
 | 
			
		|||
	class dxFramebuffer : public Framebuffer
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
		
 | 
			
		||||
		FramebufferSpecification m_Specification;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ namespace Light {
 | 
			
		|||
		Microsoft::WRL::ComPtr<ID3D11DepthStencilView> m_DepthStencilView;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxFramebuffer(const FramebufferSpecification& specification, std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxFramebuffer(const FramebufferSpecification& specification, Ref<dxSharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		inline void* GetColorAttachment() override { return (void*)m_ResourceView.Get(); }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	void dxGraphicsContext::SetupDeviceAndSwapChain(GLFWwindow* windowHandle)
 | 
			
		||||
	{
 | 
			
		||||
		std::shared_ptr<dxSharedContext> context = std::static_pointer_cast<dxSharedContext>(m_SharedContext);
 | 
			
		||||
		Ref<dxSharedContext> context = std::static_pointer_cast<dxSharedContext>(m_SharedContext);
 | 
			
		||||
 | 
			
		||||
		// swap chain desc
 | 
			
		||||
		DXGI_SWAP_CHAIN_DESC sd = { 0 };
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	void dxGraphicsContext::SetupRenderTargets()
 | 
			
		||||
	{
 | 
			
		||||
		std::shared_ptr<dxSharedContext> context = std::static_pointer_cast<dxSharedContext>(m_SharedContext);
 | 
			
		||||
		Ref<dxSharedContext> context = std::static_pointer_cast<dxSharedContext>(m_SharedContext);
 | 
			
		||||
 | 
			
		||||
		// set primitive topology
 | 
			
		||||
		context->GetDeviceContext()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +106,7 @@ namespace Light {
 | 
			
		|||
	void dxGraphicsContext::SetupDebugInterface()
 | 
			
		||||
	{
 | 
			
		||||
#ifdef LIGHT_DEBUG
 | 
			
		||||
		std::shared_ptr<dxSharedContext> context = std::static_pointer_cast<dxSharedContext>(m_SharedContext);
 | 
			
		||||
		Ref<dxSharedContext> context = std::static_pointer_cast<dxSharedContext>(m_SharedContext);
 | 
			
		||||
 | 
			
		||||
		HRESULT hr;
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11Debug> debugInterface = nullptr;
 | 
			
		||||
| 
						 | 
				
			
			@ -134,7 +134,7 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
	void dxGraphicsContext::LogDebugData()
 | 
			
		||||
	{
 | 
			
		||||
		std::shared_ptr<dxSharedContext> context = std::static_pointer_cast<dxSharedContext>(m_SharedContext);
 | 
			
		||||
		Ref<dxSharedContext> context = std::static_pointer_cast<dxSharedContext>(m_SharedContext);
 | 
			
		||||
 | 
			
		||||
		// locals 
 | 
			
		||||
		IDXGIDevice* DXGIDevice;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	dxRenderCommand::dxRenderCommand(std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxRenderCommand::dxRenderCommand(Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Context(sharedContext)
 | 
			
		||||
	{ }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,10 +13,10 @@ namespace Light {
 | 
			
		|||
	class dxRenderCommand : public RenderCommand
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxRenderCommand(std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxRenderCommand(Ref<dxSharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		virtual void SwapBuffers() override;
 | 
			
		||||
		virtual void ClearBackBuffer(const glm::vec4& clearColor) override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	dxShader::dxShader(const std::string& vertexSource, const std::string& pixelSource, std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxShader::dxShader(const std::string& vertexSource, const std::string& pixelSource, Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Context(sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3DBlob> ps = nullptr, vsErr = nullptr, psErr = nullptr;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ namespace Light {
 | 
			
		|||
	class dxShader : public Shader
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11VertexShader> m_VertexShader;
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11PixelShader> m_PixelShader;
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ namespace Light {
 | 
			
		|||
		Microsoft::WRL::ComPtr<ID3DBlob> m_VertexBlob;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxShader(const std::string& vertexSource, const std::string& pixelSource, std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxShader(const std::string& vertexSource, const std::string& pixelSource, Ref<dxSharedContext> sharedContext);
 | 
			
		||||
		~dxShader();
 | 
			
		||||
 | 
			
		||||
		void Bind() override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	dxTexture::dxTexture(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxTexture::dxTexture(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Context(sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		// texture desc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,14 +13,14 @@ namespace Light {
 | 
			
		|||
	class dxTexture : public Texture
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11Texture2D> m_Texture;
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_ResourceView;
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11SamplerState> m_SamplerState;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxTexture(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxTexture(unsigned int width, unsigned int height, unsigned int components, unsigned char* pixels, Ref<dxSharedContext> sharedContext);
 | 
			
		||||
 | 
			
		||||
		void Bind(unsigned int slot = 0u) override;
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	dxUserInterface::dxUserInterface(GLFWwindow* windowHandle, std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxUserInterface::dxUserInterface(GLFWwindow* windowHandle, Ref<dxSharedContext> sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		// create context
 | 
			
		||||
		IMGUI_CHECKVERSION();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ namespace Light {
 | 
			
		|||
	class dxUserInterface : public UserInterface
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		dxUserInterface(GLFWwindow* windowHandle, std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxUserInterface(GLFWwindow* windowHandle, Ref<dxSharedContext> sharedContext);
 | 
			
		||||
		~dxUserInterface();
 | 
			
		||||
 | 
			
		||||
		void Begin() override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	dxVertexLayout::dxVertexLayout(std::shared_ptr<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, std::shared_ptr<dxSharedContext> sharedContext)
 | 
			
		||||
	dxVertexLayout::dxVertexLayout(Ref<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, Ref<dxSharedContext> sharedContext)
 | 
			
		||||
		: m_Context(sharedContext)
 | 
			
		||||
	{
 | 
			
		||||
		// occupy space for input elements
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ namespace Light {
 | 
			
		|||
										   0u });
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		std::shared_ptr<dxShader> dxpShader = std::dynamic_pointer_cast<dxShader>(shader);
 | 
			
		||||
		Ref<dxShader> dxpShader = std::dynamic_pointer_cast<dxShader>(shader);
 | 
			
		||||
		LT_ENGINE_ASSERT(dxpShader, "dxVertexLayout::dxVertexLayout: failed to cast 'Shader' to 'dxShader'");
 | 
			
		||||
 | 
			
		||||
		// create input layout (vertex layout)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,12 +14,12 @@ namespace Light {
 | 
			
		|||
	class dxVertexLayout : public VertexLayout
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		std::shared_ptr<dxSharedContext> m_Context;
 | 
			
		||||
		Ref<dxSharedContext> m_Context;
 | 
			
		||||
 | 
			
		||||
		Microsoft::WRL::ComPtr<ID3D11InputLayout> m_InputLayout;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		dxVertexLayout(std::shared_ptr<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, std::shared_ptr<dxSharedContext> sharedContext);
 | 
			
		||||
		dxVertexLayout(Ref<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, Ref<dxSharedContext> sharedContext);
 | 
			
		||||
		~dxVertexLayout();
 | 
			
		||||
 | 
			
		||||
		void Bind() override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	glVertexLayout::glVertexLayout(std::shared_ptr<VertexBuffer> buffer, const std::vector<std::pair<std::string, VertexElementType>>& elements)
 | 
			
		||||
	glVertexLayout::glVertexLayout(Ref<VertexBuffer> buffer, const std::vector<std::pair<std::string, VertexElementType>>& elements)
 | 
			
		||||
	{
 | 
			
		||||
		// check
 | 
			
		||||
		LT_ENGINE_ASSERT(std::dynamic_pointer_cast<glVertexBuffer>(buffer), "glVertexLayout::glVertexLayout: failed to cast 'VertexBuffer' to 'glVertexBuffer'");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@ namespace Light {
 | 
			
		|||
		unsigned int m_ArrayID;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		glVertexLayout(std::shared_ptr<VertexBuffer> buffer, const std::vector<std::pair<std::string, VertexElementType>>& elements);
 | 
			
		||||
		glVertexLayout(Ref<VertexBuffer> buffer, const std::vector<std::pair<std::string, VertexElementType>>& elements);
 | 
			
		||||
		~glVertexLayout();
 | 
			
		||||
 | 
			
		||||
		void Bind() override;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,9 +12,9 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
	
 | 
			
		||||
	Window* Window::Create(std::function<void(Event&)> callback)
 | 
			
		||||
	Scope<Window> Window::Create(std::function<void(Event&)> callback)
 | 
			
		||||
	{
 | 
			
		||||
		return new lWindow(callback);
 | 
			
		||||
		return CreateScope<lWindow>(callback);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	lWindow::lWindow(std::function<void(Event&)> callback)
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +37,7 @@ namespace Light {
 | 
			
		|||
		BindGlfwEvents();
 | 
			
		||||
		
 | 
			
		||||
		// create graphics contextG
 | 
			
		||||
		m_GraphicsContext = std::unique_ptr<GraphicsContext>(GraphicsContext::Create(GraphicsAPI::OpenGL, m_Handle));
 | 
			
		||||
		m_GraphicsContext = GraphicsContext::Create(GraphicsAPI::OpenGL, m_Handle);
 | 
			
		||||
		LT_ENGINE_ASSERT(m_GraphicsContext, "lWindow::lWindow: failed to create 'GraphicsContext'");
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,9 +12,9 @@
 | 
			
		|||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	Window* Window::Create(std::function<void(Event&)> callback)
 | 
			
		||||
	Scope<Window> Window::Create(std::function<void(Event&)> callback)
 | 
			
		||||
	{
 | 
			
		||||
		return new wWindow(callback);
 | 
			
		||||
		return CreateScope<wWindow>(callback);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wWindow::wWindow(std::function<void(Event&)> callback)
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +37,7 @@ namespace Light {
 | 
			
		|||
		BindGlfwEvents();
 | 
			
		||||
 | 
			
		||||
		// create graphics context
 | 
			
		||||
		m_GraphicsContext = std::unique_ptr<GraphicsContext>(GraphicsContext::Create(GraphicsAPI::DirectX, m_Handle));
 | 
			
		||||
		m_GraphicsContext = GraphicsContext::Create(GraphicsAPI::DirectX, m_Handle);
 | 
			
		||||
		LT_ENGINE_ASSERT(m_GraphicsContext, "wWindow::wWindow: failed to create 'GraphicsContext'");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,6 @@ namespace Light {
 | 
			
		|||
	class wWindow : public Window
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		// #todo: don't handle Windows's window with glfw, create an HWND
 | 
			
		||||
		GLFWwindow* m_Handle = nullptr;
 | 
			
		||||
 | 
			
		||||
		std::function<void(Event&)> m_EventCallback;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ namespace Light {
 | 
			
		|||
			m_Window->SetProperties(properties);
 | 
			
		||||
 | 
			
		||||
			// Attach the sandbox layer
 | 
			
		||||
			LayerStack::AttachLayer(new MirrorLayer("MirrorLayer"));
 | 
			
		||||
			LayerStack::AttachLayer<MirrorLayer>(("MirrorLayer"));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		~Mirror()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,9 +13,9 @@ namespace Light {
 | 
			
		|||
		glm::vec2 m_Direction;
 | 
			
		||||
		float m_Speed = 1000.0f;
 | 
			
		||||
 | 
			
		||||
		std::shared_ptr<Camera> m_Camera;
 | 
			
		||||
		Ref<Camera> m_Camera;
 | 
			
		||||
 | 
			
		||||
		std::shared_ptr<Framebuffer> m_Framebuffer;
 | 
			
		||||
		Ref<Framebuffer> m_Framebuffer;
 | 
			
		||||
 | 
			
		||||
		Scene m_Scene;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@ private:
 | 
			
		|||
	glm::vec2 m_Direction;
 | 
			
		||||
	float m_Speed = 1.2f;
 | 
			
		||||
 | 
			
		||||
	std::shared_ptr<Light::Camera> m_Camera;
 | 
			
		||||
	Light::Ref<Light::Camera> m_Camera;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	SandboxLayer(const std::string& name) 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue