ResourceManager
- Added ResourceManager - Removed FileManager - Shader's constructor now takes the shader source specific to the current GraphicsAPI
This commit is contained in:
		
							parent
							
								
									b50564c833
								
							
						
					
					
						commit
						6149c0da70
					
				
					 10 changed files with 236 additions and 82 deletions
				
			
		| 
						 | 
					@ -21,10 +21,16 @@ project "Engine"
 | 
				
			||||||
	-- Project Files ---
 | 
						-- Project Files ---
 | 
				
			||||||
	files
 | 
						files
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		"%{prj.location}/src/**.h"      ,
 | 
							-- src
 | 
				
			||||||
		"%{prj.location}/src/**.cpp"    ,
 | 
							"%{prj.location}/src/**.h",
 | 
				
			||||||
		"%{prj.location}/**.lua"        ,
 | 
							"%{prj.location}/src/**.cpp",
 | 
				
			||||||
		"%{prj.location}/dxgidebug.dll" ,
 | 
							
 | 
				
			||||||
 | 
							-- premake
 | 
				
			||||||
 | 
							"%{prj.location}/preake5*.lua",
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							"%{prj.location}/dxgidebug.dll", -- :#todo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							"%{prj.location}/res/**"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	-- Dependencies --
 | 
						-- Dependencies --
 | 
				
			||||||
| 
						 | 
					@ -38,11 +44,11 @@ project "Engine"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		-- 3rd party
 | 
							-- 3rd party
 | 
				
			||||||
		(dependenciesdir .. "spdlog/include/"),
 | 
							(dependenciesdir .. "spdlog/include/"),
 | 
				
			||||||
		(dependenciesdir .. "GLFW/include/"  ),
 | 
							(dependenciesdir .. "GLFW/include/"),
 | 
				
			||||||
		(dependenciesdir .. "GLAD/include"   ),
 | 
							(dependenciesdir .. "GLAD/include"),
 | 
				
			||||||
		(dependenciesdir .. "imgui/backends" ),
 | 
							(dependenciesdir .. "imgui/backends"),
 | 
				
			||||||
		(dependenciesdir .. "imgui/"         ),
 | 
							(dependenciesdir .. "imgui/"),
 | 
				
			||||||
		(dependenciesdir .. "glm/"           ),
 | 
							(dependenciesdir .. "glm/"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	links
 | 
						links
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										53
									
								
								Engine/res/Shaders/QuadShader.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								Engine/res/Shaders/QuadShader.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					#define LT_ENGINE_RESOURCES_QUAD_SHADER_VS \
 | 
				
			||||||
 | 
					R"(
 | 
				
			||||||
 | 
					+GLSL
 | 
				
			||||||
 | 
					#version 440 core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					layout(location = 0) in vec3 a_Position;
 | 
				
			||||||
 | 
					layout(location = 1) in vec4 a_Color;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out vec4 fragColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						gl_Position = vec4(a_Position, 1.0);
 | 
				
			||||||
 | 
						fragColor = a_Color;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					-GLSL
 | 
				
			||||||
 | 
					+HLSL
 | 
				
			||||||
 | 
					struct VertexOut
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						float4 Color : COLOR;
 | 
				
			||||||
 | 
						float4 Position : SV_Position;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VertexOut main(float3 InPosition : POSITION, float4 InColor : COLOR)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						VertexOut vso;
 | 
				
			||||||
 | 
						vso.Position = float4(InPosition.x, InPosition.y, InPosition.z, 1.0);
 | 
				
			||||||
 | 
						vso.Color = InColor;
 | 
				
			||||||
 | 
						return vso;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					-HLSL)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LT_ENGINE_RESOURCES_QUAD_SHADER_PS \
 | 
				
			||||||
 | 
					R"(
 | 
				
			||||||
 | 
					+GLSL
 | 
				
			||||||
 | 
					#version 440 core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					in vec4 fragColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out vec4 FragmentColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FragmentColor = fragColor;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					-GLSL
 | 
				
			||||||
 | 
					+HLSL
 | 
				
			||||||
 | 
					float4 main(float4 Color : COLOR) : SV_Target
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return Color;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					-HLSL
 | 
				
			||||||
 | 
					)"
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,7 @@
 | 
				
			||||||
#include "RenderCommand.h"
 | 
					#include "RenderCommand.h"
 | 
				
			||||||
#include "UserInterface/UserInterface.h" 
 | 
					#include "UserInterface/UserInterface.h" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Utility/ResourceManager.h"
 | 
				
			||||||
#include "Utility/Stringifier.h"
 | 
					#include "Utility/Stringifier.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Light {
 | 
					namespace Light {
 | 
				
			||||||
| 
						 | 
					@ -61,6 +62,8 @@ namespace Light {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// create gfx context dependent classes
 | 
							// create gfx context dependent classes
 | 
				
			||||||
 | 
							s_Context->m_ResourceManager = std::unique_ptr<ResourceManager>(ResourceManager::Create(s_Context->m_SharedContext));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		s_Context->m_RenderCommand = std::unique_ptr<RenderCommand>(RenderCommand::Create(windowHandle, s_Context->m_SharedContext));
 | 
							s_Context->m_RenderCommand = std::unique_ptr<RenderCommand>(RenderCommand::Create(windowHandle, s_Context->m_SharedContext));
 | 
				
			||||||
		s_Context->m_UserInterface = std::unique_ptr<UserInterface>(UserInterface::Create(windowHandle, 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(s_Context->m_RenderCommand, s_Context->m_SharedContext));
 | 
							s_Context->m_Renderer = std::unique_ptr<Renderer>(Renderer::Create(s_Context->m_RenderCommand, s_Context->m_SharedContext));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,8 +6,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct GLFWwindow;
 | 
					struct GLFWwindow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Utility/ResourceManager.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Light {
 | 
					namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						class ResourceManager;
 | 
				
			||||||
	class Renderer;
 | 
						class Renderer;
 | 
				
			||||||
	class RenderCommand;
 | 
						class RenderCommand;
 | 
				
			||||||
	class UserInterface;
 | 
						class UserInterface;
 | 
				
			||||||
| 
						 | 
					@ -28,6 +32,8 @@ namespace Light {
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
		static GraphicsContext* s_Context;
 | 
							static GraphicsContext* s_Context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							std::unique_ptr<ResourceManager> m_ResourceManager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::unique_ptr<Renderer> m_Renderer;
 | 
							std::unique_ptr<Renderer> m_Renderer;
 | 
				
			||||||
		std::shared_ptr<RenderCommand> m_RenderCommand;
 | 
							std::shared_ptr<RenderCommand> m_RenderCommand;
 | 
				
			||||||
		std::unique_ptr<UserInterface> m_UserInterface;
 | 
							std::unique_ptr<UserInterface> m_UserInterface;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,10 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "GraphicsContext.h"
 | 
					#include "GraphicsContext.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Utility/ResourceManager.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../res/Shaders/QuadShader.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RenderCommand.h"
 | 
					#include "RenderCommand.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Light {
 | 
					namespace Light {
 | 
				
			||||||
| 
						 | 
					@ -14,8 +18,10 @@ namespace Light {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		s_Context = this;
 | 
							s_Context = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ResourceManager::CreateShader("QuadShader", LT_ENGINE_RESOURCES_QUAD_SHADER_VS, LT_ENGINE_RESOURCES_QUAD_SHADER_PS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// QUADRENDERER //
 | 
							// QUADRENDERER //
 | 
				
			||||||
		m_QuadRenderer.shader = std::unique_ptr<Shader>(Shader::Create("res/vertex.vertex", "res/fragment.fragment", m_SharedContext));
 | 
							m_QuadRenderer.shader = ResourceManager::GetShader("QuadShader");
 | 
				
			||||||
		m_QuadRenderer.vertexBuffer = std::unique_ptr<VertexBuffer>(VertexBuffer::Create(nullptr, sizeof(QuadRendererProgram::QuadVertexData), LT_MAX_QUAD * 4, m_SharedContext));
 | 
							m_QuadRenderer.vertexBuffer = std::unique_ptr<VertexBuffer>(VertexBuffer::Create(nullptr, sizeof(QuadRendererProgram::QuadVertexData), LT_MAX_QUAD * 4, m_SharedContext));
 | 
				
			||||||
		m_QuadRenderer.indexBuffer = std::unique_ptr<IndexBuffer>(IndexBuffer::Create(nullptr, LT_MAX_QUAD * 6, m_SharedContext));
 | 
							m_QuadRenderer.indexBuffer = std::unique_ptr<IndexBuffer>(IndexBuffer::Create(nullptr, LT_MAX_QUAD * 6, m_SharedContext));
 | 
				
			||||||
		m_QuadRenderer.vertexLayout = std::unique_ptr<VertexLayout>(VertexLayout::Create(m_QuadRenderer.vertexBuffer.get(), m_QuadRenderer.shader.get(), { { "POSITION", VertexElementType::Float3 },{ "COLOR", VertexElementType::Float4 } }, m_SharedContext));
 | 
							m_QuadRenderer.vertexLayout = std::unique_ptr<VertexLayout>(VertexLayout::Create(m_QuadRenderer.vertexBuffer.get(), m_QuadRenderer.shader.get(), { { "POSITION", VertexElementType::Float3 },{ "COLOR", VertexElementType::Float4 } }, m_SharedContext));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,28 +9,17 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "GraphicsContext.h"
 | 
					#include "GraphicsContext.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Utility/FileManager.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace Light {
 | 
					namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Shader* Shader::Create(const std::string& vertexPath, const std::string& pixelPath, std::shared_ptr<SharedContext> sharedContext)
 | 
						Shader* Shader::Create(const std::string& vertexSource, const std::string& pixelSource, std::shared_ptr<SharedContext> sharedContext)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// load shader source
 | 
							// load shader source
 | 
				
			||||||
		std::string vertexSource = FileManager::ReadTXTFile(vertexPath);
 | 
					 | 
				
			||||||
		std::string pixelSource = FileManager::ReadTXTFile(pixelPath);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		switch (GraphicsContext::GetGraphicsAPI())
 | 
							switch (GraphicsContext::GetGraphicsAPI())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		case GraphicsAPI::OpenGL:
 | 
							case GraphicsAPI::OpenGL:
 | 
				
			||||||
			ExtractShaderSource(vertexSource, "GLSL");
 | 
					 | 
				
			||||||
			ExtractShaderSource(pixelSource, "GLSL");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return new glShader(vertexSource, pixelSource);
 | 
								return new glShader(vertexSource, pixelSource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case GraphicsAPI::DirectX: LT_WIN(
 | 
							case GraphicsAPI::DirectX: LT_WIN(
 | 
				
			||||||
			ExtractShaderSource(vertexSource, "HLSL");
 | 
					 | 
				
			||||||
			ExtractShaderSource(pixelSource, "HLSL");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return new dxShader(vertexSource, pixelSource, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
								return new dxShader(vertexSource, pixelSource, std::static_pointer_cast<dxSharedContext>(sharedContext));)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
| 
						 | 
					@ -39,26 +28,4 @@ namespace Light {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Shader::ExtractShaderSource(std::string& src, const std::string& delim)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		size_t begDelimPos, endDelimPos;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// find begin and end delimiter (eg. +GLSL ... -GLSL )
 | 
					 | 
				
			||||||
		begDelimPos = src.find('+' + delim) + 5;
 | 
					 | 
				
			||||||
		endDelimPos = src.find('-' + delim);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// check
 | 
					 | 
				
			||||||
		LT_ENGINE_ASSERT(begDelimPos != std::string::npos + 5,
 | 
					 | 
				
			||||||
		                 "Shader::ExtractShaderSource: failed to find the start delimeter in shader source, delim: {}, shader:\n{}",
 | 
					 | 
				
			||||||
		                 delim, src);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		LT_ENGINE_ASSERT(endDelimPos != std::string::npos,
 | 
					 | 
				
			||||||
		                 "Shader::ExtractShaderSource: failed to find the end delimeter in shader source, delim: {}, shader:\n{}",
 | 
					 | 
				
			||||||
		                 delim, src);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// extract the shader
 | 
					 | 
				
			||||||
		src = src.substr(begDelimPos, endDelimPos - begDelimPos);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,24 +0,0 @@
 | 
				
			||||||
#include "ltpch.h"
 | 
					 | 
				
			||||||
#include "FileManager.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace Light {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::string FileManager::ReadTXTFile(const std::string& path)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		// initialize
 | 
					 | 
				
			||||||
		std::ifstream stream(path);
 | 
					 | 
				
			||||||
		std::stringstream ss;
 | 
					 | 
				
			||||||
		std::string line;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// check
 | 
					 | 
				
			||||||
		LT_ENGINE_ASSERT(!path.empty(), "FileManager::ReadTXTFile: path is empty");
 | 
					 | 
				
			||||||
		LT_ENGINE_ASSERT(stream.is_open(), "FileManager::ReadTXTFile: invalid path: {}", path);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// read
 | 
					 | 
				
			||||||
		while (std::getline(stream, line))
 | 
					 | 
				
			||||||
			ss << line << '\n';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return ss.str();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,14 +0,0 @@
 | 
				
			||||||
#pragma once
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "Base.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace Light {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// TODO: optimize!!
 | 
					 | 
				
			||||||
	class FileManager
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	public:
 | 
					 | 
				
			||||||
		static std::string ReadTXTFile(const std::string& path);
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										111
									
								
								Engine/src/Engine/Utility/ResourceManager.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								Engine/src/Engine/Utility/ResourceManager.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,111 @@
 | 
				
			||||||
 | 
					#include "ltpch.h"
 | 
				
			||||||
 | 
					#include "ResourceManager.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Graphics/GraphicsContext.h"
 | 
				
			||||||
 | 
					#include "Graphics/Shader.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define STB_IMAGE_IMPLEMENTATION
 | 
				
			||||||
 | 
					#include <stb_image.h>g
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ResourceManager* ResourceManager::s_Context = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ResourceManager* ResourceManager::Create(std::shared_ptr<SharedContext> sharedContext)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return new ResourceManager(sharedContext);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ResourceManager::ResourceManager(std::shared_ptr<SharedContext> sharedContext)
 | 
				
			||||||
 | 
							: m_SharedContext(sharedContext)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(!s_Context, "ResourceManager::ResourceManager: an instance of 'resource manager' already exists, do not construct this class");
 | 
				
			||||||
 | 
							s_Context = this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void ResourceManager::CreateShaderImpl(const std::string& name, const std::string& vertexSource, const std::string& pixelSource)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// delim
 | 
				
			||||||
 | 
							std::string delim = GraphicsContext::GetGraphicsAPI() == GraphicsAPI::OpenGL ? "GLSL" :
 | 
				
			||||||
 | 
							                    GraphicsContext::GetGraphicsAPI() == GraphicsAPI::DirectX ? "HLSL" : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// check
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(!vertexSource.empty(), "ResourceManager::CreateShader: vertex source is empty");
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(!vertexSource.empty(), "ResourceManager::CreateShader: pixel source is empty");
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(!delim.empty(), "ResourceManager::LoadShader: invalid/unsupported graphics api: {}", GraphicsContext::GetGraphicsAPI());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// save to string
 | 
				
			||||||
 | 
							std::string vsSource = vertexSource;
 | 
				
			||||||
 | 
							std::string psSource = pixelSource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// extract source
 | 
				
			||||||
 | 
							ResourceManager::ExtractShaderSource(vsSource, delim);
 | 
				
			||||||
 | 
							ResourceManager::ExtractShaderSource(psSource, delim);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// create shader
 | 
				
			||||||
 | 
							m_Shaders[name] = std::shared_ptr<Shader>(Shader::Create(vsSource, psSource, m_SharedContext));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void ResourceManager::LoadShaderImpl(const std::string& name, const std::string& vertexPath, const std::string& pixelPath)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// check
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(!vertexPath.empty(), "ResourceManager::LoadShader: vertex path is empty");
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(!pixelPath.empty(), "ResourceManager::LoadShader: pixel path is empty");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// initialize
 | 
				
			||||||
 | 
							std::ifstream vsStream(vertexPath), psStream(pixelPath);
 | 
				
			||||||
 | 
							std::stringstream vsSS, psSS; // pss pss pss pss :D 
 | 
				
			||||||
 | 
							std::string vertexSource, pixelSource;
 | 
				
			||||||
 | 
							std::string line;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// delim
 | 
				
			||||||
 | 
							std::string delim = GraphicsContext::GetGraphicsAPI() == GraphicsAPI::OpenGL ? "GLSL" :
 | 
				
			||||||
 | 
							                    GraphicsContext::GetGraphicsAPI() == GraphicsAPI::DirectX ? "HLSL" : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// check
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(!delim.empty(), "ResourceManager::LoadShader: invalid/unsupported graphics api: {}", GraphicsContext::GetGraphicsAPI());
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(vsStream.is_open(), "ResourceManager::LoadShader: invalid vertex path: {}", vertexPath);
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(psStream.is_open(), "ResourceManager::LoadShader: invalid pixel path: {}", pixelPath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// read
 | 
				
			||||||
 | 
							while (std::getline(vsStream, line))
 | 
				
			||||||
 | 
								vsSS << line << '\n';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while (std::getline(psStream, line))
 | 
				
			||||||
 | 
								psSS << line << '\n';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// save to string
 | 
				
			||||||
 | 
							vertexSource = vsSS.str();
 | 
				
			||||||
 | 
							pixelSource = psSS.str();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// extract source
 | 
				
			||||||
 | 
							ResourceManager::ExtractShaderSource(vertexSource, delim);
 | 
				
			||||||
 | 
							ResourceManager::ExtractShaderSource(pixelSource, delim);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// create shader
 | 
				
			||||||
 | 
							m_Shaders[name] = std::shared_ptr<Shader>(Shader::Create(vertexSource, pixelSource, m_SharedContext));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void ResourceManager::ExtractShaderSource(std::string& src, const std::string& delim)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							size_t begDelimPos, endDelimPos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// find begin and end delimiter (eg. +GLSL ... -GLSL )
 | 
				
			||||||
 | 
							begDelimPos = src.find('+' + delim) + 5;
 | 
				
			||||||
 | 
							endDelimPos = src.find('-' + delim);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// check
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(begDelimPos != std::string::npos + 5,
 | 
				
			||||||
 | 
							                 "Shader::ExtractShaderSource: failed to find the start delimeter in shader source, delim: {}, shader:\n{}",
 | 
				
			||||||
 | 
							                 delim, src);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(endDelimPos != std::string::npos,
 | 
				
			||||||
 | 
							                 "Shader::ExtractShaderSource: failed to find the end delimeter in shader source, delim: {}, shader:\n{}",
 | 
				
			||||||
 | 
							                 delim, src);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// extract the shader
 | 
				
			||||||
 | 
							src = src.substr(begDelimPos, endDelimPos - begDelimPos);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								Engine/src/Engine/Utility/ResourceManager.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								Engine/src/Engine/Utility/ResourceManager.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Base.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <glm/glm.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						class Shader;
 | 
				
			||||||
 | 
						class SharedContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						class ResourceManager
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						private:
 | 
				
			||||||
 | 
							std::unordered_map<std::string, std::shared_ptr<Shader>> m_Shaders;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							std::shared_ptr<SharedContext> m_SharedContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							static ResourceManager* s_Context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public:
 | 
				
			||||||
 | 
							static ResourceManager* Create(std::shared_ptr<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); }
 | 
				
			||||||
 | 
							static inline void LoadShader(const std::string& name, const std::string& vertexPath, const std::string& pixelPath) { s_Context->LoadShaderImpl(name, vertexPath, pixelPath); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							static inline std::shared_ptr<Shader> GetShader(const std::string& name) { return s_Context->m_Shaders[name]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private:
 | 
				
			||||||
 | 
							ResourceManager(std::shared_ptr<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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private:
 | 
				
			||||||
 | 
							void ExtractShaderSource(std::string& src, const std::string& delim);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue