feat: add logger class
This commit is contained in:
		| @@ -1,11 +1,11 @@ | |||||||
| #include "buffer.h" | #include "buffer.h" | ||||||
|  |  | ||||||
| #include <vector> | #include <vector> | ||||||
| #include <iostream> |  | ||||||
|  |  | ||||||
| #include "../lib/glew/GL/glew.h" | #include "../lib/glew/GL/glew.h" | ||||||
| #include "../lib/glfw/glfw3.h" | #include "../lib/glfw/glfw3.h" | ||||||
|  |  | ||||||
|  | #include "logger.h" | ||||||
| #include "vertex.h" | #include "vertex.h" | ||||||
|  |  | ||||||
| Buffer::Buffer(const std::vector<Vertex>&   vertices, | Buffer::Buffer(const std::vector<Vertex>&   vertices, | ||||||
| @@ -30,6 +30,9 @@ Buffer::Buffer(const std::vector<Vertex>&   vertices, | |||||||
| 	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), | 	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), | ||||||
| 			      nullptr); | 			      nullptr); | ||||||
| 	glEnableVertexAttribArray(0); | 	glEnableVertexAttribArray(0); | ||||||
|  |  | ||||||
|  | 	Logger::info(sstr("Buffer created with ", vertices.size(), | ||||||
|  | 			  " vertices and ", indices.size(), " indices")); | ||||||
| } | } | ||||||
|  |  | ||||||
| Buffer::~Buffer() | Buffer::~Buffer() | ||||||
| @@ -37,6 +40,7 @@ Buffer::~Buffer() | |||||||
| 	glDeleteVertexArrays(1, &vao_); | 	glDeleteVertexArrays(1, &vao_); | ||||||
| 	glDeleteBuffers(1, &vbo_); | 	glDeleteBuffers(1, &vbo_); | ||||||
| 	glDeleteBuffers(1, &ebo_); | 	glDeleteBuffers(1, &ebo_); | ||||||
|  | 	Logger::info("Buffer destroyed"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Buffer::draw(const Shader& shader) const | void Buffer::draw(const Shader& shader) const | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| #include "engine.h" | #include "engine.h" | ||||||
|  |  | ||||||
| #include <iostream> |  | ||||||
| #include <vector> | #include <vector> | ||||||
|  |  | ||||||
| #include "../lib/glew/GL/glew.h" | #include "../lib/glew/GL/glew.h" | ||||||
| @@ -10,6 +9,7 @@ | |||||||
|  |  | ||||||
| #include "buffer.h" | #include "buffer.h" | ||||||
| #include "camera.h" | #include "camera.h" | ||||||
|  | #include "logger.h" | ||||||
| #include "mesh.h" | #include "mesh.h" | ||||||
| #include "model.h" | #include "model.h" | ||||||
| #include "shader.h" | #include "shader.h" | ||||||
| @@ -17,32 +17,37 @@ | |||||||
| #include "vertex.h" | #include "vertex.h" | ||||||
| #include "world.h" | #include "world.h" | ||||||
|  |  | ||||||
| constexpr int	 SCREEN_WIDTH  = 800; | constexpr int	 screen_width  = 800; | ||||||
| constexpr int	 SCREEN_HEIGHT = 600; | constexpr int	 screen_height = 600; | ||||||
| constexpr double FPS_LIMIT     = 1.0 / 60.0; | constexpr double fps_limit     = 1.0 / 60.0; | ||||||
|  |  | ||||||
| Engine::Engine() | Engine::Engine() | ||||||
|     : window_(nullptr) |     : window_(nullptr) | ||||||
|     , screen_width_(SCREEN_WIDTH) |     , screen_width_(screen_width) | ||||||
|     , screen_height_(SCREEN_HEIGHT) |     , screen_height_(screen_height) | ||||||
|     , last_update_time_(0.0) |     , last_update_time_(0.0) | ||||||
|     , last_frame_time_(0.0) |     , last_frame_time_(0.0) | ||||||
|     , angle_(0.0) |     , angle_(0.0) | ||||||
| { | { | ||||||
|  | 	Logger::info("Engine created"); | ||||||
| } | } | ||||||
|  |  | ||||||
| Engine::~Engine() | Engine::~Engine() | ||||||
| { | { | ||||||
|  | 	Logger::info("Engine destroyed"); | ||||||
| 	destroy(); | 	destroy(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Engine::initialize() | void Engine::initialize() | ||||||
| { | { | ||||||
|  | 	Logger::info("Initializing engine..."); | ||||||
|  |  | ||||||
| 	// Initialize GLFW | 	// Initialize GLFW | ||||||
| 	if (!glfwInit()) { | 	if (!glfwInit()) { | ||||||
| 		std::cerr << "Failed to initialize GLFW\n"; | 		Logger::error("Failed to initialize GLFW"); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  | 	Logger::info("GLFW initialized successfully"); | ||||||
|  |  | ||||||
| 	glfwWindowHint(GLFW_RESIZABLE, false); | 	glfwWindowHint(GLFW_RESIZABLE, false); | ||||||
| 	glfwWindowHint(GLFW_SAMPLES, 8); | 	glfwWindowHint(GLFW_SAMPLES, 8); | ||||||
| @@ -51,7 +56,7 @@ void Engine::initialize() | |||||||
| 	window_ = glfwCreateWindow(screen_width_, screen_height_, | 	window_ = glfwCreateWindow(screen_width_, screen_height_, | ||||||
| 				   "Daniel Poveda", nullptr, nullptr); | 				   "Daniel Poveda", nullptr, nullptr); | ||||||
| 	if (window_ == nullptr) { | 	if (window_ == nullptr) { | ||||||
| 		std::cerr << "Failed to create OpenGL window\n"; | 		Logger::error("Failed to create OpenGL window"); | ||||||
| 		glfwTerminate(); | 		glfwTerminate(); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| @@ -61,30 +66,39 @@ void Engine::initialize() | |||||||
| 	glEnable(GL_DEPTH_TEST); | 	glEnable(GL_DEPTH_TEST); | ||||||
| 	glEnable(GL_SCISSOR_TEST); | 	glEnable(GL_SCISSOR_TEST); | ||||||
|  |  | ||||||
| 	std::cout << "OpenGL initialized, version: " << glGetString(GL_VERSION) | 	Logger::info( | ||||||
| 		  << "\n"; | 	    sstr("OpenGL initialized, version: ", | ||||||
|  | 		 reinterpret_cast<const char*>(glGetString(GL_VERSION)))); | ||||||
|  |  | ||||||
| 	// Initialize GLEW | 	// Initialize GLEW | ||||||
| 	glewExperimental = GL_TRUE; | 	glewExperimental = GL_TRUE; | ||||||
| 	GLenum err	 = glewInit(); | 	GLenum err	 = glewInit(); | ||||||
| 	if (err != GLEW_OK) { | 	if (err != GLEW_OK) { | ||||||
| 		std::cerr << "Failed to initialize GLEW: " | 		Logger::error(sstr( | ||||||
| 			  << glewGetErrorString(err) << "\n"; | 		    "Failed to initialize GLEW: ", | ||||||
|  | 		    reinterpret_cast<const char*>(glewGetErrorString(err)))); | ||||||
| 		glfwTerminate(); | 		glfwTerminate(); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Initialize default shader | 	// Initialize default shader | ||||||
|  | 	Logger::info("Loading default shaders..."); | ||||||
| 	state::default_shader = | 	state::default_shader = | ||||||
| 	    std::make_shared<Shader>("data/vertex.glsl", "data/fragment.glsl"); | 	    std::make_shared<Shader>("data/vertex.glsl", "data/fragment.glsl"); | ||||||
| 	if (std::strlen(state::default_shader->error()) > 0) { | 	if (std::strlen(state::default_shader->error()) > 0) { | ||||||
| 		std::cerr << "Failed to initialize shaders: " | 		Logger::error(sstr("Failed to initialize shaders: ", | ||||||
| 			  << state::default_shader->error() << "\n"; | 				   state::default_shader->error())); | ||||||
|  | 	} else { | ||||||
|  | 		Logger::info("Default shaders loaded successfully"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	Logger::info("Engine initialization complete"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Engine::run() | void Engine::run() | ||||||
| { | { | ||||||
|  | 	Logger::info("Starting game loop..."); | ||||||
|  |  | ||||||
| 	setup(); | 	setup(); | ||||||
| 	start(); | 	start(); | ||||||
|  |  | ||||||
| @@ -98,26 +112,33 @@ void Engine::run() | |||||||
| 		process_input(); | 		process_input(); | ||||||
| 		update(delta_time); | 		update(delta_time); | ||||||
|  |  | ||||||
| 		if (now - last_frame_time_ >= FPS_LIMIT) { | 		if (now - last_frame_time_ >= fps_limit) { | ||||||
| 			render(); | 			render(); | ||||||
| 			last_frame_time_ = now; | 			last_frame_time_ = now; | ||||||
| 		} | 		} | ||||||
| 		last_update_time_ = now; | 		last_update_time_ = now; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	Logger::info("Game loop ended"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Engine::destroy() | void Engine::destroy() | ||||||
| { | { | ||||||
| 	if (window_) { | 	if (window_) { | ||||||
|  | 		Logger::info("Shutting down engine..."); | ||||||
| 		glfwTerminate(); | 		glfwTerminate(); | ||||||
| 		window_ = nullptr; | 		window_ = nullptr; | ||||||
|  | 		Logger::info("Engine shutdown complete"); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| void Engine::setup() | void Engine::setup() | ||||||
| { | { | ||||||
|  | 	Logger::info("Setting up scene..."); | ||||||
|  |  | ||||||
| 	// Create world | 	// Create world | ||||||
| 	world_ = std::make_unique<World>(); | 	world_ = std::make_unique<World>(); | ||||||
|  | 	Logger::info("World created"); | ||||||
|  |  | ||||||
| 	// Create camera | 	// Create camera | ||||||
| 	camera_ = std::make_shared<Camera>(); | 	camera_ = std::make_shared<Camera>(); | ||||||
| @@ -130,6 +151,7 @@ void Engine::setup() | |||||||
| 	camera_->set_viewport(glm::ivec4(0, 0, screen_width_, screen_height_)); | 	camera_->set_viewport(glm::ivec4(0, 0, screen_width_, screen_height_)); | ||||||
| 	camera_->set_clear_color(glm::vec3(0.1f, 0.1f, 0.1f)); | 	camera_->set_clear_color(glm::vec3(0.1f, 0.1f, 0.1f)); | ||||||
| 	world_->add_entity(camera_); | 	world_->add_entity(camera_); | ||||||
|  | 	Logger::info("Camera created and added to world"); | ||||||
|  |  | ||||||
| 	// Create triangle mesh | 	// Create triangle mesh | ||||||
| 	std::vector<Vertex> vertices = { | 	std::vector<Vertex> vertices = { | ||||||
| @@ -141,6 +163,8 @@ void Engine::setup() | |||||||
| 	auto buffer = std::make_shared<Buffer>(vertices, indices); | 	auto buffer = std::make_shared<Buffer>(vertices, indices); | ||||||
| 	mesh_	    = std::make_shared<Mesh>(); | 	mesh_	    = std::make_shared<Mesh>(); | ||||||
| 	mesh_->add_buffer(buffer); | 	mesh_->add_buffer(buffer); | ||||||
|  | 	Logger::info(sstr("Mesh created with ", vertices.size(), | ||||||
|  | 			  " vertices and ", indices.size(), " indices")); | ||||||
|  |  | ||||||
| 	// Create 9 models in a 3x3 grid | 	// Create 9 models in a 3x3 grid | ||||||
| 	for (int row = 0; row < 3; ++row) { | 	for (int row = 0; row < 3; ++row) { | ||||||
| @@ -153,6 +177,8 @@ void Engine::setup() | |||||||
| 			world_->add_entity(model); | 			world_->add_entity(model); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	Logger::info(sstr("Created ", models_.size(), " models in scene")); | ||||||
|  | 	Logger::info("Scene setup complete"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Engine::start() | void Engine::start() | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								src/logger.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/logger.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | #include "logger.h" | ||||||
|  |  | ||||||
|  | #include <chrono> | ||||||
|  | #include <iostream> | ||||||
|  |  | ||||||
|  | namespace { | ||||||
|  |  | ||||||
|  | std::string current_datetime_string() | ||||||
|  | { | ||||||
|  | 	auto	  now	     = std::chrono::system_clock::now(); | ||||||
|  | 	auto	  now_time_t = std::chrono::system_clock::to_time_t(now); | ||||||
|  | 	struct tm now_tm {}; | ||||||
|  | #ifdef _WIN32 | ||||||
|  | 	localtime_s(&now_tm, &now_time_t); | ||||||
|  | #else | ||||||
|  | 	localtime_r(&now_time_t, &now_tm); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | 	char buffer[30]; | ||||||
|  | 	std::strftime(buffer, sizeof(buffer) / sizeof(char), "%Y-%m-%d %H:%M:%S", | ||||||
|  | 		      &now_tm); | ||||||
|  | 	return std::string{buffer}; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  | void Logger::info(const std::string& message) | ||||||
|  | { | ||||||
|  | 	LogEntry entry; | ||||||
|  | 	entry.type = LogType::info; | ||||||
|  | 	entry.message = | ||||||
|  | 	    "[" + current_datetime_string() + "] [INFO]: " + message; | ||||||
|  |  | ||||||
|  | 	std::cout << "\x1B[32m" << entry.message << "\033[0m" << std::endl; | ||||||
|  | 	messages_.push_back(entry); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Logger::warn(const std::string& message) | ||||||
|  | { | ||||||
|  | 	LogEntry entry; | ||||||
|  | 	entry.type = LogType::warn; | ||||||
|  | 	entry.message = | ||||||
|  | 	    "[" + current_datetime_string() + "] [WARN]: " + message; | ||||||
|  |  | ||||||
|  | 	std::cout << "\x1B[93m" << entry.message << "\033[0m" << std::endl; | ||||||
|  | 	messages_.push_back(entry); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Logger::error(const std::string& message) | ||||||
|  | { | ||||||
|  | 	LogEntry entry; | ||||||
|  | 	entry.type	= LogType::error; | ||||||
|  | 	entry.message = "[" + current_datetime_string() + "] [ERROR]: " + message; | ||||||
|  |  | ||||||
|  | 	std::cerr << "\x1B[91m" << entry.message << "\033[0m" << std::endl; | ||||||
|  | 	messages_.push_back(entry); | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								src/logger.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/logger.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | #ifndef LOGGER_H_ | ||||||
|  | #define LOGGER_H_ | ||||||
|  |  | ||||||
|  | #include <sstream> | ||||||
|  | #include <string> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  | // Utility: Concatenate any types into a string | ||||||
|  | template <typename... Args> | ||||||
|  | std::string sstr(Args&&... args) | ||||||
|  | { | ||||||
|  | 	std::ostringstream stream; | ||||||
|  | 	stream << std::dec; | ||||||
|  | 	((stream << args), ...); | ||||||
|  | 	return stream.str(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Log types | ||||||
|  | enum class LogType { | ||||||
|  | 	info = 0, | ||||||
|  | 	warn, | ||||||
|  | 	error | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // Log entry structure | ||||||
|  | struct LogEntry { | ||||||
|  | 	LogType	    type{LogType::info}; | ||||||
|  | 	std::string message{}; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // Logger class | ||||||
|  | class Logger { | ||||||
|  | public: | ||||||
|  | 	static void info(const std::string& message); | ||||||
|  | 	static void warn(const std::string& message); | ||||||
|  | 	static void error(const std::string& message); | ||||||
|  |  | ||||||
|  | 	[[nodiscard]] static const std::vector<LogEntry>& messages() | ||||||
|  | 	{ | ||||||
|  | 		return messages_; | ||||||
|  | 	} | ||||||
|  | 	static void clear() { messages_.clear(); } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | 	inline static std::vector<LogEntry> messages_{}; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif // LOGGER_H_ | ||||||
| @@ -1,13 +1,13 @@ | |||||||
| #include "shader.h" | #include "shader.h" | ||||||
|  |  | ||||||
| #include <vector> |  | ||||||
| #include <fstream> | #include <fstream> | ||||||
| #include <sstream> | #include <sstream> | ||||||
| #include <iostream> | #include <vector> | ||||||
|  |  | ||||||
| #include "../lib/glew/GL/glew.h" | #include "../lib/glew/GL/glew.h" | ||||||
| #include "../lib/glfw/glfw3.h" | #include "../lib/glfw/glfw3.h" | ||||||
|  |  | ||||||
|  | #include "logger.h" | ||||||
| #include "vertex.h" | #include "vertex.h" | ||||||
|  |  | ||||||
| Shader::Shader(const std::string& vertexPath, const std::string& fragmentPath) | Shader::Shader(const std::string& vertexPath, const std::string& fragmentPath) | ||||||
| @@ -106,7 +106,8 @@ std::string Shader::read_shader_file(const std::string& filename) | |||||||
| { | { | ||||||
| 	std::ifstream file(filename); | 	std::ifstream file(filename); | ||||||
| 	if (!file) { | 	if (!file) { | ||||||
| 		error_ = "Failed to open shader file: " + filename + "\n"; | 		error_ = "Failed to open shader file: " + filename; | ||||||
|  | 		Logger::error(sstr("Failed to open shader file: ", filename)); | ||||||
| 		return std::string{0}; | 		return std::string{0}; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -117,11 +118,16 @@ std::string Shader::read_shader_file(const std::string& filename) | |||||||
|  |  | ||||||
| uint32_t Shader::compile_shader(uint32_t type, const std::string& source_path) | uint32_t Shader::compile_shader(uint32_t type, const std::string& source_path) | ||||||
| { | { | ||||||
|  | 	const char* shader_type_name = | ||||||
|  | 	    (type == GL_VERTEX_SHADER) ? "vertex" : "fragment"; | ||||||
|  |  | ||||||
| 	std::string source = read_shader_file(source_path); | 	std::string source = read_shader_file(source_path); | ||||||
| 	// std::cout << "SHADER FILE: " << source << "\n"; |  | ||||||
| 	if (source.empty()) | 	if (source.empty()) | ||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
|  | 	Logger::info( | ||||||
|  | 	    sstr("Compiling ", shader_type_name, " shader: ", source_path)); | ||||||
|  |  | ||||||
| 	const uint32_t shader	   = glCreateShader(type); | 	const uint32_t shader	   = glCreateShader(type); | ||||||
| 	const char*    shader_code = source.c_str(); | 	const char*    shader_code = source.c_str(); | ||||||
|  |  | ||||||
| @@ -135,9 +141,13 @@ uint32_t Shader::compile_shader(uint32_t type, const std::string& source_path) | |||||||
| 		char buffer[1024]; | 		char buffer[1024]; | ||||||
| 		glGetShaderInfoLog(shader, sizeof(buffer), nullptr, buffer); | 		glGetShaderInfoLog(shader, sizeof(buffer), nullptr, buffer); | ||||||
| 		error_ = buffer; | 		error_ = buffer; | ||||||
|  | 		Logger::error( | ||||||
|  | 		    sstr("Shader compilation failed (", shader_type_name, "): ", | ||||||
|  | 			 buffer)); | ||||||
| 		glDeleteShader(shader); | 		glDeleteShader(shader); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	Logger::info(sstr(shader_type_name, " shader compiled successfully")); | ||||||
| 	return shader; | 	return shader; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,8 +1,11 @@ | |||||||
| #include "world.h" | #include "world.h" | ||||||
| #include "entity.h" |  | ||||||
| #include "camera.h" |  | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
|  |  | ||||||
|  | #include "camera.h" | ||||||
|  | #include "entity.h" | ||||||
|  | #include "logger.h" | ||||||
|  |  | ||||||
| void World::add_entity(const std::shared_ptr<Entity>& entity) | void World::add_entity(const std::shared_ptr<Entity>& entity) | ||||||
| { | { | ||||||
| 	entities_.push_back(entity); | 	entities_.push_back(entity); | ||||||
| @@ -12,6 +15,11 @@ void World::add_entity(const std::shared_ptr<Entity>& entity) | |||||||
| 	    std::dynamic_pointer_cast<Camera>(entity); | 	    std::dynamic_pointer_cast<Camera>(entity); | ||||||
| 	if (camera) { | 	if (camera) { | ||||||
| 		cameras_.push_back(camera); | 		cameras_.push_back(camera); | ||||||
|  | 		Logger::info(sstr("Camera added to world (total cameras: ", | ||||||
|  | 				  cameras_.size(), ")")); | ||||||
|  | 	} else { | ||||||
|  | 		Logger::info(sstr("Entity added to world (total entities: ", | ||||||
|  | 				  entities_.size(), ")")); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -21,6 +29,7 @@ void World::remove_entity(const std::shared_ptr<Entity>& entity) | |||||||
| 	auto it = std::find(entities_.begin(), entities_.end(), entity); | 	auto it = std::find(entities_.begin(), entities_.end(), entity); | ||||||
| 	if (it != entities_.end()) { | 	if (it != entities_.end()) { | ||||||
| 		entities_.erase(it); | 		entities_.erase(it); | ||||||
|  | 		Logger::info("Entity removed from world"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Check if entity is a camera and remove from cameras list | 	// Check if entity is a camera and remove from cameras list | ||||||
| @@ -31,6 +40,7 @@ void World::remove_entity(const std::shared_ptr<Entity>& entity) | |||||||
| 		    std::find(cameras_.begin(), cameras_.end(), camera); | 		    std::find(cameras_.begin(), cameras_.end(), camera); | ||||||
| 		if (camIt != cameras_.end()) { | 		if (camIt != cameras_.end()) { | ||||||
| 			cameras_.erase(camIt); | 			cameras_.erase(camIt); | ||||||
|  | 			Logger::info("Camera removed from world"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -163,6 +163,7 @@ | |||||||
|     <ClInclude Include="src\camera.h" /> |     <ClInclude Include="src\camera.h" /> | ||||||
|     <ClInclude Include="src\engine.h" /> |     <ClInclude Include="src\engine.h" /> | ||||||
|     <ClInclude Include="src\entity.h" /> |     <ClInclude Include="src\entity.h" /> | ||||||
|  |     <ClInclude Include="src\logger.h" /> | ||||||
|     <ClInclude Include="src\mesh.h" /> |     <ClInclude Include="src\mesh.h" /> | ||||||
|     <ClInclude Include="src\model.h" /> |     <ClInclude Include="src\model.h" /> | ||||||
|     <ClInclude Include="src\shader.h" /> |     <ClInclude Include="src\shader.h" /> | ||||||
| @@ -176,6 +177,7 @@ | |||||||
|     <ClCompile Include="src\camera.cpp" /> |     <ClCompile Include="src\camera.cpp" /> | ||||||
|     <ClCompile Include="src\engine.cpp" /> |     <ClCompile Include="src\engine.cpp" /> | ||||||
|     <ClCompile Include="src\entity.cpp" /> |     <ClCompile Include="src\entity.cpp" /> | ||||||
|  |     <ClCompile Include="src\logger.cpp" /> | ||||||
|     <ClCompile Include="src\main.cpp" /> |     <ClCompile Include="src\main.cpp" /> | ||||||
|     <ClCompile Include="src\mesh.cpp" /> |     <ClCompile Include="src\mesh.cpp" /> | ||||||
|     <ClCompile Include="src\model.cpp" /> |     <ClCompile Include="src\model.cpp" /> | ||||||
|   | |||||||
| @@ -63,6 +63,9 @@ | |||||||
|     <ClInclude Include="src\engine.h"> |     <ClInclude Include="src\engine.h"> | ||||||
|       <Filter>Source Files</Filter> |       <Filter>Source Files</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="src\logger.h"> | ||||||
|  |       <Filter>Source Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClCompile Include="src\main.cpp"> |     <ClCompile Include="src\main.cpp"> | ||||||
| @@ -98,6 +101,9 @@ | |||||||
|     <ClCompile Include="src\engine.cpp"> |     <ClCompile Include="src\engine.cpp"> | ||||||
|       <Filter>Source Files</Filter> |       <Filter>Source Files</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="src\logger.cpp"> | ||||||
|  |       <Filter>Source Files</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <None Include="data\fragment.glsl"> |     <None Include="data\fragment.glsl"> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user