Assertion
This commit is contained in:
		
							parent
							
								
									ab92d8abc2
								
							
						
					
					
						commit
						f3fe4c3713
					
				
					 13 changed files with 159 additions and 18 deletions
				
			
		| 
						 | 
					@ -12,3 +12,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BIT(x) 1 << x
 | 
					#define BIT(x) 1 << x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LT_ENGINE_ASSERT(x, ...) { if(!(x)) { LT_ENGINE_CRITICAL(__VA_ARGS__); __debugbreak(); } }
 | 
				
			||||||
 | 
					#define LT_CLIENT_ASSERT(x, ...) { if(!(x)) { LT_CLIENT_CRITICAL(__VA_ARGS__); __debugbreak(); } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,8 @@ namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Application::GameLoop()
 | 
						void Application::GameLoop()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(!m_LayerStack.IsEmpty(), "Application::GameLoop: Layerstack is empty");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		while (m_Window->IsOpen())
 | 
							while (m_Window->IsOpen())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Events
 | 
								// Events
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,26 +18,36 @@ namespace Light {
 | 
				
			||||||
			s_Context->m_UserInterface.reset();
 | 
								s_Context->m_UserInterface.reset();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// determine the default api
 | 
				
			||||||
 | 
							if (api == GraphicsAPI::Default)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					#ifdef LIGHT_PLATFORM_WINDOWS
 | 
				
			||||||
 | 
								api = GraphicsAPI::OpenGL; // TODO: Change to DirectX
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// create gfx context
 | 
							// create gfx context
 | 
				
			||||||
		switch (api)
 | 
							switch (api)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		case Light::GraphicsAPI::Default:
 | 
					 | 
				
			||||||
		case Light::GraphicsAPI::OpenGL:
 | 
							case Light::GraphicsAPI::OpenGL:
 | 
				
			||||||
			s_Context = new glGraphicsContext(windowHandle);
 | 
								s_Context = new glGraphicsContext(windowHandle);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			break;
 | 
								LT_ENGINE_ASSERT(false, "GraphicsContext::Create: invalid/unsupported GraphicsAPI {}", api);
 | 
				
			||||||
			// TODO: ASSERT
 | 
								return nullptr;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// create gfx context dependent classes
 | 
							// create gfx context dependent classes
 | 
				
			||||||
		if (s_Context)
 | 
							s_Context->m_RenderCommand = std::unique_ptr<RenderCommand>(RenderCommand::Create(windowHandle));
 | 
				
			||||||
		{
 | 
							s_Context->m_UserInterface = std::unique_ptr<UserInterface>(UserInterface::Create(windowHandle));
 | 
				
			||||||
			s_Context->m_RenderCommand = std::unique_ptr<RenderCommand>(RenderCommand::Create(windowHandle));
 | 
							// ...Renderer
 | 
				
			||||||
			s_Context->m_UserInterface = std::unique_ptr<UserInterface>(UserInterface::Create(windowHandle));
 | 
							// ...UserInterface...
 | 
				
			||||||
			// ...Renderer
 | 
					
 | 
				
			||||||
			// ...UserInterface...
 | 
							// sanity check
 | 
				
			||||||
		}
 | 
							LT_ENGINE_ASSERT(s_Context->m_RenderCommand, "GraphicsContext::Create: RenderCommand creation failed");
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(s_Context->m_UserInterface, "GraphicsContext::Create: UserInterface creation failed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return s_Context;
 | 
							return s_Context;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Base.h"
 | 
					#include "Base.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
struct GLFWwindow;
 | 
					struct GLFWwindow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Light {
 | 
					namespace Light {
 | 
				
			||||||
| 
						 | 
					@ -12,7 +11,11 @@ namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	enum class GraphicsAPI
 | 
						enum class GraphicsAPI
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		Default, OpenGL // TODO: Add DirectX, Vulkan, Metal.
 | 
							Default = 0,
 | 
				
			||||||
 | 
							OpenGL, 
 | 
				
			||||||
 | 
							DirectX, 
 | 
				
			||||||
 | 
							Vulkan, 
 | 
				
			||||||
 | 
							Metal
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class GraphicsContext
 | 
						class GraphicsContext
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,8 @@ namespace Light {
 | 
				
			||||||
			return new glRenderCommand(windowHandle);
 | 
								return new glRenderCommand(windowHandle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return nullptr; // TODO: Add ASSERT
 | 
								LT_ENGINE_ASSERT(false, "RenderCommand::Create: invalid/unsupported GraphicsAPI {}", GraphicsContext::GetGraphicsAPI());
 | 
				
			||||||
 | 
								return nullptr;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,22 @@
 | 
				
			||||||
#include "ltpch.h"
 | 
					#include "ltpch.h"
 | 
				
			||||||
#include "Shader.h"
 | 
					#include "Shader.h"
 | 
				
			||||||
 | 
					#include "OpenGL/glShader.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "GraphicsContext.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Light {
 | 
					namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Shader* Shader::Create(const std::string& vertexPath, const std::string& pixelPath)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							switch (GraphicsContext::GetGraphicsAPI())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case GraphicsAPI::OpenGL:
 | 
				
			||||||
 | 
								return new glShader(vertexPath, pixelPath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								LT_ENGINE_ASSERT(false, "Shader::Create: invalid/unsupported GraphicsAPI {}", GraphicsContext::GetGraphicsAPI());
 | 
				
			||||||
 | 
								return nullptr;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@ namespace Light {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		static Shader* Create();
 | 
							static Shader* Create(const std::string& vertexPath, const std::string& pixelPath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		virtual ~Shader() = default;
 | 
							virtual ~Shader() = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,8 @@ namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void OnEvent(const Event& event);
 | 
							void OnEvent(const Event& event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline bool IsEmpty() { return m_Layers.empty(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::vector<Layer*>::iterator begin() { return m_Layers.begin(); }
 | 
							std::vector<Layer*>::iterator begin() { return m_Layers.begin(); }
 | 
				
			||||||
		std::vector<Layer*>::iterator end() { return m_Layers.end(); }
 | 
							std::vector<Layer*>::iterator end() { return m_Layers.end(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,10 @@ namespace Light {
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		case GraphicsAPI::OpenGL:
 | 
							case GraphicsAPI::OpenGL:
 | 
				
			||||||
			return new glUserInterface(windowHandle);
 | 
								return new glUserInterface(windowHandle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								LT_ENGINE_ASSERT(false, "UserInterface::Create: invalid/unsupported GraphicsAPI {}", GraphicsContext::GetGraphicsAPI());
 | 
				
			||||||
 | 
								return nullptr;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,8 @@ namespace Light {
 | 
				
			||||||
		m_GraphicsAPI = GraphicsAPI::OpenGL;
 | 
							m_GraphicsAPI = GraphicsAPI::OpenGL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		glfwMakeContextCurrent(windowHandle);
 | 
							glfwMakeContextCurrent(windowHandle);
 | 
				
			||||||
		gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
 | 
							LT_ENGINE_ASSERT(gladLoadGLLoader((GLADloadproc)glfwGetProcAddress),
 | 
				
			||||||
 | 
							                 "glGraphicsContext::glGraphicsContext: gladLoadGLLoader: failed to initialize opengl context");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		LT_ENGINE_INFO("glGraphicsContext:");
 | 
							LT_ENGINE_INFO("glGraphicsContext:");
 | 
				
			||||||
		LT_ENGINE_INFO("        Renderer: {}", glGetString(GL_RENDERER));
 | 
							LT_ENGINE_INFO("        Renderer: {}", glGetString(GL_RENDERER));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										76
									
								
								Engine/src/Platform/GraphicsAPI/OpenGL/glShader.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								Engine/src/Platform/GraphicsAPI/OpenGL/glShader.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,76 @@
 | 
				
			||||||
 | 
					#include "ltpch.h"
 | 
				
			||||||
 | 
					#include "glShader.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <GLAD/glad.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glShader::glShader(const std::string& vertexPath, const std::string& pixelPath)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							m_ShaderID = glCreateProgram();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
 | 
				
			||||||
 | 
							unsigned int pixelShader = glCreateShader(GL_FRAGMENT_SHADER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const char* vertexPath_cstr = vertexPath.c_str();
 | 
				
			||||||
 | 
							const char* pixelPath_cstr = pixelPath.c_str();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							glShaderSource(vertexShader, 1, &vertexPath_cstr, NULL);
 | 
				
			||||||
 | 
							glShaderSource(pixelShader, 1, &pixelPath_cstr, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							glCompileShader(vertexShader);
 | 
				
			||||||
 | 
							glCompileShader(pixelShader);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// TEMP
 | 
				
			||||||
 | 
							int isCompiled = 0;
 | 
				
			||||||
 | 
							glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &isCompiled);
 | 
				
			||||||
 | 
							if (isCompiled == GL_FALSE)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								GLint maxLength = 0;
 | 
				
			||||||
 | 
								glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &maxLength);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								std::vector<char> errorLog(maxLength);
 | 
				
			||||||
 | 
								glGetShaderInfoLog(vertexShader, maxLength, &maxLength, &errorLog[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								glDeleteShader(vertexShader);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							glGetShaderiv(pixelShader, GL_COMPILE_STATUS, &isCompiled);
 | 
				
			||||||
 | 
							if (isCompiled == GL_FALSE)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								GLint maxLength = 0;
 | 
				
			||||||
 | 
								glGetShaderiv(pixelShader, GL_INFO_LOG_LENGTH, &maxLength);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								std::vector<char> errorLog(maxLength);
 | 
				
			||||||
 | 
								glGetShaderInfoLog(pixelShader, maxLength, &maxLength, &errorLog[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								glDeleteShader(pixelShader);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// TEMP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							glAttachShader(m_ShaderID, vertexShader);
 | 
				
			||||||
 | 
							glAttachShader(m_ShaderID, pixelShader);
 | 
				
			||||||
 | 
							glLinkProgram(m_ShaderID);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							glDeleteShader(vertexShader);
 | 
				
			||||||
 | 
							glDeleteShader(pixelShader);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// TODO: validate program
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						glShader::~glShader()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							glDeleteProgram(m_ShaderID);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void glShader::Bind()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							glUseProgram(m_ShaderID);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void glShader::UnBind()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							glUseProgram(NULL);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								Engine/src/Platform/GraphicsAPI/OpenGL/glShader.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Engine/src/Platform/GraphicsAPI/OpenGL/glShader.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Base.h"
 | 
				
			||||||
 | 
					#include "Graphics/Shader.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						class glShader : public Shader
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						private:
 | 
				
			||||||
 | 
							unsigned int m_ShaderID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public:
 | 
				
			||||||
 | 
							glShader(const std::string& vertexPath, const std::string& pixelPath);
 | 
				
			||||||
 | 
							~glShader();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void Bind() override;
 | 
				
			||||||
 | 
							void UnBind() override;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -20,14 +20,16 @@ namespace Light {
 | 
				
			||||||
	wWindow::wWindow(const WindowProperties& properties, std::function<void(Event&)> callback)
 | 
						wWindow::wWindow(const WindowProperties& properties, std::function<void(Event&)> callback)
 | 
				
			||||||
		: m_Properties(properties), m_EventCallback(callback)
 | 
							: m_Properties(properties), m_EventCallback(callback)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (!glfwInit()) __debugbreak();
 | 
							LT_ENGINE_ASSERT(glfwInit(), "wWindow::wWindow: glfwInit: failed to initialize glfw");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m_Handle = glfwCreateWindow(properties.width, properties.height, properties.title.c_str(), nullptr, nullptr);
 | 
							m_Handle = glfwCreateWindow(properties.width, properties.height, properties.title.c_str(), nullptr, nullptr);
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(m_Handle, "wWindow::wWindow: glfwCreateWindow: failed to create glfw window");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		glfwSetWindowUserPointer(m_Handle, &m_EventCallback);
 | 
							glfwSetWindowUserPointer(m_Handle, &m_EventCallback);
 | 
				
			||||||
		BindGlfwEvents();
 | 
							BindGlfwEvents();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m_GraphicsContext = std::unique_ptr<GraphicsContext>(GraphicsContext::Create(GraphicsAPI::OpenGL, m_Handle));
 | 
							m_GraphicsContext = std::unique_ptr<GraphicsContext>(GraphicsContext::Create(GraphicsAPI::OpenGL, m_Handle));
 | 
				
			||||||
 | 
							LT_ENGINE_ASSERT(m_GraphicsContext, "wWindow::wWindow: graphics context creation failed");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wWindow::~wWindow()
 | 
						wWindow::~wWindow()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue