Compare commits
	
		
			56 Commits
		
	
	
		
			Feature/Ba
			...
			0f9be33bd6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0f9be33bd6 | |||
| 75aa577211 | |||
| fe7e168e21 | |||
| 3722e63495 | |||
| 3a9c07aff9 | |||
| 2dcc3f1803 | |||
| 2a5c7811e7 | |||
| 3fa5455b43 | |||
| ad79aa2865 | |||
| fd68c5dde3 | |||
| 1f1a776686 | |||
| e7f1bd7d52 | |||
| a1ec94e983 | |||
| 4b84707f98 | |||
| 3d3596a3b6 | |||
| 628225af45 | |||
| b5db500d48 | |||
| f7a85d53ab | |||
| c57177a1a9 | |||
| 9a9db279a5 | |||
| 210d535c41 | |||
| b2688e843c | |||
| 28c64b43ba | |||
| 02e14aa8fa | |||
| 7343300dcb | |||
| 3b91516d6e | |||
| c8ebc0fa17 | |||
| 41d5b87c7b | |||
| b44c88d05c | |||
| 644b6db100 | |||
| f37175a01e | |||
| c62f3615d4 | |||
| 3e75406783 | |||
| 65ae892951 | |||
| f0984b6117 | |||
| adf2331ab1 | |||
| 99eb5282e5 | |||
| bc1254e427 | |||
| 7458254b2d | |||
| b359a940ba | |||
| e0e8de90b1 | |||
| 23ac663667 | |||
| 955eeabb48 | |||
| 29e715b92a | |||
| 463a9ff307 | |||
| cbbdafcb3e | |||
| b03b82272f | |||
| 3974889f7e | |||
| db6def3bc9 | |||
| ab5599f1fc | |||
| 3639f967e1 | |||
| 5a06b068f3 | |||
| e31fd036ea | |||
| 6a2e8d3b2f | |||
| f8b390923e | |||
| b7e3465406 | 
							
								
								
									
										2
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							| @ -1 +1,3 @@ | ||||
| *.png filter=lfs diff=lfs merge=lfs -text | ||||
| *.webp filter=lfs diff=lfs merge=lfs -text | ||||
| *.xcf filter=lfs diff=lfs merge=lfs -text | ||||
|  | ||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,12 +1,11 @@ | ||||
| build/ | ||||
| intermediates/ | ||||
| **/build/ | ||||
| **/intermediates/ | ||||
| tools/ | ||||
| *.make | ||||
| Makefile | ||||
| .vscode/ | ||||
| libs/lua | ||||
| libs/glad | ||||
| Debug/ | ||||
| *.sln | ||||
| *.vcxproj | ||||
| *.vcxproj.filters | ||||
|  | ||||
							
								
								
									
										17
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @ -4,12 +4,10 @@ | ||||
| [submodule "glm"] | ||||
| 	path = libs/glm | ||||
| 	url = https://github.com/nigelbarink/glm.git | ||||
| 	ignore = untracked | ||||
| [submodule "spdlog"] | ||||
| 	path = libs/spdlog | ||||
| 	url = https://github.com/nigelbarink/spdlog.git | ||||
| [submodule "tinygltf"] | ||||
| 	path = libs/tinygltf | ||||
| 	url = https://github.com/syoyo/tinygltf.git | ||||
| [submodule "GorrillaAudio"] | ||||
| 	path = libs/GorillaAudio | ||||
| 	url = https://github.com/mewspring/gorilla-audio.git | ||||
| @ -22,6 +20,19 @@ | ||||
| [submodule "libs/steam-audio"] | ||||
| 	path = libs/steam-audio | ||||
| 	url = https://github.com/ValveSoftware/steam-audio.git | ||||
| 	ignore = untracked | ||||
| [submodule "libs/physx"] | ||||
| 	path = libs/physx | ||||
| 	url = https://git.barink.dev/Nigel/PhysX.git | ||||
| [submodule "libs/entt"] | ||||
| 	path = libs/entt | ||||
| 	url = https://github.com/skypjack/entt.git | ||||
| [submodule "libs/guizmo"] | ||||
| 	path = libs/guizmo | ||||
| 	url = https://github.com/CedricGuillemet/ImGuizmo.git | ||||
| [submodule "libs/yaml-cpp"] | ||||
| 	path = libs/yaml-cpp | ||||
| 	url = https://git.barink.dev/Nigel/yaml-cpp.git | ||||
| [submodule "libs/nativefiledialog"] | ||||
| 	path = libs/nativefiledialog | ||||
| 	url = https://git.barink.dev/Nigel/nativefiledialog.git | ||||
|  | ||||
							
								
								
									
										6
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -1,6 +0,0 @@ | ||||
| { | ||||
|     "cmake.configureOnOpen": true, | ||||
|     "files.associations": { | ||||
|         "iosfwd": "cpp" | ||||
|     } | ||||
| } | ||||
| @ -1,64 +0,0 @@ | ||||
| #include "BarinkEngine.h" | ||||
| #include <phonon.h> | ||||
|  | ||||
| EngineStatistics* ES; | ||||
| BarinkEngine::InputManager InputSystem; | ||||
|  | ||||
| int main(int argc, char* argv[]) { | ||||
| 	// Setup performance sampler  | ||||
| 	PerfomanceSamplerInit(); | ||||
|  | ||||
|  | ||||
| 	// Startup services  | ||||
| 	BarinkWindow MainWindow =  BarinkWindow(800, 600); | ||||
|  | ||||
| 	BarinkEngine::Renderer renderer = BarinkEngine::Renderer(); | ||||
| 	InputSystem = BarinkEngine::InputManager(); | ||||
|  | ||||
| 	InputSystem.attach(&MainWindow); | ||||
|  | ||||
| 	GUIManager GUISystem = GUIManager(&MainWindow); | ||||
|  | ||||
|  | ||||
| 	glEnable(GL_DEPTH_TEST); | ||||
|  | ||||
|  | ||||
|  | ||||
| 	// First call to setup game | ||||
| 	Start(); | ||||
|  | ||||
|  | ||||
| 	 | ||||
| 	// Runtime loop | ||||
| 	while (!MainWindow.WindowShouldClose()) { | ||||
|  | ||||
| 		SamplePerformance(); | ||||
|  | ||||
|  | ||||
| 		// Execute main logic  | ||||
| 		InputSystem.PollEvents(); | ||||
| 		 | ||||
| 		Update(); | ||||
|  | ||||
| 		renderer.Render(); | ||||
|  | ||||
| 		ImmediateGraphicsDraw(); | ||||
|  | ||||
| 		GUISystem.Render(); | ||||
| 		 | ||||
|  | ||||
|  | ||||
| 		MainWindow.SwapBuffers(); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	// Shutdown game | ||||
| 	Stop(); | ||||
|  | ||||
|  | ||||
| 	// Shutdown Services | ||||
| 	delete ES; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| #include "../Include/EventSystem/EventEmitter.h" | ||||
|  | ||||
|  | ||||
| void EventEmitter::Subscribe(EventListener& subscriber) | ||||
| { | ||||
|   subscribers.push_back(&subscriber); | ||||
| } | ||||
|  | ||||
| void EventEmitter::Unsubscribe(EventListener& subscriber) | ||||
| { | ||||
|   subscribers.remove(&subscriber); | ||||
| } | ||||
|  | ||||
| void EventEmitter::EmitEvent(Event& incident) | ||||
| { | ||||
| 	// Notify all subscribers an event has taken place  | ||||
| 	for (auto it = subscribers.begin(); it != subscribers.end(); ++it) | ||||
| 	{ | ||||
| 		(*it)->ReceiveEvent(incident); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| EventEmitter::EventEmitter() { | ||||
| 	subscribers = std::list<EventListener*>{}; | ||||
| } | ||||
| @ -1,26 +0,0 @@ | ||||
| #pragma once | ||||
| #define TINYGLTF_IMPLEMENTATION | ||||
| #define STB_IMAGE_IMPLEMENTATION | ||||
| #define STB_IMAGE_WRITE_IMPLEMENTATION | ||||
| #define TINYGLTF_NO_EXTERNAL_IMAGE | ||||
|  | ||||
| #include "Graphics/Mesh.h" | ||||
| #include <assimp/Importer.hpp> | ||||
| #include <assimp/scene.h> | ||||
| #include <assimp/postprocess.h>  | ||||
| #include <string> | ||||
|  | ||||
| class ModelImporter { | ||||
| private: | ||||
| 	void ImportFBX(std::string path);  | ||||
| 	void ImportBlend(std::string path); | ||||
| 	void ImportGLTF(std::string path); | ||||
| 	void ImportOBJ(std::string path); | ||||
| 	static BarinkEngine::Mesh ModelImporter::processMesh(aiMesh* mesh, const aiScene* scene); | ||||
| 	static std::vector<BarinkEngine::Mesh> ModelImporter::processNode(aiNode* node, const aiScene* scene); | ||||
|  | ||||
| public: | ||||
| 	void Import(std::string path); | ||||
|  | ||||
| 	static std::vector<BarinkEngine::Mesh> Test(); | ||||
| }; | ||||
| @ -1,24 +0,0 @@ | ||||
| #pragma once | ||||
| #include "glm/glm.hpp" | ||||
| #include "graphics/Shader.h" | ||||
| #include "graphics/Window.h" | ||||
| #include "graphics/Texture.h" | ||||
| #include "graphics/Camera.h" | ||||
| #include "graphics/Renderable.h" | ||||
| #include "Graphics/Material.h" | ||||
|  | ||||
| #include "spdlog/spdlog.h" | ||||
|  | ||||
| #include "Input/InputManager.h" | ||||
| #include "Graphics/Renderer.h" | ||||
| #include "Graphics/GUI/GUIManager.h" | ||||
| #include "Scene.h" | ||||
| #include "PerfCounter.h" | ||||
|  | ||||
|  | ||||
| extern void Start(); | ||||
| extern void Update(); | ||||
| extern void ImmediateGraphicsDraw(); | ||||
| extern void Stop(); | ||||
|  | ||||
| extern BarinkEngine::InputManager InputSystem; | ||||
| @ -1,12 +0,0 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
|  | ||||
| class EditorWindow { | ||||
| protected: | ||||
| 	std::string WindowTitle; | ||||
|  | ||||
| public: | ||||
|  | ||||
| 	virtual void Show() = 0; | ||||
|  | ||||
| }; | ||||
| @ -1,11 +0,0 @@ | ||||
| #pragma once  | ||||
| #include <string>  | ||||
|  | ||||
| struct Event | ||||
| { | ||||
|   public: | ||||
|     std::string name; | ||||
|     int argc; | ||||
|     void** argv; | ||||
|  | ||||
| }; | ||||
| @ -1,16 +0,0 @@ | ||||
| #pragma once | ||||
| #include "Event.h" | ||||
| #include "EventListener.h" | ||||
|  | ||||
| class EventEmitter { | ||||
| public:  | ||||
|   void Subscribe (EventListener& subscriber); | ||||
|   void Unsubscribe(EventListener& subscriber); | ||||
|  | ||||
| protected: | ||||
|   std::list<EventListener*> subscribers; | ||||
|   void EmitEvent(Event& incident); | ||||
|  | ||||
|   EventEmitter(); | ||||
|  | ||||
| }; | ||||
| @ -1,5 +0,0 @@ | ||||
| #include "EventListener.h" | ||||
|  | ||||
| void EventListener::ReceiveEvent(Event& incident) | ||||
| { | ||||
| } | ||||
| @ -1,8 +0,0 @@ | ||||
| #pragma once  | ||||
| #include "Event.h" | ||||
| #include <list> | ||||
| class EventListener{ | ||||
|   public:  | ||||
|     virtual void ReceiveEvent(Event& incident); | ||||
|  | ||||
| }; | ||||
| @ -1,19 +0,0 @@ | ||||
| #pragma once | ||||
| #include <glad/glad.h> | ||||
| class Buffer { | ||||
| private: | ||||
| 	unsigned int id; | ||||
| public: | ||||
|  | ||||
| 	int getBufferID(); | ||||
|  | ||||
| 	void createBuffer(); | ||||
|  | ||||
| 	void setBufferData(void* data, size_t dataSize, bool elementBuffer ); | ||||
|  | ||||
| 	void Bind(bool elementBuffer); | ||||
| 	void Unbind(bool elementBuffer); | ||||
|  | ||||
| 	void Delete(); | ||||
|  | ||||
| }; | ||||
| @ -1,22 +0,0 @@ | ||||
| #pragma once | ||||
| #include <glm/glm.hpp> | ||||
| #include <glm/gtc/matrix_transform.hpp> | ||||
|  | ||||
| class Camera { | ||||
| public: | ||||
| 	glm::vec3 Position; | ||||
| 	glm::vec3 Rotation; | ||||
| 	float Zoom; | ||||
|  | ||||
| 	Camera(glm::vec3 position, glm::vec3 rotation, float zoom ); | ||||
| 	~Camera(); | ||||
|  | ||||
| 	glm::mat4 GetViewMatrix(); | ||||
|  | ||||
|  | ||||
| private: | ||||
| 	glm::vec3 Front;   | ||||
| 	glm::vec3 Right; | ||||
| 	glm::vec3 Up; | ||||
|  | ||||
| }; | ||||
| @ -1,15 +0,0 @@ | ||||
| #pragma once | ||||
| #include "Graphics/Window.h" | ||||
|  | ||||
|  | ||||
| class GUIManager { | ||||
| public: | ||||
| 	GUIManager(BarinkWindow* window); | ||||
| 	~GUIManager(); | ||||
|  | ||||
| 	void Render(); | ||||
|  | ||||
|  | ||||
| private: | ||||
| 	BarinkWindow* currentwindow; | ||||
| }; | ||||
| @ -1,19 +0,0 @@ | ||||
| #pragma once | ||||
| #include <glm/glm.hpp> | ||||
| #include <string> | ||||
| #include "Shader.h" | ||||
|  | ||||
| class Material { | ||||
| public: | ||||
| 	Material(const Shader& shader); | ||||
| 	 | ||||
| 	void Apply(); | ||||
| 	 | ||||
| 	glm::vec3 Color; | ||||
|  | ||||
|  | ||||
| private: | ||||
| 	const Shader& shader; | ||||
| 	 | ||||
|  | ||||
| }; | ||||
| @ -1,20 +0,0 @@ | ||||
| #pragma once | ||||
| #include <vector> | ||||
| #include <glm/glm.hpp> | ||||
|  | ||||
| namespace BarinkEngine{ | ||||
|  | ||||
|  | ||||
| 	struct Vertex { | ||||
| 		glm::vec3 vertices; | ||||
| 		glm::vec2 uv; | ||||
| 	}; | ||||
|  | ||||
| 	class Mesh { | ||||
| 	public: | ||||
| 		std::vector<Vertex> vertices; | ||||
| 		std::vector<unsigned int > elements; | ||||
| 	 | ||||
| 	}; | ||||
|  | ||||
| } | ||||
| @ -1,30 +0,0 @@ | ||||
| #pragma once | ||||
| #include "BarinkEngine.h" | ||||
| #include <vector>; | ||||
| class RenderSurface  | ||||
| { | ||||
| public: | ||||
| 	RenderSurface(); | ||||
| 	~RenderSurface(); | ||||
|  | ||||
| 	void Draw(); | ||||
|  | ||||
| private: | ||||
| 	// would normally be a material | ||||
| 	// however rendersurface is special and | ||||
| 	// thus does not contain a material | ||||
| 	Shader* shader; | ||||
|  | ||||
| 	// Basically a mesh | ||||
| 	std::vector<glm::vec3> verts; | ||||
| 	std::vector<unsigned int > indices; | ||||
|  | ||||
|  | ||||
| 	Buffer vertexBuffer; | ||||
| 	Buffer elementBuffer; | ||||
|  | ||||
| 	VertexArray VAO; | ||||
|  | ||||
|  | ||||
|  | ||||
| }; | ||||
| @ -1,37 +0,0 @@ | ||||
| #pragma once | ||||
| #include <vector> | ||||
| #include "Mesh.h" | ||||
| #include "Buffer.h" | ||||
| #include "Material.h" | ||||
| #include "Texture.h" | ||||
| #include "VertexArray.h" | ||||
| #include "Scene.h" | ||||
|  | ||||
|  | ||||
| class Renderable  : public SceneNode { | ||||
| public: | ||||
| 	/* | ||||
| 	* NOTE: Should combine into a Mesh!! | ||||
| 	*/ | ||||
| 	Buffer vertexBuffer; | ||||
| 	Buffer elementBuffer; | ||||
| 	//Buffer uv; | ||||
| 	VertexArray VAO; | ||||
|  | ||||
|  | ||||
| 	GLuint UV_id; | ||||
| 	Material* material; | ||||
| 	Texture* texture; | ||||
|  | ||||
| 	 | ||||
| 	Shader* shader; | ||||
|  | ||||
| 	~Renderable(); | ||||
|  | ||||
| 	static Renderable* Load(); | ||||
| 	void Draw(); | ||||
|  | ||||
| private: | ||||
| 	std::vector<BarinkEngine::Mesh> meshes; | ||||
| 	Renderable(); | ||||
| }; | ||||
| @ -1,21 +0,0 @@ | ||||
| #pragma once | ||||
| #include "Graphics/Renderable.h" | ||||
|  | ||||
| #include <vector> | ||||
|  | ||||
| namespace BarinkEngine { | ||||
|  | ||||
| 	class Renderer { | ||||
| 	public: | ||||
| 		Renderer(); | ||||
| 		~Renderer(); | ||||
|  | ||||
| 		void Render(); | ||||
|  | ||||
| 		void Submit(Renderable* model); | ||||
|  | ||||
| 	private: | ||||
| 		std::vector<Renderable*> models; | ||||
|  | ||||
| 	}; | ||||
| } | ||||
| @ -1,27 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <glad/glad.h> | ||||
| #include <string> | ||||
| #include <iostream> | ||||
| #include <fstream> | ||||
| #include <glm/glm.hpp> | ||||
| #include <glm/gtc/type_ptr.hpp> | ||||
|  | ||||
|  | ||||
| class Shader { | ||||
|     private: | ||||
|          | ||||
|         char* readFile (const char* filePath); | ||||
|     public: | ||||
|         Shader(const std::string vertexShaderPath, const std::string fragmentShaderPath); | ||||
|         void Use(); | ||||
|         void setUniformMat4(std::string uniformName, glm::mat4 matrix4)const; | ||||
|         void setUniformVec4(std::string uniformName, glm::vec4 vector4)const; | ||||
|         void setUniformVec3(std::string uniformName, glm::vec3 vector3)const; | ||||
|         void setUniformVec2(std::string uniformName, glm::vec2 vector2)const; | ||||
|         void setUniformFloat(std::string uniformName, float value)const; | ||||
|         void setUniformInt(std::string uniformName, int value) const ; | ||||
|  | ||||
|         int id; | ||||
|  | ||||
| }; | ||||
| @ -1,18 +0,0 @@ | ||||
| #pragma once | ||||
| #include <spdlog/spdlog.h> | ||||
| #include <string> | ||||
|  | ||||
|  | ||||
| class Texture { | ||||
| public: | ||||
| 	Texture(const std::string texturePath); | ||||
| 	 | ||||
| 	void Bind(); | ||||
| 	void Unbind(); | ||||
|  | ||||
|  | ||||
| private: | ||||
|  | ||||
| 	unsigned int Id; | ||||
|  | ||||
| }; | ||||
| @ -1,18 +0,0 @@ | ||||
| #pragma once  | ||||
|  | ||||
| class VertexArray{ | ||||
| private: | ||||
| unsigned int id; | ||||
|  | ||||
|  | ||||
| public: | ||||
| void Create(); | ||||
| void Bind(); | ||||
| void Unbind(); | ||||
|  | ||||
| void Delete(); | ||||
|  | ||||
| void AttachAttribute(unsigned int index, int size, int stride); | ||||
|  | ||||
|  | ||||
| }; | ||||
| @ -1,37 +0,0 @@ | ||||
| #pragma once  | ||||
| #define GLFW_STATIC | ||||
|  | ||||
| #include <glad/glad.h> | ||||
| #include <GLFW/glfw3.h> | ||||
| #include "../Include/EventSystem/EventListener.h" | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| class BarinkWindow : EventListener { | ||||
|     private: | ||||
|         GLFWwindow* window; | ||||
|         bool FullScreen; | ||||
|         bool VulkanSupported; | ||||
|         int Width, Height; | ||||
|  | ||||
|         static bool InitGLFW(); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|     public: | ||||
|         BarinkWindow(const int width, const int height); | ||||
|         ~BarinkWindow(); | ||||
|  | ||||
|         GLFWwindow* windowptr(); | ||||
|  | ||||
|         void ReceiveEvent(Event& incident) override; | ||||
|         bool WindowShouldClose(); | ||||
|  | ||||
|         void Poll(); | ||||
|         void SwapBuffers(); | ||||
|  | ||||
|  | ||||
| }; | ||||
| @ -1,50 +0,0 @@ | ||||
| #pragma once | ||||
| #include <chrono> | ||||
| #include <imgui.h> | ||||
|  | ||||
|  struct EngineStatistics { | ||||
| 	uint32_t lastSampleTime; | ||||
| 	float frameTime; | ||||
| 	uint32_t verts; | ||||
| 	uint32_t DC; | ||||
|  | ||||
| 	uint64_t frames; | ||||
| 	uint64_t  FPS; | ||||
| }; | ||||
| extern EngineStatistics* ES; | ||||
|  | ||||
| inline void PerfomanceSamplerInit(){ | ||||
| 	ES = new EngineStatistics(); | ||||
| 	ES->frames = 0; | ||||
| 	ES->lastSampleTime = 0; | ||||
| 	ES->lastSampleTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); | ||||
|  | ||||
| } | ||||
|  | ||||
| inline void SamplePerformance(void) { | ||||
| 	ES->frames++;  | ||||
| 	ES->DC = 0;  | ||||
| 	ES->verts = 0;  | ||||
| 	unsigned int  now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();  | ||||
| 	unsigned int MilliSecondsPast = now - ES->lastSampleTime;  | ||||
| 	if (MilliSecondsPast >= 1000) { | ||||
| 			 | ||||
| 			ES->frameTime = (float)1000 / ES->frames;  | ||||
| 			ES->FPS = ES->frames;  | ||||
| 			ES->frames = 0;  | ||||
| 			ES->lastSampleTime = now;  | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| inline void ShowStats() { | ||||
| 	ImGui::Begin("Statistics", false, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); | ||||
|  | ||||
| 	ImGui::Text("FPS: %i", ES->FPS); | ||||
| 	ImGui::Text("Frame Time: %f", ES->frameTime); | ||||
| 	ImGui::Text("Verts: %i", ES->verts); | ||||
| 	ImGui::Text("Draw Calls: %i", ES->DC); | ||||
| 	ImGui::End(); | ||||
|  | ||||
| } | ||||
| @ -1,47 +0,0 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
| #include <vector> | ||||
|  | ||||
| #include "glm/glm.hpp" | ||||
|  | ||||
| /* | ||||
| *	Scene should be a description of a game world  | ||||
| */ | ||||
|  | ||||
| struct Transform { | ||||
| 	glm::vec3 Position; | ||||
| 	glm::vec3 Rotation; | ||||
| 	glm::vec3 Scale; | ||||
|  | ||||
| 	glm::mat4 ModelMatrix; | ||||
| }; | ||||
|  | ||||
|  | ||||
| class SceneNode { | ||||
| public:  | ||||
| 	std::string name; | ||||
| 	Transform transform; | ||||
| 	SceneNode* parent; | ||||
| 	std::vector<SceneNode*> children; | ||||
|  | ||||
|  | ||||
| 	void addChild(SceneNode& node); | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| class Scene { | ||||
|  | ||||
| public: | ||||
| 	SceneNode& GetSceneNode(std::string); | ||||
| 	SceneNode& GetRoot(); | ||||
|  | ||||
| 	Scene(std::string SceneName = "Default Scene"); | ||||
| 	~Scene(); | ||||
|  | ||||
|  | ||||
| private: | ||||
| 	SceneNode* root; | ||||
| 		 | ||||
| }; | ||||
|  | ||||
| @ -1,28 +0,0 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
|  | ||||
| extern "C" | ||||
| { | ||||
| 	#include "lauxlib.h" | ||||
| 	#include "lua.h" | ||||
| 	#include "lualib.h" | ||||
| } | ||||
|  | ||||
|  | ||||
| #include "LuaScriptingManager.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
| class LuaScript { | ||||
| public: | ||||
|  | ||||
| 	LuaScript(const std::string&); | ||||
| 	void execute(lua_State& l); | ||||
|  | ||||
| private: | ||||
| 	std::string filePath; | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| */ | ||||
| @ -1,28 +0,0 @@ | ||||
| #pragma once | ||||
| #include <vector> | ||||
|  | ||||
| extern "C" | ||||
| { | ||||
| 	#include "lauxlib.h" | ||||
| 	#include "lua.h" | ||||
| 	#include "lualib.h" | ||||
| } | ||||
|  | ||||
|  | ||||
| #include "LuaScript.h" | ||||
|  | ||||
| /* | ||||
| class LuaScriptingManager  | ||||
| { | ||||
| public: | ||||
| 	std::vector<LuaScript*> scripts; | ||||
|  | ||||
| 	LuaScriptingManager(); | ||||
|  | ||||
| 	void ExecuteLuaString(const std::string&); | ||||
|  | ||||
| private: | ||||
| 	lua_State* L; | ||||
|  | ||||
| 	lua_State& getState(); | ||||
| };*/ | ||||
| @ -1,118 +0,0 @@ | ||||
| #include "BarinkEngine.h" | ||||
| #include "Input/InputManager.h" | ||||
| #include "GLFW/glfw3.h" | ||||
| #include "spdlog/spdlog.h" | ||||
| #include <iostream> | ||||
| void BarinkEngine::InputManager::PollEvents() | ||||
| { | ||||
| 	for (auto it = windows.begin(); it != windows.end(); ++it) { | ||||
| 		(*it)->Poll(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void BarinkEngine::InputManager::KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)  | ||||
| { | ||||
|  | ||||
| 	Event KeyEvent{}; | ||||
| 	KeyEvent.name = "KEY"; | ||||
| 	  | ||||
| 	InputSystem.EmitEvent(KeyEvent); | ||||
|  | ||||
|  | ||||
| 	if (key == GLFW_KEY_A && action == GLFW_PRESS) | ||||
| 	{ | ||||
| 		 | ||||
| 		std::cout << "'a' key was pressed" << std::endl; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| void BarinkEngine::InputManager::CursorPositionCallback(GLFWwindow* window, double x, double y)  | ||||
| { | ||||
| 	//std::cout << "Cursor Position  x: " << x << ", y: " << y << std::endl; | ||||
| 	Event CursorPosUpdate{}; | ||||
| 	CursorPosUpdate.name = "UPDATE::CURSOR:POSITION"; | ||||
|  | ||||
| 	InputSystem.EmitEvent(CursorPosUpdate); | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| void BarinkEngine::InputManager::CursorEnterCallback(GLFWwindow* window, int entered) | ||||
| { | ||||
| 	if (entered) { | ||||
| 		Event mouseEntered {}; | ||||
| 		mouseEntered.name = "Mouse Entered Window's confines!"; | ||||
| 		mouseEntered.argc = 0; | ||||
| 		 | ||||
| 		InputSystem.EmitEvent(mouseEntered); | ||||
|  | ||||
| 		 | ||||
|  | ||||
| 	} | ||||
| 	else { | ||||
| 		Event mouseLeft{}; | ||||
| 		mouseLeft.name = "Mouse Left Window's confines!"; | ||||
| 		mouseLeft.argc = 0; | ||||
|  | ||||
| 		InputSystem.EmitEvent(mouseLeft); | ||||
|  | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| void BarinkEngine::InputManager::MouseButtonCallback(GLFWwindow* window, int button, int action, int mods) | ||||
| { | ||||
|  | ||||
| 	Event MouseButtonEvent{}; | ||||
| 	MouseButtonEvent.name = "MOUSEBUTTON"; | ||||
|  | ||||
| 	InputSystem.EmitEvent(MouseButtonEvent); | ||||
|  | ||||
|  | ||||
| 	if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) { | ||||
| 		std::cout << "Right mouse button was pressed!" << std::endl; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| void BarinkEngine::InputManager::ScrollCallback(GLFWwindow* window, double xoffset, double yoffset) | ||||
| { | ||||
| 	std::cout << "Scroll: x: " << xoffset << ", y: " << yoffset << std::endl; | ||||
| 	 | ||||
| 	Event ScrollEvent{}; | ||||
| 	ScrollEvent.name = "SCROLL"; | ||||
|  | ||||
| 	InputSystem.EmitEvent(ScrollEvent); | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| void BarinkEngine::InputManager::attach(BarinkWindow* window) | ||||
| { | ||||
| 	 | ||||
| 	windows.push_back(window); | ||||
|  | ||||
| 	// Attach callbacks | ||||
| 	glfwSetKeyCallback(window->windowptr(), KeyCallback); | ||||
| 	glfwSetCursorPosCallback(window->windowptr(), CursorPositionCallback); | ||||
| 	glfwSetCursorEnterCallback(window->windowptr(), CursorEnterCallback); | ||||
| 	glfwSetMouseButtonCallback(window->windowptr(), MouseButtonCallback); | ||||
| 	glfwSetScrollCallback(window->windowptr(), ScrollCallback); | ||||
|  | ||||
| 	this->Subscribe( (EventListener&)(*window)); | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| BarinkEngine::InputManager::InputManager() : EventEmitter () | ||||
| { | ||||
| 	windows = std::vector<BarinkWindow*>(); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -1,52 +0,0 @@ | ||||
| #include "Scene.h" | ||||
|  | ||||
|  | ||||
| SceneNode* SearchInChildren(SceneNode* root, std::string name ) { | ||||
| 	 | ||||
| 	if (root->name == name) | ||||
| 		return root; | ||||
|  | ||||
| 	SceneNode* found = nullptr; | ||||
| 	for (auto child : root->children) { | ||||
| 		found = SearchInChildren(child, name); | ||||
| 	} | ||||
| 	return found; | ||||
| } | ||||
|  | ||||
|  | ||||
| SceneNode& Scene::GetSceneNode(std::string name) | ||||
| { | ||||
| 	return *SearchInChildren(root, name); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| SceneNode& Scene::GetRoot() | ||||
| { | ||||
| 	return *root; | ||||
| } | ||||
|  | ||||
| Scene::Scene(std::string sceneName) | ||||
| { | ||||
| 	// Create a root node | ||||
| 	root = new SceneNode(); | ||||
| 	root->name = sceneName; | ||||
| 	root->transform = Transform(); | ||||
|  | ||||
| 	root->transform.Position	= glm::vec3(0); | ||||
| 	root->transform.Rotation	= glm::vec3(0); | ||||
| 	root->transform.Scale		= glm::vec3(0); | ||||
|  | ||||
| 	root->transform.ModelMatrix = glm::mat4(0); | ||||
|  | ||||
| } | ||||
|  | ||||
| Scene::~Scene() | ||||
| {	 | ||||
| 	// Destruct scene! | ||||
| } | ||||
|  | ||||
| void SceneNode::addChild(SceneNode& node) | ||||
| { | ||||
| 	children.push_back(&node); | ||||
| } | ||||
| @ -1,11 +0,0 @@ | ||||
| #include "Scripting/LuaScript.h" | ||||
| /* | ||||
| LuaScript::LuaScript(const std::string& path) | ||||
| : filePath(path) { | ||||
| } | ||||
|  | ||||
| void LuaScript::execute(lua_State& l) | ||||
| { | ||||
| 	luaL_dofile(&l, filePath.c_str()); | ||||
| } | ||||
| */ | ||||
| @ -1,18 +0,0 @@ | ||||
| #include "Scripting/LuaScriptingManager.h" | ||||
| /* | ||||
| LuaScriptingManager::LuaScriptingManager() | ||||
| { | ||||
| 	L = luaL_newstate(); | ||||
| 	luaL_openlibs(L); | ||||
| } | ||||
|  | ||||
|  | ||||
| void LuaScriptingManager::ExecuteLuaString(const std::string& code) { | ||||
| 	luaL_dostring(L, code.c_str()); | ||||
| } | ||||
|  | ||||
| lua_State& LuaScriptingManager::getState() | ||||
| { | ||||
| 	return (*L); | ||||
| } | ||||
| */ | ||||
| @ -1,47 +0,0 @@ | ||||
| #include "Graphics/Buffer.h" | ||||
|  | ||||
|  | ||||
| int Buffer::getBufferID() { | ||||
| 	return id; | ||||
| } | ||||
|  | ||||
| void Buffer::createBuffer() { | ||||
| 	glGenBuffers(1, (GLuint*) &id); | ||||
| } | ||||
|  | ||||
| void Buffer::setBufferData(void* data, size_t dataSize, bool elementBuffer = false ) { | ||||
| 	 | ||||
| 	if (elementBuffer) { | ||||
| 		glBufferData(GL_ELEMENT_ARRAY_BUFFER, dataSize, data, GL_STATIC_DRAW); | ||||
|  | ||||
| 	} | ||||
| 	else { | ||||
| 		glBufferData(GL_ARRAY_BUFFER, dataSize, data, GL_STATIC_DRAW); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| void Buffer::Bind(bool elementBuffer = false ) { | ||||
| 	if (elementBuffer) { | ||||
| 		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); | ||||
|  | ||||
| 	} | ||||
| 	else { | ||||
| 		glBindBuffer(GL_ARRAY_BUFFER, id); | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void Buffer::Unbind(bool elementBuffer = false) { | ||||
| 	if (elementBuffer) { | ||||
| 		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); | ||||
| 	} | ||||
| 	else { | ||||
| 		glBindBuffer(GL_ARRAY_BUFFER, 0); | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void Buffer::Delete() { | ||||
| 	glDeleteBuffers(1, (GLuint*) &id); | ||||
| } | ||||
| @ -1,22 +0,0 @@ | ||||
| #include "Graphics/Camera.h" | ||||
|  | ||||
| Camera::Camera(glm::vec3 position, glm::vec3 rotation, float zoom) | ||||
| : Position(position), Rotation(rotation), Zoom(zoom) { | ||||
| 	 | ||||
| 	Front = glm::vec3(-1.0f, 0.0f, 0.0f); | ||||
| 	Right = glm::vec3(0.0f, 0.0f, 1.0f); | ||||
| 	Up = glm::vec3(0.0f, 1.0f, 0.0f); | ||||
|  | ||||
| } | ||||
|  | ||||
| Camera::~Camera() { | ||||
|  | ||||
| } | ||||
|  | ||||
| glm::mat4 Camera::GetViewMatrix() { | ||||
| 	return glm::lookAt( | ||||
| 		Position, | ||||
| 		Position + Front, | ||||
| 		Up | ||||
| 	); | ||||
| } | ||||
| @ -1,38 +0,0 @@ | ||||
| #include "Graphics/GUI/GUIManager.h" | ||||
| #include "imgui.h" | ||||
| #include "backends/imgui_impl_opengl3.h" | ||||
| #include <backends/imgui_impl_glfw.cpp> | ||||
|  | ||||
| GUIManager::GUIManager(BarinkWindow* window)  | ||||
| 	: currentwindow(window) | ||||
| { | ||||
|     IMGUI_CHECKVERSION(); | ||||
|     ImGui::CreateContext(); | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     (void)io; | ||||
|  | ||||
|     ImGui::StyleColorsDark(); | ||||
|     ImGui_ImplGlfw_InitForOpenGL(currentwindow->windowptr(), true); | ||||
|     ImGui_ImplOpenGL3_Init("#version 440"); | ||||
|  | ||||
|  | ||||
|     ImGui_ImplGlfw_NewFrame(); | ||||
|     ImGui_ImplOpenGL3_NewFrame(); | ||||
|  | ||||
| } | ||||
|  | ||||
| GUIManager::~GUIManager() | ||||
| { | ||||
|     ImGui_ImplOpenGL3_Shutdown(); | ||||
|     ImGui_ImplGlfw_Shutdown(); | ||||
|     ImGui::DestroyContext(); | ||||
| } | ||||
|  | ||||
|  | ||||
| void GUIManager::Render() | ||||
| { | ||||
|     | ||||
|  | ||||
|     ImGui::Render(); | ||||
|     ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); | ||||
| } | ||||
| @ -1,10 +0,0 @@ | ||||
| #include "../Include/Graphics/Material.h" | ||||
|  | ||||
| Material::Material(const Shader& shader) : | ||||
| shader(shader) { | ||||
| } | ||||
|  | ||||
|  | ||||
| void Material::Apply() { | ||||
| 	shader.setUniformVec3("Color", Color); | ||||
| } | ||||
| @ -1,133 +0,0 @@ | ||||
| #include "AssetManager/ModelImporter.h" | ||||
|  | ||||
|  | ||||
| void ModelImporter::ImportFBX(std::string path) | ||||
| { | ||||
|     //spdlog::warn("ImportFBX not implemented!"); | ||||
| } | ||||
|  | ||||
| void ModelImporter::ImportBlend(std::string path) | ||||
| { | ||||
|     //spdlog::warn("ImportBlend not implemented!"); | ||||
| } | ||||
|  | ||||
| void ModelImporter::ImportGLTF(std::string path) | ||||
| { | ||||
|     //spdlog::warn("ImportGLTF not implemented!"); | ||||
| } | ||||
|  | ||||
| void ModelImporter::ImportOBJ(std::string path) | ||||
| { | ||||
|     //spdlog::warn("ImportOBJ not implemented!"); | ||||
| } | ||||
|  | ||||
| void ModelImporter::Import(std::string path) | ||||
| { | ||||
|     //spdlog::warn("Import not implemented!"); | ||||
| } | ||||
|  | ||||
| std::vector<BarinkEngine::Mesh> ModelImporter::Test() { | ||||
|     | ||||
|     /* | ||||
|     spdlog::info("====== Tiny GLTF ======"); | ||||
|     tinygltf::Model loadedModel; | ||||
|     tinygltf::TinyGLTF loader; | ||||
|     std::string error; | ||||
|     std::string warn; | ||||
|     bool ret = loader.LoadASCIIFromFile(&loadedModel, &error, &warn, "./Build/SandboxApplication/Debug/sponza.gltf"); | ||||
|  | ||||
|     if (!warn.empty()) | ||||
|         spdlog::warn("TinyGLTF Warning: {}", warn); | ||||
|     if (!error.empty()) | ||||
|         spdlog::error("TinyGLTF Error: {}", error); | ||||
|     if (!ret) { | ||||
|         spdlog::error("TinyGLTF Error: Failed to parse glTF"); | ||||
|         exit(-1); | ||||
|     } | ||||
|  | ||||
|     spdlog::info("Meshes in model: {}", loadedModel.meshes.size()); | ||||
|     spdlog::info("Primitives in mesh: {}", loadedModel.meshes[0].primitives.size()); | ||||
|  | ||||
|     */ | ||||
|      | ||||
|     | ||||
|     //spdlog::info("======= Assimp ======"); | ||||
|  | ||||
|     Assimp::Importer importer; | ||||
|     const aiScene* scene = importer.ReadFile("build/SandboxApplication/Debug/Models/Cube.obj", aiProcess_Triangulate | aiProcess_FlipUVs); | ||||
|      | ||||
|     aiNode* currentNode = scene->mRootNode; | ||||
|  | ||||
|    return processNode(currentNode, scene); | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| std::vector<BarinkEngine::Mesh> ModelImporter::processNode(aiNode* node, const aiScene* scene) { | ||||
|     std::vector<BarinkEngine::Mesh> meshes; | ||||
|     for (unsigned int i = 0; i < node->mNumMeshes; i++) { | ||||
|         aiMesh* mesh = scene->mMeshes[node->mMeshes[i]]; | ||||
|         meshes.push_back(processMesh(mesh, scene)); | ||||
|     } | ||||
|  | ||||
|     for (unsigned int i = 0; i < node->mNumChildren; i++) { | ||||
|        auto m2 =  processNode(node->mChildren[i], scene); | ||||
|  | ||||
|        for(auto m : m2) { | ||||
|            meshes.push_back(m); | ||||
|        } | ||||
|     } | ||||
|  | ||||
|     return meshes; | ||||
| } | ||||
|  | ||||
| BarinkEngine::Mesh ModelImporter::processMesh(aiMesh* mesh, const aiScene* scene) { | ||||
|     std::vector<unsigned int> indices; | ||||
|     std::vector<BarinkEngine::Vertex> vertices; | ||||
|  | ||||
|     // Process vertices | ||||
|     for (unsigned int i = 0; i < mesh->mNumVertices; i++) { | ||||
|         BarinkEngine::Vertex v{}; | ||||
|         glm::vec3 vector; | ||||
|         vector.x = mesh->mVertices[i].x; | ||||
|         vector.y = mesh->mVertices[i].y; | ||||
|         vector.z = mesh->mVertices[i].z; | ||||
|          | ||||
|         v.vertices = vector; | ||||
|          | ||||
|         if (mesh->mTextureCoords[0]) { | ||||
|  | ||||
|             glm::vec2 texCoord; | ||||
|  | ||||
|             texCoord.x = mesh->mTextureCoords[0][i].x; | ||||
|             texCoord.y = mesh->mTextureCoords[0][i].y; | ||||
|  | ||||
|             v.uv = texCoord; | ||||
|  | ||||
|         } | ||||
|      | ||||
|         vertices.push_back(v); | ||||
|     } | ||||
|  | ||||
|     // Process Indices | ||||
|     for (unsigned int i = 0; i < mesh->mNumFaces; i++) { | ||||
|         aiFace face = mesh->mFaces[i]; | ||||
|         if (face.mNumIndices < 3) | ||||
|             continue; | ||||
|         for (unsigned int j = 0; j < face.mNumIndices; j++) { | ||||
|             indices.push_back(face.mIndices[j]); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|      | ||||
|  | ||||
|     BarinkEngine::Mesh result; | ||||
|      | ||||
|  | ||||
|     result.vertices = vertices; | ||||
|     result.elements = indices; | ||||
|  | ||||
|  | ||||
|     return result; | ||||
|  | ||||
| } | ||||
| @ -1,46 +0,0 @@ | ||||
| #include "Graphics/RenderSurface.h"; | ||||
|  | ||||
| RenderSurface::RenderSurface(){ | ||||
| 	shader = new Shader("build/SandboxAppliction/Debug/renderSuface.vs", "build/SandboxApplication/Debug/renderSurface.fs"); | ||||
|  | ||||
|  | ||||
|  | ||||
| 	verts = std::vector<glm::vec3>{ | ||||
| 		{-0.5f, 0.5f, 0.0f}, // 0 | ||||
| 		{-0.5f, -0.5f, 0.0f}, // 1 | ||||
| 		{0.5f, -0.5f, 0.0f}, // 2 | ||||
| 		{0.5f, 0.5f, 0.0f}, // 3  | ||||
| 	}; | ||||
|  | ||||
| 	indices = std::vector<unsigned int>{ | ||||
| 		0,2,1, | ||||
| 		0,3,2 | ||||
| 	}; | ||||
|  | ||||
| 	VAO.Create(); | ||||
| 	VAO.Bind(); | ||||
|  | ||||
| 	vertexBuffer.createBuffer(); | ||||
| 	vertexBuffer.Bind(false); | ||||
| 	vertexBuffer.setBufferData(&verts[0], verts.size() * sizeof(glm::vec3), false); | ||||
|  | ||||
| 	elementBuffer.createBuffer(); | ||||
| 	elementBuffer.Bind(true); | ||||
| 	elementBuffer.setBufferData(&indices[0], indices.size() * sizeof(unsigned int), true); | ||||
|  | ||||
| 	VAO.AttachAttribute(0, 3, 0); | ||||
|  | ||||
| 	vertexBuffer.Unbind(false); | ||||
| 	VAO.Unbind(); | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| RenderSurface::~RenderSurface() { | ||||
| 	delete shader; | ||||
| } | ||||
|  | ||||
| void RenderSurface::Draw() { | ||||
| 	 | ||||
| } | ||||
| @ -1,62 +0,0 @@ | ||||
| #include "Graphics/Renderable.h" | ||||
| #include "AssetManager/ModelImporter.h" | ||||
| #include "PerfCounter.h" | ||||
|  | ||||
|  | ||||
| Renderable* Renderable::Load() | ||||
| { | ||||
|     return new Renderable(); | ||||
| } | ||||
|  | ||||
| Renderable::Renderable() | ||||
| { | ||||
|     meshes = ModelImporter::Test(); | ||||
|  | ||||
|     transform.Scale = glm::vec3(1.0f); | ||||
|     transform.Rotation = glm::vec3(0.0f, 0.0f, 0.0f); | ||||
|     transform.Position = glm::vec3(0.0f, 0.0f, 0.0f); | ||||
|  | ||||
|     VAO.Create(); | ||||
|     VAO.Bind(); | ||||
|  | ||||
|  | ||||
|     vertexBuffer.createBuffer(); | ||||
|     vertexBuffer.Bind(false); | ||||
|     vertexBuffer.setBufferData(&meshes[0].vertices[0], meshes[0].vertices.size() * sizeof(BarinkEngine::Vertex), false);    | ||||
|  | ||||
|     elementBuffer.createBuffer(); | ||||
|     elementBuffer.Bind(true); | ||||
|     elementBuffer.setBufferData(&meshes[0].elements[0], meshes[0].elements.size() * sizeof(unsigned int), true); | ||||
|  | ||||
|     VAO.AttachAttribute(0, 3, sizeof(BarinkEngine::Vertex)); | ||||
|  | ||||
|    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(BarinkEngine::Vertex),(void* )offsetof(BarinkEngine::Vertex, vertices)); | ||||
|    glEnableVertexAttribArray(1); | ||||
|      | ||||
|    vertexBuffer.Unbind(false); | ||||
|    | ||||
|    VAO.Unbind(); | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| Renderable::~Renderable() | ||||
| { | ||||
|     glDeleteBuffers(1, &UV_id); | ||||
| } | ||||
|  | ||||
| void Renderable::Draw() | ||||
| { | ||||
|     VAO.Bind(); | ||||
|     elementBuffer.Bind(true); | ||||
|  | ||||
|     glActiveTexture(GL_TEXTURE0); | ||||
|     glUniform1i(glGetUniformLocation(shader->id, "Texture"), GL_TEXTURE0); | ||||
|     texture->Bind(); | ||||
|  | ||||
|     ES->verts = meshes[0].vertices.size(); | ||||
|     ES->DC++; | ||||
|     glDrawElements(GL_TRIANGLES, static_cast<unsigned int>(meshes[0].elements.size()), GL_UNSIGNED_INT, NULL); | ||||
|     VAO.Unbind(); | ||||
|  | ||||
| } | ||||
| @ -1,25 +0,0 @@ | ||||
| #include "Graphics/Renderer.h" | ||||
|  | ||||
| BarinkEngine::Renderer::Renderer() | ||||
| { | ||||
| 	models = std::vector<Renderable*>(); | ||||
| } | ||||
|  | ||||
| BarinkEngine::Renderer::~Renderer() | ||||
| { | ||||
| 	// CleanUp! | ||||
| } | ||||
|  | ||||
| void BarinkEngine::Renderer::Render() | ||||
| { | ||||
|  | ||||
| 	for (auto model : models) { | ||||
| 		model->Draw(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| void BarinkEngine::Renderer::Submit(Renderable* model) | ||||
| { | ||||
| 	models.push_back(model); | ||||
| } | ||||
| @ -1,124 +0,0 @@ | ||||
| #include "Graphics/Shader.h" | ||||
| #include "spdlog/spdlog.h" | ||||
| Shader::Shader(const std::string vertexShaderPath, const std::string fragmentShaderPath) | ||||
| { | ||||
|     char infoLog[512]; | ||||
|     int succes; | ||||
|      | ||||
|     char* vertexCode = readFile(vertexShaderPath.c_str()); | ||||
|     //spdlog::info(vertexCode); | ||||
|     unsigned int vertId = glCreateShader(GL_VERTEX_SHADER); | ||||
|      | ||||
|     glShaderSource(vertId, 1, &vertexCode, NULL); | ||||
|     glCompileShader(vertId); | ||||
|  | ||||
|     glGetShaderiv(vertId, GL_COMPILE_STATUS, &succes); | ||||
|     if(!succes){ | ||||
|         glGetShaderInfoLog(vertId, 512, NULL, infoLog); | ||||
|         spdlog::error( "Vertex shader has compile error {}", infoLog); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     char* fragmentCode = readFile(fragmentShaderPath.c_str()); | ||||
|     //spdlog::info(fragmentCode);  | ||||
|     unsigned int fragId = glCreateShader(GL_FRAGMENT_SHADER); | ||||
|  | ||||
|  | ||||
|      | ||||
|     glShaderSource(fragId, 1, &fragmentCode, NULL); | ||||
|     glCompileShader(fragId); | ||||
|  | ||||
|      | ||||
|     glGetShaderiv(fragId, GL_COMPILE_STATUS, &succes); | ||||
|     if(!succes){ | ||||
|         glGetShaderInfoLog(fragId, 512, NULL, infoLog); | ||||
|         spdlog::error("Fragment shader has compile error {}", infoLog); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     id = glCreateProgram(); | ||||
|  | ||||
|     glAttachShader(id, vertId); | ||||
|     glAttachShader(id, fragId); | ||||
|     glLinkProgram(id); | ||||
|  | ||||
|  | ||||
|     int success; | ||||
|     glGetProgramiv(id, GL_LINK_STATUS, &success); | ||||
|     if(!success) { | ||||
|         glGetProgramInfoLog(id, 512, NULL, infoLog); | ||||
|         printf("ERROR::SHADER_PROGRAM::LINKING_FAILED\n %s", infoLog); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     delete vertexCode; | ||||
|     delete fragmentCode; | ||||
|  | ||||
|  | ||||
| } | ||||
| char* Shader::readFile (const char* filePath){ | ||||
|  | ||||
|     std::ifstream file ; | ||||
|     file.open(filePath); | ||||
|  | ||||
|     if(file.is_open() == false){ | ||||
|          spdlog::info("File not found."); | ||||
|          return nullptr; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     // Determine the file size! | ||||
|     file.seekg(0, std::ios::end); | ||||
|     size_t filesize = file.tellg(); | ||||
|  | ||||
|     // Undo previous seek. | ||||
|     file.seekg(0, std::ios::beg); | ||||
|     //spdlog::info("filesize: {}", filesize); | ||||
|  | ||||
|  | ||||
|     // Create a big enough buffer for the file | ||||
|  | ||||
|     size_t bufferSize = filesize + 3; | ||||
|     char* FileBuffer = new char[bufferSize]; | ||||
|   | ||||
|     memset(FileBuffer, '\0', bufferSize); | ||||
|     | ||||
|     // read the whole file | ||||
|     file.read(FileBuffer, filesize); | ||||
|      | ||||
|     return FileBuffer; | ||||
| } | ||||
|  | ||||
| void Shader::Use() | ||||
| { | ||||
|     glUseProgram(id); | ||||
| } | ||||
|  | ||||
|  | ||||
| void Shader::setUniformMat4(std::string uniformName, glm::mat4 matrix4) const | ||||
| {     | ||||
|     glUniformMatrix4fv(glGetUniformLocation(id, uniformName.c_str()), 1, GL_FALSE, glm::value_ptr(matrix4)); | ||||
| } | ||||
| void Shader::setUniformVec4(std::string uniformName, glm::vec4 vector4) const | ||||
| { | ||||
|     glUniform4fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector4)); | ||||
| } | ||||
| void Shader::setUniformVec3(std::string uniformName, glm::vec3 vector3) const | ||||
| { | ||||
|     glUniform3fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector3)); | ||||
| } | ||||
| void Shader::setUniformVec2(std::string uniformName, glm::vec2 vector2) const | ||||
| { | ||||
|     glUniform2fv(glGetUniformLocation(id, uniformName.c_str()),1, glm::value_ptr(vector2)); | ||||
| } | ||||
|  | ||||
| void Shader::setUniformFloat(std::string uniformName, float value) const | ||||
| { | ||||
|     glUniform1f(glGetUniformLocation(id, uniformName.c_str()), value); | ||||
| } | ||||
|  | ||||
| void Shader::setUniformInt(std::string uniformName, int value) const | ||||
| { | ||||
|     glUniform1i(glGetUniformLocation(id, uniformName.c_str()), value); | ||||
| } | ||||
| @ -1,40 +0,0 @@ | ||||
| #include "../Include/Graphics/Texture.h" | ||||
| #include <glad/glad.h> | ||||
| #include <GLFW/glfw3.h> | ||||
| #define STB_IMAGE_IMPLEMENTATION | ||||
| #include "Graphics/stb_image.h" | ||||
| #include <iostream> | ||||
|  | ||||
| Texture::Texture(const std::string texturePath) { | ||||
|  | ||||
| 	int width, height, channels; | ||||
| 	unsigned char* data = stbi_load(texturePath.c_str(), &width, &height, &channels, 0); | ||||
| 	std::cout << channels << std::endl; | ||||
|  | ||||
| 	if (data) { | ||||
| 		glGenTextures(1, &Id); | ||||
|  | ||||
| 		glBindTexture(GL_TEXTURE_2D, Id); | ||||
| 		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); | ||||
| 		glGenerateMipmap(GL_TEXTURE_2D); | ||||
|  | ||||
| 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); | ||||
| 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); | ||||
| 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); | ||||
| 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
|  | ||||
| 	} | ||||
| 	else { | ||||
| 		spdlog::error("Failed to load image (%s)", texturePath ); | ||||
| 	} | ||||
| 	stbi_image_free(data); | ||||
|  | ||||
| } | ||||
|  | ||||
| void Texture::Bind() { | ||||
| 	glBindTexture(GL_TEXTURE_2D, Id); | ||||
| } | ||||
|  | ||||
| void Texture::Unbind() { | ||||
| 	glBindTexture(GL_TEXTURE_2D, 0); | ||||
| } | ||||
| @ -1,25 +0,0 @@ | ||||
| #include "Graphics/VertexArray.h" | ||||
| #include <glad/glad.h> | ||||
|  | ||||
| void VertexArray::Create(){ | ||||
|     glGenVertexArrays(1, &id); | ||||
| } | ||||
|  | ||||
| void VertexArray::Bind(){ | ||||
|     glBindVertexArray(id); | ||||
| } | ||||
|  | ||||
| void VertexArray::Unbind(){ | ||||
|     glBindVertexArray(0); | ||||
| } | ||||
|  | ||||
| void VertexArray::Delete() { | ||||
|     glDeleteVertexArrays(1, &id); | ||||
| } | ||||
|  | ||||
|  | ||||
| void VertexArray::AttachAttribute(unsigned int index , int size, int stride  ){ | ||||
|     glVertexAttribPointer(index, size, GL_FLOAT, GL_FALSE, stride, 0); | ||||
|     glEnableVertexAttribArray(0); | ||||
| } | ||||
|  | ||||
| @ -1,84 +0,0 @@ | ||||
| #include "Graphics/Window.h" | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <iostream> | ||||
| #include <GLFW/glfw3.h> | ||||
| #include <spdlog/spdlog.h> | ||||
| #include "../Include/EventSystem/Event.h" | ||||
|  | ||||
| bool BarinkWindow::InitGLFW(){ | ||||
| 	if(!glfwInit()) | ||||
| 	{ | ||||
| 		spdlog::error("Failed to initialise GLFW!"); | ||||
| 		return false; | ||||
| 	} | ||||
| 	 | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| BarinkWindow::BarinkWindow(const int width, const int height) : | ||||
| Width(width), Height(height), FullScreen(false){ | ||||
| 	if (InitGLFW()==false) { | ||||
| 		exit(-1); | ||||
| 	} | ||||
|  | ||||
| 	window = glfwCreateWindow(Width, Height, "BarinkEngine", NULL, NULL); | ||||
|  | ||||
| 	if( !window) | ||||
| 	{ | ||||
| 		spdlog::error("GLFW failed to create window!"); | ||||
| 		glfwTerminate(); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	glfwMakeContextCurrent(window); | ||||
| 	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { | ||||
| 		printf("Failed to initialize GLAD!\n"); | ||||
| 		exit(-1); | ||||
| 	} | ||||
|  | ||||
| 	// Set vsync off !!  | ||||
| 	glfwSwapInterval(0); | ||||
|  | ||||
| 	VulkanSupported = glfwVulkanSupported(); | ||||
|  | ||||
| 	glfwGetFramebufferSize(window, &Width, &Height); | ||||
| 	glViewport(0,0, Width, Height); | ||||
|  | ||||
|  | ||||
|  | ||||
| 	glClearColor(0.2f, 0.2f, 0.2f, 1.0f); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| BarinkWindow::~BarinkWindow(){ | ||||
|  | ||||
| 	glfwTerminate(); | ||||
| } | ||||
|  | ||||
| GLFWwindow* BarinkWindow::windowptr() | ||||
| { | ||||
| 	return window; | ||||
| } | ||||
|  | ||||
| bool BarinkWindow::WindowShouldClose(){ | ||||
| 	return glfwWindowShouldClose(window); | ||||
| } | ||||
|  | ||||
| void BarinkWindow::Poll() | ||||
| {	 | ||||
| 	glfwPollEvents(); | ||||
| } | ||||
|  | ||||
| void BarinkWindow::SwapBuffers()  | ||||
| { | ||||
| 	glfwSwapBuffers(window); | ||||
| } | ||||
|  | ||||
|  | ||||
| void BarinkWindow::ReceiveEvent(Event& incident) | ||||
| { | ||||
| 	std::cout << "EVENT RECEIVED: " <<  incident.name << std::endl; | ||||
|  | ||||
| } | ||||
| @ -1,83 +0,0 @@ | ||||
| project "BarinkEngine" | ||||
|   kind "StaticLib" | ||||
|  | ||||
|   buildmessage "Building BarinkEngine" | ||||
|  | ||||
|   includedirs { | ||||
|     "Include/", | ||||
|  | ||||
|     "../libs/lua/include", | ||||
|     "../libs/spdlog/include", | ||||
|     "../libs/glm", | ||||
|     "../libs/GorillaAudio/include", | ||||
|  | ||||
|     "../libs/physx/physx/include", | ||||
|     "../libs/steam-audio/include", | ||||
|      | ||||
|     "../libs/assimp/include", | ||||
|      | ||||
|  | ||||
|     "../libs/glad/include", | ||||
|  | ||||
|     "../libs/glfw/include", | ||||
|     "../libs/glew/include", | ||||
|     "../libs/glm", | ||||
|      | ||||
|     "../libs/ImGui", | ||||
|   } | ||||
|  | ||||
|   links { | ||||
|     -- This needs to fall under the filter as the names can differ on different platforms  | ||||
|     "phonon", | ||||
|     "lua54", | ||||
|     "spdlog", | ||||
|     "assimp-vc143-mtd", | ||||
|     "glfw3", | ||||
|  | ||||
|     "ImGUI_Opengl3", | ||||
|  | ||||
|      | ||||
|  | ||||
|   } | ||||
|  | ||||
|  | ||||
|   libdirs { | ||||
|     "../libs/steam-audio/lib/windows-x64", | ||||
|     "../libs/lua", | ||||
|     "../libs/spdlog/build/Release", | ||||
|     "../libs/assimp/lib/Debug", | ||||
|     "../libs/glfw/build/src/Debug", | ||||
|   } | ||||
|  | ||||
|   files { | ||||
|     "../libs/glad/src/glad.c", | ||||
|  | ||||
|     "./*.cpp", | ||||
|     "./*.h", | ||||
|     "./**/*.cpp", | ||||
|     "./**/*.h" | ||||
|   } | ||||
|  | ||||
|  | ||||
|  | ||||
|   filter { "system:windows"} | ||||
|     prebuildcommands { | ||||
|       -- Copy shaders  | ||||
|       "copy graphics\\shaders\\fragment.shader            ..\\build\\SandboxApplication\\Debug\\test.fs",  | ||||
|       "copy graphics\\shaders\\vertex.shader              ..\\build\\SandboxApplication\\Debug\\test.vs", | ||||
|       "copy graphics\\shaders\\RenderSurfaceFrag.shader   ..\\build\\SandboxApplication\\Debug\\RenderSurface.fs", | ||||
|       "copy graphics\\shaders\\RenderSurfaceVert.shader   ..\\build\\SandboxApplication\\Debug\\RenderSurface.vs"  | ||||
|     } | ||||
|      | ||||
|     | ||||
|  | ||||
|   filter { "system:linux" } | ||||
|     prebuildcommands { | ||||
|       -- Copy shaders | ||||
|       "cp graphics/shaders/fragment.shader ../build/SandboxApplication/Debug/test.fs",  | ||||
|       "cp graphics/shaders/vertex.shader ../build/SandboxApplication/Debug/test.vs", | ||||
|       "cp graphics/shaders/RenderSurfaceFrag.shader ../build/SandboxApplication/Debug/RenderSurface.fs", | ||||
|       "cp graphics/shaders/RenderSurfaceVert.shader ../build/SandboxApplication/Debug/RenderSurface.vs"  | ||||
|     } | ||||
|  | ||||
| include('../ImGui') | ||||
							
								
								
									
										23
									
								
								DEVELOPMENT.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								DEVELOPMENT.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| ## Requirements | ||||
| *_NOTE:_ Right now the build proces of some third party libraries have not been converted and may need special tooling* | ||||
|  | ||||
| #### Software | ||||
| * Premake | ||||
| * Git | ||||
| * C++ Compiler | ||||
|  | ||||
| ## Windows development workflow  | ||||
| User premake to generate project files for the approperiate build method. | ||||
| On Windows I assume you'll build with visual studio | ||||
|  | ||||
| ```bash | ||||
| User:~$ premake vs2022 | ||||
| ``` | ||||
|  | ||||
| ## Linux development workflow | ||||
| Use premake to generate project files for the approperiate build method. | ||||
| On Linux I assume you'll build with something like make. | ||||
|  | ||||
| ```bash | ||||
| User@Machine:~$ premake gmake2 | ||||
| ``` | ||||
							
								
								
									
										
											BIN
										
									
								
								Editor/Assets/Cube.mesh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Editor/Assets/Cube.mesh
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										46
									
								
								Editor/premake5.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Editor/premake5.lua
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| project "Editor" | ||||
| kind "ConsoleApp" | ||||
|  | ||||
| buildmessage "Building editor ..." | ||||
|  | ||||
| links{ | ||||
|   "YoggieEngine", | ||||
|   "ImGuizmo", | ||||
|   "yaml-cpp", | ||||
|   "nfd.lib" | ||||
| } | ||||
|  | ||||
| includedirs{ | ||||
|  | ||||
|   "../YoggieEngine/build/Debug", | ||||
|  | ||||
|   -- I'd prefer if didn't need these.. | ||||
|   -- We'll figure that out some time later | ||||
|   "../libs/physx/physx/include", | ||||
|   "../libs/physx/pxshared/include", | ||||
|   incfolder["lua"], | ||||
|   incfolder["spdlog"], | ||||
|   incfolder["glm"], | ||||
|   incfolder["assimp"], | ||||
|   incfolder["glad"], | ||||
|   incfolder["glfw"], | ||||
|  | ||||
|   incfolder["imgui"], | ||||
|   incfolder["imguizmo"], | ||||
|   incfolder["entt"], | ||||
|   incfolder["yamlcpp"], | ||||
|   incfolder["nativefiledialog"], | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| libdirs { | ||||
|   staticlib["yoggie"], | ||||
|   staticlib["nativefiledialog"] | ||||
| } | ||||
|  | ||||
| files {  | ||||
|   "../libs/glad/src/glad.c", | ||||
|   "./src/**.h", | ||||
|   "./src/**.cpp" | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								Editor/rsc/AssetIcon.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Editor/rsc/AssetIcon.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Editor/rsc/AssetIcon.xcf
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Editor/rsc/AssetIcon.xcf
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Editor/rsc/FodlerIcon.xcf
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Editor/rsc/FodlerIcon.xcf
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Editor/rsc/FolderIcon.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Editor/rsc/FolderIcon.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										46
									
								
								Editor/src/AssetManagement/Asset.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Editor/src/AssetManagement/Asset.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| #pragma once | ||||
| #include <filesystem> | ||||
| #include <string> | ||||
| #include "../../YoggieEngine/src/YoggieEngine.h" | ||||
|  | ||||
| enum class ASSET_TYPE { | ||||
| 	Unknown = -1, | ||||
| 	Mesh, | ||||
| 	Texture, | ||||
| 	Material | ||||
| }; | ||||
|  | ||||
| class Asset { | ||||
| public: | ||||
| 	Asset(const char* name):  name(name) {} | ||||
| 	virtual ASSET_TYPE GetType() { return ASSET_TYPE::Unknown; } | ||||
| 	const char* GetName() const { return name.c_str(); } | ||||
| 	bool isFolder = false ; | ||||
| protected: | ||||
| 	std::string name; | ||||
|  | ||||
| }; | ||||
|  | ||||
| class MeshAsset : Asset { | ||||
| public: | ||||
| 	MeshAsset(YoggieEngine::Mesh mesh) : Asset("New MeshAsset"), mesh(mesh) {} | ||||
| 	ASSET_TYPE  GetType() override { return ASSET_TYPE::Mesh; } | ||||
| private: | ||||
| 	YoggieEngine::Mesh& mesh; | ||||
| }; | ||||
|  | ||||
| class TextureAsset : Asset { | ||||
| public: | ||||
| 	TextureAsset (YoggieEngine::Texture texture): Asset("New TextureAsset"), texture(texture) {} | ||||
| 	ASSET_TYPE GetType() override { return ASSET_TYPE::Texture; } | ||||
| private: | ||||
| 	YoggieEngine::Texture& texture; | ||||
| }; | ||||
|  | ||||
| class MaterialAsset : Asset { | ||||
| public: | ||||
| 	MaterialAsset ()  : Asset("New MaterialAsset"){} | ||||
| 	ASSET_TYPE GetType() override { return ASSET_TYPE::Material; } | ||||
| private: | ||||
|  | ||||
| }; | ||||
							
								
								
									
										150
									
								
								Editor/src/AssetManagement/AssetManager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								Editor/src/AssetManagement/AssetManager.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,150 @@ | ||||
| #include "AssetManager.h" | ||||
| #include "../../YoggieEngine/src/AssetManager/ModelImporter.h" | ||||
| #include <iostream> | ||||
| #include <fstream> | ||||
| #include <spdlog/spdlog.h> | ||||
|  | ||||
| std::vector<Asset> AssetManager::assets; | ||||
| std::filesystem::path AssetManager::currentPath; | ||||
|  | ||||
|  | ||||
| void AssetManager::Init()  | ||||
| {  | ||||
| 	assets = std::vector<Asset>(); | ||||
| 	currentPath = std::filesystem::path(".");  | ||||
| } | ||||
|  | ||||
| void AssetManager::BuildAssetView() | ||||
| { | ||||
| 	if (currentPath.empty()) { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	for (auto& dir_entry : std::filesystem::directory_iterator(currentPath)) | ||||
| 	{ | ||||
| 		auto asset = Asset(dir_entry.path().filename().string().c_str()); | ||||
| 	 | ||||
| 		if (dir_entry.is_directory()) { | ||||
| 			asset.isFolder = true; | ||||
| 		} | ||||
| 		 | ||||
| 		assets.push_back(asset); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| void AssetManager::setAssetPath(std::filesystem::path path)  | ||||
| {  | ||||
| 	currentPath = path;  | ||||
| } | ||||
|  | ||||
|  | ||||
| YoggieEngine::Mesh* AssetManager::LoadFromAssetFile(const std::filesystem::path assetPath) | ||||
| { | ||||
| 	YoggieEngine::Mesh* imported = nullptr; | ||||
|  | ||||
| 	std::ifstream AssetFile; | ||||
| 	AssetFile.open(assetPath, std::ios::binary); | ||||
| 	if (AssetFile.is_open()) { | ||||
|  | ||||
| 		char* Header = (char*)malloc(8); | ||||
| 		unsigned long long  Vsize = 0; | ||||
| 		uint32_t Vnum = 0; | ||||
| 		uint32_t Enum = 0; | ||||
|  | ||||
| 		// Read header  | ||||
| 		AssetFile.read(Header, 8); | ||||
| 		AssetFile.read((char*)&Vsize, sizeof(unsigned long long)); | ||||
| 		AssetFile.read((char*)&Vnum, sizeof(uint32_t)); | ||||
| 		AssetFile.read((char*)&Enum, sizeof(uint32_t)); | ||||
|  | ||||
| 		// print Header info  | ||||
| 		std::cout << "File has header: " << Header << std::endl; | ||||
| 		std::cout << "Vertex size: " << Vsize << std::endl; | ||||
| 		std::cout << "Number of Vertices: " << Vnum << std::endl; | ||||
| 		std::cout << "Number of Elements: " << Enum << std::endl; | ||||
| 		free(Header); | ||||
|  | ||||
|  | ||||
| 		imported = new YoggieEngine::Mesh(); | ||||
| 		// Load Vertices (Vertex + UV ) | ||||
| 		imported->vertices = std::vector < YoggieEngine::Vertex>(); | ||||
| 		for (int i = 0; i < Vnum; i++) | ||||
| 		{ | ||||
| 			YoggieEngine::Vertex data = YoggieEngine::Vertex(); | ||||
| 			AssetFile.read((char*)&data, Vsize); | ||||
|  | ||||
| 			imported->vertices.push_back(data); | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 		// skip x bytes  | ||||
| 		AssetFile.ignore(sizeof(char) * 3); | ||||
|  | ||||
| 		// Load Elements | ||||
| 		imported->elements = std::vector<unsigned int>(); | ||||
| 		for (int i = 0; i < Enum; i++) { | ||||
| 			unsigned int data = 0; | ||||
| 			AssetFile.read((char*)&data, sizeof(unsigned int)); | ||||
| 			imported->elements.push_back(data); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
| 	else { | ||||
| 		std::cout << "Failed ot open mesh " << std::endl; | ||||
| 	} | ||||
|  | ||||
| 	return imported; | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| YoggieEngine::Renderable* AssetManager::LoadFromSource(const std::filesystem::path srcPath, const std::filesystem::path assetFolder) | ||||
| { | ||||
|  | ||||
| 	auto model = (YoggieEngine::ModelImporter()).Import(srcPath.string()); | ||||
| 	YoggieEngine::Mesh* exportMesh = model->renderable->mesh; | ||||
| 	std::filesystem::path MeshFileName = assetFolder / srcPath.filename().replace_extension(".mesh"); | ||||
| 	std::cout << "Save path: " << MeshFileName << std::endl; | ||||
|  | ||||
| 	std::ofstream meshAsset; | ||||
| 	meshAsset.open(MeshFileName, std::ios::binary); | ||||
| 	if (meshAsset.is_open()) { | ||||
|  | ||||
| 		// write a header | ||||
| 		static const char* HEADER = "MESH"; | ||||
| 		meshAsset.write(HEADER, sizeof(HEADER)); | ||||
| 		auto Vsize = sizeof(YoggieEngine::Vertex); | ||||
| 		std::cout << "size of vertex: " << Vsize << std::endl; | ||||
| 		std::cout << "Addr of vSize: " << &Vsize << std::endl; | ||||
| 		auto Vnum = exportMesh->vertices.size(); | ||||
| 		auto Enum = exportMesh->elements.size(); | ||||
|  | ||||
| 		meshAsset.write((char*)&Vsize, sizeof(unsigned long long)); | ||||
| 		meshAsset.write((char*)&Vnum, sizeof(uint32_t)); | ||||
| 		meshAsset.write((char*)&Enum, sizeof(uint32_t)); | ||||
| 		// write all vertices  | ||||
| 		for (auto& vertice : exportMesh->vertices) | ||||
| 		{ | ||||
| 			meshAsset.write((char*)&vertice, sizeof(vertice)); | ||||
| 		} | ||||
|  | ||||
| 		// write 3 x 0 byte | ||||
| 		meshAsset.write((const char*)"\0\0\0", sizeof(char) * 3); | ||||
|  | ||||
| 		// write all indices  | ||||
| 		for (auto index : exportMesh->elements) { | ||||
| 			meshAsset.write((char*)&index, sizeof(index)); | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		meshAsset.close(); | ||||
| 	} | ||||
| 	else { | ||||
|  | ||||
| 		spdlog::error("Failed to create/open mesh file."); | ||||
| 	} | ||||
|  | ||||
| 	return model->renderable; | ||||
|  | ||||
| } | ||||
							
								
								
									
										20
									
								
								Editor/src/AssetManagement/AssetManager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Editor/src/AssetManagement/AssetManager.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| #pragma once | ||||
| #include <vector> | ||||
| #include "Asset.h" | ||||
|  | ||||
| class AssetManager { | ||||
| public: | ||||
|  | ||||
| 	static void Init(); | ||||
| 	static void BuildAssetView(); | ||||
| 	static void setAssetPath(std::filesystem::path path); | ||||
|  | ||||
| 	static YoggieEngine::Mesh* LoadFromAssetFile(const std::filesystem::path assetPath); | ||||
| 	static YoggieEngine::Renderable* LoadFromSource(const std::filesystem::path srcPath, const std::filesystem::path assetFolder); | ||||
| 	 | ||||
| 	static std::vector<Asset> assets ; | ||||
|  | ||||
| private: | ||||
| 	static std::filesystem::path currentPath; | ||||
|  | ||||
| }; | ||||
							
								
								
									
										66
									
								
								Editor/src/Project/Project.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								Editor/src/Project/Project.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,66 @@ | ||||
| #include "Project.h" | ||||
| #include <string> | ||||
| #include <sstream> | ||||
| #include <fstream> | ||||
| #include <iostream> | ||||
| #include <yaml-cpp/yaml.h> | ||||
|  | ||||
|  | ||||
| void Project::SaveProject(std::filesystem::path path, Project& project) | ||||
| { | ||||
| 	YAML::Emitter projectYAML; | ||||
| 	projectYAML << YAML::BeginMap; | ||||
| 	projectYAML << YAML::Key << "Project" << YAML::Value << project.Name;	 | ||||
| 	projectYAML << YAML::Key << "Directory" << YAML::Value << path.parent_path().u8string(); | ||||
| 	projectYAML << YAML::EndMap; | ||||
| 	std::ofstream projectFile; | ||||
|  | ||||
| 	projectFile.open(path.u8string()); | ||||
| 	projectFile << projectYAML.c_str(); | ||||
| 	projectFile.close(); | ||||
| } | ||||
|  | ||||
| void Project::LoadProject(std::filesystem::path path, std::unique_ptr<Project>& project)  | ||||
| { | ||||
| 	std::string YAMLProject; | ||||
| 	std::stringstream sstream; | ||||
| 	std::ifstream projectFile; | ||||
| 	projectFile.open(path.u8string()); | ||||
|  | ||||
| 	sstream << projectFile.rdbuf(); | ||||
| 	YAMLProject = sstream.str(); | ||||
|  | ||||
| 	projectFile.close(); | ||||
|  | ||||
|  | ||||
| 	YAML::Node node = YAML::Load(YAMLProject); | ||||
| 	 | ||||
| 	// this is probably not perfect but it seems to work for now | ||||
| 	project.release(); | ||||
| 	project = std::make_unique<Project>(node.as<Project>()); | ||||
|  | ||||
| 	std::cout << "loading..." << project.get()->Name << std::endl; | ||||
|  | ||||
|  | ||||
| 	 | ||||
| } | ||||
|  | ||||
|  | ||||
| namespace YAML { | ||||
|  | ||||
| 	template<> | ||||
| 	class convert<Project> { | ||||
| 	public: | ||||
| 		static bool decode(const Node& node , Project& rhs)  | ||||
| 		{ | ||||
| 			if (!node.IsMap()) | ||||
| 				return false; | ||||
| 			rhs.setName(node["Project"].as<std::string>()); | ||||
| 			rhs.setProjectDirectory(node["Directory"].as<std::string>()); | ||||
| 			return true; | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 	}; | ||||
|  | ||||
| } | ||||
							
								
								
									
										22
									
								
								Editor/src/Project/Project.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Editor/src/Project/Project.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| #pragma once | ||||
| #include <filesystem> | ||||
| #include <iostream> | ||||
| class Project { | ||||
| public: | ||||
| 	Project() = default; | ||||
| 	Project(const std::string& name): Name(name){} | ||||
| 	~Project() { std::cout << "Unloading project..." << Name << std::endl; } | ||||
|  | ||||
| 	void setName(std::string& name) { Name = name; } | ||||
| 	const std::string& GetName()const { return Name; } | ||||
|  | ||||
| 	void setProjectDirectory(std::string& path) { ProjectDirectory = std::filesystem::path(path); } | ||||
| 	const std::filesystem::path GetProjectDirectory() { return ProjectDirectory; } | ||||
|  | ||||
| 	static void SaveProject(std::filesystem::path path, Project& project); | ||||
| 	static void LoadProject(std::filesystem::path path, std::unique_ptr<Project>& project); | ||||
| private: | ||||
| 	std::string Name; | ||||
| 	std::filesystem::path ProjectDirectory; | ||||
| }; | ||||
|  | ||||
							
								
								
									
										134
									
								
								Editor/src/SceneSerializer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								Editor/src/SceneSerializer.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,134 @@ | ||||
| #pragma once | ||||
| #include <yaml-cpp/yaml.h> | ||||
| #include <yaml-cpp/node/type.h> | ||||
|  | ||||
| #include <string> | ||||
| #include <filesystem> | ||||
| #include <fstream> | ||||
|  | ||||
| #include "../../YoggieEngine/src/Scene/Entity.h" | ||||
|  | ||||
| void WriteFile(std::string& emitter, std::filesystem::path path)  | ||||
| { | ||||
| 	std::cout << "Writing Scene file to: "  << path.u8string() << std::endl; | ||||
| 	std::ofstream sceneFile; | ||||
| 	sceneFile.open(path.u8string()); | ||||
|  | ||||
| 	sceneFile << emitter.c_str(); | ||||
|  | ||||
| 	sceneFile.close(); | ||||
| } | ||||
|  | ||||
| YAML::Emitter& operator<< (YAML::Emitter& emitter, glm::vec3& vector) { | ||||
| 	emitter << YAML::Flow << YAML::BeginSeq   << vector.x << vector.y << vector.x << YAML::EndSeq; | ||||
| 	return emitter; | ||||
| } | ||||
|  | ||||
|  std::string Serialize( Scene& scene) { | ||||
| 	YAML::Emitter emitter; | ||||
| 	 | ||||
| 	emitter << YAML::BeginMap; | ||||
| 	emitter << YAML::Key << "Scene" << YAML::Value << "test-Scene"; | ||||
| 	emitter << YAML::Key << "Entities" << YAML::Value << YAML::BeginSeq; | ||||
|  | ||||
| 	scene.getReg().each([&scene, &emitter](auto enttNumber) { | ||||
| 		Entity entity = Entity(enttNumber, &scene); | ||||
| 		 | ||||
| 		emitter << YAML::BeginMap; | ||||
| 		emitter << YAML::Key << "Entity" << YAML::Value << entity.GetComponent<IdentifierComponent>().name; | ||||
|  | ||||
| 		if (entity.HasComponent<IdentifierComponent>()) { | ||||
| 			emitter << YAML::Key << "Ident"; | ||||
| 			emitter << YAML::BeginMap; | ||||
| 			emitter << YAML::Value << entity.GetComponent<IdentifierComponent>().name; | ||||
| 			emitter << YAML::EndMap; | ||||
| 		} | ||||
|  | ||||
| 		if (entity.HasComponent<TransformComponent>()) { | ||||
| 			emitter << YAML::Key << "Transform" << YAML::Value ; | ||||
|  | ||||
| 			emitter << YAML::BeginMap; | ||||
|  | ||||
| 			emitter << YAML::Key << "Position"; | ||||
| 			emitter << YAML::Value << entity.GetComponent<TransformComponent>().Position; | ||||
|  | ||||
| 			emitter << YAML::Key << "Rotation"; | ||||
| 			emitter << YAML::Value << entity.GetComponent<TransformComponent>().Rotation; | ||||
|  | ||||
| 			emitter << YAML::Key << "Scale"; | ||||
| 			emitter << YAML::Value << entity.GetComponent<TransformComponent>().Scale; | ||||
|  | ||||
| 			emitter << YAML::EndMap; | ||||
| 		} | ||||
|  | ||||
| 		 | ||||
| 		if (entity.HasComponent<LightComponent>()) { | ||||
| 			emitter << YAML::Key << "Light"; | ||||
| 			emitter << YAML::Value; | ||||
| 			emitter << YAML::BeginMap; | ||||
| 			emitter << YAML::Key << "Color"; | ||||
| 			emitter << YAML::Value << entity.GetComponent<LightComponent>().Color; | ||||
| 			emitter << YAML::EndMap;	 | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		emitter << YAML::EndMap; | ||||
|  | ||||
| 		}); | ||||
|  | ||||
| 	emitter << YAML::EndSeq; | ||||
| 	emitter << YAML::EndMap; | ||||
|  | ||||
| 	return std::string(emitter.c_str()); | ||||
| } | ||||
|   | ||||
|  | ||||
|  void SaveScene(std::filesystem::path path, Scene& scene) { | ||||
| 	 std::string YAMLString = Serialize(scene); | ||||
| 	 WriteFile(YAMLString, path); | ||||
|  } | ||||
|  | ||||
|  | ||||
|  void LoadScene(std::filesystem::path path, Scene& scene) | ||||
|  { | ||||
| 	auto sceneYAML = YAML::LoadFile(path.u8string()); | ||||
|  | ||||
| 	if (!sceneYAML["Scene"]) { | ||||
| 		 spdlog::error("Not a scene file!"); | ||||
| 		 return; | ||||
| 	} | ||||
| 	 | ||||
| 	scene.getReg().clear(); | ||||
|  | ||||
|  | ||||
|  | ||||
| 	std::string SceneName = sceneYAML["Scene"].as<std::string>(); | ||||
|  | ||||
|  | ||||
| 	auto entities = sceneYAML["Entities"]; | ||||
| 	  | ||||
| 	for (const auto& entity : entities) { | ||||
| 	 | ||||
| 		std::string entityID = entity["Ident"].as<std::string>(); | ||||
| 		YoggieEngine::Entity SE = scene.AddEntity(entityID); | ||||
| 		if (entity["Transform"])  | ||||
| 		{ | ||||
| 			TransformComponent tc = SE.GetComponent<TransformComponent>(); | ||||
| 			auto positionNode = entity["Transform"]["Position"]; | ||||
| 			tc.Position =  glm::vec3(positionNode[0].as<float>(), positionNode[1].as<float>(), positionNode[2].as<float>()); | ||||
|  | ||||
| 			auto rotationNode = entity["Transform"]["Rotation"]; | ||||
| 			tc.Rotation = glm::vec3(rotationNode[0].as<float>(), rotationNode[1].as<float>(), rotationNode[2].as<float>()); | ||||
|  | ||||
| 			auto scaleNode = entity["Transform"]["Scale"]; | ||||
| 			tc.Scale = glm::vec3(scaleNode[0].as<float>(), scaleNode[1].as<float>(), scaleNode[2].as<float>()); | ||||
| 		} | ||||
| 		if (entity["Light"]) { | ||||
| 			LightComponent lc = SE.AddComponent<LightComponent>(); | ||||
| 			lc.Color = glm::vec3(entity["Light"]["Color"][0].as<float>(), entity["Light"]["Color"][1].as<float>(), entity["Light"]["Color"][2].as<float>()); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
| 	  | ||||
|  | ||||
|  } | ||||
							
								
								
									
										72
									
								
								Editor/src/UI/Dialog.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								Editor/src/UI/Dialog.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
| #include <imgui.h> | ||||
| #include <nfd.h> | ||||
| #include <iostream> | ||||
| #include <functional> | ||||
| #include "Project.h" | ||||
| struct DialogSpec { | ||||
|     const std::string& id; | ||||
|     const std::string& Title; | ||||
|     const std::string& confirmText; | ||||
|     DialogSpec() = default; | ||||
| }; | ||||
|  | ||||
| //classes based on RAII | ||||
| class Dialog { | ||||
| public: | ||||
| 	Dialog( DialogSpec spec, std::function<void(std::string&)> onConfirm) | ||||
| 	: path(nullptr), location() { | ||||
|         if (ImGui::BeginPopupModal(spec.id.c_str(), NULL, ImGuiWindowFlags_NoMove)) | ||||
|         { | ||||
|             ImGui::Text(spec.Title.c_str()); | ||||
|             ImGui::Separator(); | ||||
|  | ||||
|             ImGui::LabelText("##Directory", "Directory: %s", location.c_str()); | ||||
|             if (ImGui::Button("...")) { | ||||
|                 nfdresult_t result = NFD_OpenDialog(NULL, NULL, &path); | ||||
|  | ||||
|                 switch (result) { | ||||
|                 case (NFD_OKAY): | ||||
|                     location = std::string(path); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     std::cout << "NFD_CANCEL" << std::endl; | ||||
|                 case (NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|  | ||||
|                 }; | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::Button(spec.confirmText.c_str(), ImVec2(120, 0))) | ||||
|             { | ||||
|                 onConfirm(location); | ||||
|  | ||||
|                 ImGui::CloseCurrentPopup(); | ||||
|             } | ||||
|  | ||||
|             ImGui::SetItemDefaultFocus(); | ||||
|             ImGui::SameLine(); | ||||
|  | ||||
|             if (ImGui::Button("Cancel", ImVec2(120, 0))) | ||||
|             { | ||||
|                 ImGui::CloseCurrentPopup(); | ||||
|             } | ||||
|  | ||||
|             ImGui::EndPopup(); | ||||
|  | ||||
|         } | ||||
| 	} | ||||
|  | ||||
| 	~Dialog() { | ||||
| 		delete path; | ||||
| 	} | ||||
|  | ||||
| protected : | ||||
| 	char* path; | ||||
| 	std::string location; | ||||
| }; | ||||
|  | ||||
|  | ||||
							
								
								
									
										35
									
								
								Editor/src/UI/EditorConsole.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								Editor/src/UI/EditorConsole.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| #include <stdio.h> | ||||
| #include "EditorConsole.h" | ||||
|  | ||||
|  | ||||
| EditorConsole::EditorConsole() | ||||
| 	: Items(ImVector<char*>()), AutoScroll(false), ScrollToBottom(false) | ||||
| { | ||||
| 	AddLog("Hello Editor console!"); | ||||
| } | ||||
|  | ||||
| EditorConsole::~EditorConsole() { | ||||
|  | ||||
| } | ||||
|  | ||||
| void EditorConsole::Draw() { | ||||
| 	ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); | ||||
| 	 | ||||
|  | ||||
| 	for (int i = 0; i < Items.Size; i++)  | ||||
| 	{ | ||||
| 		const char* item = Items[i]; | ||||
| 		ImGui::TextUnformatted(item); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| void EditorConsole::AddLog(const char* fmt, ...) { | ||||
| 	char buf[1024]; | ||||
| 	va_list args; | ||||
| 	va_start(args, fmt); | ||||
| 	vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); | ||||
| 	buf[IM_ARRAYSIZE(buf) - 1] = 0; | ||||
| 	va_end(args); | ||||
| 	Items.push_back(strdup(buf)); | ||||
| } | ||||
							
								
								
									
										18
									
								
								Editor/src/UI/EditorConsole.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Editor/src/UI/EditorConsole.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| #pragma once | ||||
| #include <imgui.h> | ||||
|  | ||||
| class EditorConsole  | ||||
| { | ||||
| public: | ||||
| 	EditorConsole(); | ||||
| 	~EditorConsole(); | ||||
|  | ||||
| 	void Draw(); | ||||
| 	void AddLog(const  char* fmt, ...); | ||||
|  | ||||
| private: | ||||
| 	ImVector<char*> Items; | ||||
| 	bool AutoScroll; | ||||
| 	bool ScrollToBottom; | ||||
|  | ||||
| }; | ||||
							
								
								
									
										14
									
								
								Editor/src/UI/EditorWindow.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Editor/src/UI/EditorWindow.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #pragma once | ||||
| #include <imgui.h> | ||||
| #include <string> | ||||
|  | ||||
| class EditorWindow { | ||||
|  | ||||
| public: | ||||
| 	EditorWindow(const std::string& name, ImGuiWindowFlags_ flags = ImGuiWindowFlags_None ) { ImGui::Begin(name.c_str(), false ,flags); } | ||||
| 	 | ||||
| 	 | ||||
|  | ||||
| 	~EditorWindow() { ImGui::End(); } | ||||
|  | ||||
| }; | ||||
							
								
								
									
										71
									
								
								Editor/src/UI/GUIRenderer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								Editor/src/UI/GUIRenderer.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| #pragma once | ||||
| #include <imgui.h> | ||||
| #include <backends/imgui_impl_opengl3.h> | ||||
| #include <backends/imgui_impl_glfw.h> | ||||
| #include <ImGuizmo.h> | ||||
| #include "../../src/YoggieEngine.h" | ||||
|  | ||||
|  | ||||
| class GUIRenderer { | ||||
| public: | ||||
| 	GUIRenderer(YoggieEngine::NativeWindow& window ) { | ||||
| 		IMGUI_CHECKVERSION(); | ||||
| 		ImGui::CreateContext(); | ||||
| 		ImGuiIO& io = ImGui::GetIO(); | ||||
| 		io.ConfigFlags |= ImGuiConfigFlags_::ImGuiConfigFlags_ViewportsEnable; | ||||
| 		io.ConfigFlags |= ImGuiConfigFlags_::ImGuiConfigFlags_DockingEnable; | ||||
| 		io.Fonts->AddFontFromFileTTF("build/Debug/Fonts/Roboto-Regular.ttf", 18); | ||||
|  | ||||
|  | ||||
| 		ImGui::StyleColorsDark(); | ||||
|  | ||||
| 		ImGui_ImplGlfw_InitForOpenGL(window.GetGLFWHandle(), true); | ||||
| 		ImGui_ImplOpenGL3_Init("#version 450"); | ||||
|  | ||||
| 		ImGuizmo::SetImGuiContext(ImGui::GetCurrentContext()); | ||||
| 		ImGuizmo::SetOrthographic(true); | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	void Begin () | ||||
| 	{ | ||||
| 		ImGui_ImplGlfw_NewFrame(); | ||||
| 		ImGui_ImplOpenGL3_NewFrame(); | ||||
|  | ||||
| 		ImGui::NewFrame(); | ||||
| 		ImGuizmo::BeginFrame(); | ||||
| 	} | ||||
|  | ||||
| 	void End() | ||||
| 	{	 | ||||
|  | ||||
| 		ImGui::EndFrame(); | ||||
|  | ||||
|  | ||||
| 		ImGui::Render(); | ||||
| 		ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); | ||||
|  | ||||
| 		 | ||||
| 		if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||
| 		{ | ||||
| 			GLFWwindow* last_context = glfwGetCurrentContext(); | ||||
| 			ImGui::UpdatePlatformWindows(); | ||||
| 			ImGui::RenderPlatformWindowsDefault(); | ||||
| 			glfwMakeContextCurrent(last_context); | ||||
| 		} | ||||
| 		 | ||||
| 		 | ||||
|  | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	~GUIRenderer(){ | ||||
| 	 | ||||
|  | ||||
| 		ImGui_ImplOpenGL3_Shutdown(); | ||||
| 		ImGui_ImplGlfw_Shutdown(); | ||||
| 		ImGui::DestroyContext(); | ||||
|  | ||||
|  | ||||
| 	} | ||||
| }; | ||||
							
								
								
									
										187
									
								
								Editor/src/UI/MainMenuBar.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								Editor/src/UI/MainMenuBar.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,187 @@ | ||||
| #pragma once | ||||
| #include <imgui.h> | ||||
|  | ||||
| class MainMenuBar { | ||||
|  | ||||
| public: | ||||
| 	MainMenuBar() { ImGui::BeginMainMenuBar(); } | ||||
|  | ||||
| 	void ApplicationMenu(std::unique_ptr<Project>& project) { | ||||
|  | ||||
|         if (ImGui::BeginMenu("Application")) { | ||||
|  | ||||
|             if (ImGui::MenuItem("Load Project")) | ||||
|             { | ||||
|                 nfdresult_t result = NFD_OpenDialog({ "yproj" }, NULL, &path); | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                     Project::LoadProject(path, project); | ||||
|                     AssetManager::setAssetPath(project.get()->GetProjectDirectory()); | ||||
|                     AssetManager::BuildAssetView(); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Save project as...")) { | ||||
|                 nfdresult_t result = NFD_SaveDialog({ "yproj" }, NULL, &path); | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                     std::cout << "Save as: " << path << std::endl; | ||||
|                     Project::SaveProject(path, *project.get()); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|  | ||||
|  | ||||
|             if (ImGui::MenuItem("Preferences")) | ||||
|             { | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Exit")) | ||||
|             { | ||||
|                 // TODO: Exit application | ||||
|             } | ||||
|  | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
| 	} | ||||
|  | ||||
|     void SceneMenu(std::unique_ptr<Project>& project,  Scene& scene) { | ||||
|  | ||||
|         if (ImGui::BeginMenu("Scene")) { | ||||
|  | ||||
|             if (ImGui::MenuItem("Save scene")) | ||||
|             { | ||||
|                 nfdresult_t result = NFD_SaveDialog({ "yscene" }, NULL, &path); | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                     SaveScene(path, scene); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Load scene")) | ||||
|             { | ||||
|                 auto result = NFD_OpenDialog({ "yscene" }, NULL, &path); | ||||
|                 switch (result) { | ||||
|                 case (NFD_OKAY): | ||||
|                     LoadScene(path, scene); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Add Entity")) | ||||
|             { | ||||
|                 scene.AddEntity("New Entity"); | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Import Model")) | ||||
|             { | ||||
|                 auto result = NFD_OpenDialog("obj,fbx,gltf", NULL, &path); | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                     // Import Model | ||||
|                      | ||||
|                     AssetManager::LoadFromSource( | ||||
|                         path, | ||||
|                         "build/Debug/Assets"//project.get()->GetProjectDirectory() / "Assets" | ||||
|                     ); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Import MeshAsset (temp)")) | ||||
|             { | ||||
|                 auto result = NFD_OpenDialog("mesh", NULL, &path); | ||||
|                | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                 { | ||||
|                     YoggieEngine::Mesh* importedMesh = AssetManager::LoadFromAssetFile(path); | ||||
|                     if (importedMesh != nullptr) | ||||
|                     { | ||||
|                         auto full_name = std::filesystem::path(path); | ||||
|                         auto importedModel = scene.AddEntity(full_name.filename().u8string()); | ||||
|                         auto& rendererComponent = importedModel.AddComponent<Render3DComponent>(); | ||||
|                         rendererComponent.mesh = *importedMesh; | ||||
|  | ||||
|                     } | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|                 case(NFD_CANCEL): | ||||
|                     spdlog::debug("User cancelled action"); | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     spdlog::warn("Something went wrong!"); | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void DebugMenu()  | ||||
|     { | ||||
|         if (ImGui::BeginMenu("Debug")) { | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void SelectMenu() { | ||||
|         if (ImGui::BeginMenu("Select")) { | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void WindowMenu() { | ||||
|         if (ImGui::BeginMenu("Window")) { | ||||
|              | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void Help() { | ||||
|         if (ImGui::BeginMenu("Help")) { | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
| 	~MainMenuBar() { ImGui::EndMainMenuBar(); } | ||||
| private: | ||||
|     char* path = nullptr; | ||||
|  | ||||
| }; | ||||
							
								
								
									
										364
									
								
								Editor/src/UI/widgets.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										364
									
								
								Editor/src/UI/widgets.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,364 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
|  | ||||
| #include <glm/glm.hpp> | ||||
|  | ||||
| #include <imgui.h> | ||||
| #include "../../libs/guizmo/ImGuizmo.h" | ||||
|  | ||||
| #include "../../YoggieEngine/src/YoggieEngine.h" | ||||
| #include "../../src/Scene/Entity.h" | ||||
|  | ||||
| #include "EditorWindow.h" | ||||
| #include "EditorConsole.h" | ||||
| #include "../Project/Project.h" | ||||
| #include "../AssetManagement/AssetManager.h" | ||||
|  | ||||
| typedef void ( *voidFunction ) (void); | ||||
| using namespace YoggieEngine; | ||||
|  | ||||
| auto matrix = glm::mat4(1.0f); | ||||
| auto worldOrigin = glm::mat4(1.0f); | ||||
|  | ||||
|  | ||||
| inline void ComponentView(const std::string& componentName, voidFunction func) | ||||
| { | ||||
|     ImGuiWindowFlags_ window_flags = ImGuiWindowFlags_None; | ||||
|     ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); | ||||
|     ImGui::BeginChild(componentName.c_str()); | ||||
|  | ||||
|     func(); | ||||
|  | ||||
|     ImGui::EndChild(); | ||||
|     ImGui::PopStyleVar(); | ||||
| } | ||||
|  | ||||
| class Inspector : EditorWindow { | ||||
| public: | ||||
| 	Inspector() : EditorWindow("Inspector") {} | ||||
|  | ||||
| 	void AddComponentDropDown(Entity& selected )  | ||||
|     { | ||||
| 		static char* names[] = { "Script Component", "Camera Component", "Light Component"}; | ||||
|         if (ImGui::Button("Add Component")) | ||||
|             ImGui::OpenPopup("Component picker"); | ||||
|  | ||||
|         ImGui::SameLine(); | ||||
|         if (ImGui::BeginPopup("Component picker")) { | ||||
|  | ||||
|             for (int i = 0; i < IM_ARRAYSIZE(names); i++) | ||||
|                 if (ImGui::MenuItem(names[i])) { | ||||
|                     std::cout << "Add a " << names[i] << " to " | ||||
|                         << selected.GetComponent<IdentifierComponent>().name << std::endl; | ||||
|                 } | ||||
|  | ||||
|             ImGui::EndPopup(); | ||||
|         } | ||||
|         ImGui::NewLine(); | ||||
| 	} | ||||
| 	 | ||||
|     void ShowComponents(Entity& selected)  | ||||
| 	{ | ||||
|         auto component = selected.GetComponent<IdentifierComponent>(); | ||||
|         ImGui::InputText("Name:", (char*)component.name.c_str(), component.name.size() * sizeof(char), ImGuiInputTextFlags_ReadOnly); | ||||
|  | ||||
|  | ||||
|         if (selected.HasComponent<TransformComponent>()) { | ||||
|             auto& transform = selected.GetComponent<TransformComponent>(); | ||||
|             if (ImGui::CollapsingHeader("Transform", ImGuiTreeNodeFlags_DefaultOpen)) { | ||||
|                 ImGui::DragFloat3("Position", glm::value_ptr(transform.Position), 0.1f); | ||||
|                 ImGui::DragFloat3("Rotation", glm::value_ptr(transform.Rotation), 0.1f); | ||||
|                 ImGui::DragFloat3("Scale", glm::value_ptr(transform.Scale), 0.1f, 0.0f); | ||||
|             } | ||||
|             if (selected.HasComponent<RelationComponent>()) { | ||||
|                 ImGui::Text("Has relation"); | ||||
|             } | ||||
|  | ||||
|  | ||||
|         } | ||||
|  | ||||
|  | ||||
|         if (selected.HasComponent<Render3DComponent>()) { | ||||
|             auto& render3d = selected.GetComponent<Render3DComponent>(); | ||||
|             if (ImGui::CollapsingHeader("Render3D", ImGuiTreeNodeFlags_DefaultOpen)) { | ||||
|                 ImGui::ColorEdit3("Colour", glm::value_ptr(render3d.color)); | ||||
|             } | ||||
|         } | ||||
|         static bool deferred = true; | ||||
|         if (selected.HasComponent<LightComponent>()) { | ||||
|             auto& light = selected.GetComponent<LightComponent>(); | ||||
|             if (ImGui::CollapsingHeader("Light", ImGuiTreeNodeFlags_DefaultOpen)) { | ||||
|                 ImGui::ColorEdit3("Colour", glm::value_ptr(light.Color)); | ||||
|                 ImGui::Checkbox("Deferred", &deferred); | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         if (selected.HasComponent <CameraComponent>()) { | ||||
|             auto& camera = selected.GetComponent<CameraComponent>(); | ||||
|             if (ImGui::CollapsingHeader("Camera")) { | ||||
|                 ImGui::DragFloat3("Position:",glm::value_ptr(camera.Position), 0.01f); | ||||
|                 ImGui::DragFloat3("Rotation:", glm::value_ptr(camera.Rotation), 0.01f); | ||||
|  | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (selected.HasComponent<ScriptComponent>()) { | ||||
|             ComponentView("Scripting", [] { | ||||
|                 ImGui::LabelText("##--", "Hello scripting"); | ||||
|                 }); | ||||
|         } | ||||
| 	} | ||||
|  | ||||
| }; | ||||
|  | ||||
| class SceneExplorer : EditorWindow { | ||||
| public: | ||||
|     SceneExplorer(entt::entity& selected , Scene& scene) : EditorWindow("SceneExplorer") { | ||||
|         scene.getReg().each([&](entt::entity enttNumber) { | ||||
|             Entity entity = Entity(enttNumber, &scene); | ||||
|             auto id = entity.GetComponent<IdentifierComponent>(); | ||||
|  | ||||
|             if (ImGui::Selectable(id.name.c_str(), enttNumber == selected)) { | ||||
|                 selected = enttNumber; | ||||
|             } | ||||
|  | ||||
|         }); | ||||
|  | ||||
|     } | ||||
| }; | ||||
|  | ||||
|  | ||||
| class Viewport : EditorWindow { | ||||
| public: | ||||
|     Viewport (Framebuffer& fb, Camera cam) : EditorWindow("SceneView")  | ||||
|     { | ||||
|         ImVec2 WinPos = ImGui::GetWindowPos(); | ||||
|         ImVec2 ContentRegionMin = ImGui::GetWindowContentRegionMin(); | ||||
|         ImVec2 ContentRegionMax = ImGui::GetWindowContentRegionMax(); | ||||
|         ImVec2 ScreenSpaceMin = { ContentRegionMin.x + WinPos.x, ContentRegionMin.y + WinPos.y }; | ||||
|         ImVec2 ScreenSpaceMax = { ContentRegionMax.x + WinPos.x,ContentRegionMax.y + WinPos.y }; | ||||
|  | ||||
|  | ||||
|         ImGui::Image( | ||||
|             (void*)(intptr_t)fb.GetColourAttachment(), | ||||
|             ImVec2{ (float)ImGui::GetWindowWidth(),(float)ImGui::GetWindowHeight() } | ||||
|         ); | ||||
|          | ||||
|  | ||||
|         ImGuizmo::Enable(true); | ||||
|         ImGuizmo::SetRect(ScreenSpaceMin.x, ScreenSpaceMin.y,ContentRegionMax.x, ContentRegionMax.y); | ||||
|          | ||||
|         glm::mat4 transposed_view = glm::transpose(cam.ViewMatrix); | ||||
|          | ||||
|         ImGuizmo::ViewManipulate(glm::value_ptr(transposed_view), 1, { ScreenSpaceMin.x,ScreenSpaceMin.y }, { 90,90 }, 0x22CCCCCC); | ||||
|         ImGuizmo::DrawGrid(glm::value_ptr(cam.ViewMatrix), glm::value_ptr(cam.ProjectionMatrix), glm::value_ptr(worldOrigin), 100.0f); | ||||
|        | ||||
|         // Matrix is the model matrix we would want to manipulate | ||||
|         //ImGuizmo::Manipulate(glm::value_ptr(cam.ViewMatrix), glm::value_ptr(cam.ProjectionMatrix), ImGuizmo::TRANSLATE, ImGuizmo::WORLD, glm::value_ptr(cam.ViewMatrix)); | ||||
|  | ||||
|     } | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| int selectedGfxAPI = 0; | ||||
| int selectedPhysicsEngine = 0; | ||||
| glm::vec3 Gravity = glm::vec3(0.0f, -9.81f, 0.0f); | ||||
| bool ShowAdvancedOptions = false; | ||||
| bool DebugEngine = false; | ||||
| class Settings : EditorWindow { | ||||
| public: | ||||
|     Settings() : EditorWindow("Settings")  | ||||
|     { | ||||
|         ImGui::LabelText("##title-settings", "Fine grain control over the engine!"); | ||||
|          | ||||
|         if (ImGui::BeginCombo("Graphics API", GraphicsAPI[selectedGfxAPI])) { | ||||
|             for (int i = 0; i < 3; i++) { | ||||
|                 bool isSelected = i == selectedGfxAPI; | ||||
|                 if (ImGui::Selectable(GraphicsAPI[i], isSelected)) { | ||||
|                     selectedGfxAPI = i; | ||||
|                 } | ||||
|  | ||||
|                 if(isSelected) | ||||
|                     ImGui::SetItemDefaultFocus(); | ||||
|             } | ||||
|           | ||||
|             ImGui::EndCombo(); | ||||
|         } | ||||
|  | ||||
|         ImGui::NewLine(); | ||||
|  | ||||
|         if (ImGui::BeginCombo("Physics Engine", PhysicsEngine[selectedPhysicsEngine])) { | ||||
|             for (int i = 0; i < 2; i++) { | ||||
|                 bool isSelected = i == selectedPhysicsEngine; | ||||
|                 if (ImGui::Selectable(PhysicsEngine[i], isSelected)) { | ||||
|                     selectedGfxAPI = i; | ||||
|                 } | ||||
|  | ||||
|                 if (isSelected) | ||||
|                     ImGui::SetItemDefaultFocus(); | ||||
|             } | ||||
|  | ||||
|             ImGui::EndCombo(); | ||||
|         } | ||||
|  | ||||
|         ImGui::InputFloat3("Gravity", glm::value_ptr(Gravity)); | ||||
|  | ||||
|         ImGui::NewLine(); | ||||
|         if (ImGui::Button("Show Advanced options ")) { | ||||
|             ShowAdvancedOptions = !ShowAdvancedOptions; | ||||
|         } | ||||
|  | ||||
|         if (ShowAdvancedOptions)  | ||||
|         { | ||||
|             ImGui::Checkbox("Debug Engine", &DebugEngine); | ||||
|  | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| private: | ||||
|  | ||||
|  | ||||
|     const char* PhysicsEngine[2] = { | ||||
|         "PhysX", | ||||
|         "Jolt Physics" | ||||
|     }; | ||||
|  | ||||
|     const char* GraphicsAPI[3] = { | ||||
|         "OpenGL", | ||||
|         "Vulkan", | ||||
|         "Metal (Apple)" | ||||
|     }; | ||||
|    | ||||
| }; | ||||
|  | ||||
| class ProjectInfo : EditorWindow { | ||||
| public: | ||||
|     ProjectInfo(Project& project) : EditorWindow("Project Info") { | ||||
|         ImGui::Text("Project: %s", project.GetName().c_str()); | ||||
|         ImGui::Text("Directory: %s", project.GetProjectDirectory().u8string().c_str()); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| class Console : EditorWindow { | ||||
| public: | ||||
|  | ||||
| Console() : EditorWindow("Console") { | ||||
|     s_console = std::make_unique<EditorConsole>(); | ||||
| } | ||||
| void Show() { | ||||
|     s_console.get()->Draw(); | ||||
| } | ||||
|  | ||||
| private:  | ||||
|     std::unique_ptr<EditorConsole> s_console; | ||||
| }; | ||||
|  | ||||
| class AssetFinder : EditorWindow { | ||||
| public: | ||||
|     AssetFinder() : EditorWindow("Assets") { | ||||
|  | ||||
|  | ||||
|         ImGui::DragInt("IconSize", &iconSize, 1, 30, 90); | ||||
|  | ||||
|  | ||||
|         if (ImGui::BeginTable("##resources", 3)) | ||||
|         { | ||||
|             ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f, 0.f, 0.f, 0.f)); | ||||
|             ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.f, 0.f, 0.f, 0.f)); | ||||
|             ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.f, 1.f, 1.f, 0.2f)); | ||||
|  | ||||
|             Texture folderIcon = Texture("rsc/folderIcon.png"); | ||||
|             Texture assetIcon = Texture("rsc/assetIcon.png"); | ||||
|  | ||||
|  | ||||
|             int row = 0; | ||||
|             int column = 0; | ||||
|             for (auto& asset : AssetManager::assets) { | ||||
|                 if (column % 3 == 0) { | ||||
|                     ImGui::TableNextRow(); | ||||
|                     column = 0; | ||||
|                     row++; | ||||
|                 } | ||||
|  | ||||
|                 ImGui::TableSetColumnIndex(column); | ||||
|  | ||||
|                 if (asset.isFolder) { | ||||
|                     ImGui::ImageButton( | ||||
|                         (ImTextureID)folderIcon.GetID(), | ||||
|                         ImVec2{ (float)iconSize,(float)iconSize }); | ||||
|                     ImGui::Text(asset.GetName(), row); | ||||
|  | ||||
|                 } | ||||
|                 else { | ||||
|                     ImGui::ImageButton( | ||||
|                         (ImTextureID)assetIcon.GetID(), | ||||
|                         ImVec2{ (float)iconSize, (float)iconSize }); | ||||
|                     ImGui::Text(asset.GetName(), row); | ||||
|  | ||||
|                 } | ||||
|  | ||||
|  | ||||
|                 column++; | ||||
|             } | ||||
|  | ||||
|  | ||||
|             ImGui::PopStyleColor(3); | ||||
|             ImGui::EndTable(); | ||||
|             const GLuint textures[2]{ assetIcon.GetID(), folderIcon.GetID() }; | ||||
|             glDeleteTextures(2,  textures ); | ||||
|  | ||||
|         } | ||||
|  | ||||
|     } | ||||
| private: | ||||
|     int iconSize = 60; | ||||
| }; | ||||
|  | ||||
| #define RuntimeControlWindowFlags (ImGuiWindowFlags_)(ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse) | ||||
|  | ||||
| struct ButtonInfo { | ||||
|     const char* Name; | ||||
|     ImVec4 Color; | ||||
| }; | ||||
|  | ||||
|  | ||||
| class RuntimeControls : EditorWindow { | ||||
| public: | ||||
|     RuntimeControls() : EditorWindow("RuntimeControls", RuntimeControlWindowFlags) { | ||||
|          | ||||
|         ImGui::SameLine((ImGui::GetWindowContentRegionMax().x / 2) - ( numButtons * buttonSize.x )); | ||||
|         for (int i = 0; i < numButtons; i++) { | ||||
|             ImVec4 color = button[i].Color; | ||||
|             ImGui::PushStyleColor(ImGuiCol_Button, color); | ||||
|             const float strengthIncrease = 1.5f; | ||||
|             ImGui::PushStyleColor( | ||||
|                 ImGuiCol_ButtonHovered,  | ||||
|                 ImVec4{ | ||||
|                     color.x * strengthIncrease, | ||||
|                     color.y * strengthIncrease, | ||||
|                     color.z * strengthIncrease, | ||||
|                     color.w  | ||||
|                 }  | ||||
|             ); | ||||
|             if (ImGui::Button(button[i].Name, buttonSize)) { | ||||
|  | ||||
|             } | ||||
|             ImGui::PopStyleColor(); | ||||
|             ImGui::PopStyleColor(); | ||||
|             ImGui::SameLine(); | ||||
|  | ||||
|         } | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     ImVec2 buttonSize = ImVec2{ 90 ,25 }; | ||||
|     unsigned int numButtons = 2; | ||||
|     ButtonInfo button[2] = { | ||||
|         {"Play" , ImVec4{ 0.001 * 12 , 0.001 * 201 , 0.001* 69, 1.0f}}, | ||||
|         {"Simulate", ImVec4{ 0.001 * 14, 0.001 * 157, 0.001 * 201, 1.0f}} | ||||
|     }; | ||||
|  | ||||
| }; | ||||
							
								
								
									
										227
									
								
								Editor/src/app.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										227
									
								
								Editor/src/app.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,227 @@ | ||||
| #include "../../YoggieEngine/src/EntryPoint.h" | ||||
| #include "../../YoggieEngine/src/AssetManager/ModelImporter.h" | ||||
| #include "../../YoggieEngine/src/Physics/Physics.h" | ||||
|  | ||||
| #include <nfd.h> | ||||
|  | ||||
| #include <glm/glm.hpp> | ||||
| #include <glm/gtc/type_ptr.hpp> | ||||
| #include <glm/gtc/matrix_transform.hpp> | ||||
|  | ||||
| #include "UI/GUIRenderer.h" | ||||
| #include "UI/Widgets.h" | ||||
| #include "Project/Project.h" | ||||
| #include "SceneSerializer.h" | ||||
| #include "AssetManagement/AssetManager.h" | ||||
| #include "UI/MainMenuBar.h" | ||||
| const unsigned int MS_PER_UPDATE = 2; | ||||
| void CreateTestProject(std::unique_ptr<Project>& project, Scene& scene); | ||||
|  | ||||
| RendererConfig EditorSceneRendererConfig{ | ||||
|     1200, // Screen Width | ||||
|     700, // Screen Height | ||||
|     glm::vec3{0,0,0}, // Clear Color | ||||
|     true // Depth testing   | ||||
| }; | ||||
|  | ||||
| glm::vec3 temp = glm::vec3(0); | ||||
| Camera cam = Camera(glm::vec3(12.0f, 1.0f, 0.0f), glm::vec3(45.0f, 0.0f, 0.0f), 90); | ||||
| class Editor : public Application { | ||||
| public: | ||||
|     Editor()  | ||||
|         : Application("Editor"), | ||||
|         AppWindow(1200,700), | ||||
|         framebuffer(new Framebuffer(1200,700)), | ||||
|         viewportRenderer(EditorSceneRendererConfig), | ||||
|         EditorGUIRenderer(AppWindow), | ||||
|         Selected((entt::entity)-1) | ||||
|     { | ||||
|         viewportRenderer.setCurrentFrameBuffer(*framebuffer); | ||||
|     } | ||||
|  | ||||
|     void RenderScene() { | ||||
|         // submit DrawCommands for all render3DComponents             | ||||
|         auto group = ActiveScene.getReg().view<TransformComponent, Render3DComponent>(); | ||||
|         group.each([&](auto enity, TransformComponent& t, Render3DComponent& renderComponent) { | ||||
|             viewportRenderer.Submit(renderComponent, t); | ||||
|             }); | ||||
|  | ||||
|         // Render  scene  | ||||
|         viewportRenderer.Render(ActiveScene); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     void RenderEditorGUI() { | ||||
|         EditorGUIRenderer.Begin(); | ||||
|         ImGui::DockSpaceOverViewport(ImGui::GetMainViewport()); | ||||
|  | ||||
|         // Show a menu bar | ||||
|         { | ||||
|             MainMenuBar menuBar = MainMenuBar(); | ||||
|             menuBar.ApplicationMenu(CurrentProject); | ||||
|             menuBar.SceneMenu(CurrentProject, ActiveScene); | ||||
|             menuBar.SelectMenu(); | ||||
|             menuBar.WindowMenu(); | ||||
|             menuBar.DebugMenu(); | ||||
|             menuBar.Help(); | ||||
|         } | ||||
|  | ||||
|         { | ||||
|                 ProjectInfo projectInfo(*(CurrentProject.get())); | ||||
|         } | ||||
|  | ||||
|         { | ||||
|             Viewport sceneview = Viewport(*framebuffer, viewportRenderer.getCamera()); | ||||
|         } | ||||
|  | ||||
|         { | ||||
|             RuntimeControls rc = RuntimeControls(); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         { | ||||
|             SceneExplorer explorer(Selected, ActiveScene); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         { | ||||
|             Inspector inspector = Inspector(); | ||||
|             if (ActiveScene.getReg().valid(Selected)) { | ||||
|                 Entity SelectedEntity = Entity(Selected, &ActiveScene); | ||||
|                 inspector.AddComponentDropDown(SelectedEntity); | ||||
|                 inspector.ShowComponents(SelectedEntity); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         { | ||||
|             Settings settings = Settings(); | ||||
|         } | ||||
|  | ||||
|         { | ||||
|             // AssetFinder assetsView = AssetFinder(); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         { | ||||
|             Console console = Console(); | ||||
|             console.Show(); | ||||
|         } | ||||
|  | ||||
|         ImGui::ShowDemoWindow(); | ||||
|         ImGui::ShowMetricsWindow(); | ||||
|         EditorGUIRenderer.End(); | ||||
|     } | ||||
|  | ||||
|     void Run() override | ||||
|     { | ||||
|         CreateTestProject(CurrentProject, ActiveScene); | ||||
|         ActiveScene.Start(); | ||||
|  | ||||
|  | ||||
|         // Create the physics engine demo! | ||||
|         Physics Physics; | ||||
|         //Physics.Demo(); | ||||
|  | ||||
|         double previous = glfwGetTime(); | ||||
|         double lag = 0.0; | ||||
|         while (!AppWindow.WindowShouldClose()) | ||||
|         { | ||||
|  | ||||
|             double current = glfwGetTime(); | ||||
|             double elapsed = current - previous; | ||||
|             previous = current; | ||||
|             lag += elapsed; | ||||
|  | ||||
|             AppWindow.Poll(); | ||||
|  | ||||
|             if (SimulatePhysics) | ||||
|             { | ||||
|                 Physics.Step(1.0f / 60.0f); | ||||
|             } | ||||
|  | ||||
|  | ||||
|             while (lag >= MS_PER_UPDATE)  | ||||
|             { | ||||
|                 ActiveScene.Update(); | ||||
|                 lag -= MS_PER_UPDATE; | ||||
|             } | ||||
|  | ||||
|  | ||||
|              | ||||
|             RenderScene(); | ||||
|  | ||||
|             RenderEditorGUI(); | ||||
|  | ||||
|             AppWindow.SwapBuffers(); | ||||
|             glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); | ||||
|  | ||||
|  | ||||
|         } | ||||
|  | ||||
|         delete framebuffer; | ||||
|         ActiveScene.Stop(); | ||||
|  | ||||
|     } | ||||
|  | ||||
|  | ||||
| private: | ||||
|     NativeWindow AppWindow; | ||||
|  | ||||
|     Framebuffer* framebuffer; | ||||
|     Renderer viewportRenderer; | ||||
|      | ||||
|     GUIRenderer EditorGUIRenderer; | ||||
|  | ||||
|     // Editor State  | ||||
|     bool SimulatePhysics = false; | ||||
|     entt::entity  Selected; | ||||
|  | ||||
|     std::unique_ptr<Project> CurrentProject; | ||||
|     Scene ActiveScene; | ||||
|  | ||||
| }; | ||||
|  | ||||
| YoggieEngine::Application* CreateApplication() { | ||||
|     | ||||
|     return new Editor(); | ||||
|  | ||||
| } | ||||
|  | ||||
| void CreateTestProject(std::unique_ptr<Project>& project, Scene& scene ) { | ||||
|     project = std::make_unique<Project>(); | ||||
|     std::string path = (std::filesystem::current_path()).string(); | ||||
|     project.get()->setProjectDirectory(path); | ||||
|  | ||||
|     AssetManager::Init(); | ||||
|     AssetManager::setAssetPath(project.get()->GetProjectDirectory()); | ||||
|     AssetManager::BuildAssetView(); | ||||
|  | ||||
|     // Create a level and load it as the current level | ||||
|     auto importer = ModelImporter(); | ||||
|  | ||||
|  | ||||
|     // create an ambient light source | ||||
|     auto light = scene.AddEntity("Light"); | ||||
|     auto lightComponent = light.AddComponent<LightComponent>(); | ||||
|     lightComponent.Color = glm::vec3(1.0f); | ||||
|  | ||||
|  | ||||
|     // Create a cube  | ||||
|     auto model = importer.Import("build/Debug/Models/Cube.obj"); | ||||
|      | ||||
|     auto cube = scene.AddEntity("Cube"); | ||||
|     auto& render3DComponent = cube.AddComponent<Render3DComponent>(); | ||||
|     render3DComponent.mesh = *(model->renderable->mesh); | ||||
|  | ||||
|     cube.GetComponent<TransformComponent>().Position = glm::vec3(1.0f, 0.0f, 5.0f); | ||||
|  | ||||
|     auto cube2 = scene.AddEntity("Cube2"); | ||||
|     auto& rendercube2 = cube2.AddComponent<Render3DComponent>(); | ||||
|     rendercube2.mesh = *(model->renderable->mesh); | ||||
|  | ||||
|     auto relationcube = cube.AddComponent<RelationComponent>(cube2); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| project "ImGUI_Opengl3" | ||||
| project "ImGui" | ||||
|   kind "StaticLib" | ||||
|  | ||||
|   includedirs { | ||||
|  | ||||
							
								
								
									
										19
									
								
								ImGuizmo/premake5.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								ImGuizmo/premake5.lua
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| project "ImGuizmo" | ||||
|   kind "StaticLib" | ||||
|  | ||||
|   includedirs { | ||||
|     "../libs/glfw/include", | ||||
|     "../libs/ImGui", | ||||
|     "../libs/guizmo" | ||||
|   } | ||||
|  | ||||
|   files { | ||||
|     "../libs/guizmo/*.cpp", | ||||
|   } | ||||
|  | ||||
|   libdirs{ | ||||
|     "../libs/ImGui", | ||||
|     "../libs/glad" | ||||
|   } | ||||
|  | ||||
|   include("../ImGui") | ||||
							
								
								
									
										84
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								README.md
									
									
									
									
									
								
							| @ -1,76 +1,34 @@ | ||||
| # BarinkEngine | ||||
| ``` | ||||
|     ,---,.                                           ,-.    ,---,.                                                   | ||||
|   ,'  .'  \                   ,--,               ,--/ /|  ,'  .' |                      ,--,                         | ||||
| ,---.' .' |           __  ,-,--.'|        ,---,,--. :/ |,---.'   |     ,---,          ,--.'|        ,---,            | ||||
| |   |  |: |         ,' ,'/ /|  |,     ,-+-. /  :  : ' / |   |   .' ,-+-. /  | ,----._,|  |,     ,-+-. /  |           | ||||
| :   :  :  / ,--.--. '  | |' `--'_    ,--.'|'   |  '  /  :   :  |-,,--.'|'   |/   /  ' `--'_    ,--.'|'   |  ,---.    | ||||
| :   |    ; /       \|  |   ,,' ,'|  |   |  ,"' '  |  :  :   |  ;/|   |  ,"' |   :     ,' ,'|  |   |  ,"' | /     \   | ||||
| |   :     .--.  .-. '  :  / '  | |  |   | /  | |  |   \ |   :   .|   | /  | |   | .\  '  | |  |   | /  | |/    /  |  | ||||
| |   |   . |\__\/: . |  | '  |  | :  |   | |  | '  : |. \|   |  |-|   | |  | .   ; ';  |  | :  |   | |  | .    ' / |  | ||||
| '   :  '; |," .--.; ;  : |  '  : |__|   | |  |/|  | ' \ '   :  ;/|   | |  |/'   .   . '  : |__|   | |  |/'   ;   /|  | ||||
| |   |  | ;/  /  ,.  |  , ;  |  | '.'|   | |--' '  : |--'|   |    |   | |--'  `---`-'| |  | '.'|   | |--' '   |  / |  | ||||
| |   :   /;  :   .'   ---'   ;  :    |   |/     ;  |,'   |   :   .|   |/      .'__/\_: ;  :    |   |/     |   :    |  | ||||
| |   | ,' |  ,     .-./      |  ,   /'---'      '--'     |   | ,' '---'       |   :    |  ,   /'---'       \   \  /   | ||||
| `----'    `--`---'           ---`-'                     `----'                \   \  / ---`-'              `----'    | ||||
|                                                                                `--`-'          | ||||
| ``` | ||||
| # Yoggie Engine | ||||
|  | ||||
| <img src="Screenshots/Yoggie.webp" width="160" ></img> | ||||
| ## Goal | ||||
| Must support building a full game in 48 hours.  | ||||
| The goal is to build a mature enough engine to be capable of using during game jams. | ||||
|  | ||||
|  | ||||
| ## Features | ||||
| **NOTE** __Not in any particular order__     | ||||
| *_NOTE:_ Just because it is listed as a feature here does not imply it has been nor guarantees it ever will be implemented* | ||||
| - Rendering | ||||
|     - OpenGL | ||||
|     - Vulkan  | ||||
|  | ||||
|     - Metal (Possibly) | ||||
| - Logging | ||||
|     - Different for debug and release     | ||||
|     - Different per OS | ||||
|      | ||||
| - Physics | ||||
|     -  PhysX | ||||
|     - Alternative for non-nvidia stuff?! | ||||
|  | ||||
| - Basic Entity Component system | ||||
|  | ||||
| - Graphical scripting ?? | ||||
|  | ||||
| - Scripting support ( idk what language) | ||||
|     -  Jolt Physics | ||||
| - Entity Component system | ||||
| - Graphical scripting (Possibly) | ||||
| - Scripting support | ||||
|     - LUA | ||||
|     - C# (for object orientated approaches to gamedev) | ||||
| - Configuration options  | ||||
|     - JSON | ||||
|     - LUA | ||||
|     - others ?!?!? | ||||
|     - YAML | ||||
|     - INI | ||||
|  | ||||
| ## Screenshots | ||||
|  | ||||
| <img src="Screenshots/screen1.png" width="300"></img> | ||||
| <img src="Screenshots/screen2.png" width="300"></img> | ||||
|  | ||||
| ## Planning | ||||
| see [TODO](docs/TODO.md) | ||||
|  | ||||
| _NOTE:_  | ||||
|  | ||||
| The planning is moving away from markdown in favor  | ||||
| of gitea Projects. New planning will be visible on [this page](https://git.barink.dev/Nigel/MyGameEngine/projects).  | ||||
| ## Requirements | ||||
| #### Software | ||||
| * Premake | ||||
| * Git | ||||
| * C++ Compiler | ||||
|  | ||||
| ## Windows development workflow  | ||||
| User premake to generate project files for the approperiate build method. | ||||
| On Windows I assume you'll build with visual studio | ||||
|  | ||||
| ```bash | ||||
| User:~$ premake vs2022 | ||||
| ``` | ||||
|  | ||||
| ## Linux development workflow | ||||
| Use premake to generate project files for the approperiate build method. | ||||
| On Linux I assume you'll build with something like make. | ||||
|  | ||||
| ```bash | ||||
| User@Machine:~$ premake gmake2 | ||||
| ``` | ||||
| ## More docs | ||||
| [Todo list](TODO.md)    \ | ||||
| [Planning](https://git.barink.dev/Nigel/MyGameEngine/projects)\ | ||||
| [Development](DEVELOPMENT.md)\ | ||||
| [Show case](SHOWCASE.md) | ||||
|  | ||||
							
								
								
									
										39
									
								
								Runtime/premake5.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Runtime/premake5.lua
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| project "Runtime" | ||||
| kind "ConsoleApp" | ||||
|  | ||||
| buildmessage "Building the runtime ..." | ||||
|  | ||||
| links{ | ||||
|   "YoggieEngine" | ||||
| } | ||||
|  | ||||
| includedirs{ | ||||
|   "./../YoggieEngine/src", | ||||
|   -- I'd prefer if didn't need these.. | ||||
|   -- We'll figure that out some time later | ||||
|   "./../libs/lua/include", | ||||
|   "./../libs/spdlog/include", | ||||
|   "./../libs/glm", | ||||
|   "./../libs/GorillaAudio/include", | ||||
|  | ||||
|   "./../libs/assimp/include", | ||||
|   "./../libs/glad/include", | ||||
|   "./../libs/glfw/include", | ||||
|   "./../libs/tinygltf", | ||||
|   "./../libs/glew/include", | ||||
|   "./../libs/glm", | ||||
|   "./../libs/ImGui", | ||||
|  | ||||
|  | ||||
|   "./include" | ||||
|  | ||||
| } | ||||
|  | ||||
| libdirs { | ||||
|   './../YoggieEngine/build/Debug' | ||||
| } | ||||
|  | ||||
| files {  | ||||
|   "./src/*.h", | ||||
|   "./src/*.cpp" | ||||
| } | ||||
							
								
								
									
										6
									
								
								Runtime/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Runtime/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| #include <iostream> | ||||
|  | ||||
| int main() | ||||
| { | ||||
| 	std::cout << "Welcome to the runtime!" << std::endl; | ||||
| } | ||||
							
								
								
									
										17
									
								
								SHOWCASE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								SHOWCASE.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| ## The engine development in pictures | ||||
|  | ||||
| __Testing OpenGl with ImGui as a concept__ | ||||
|  | ||||
| <img src="Screenshots/OpenGLAndImGuiTest.png" width="300"></img> | ||||
|  | ||||
| __Working on docking with different windows using ImGui__ | ||||
|  | ||||
| <img src="Screenshots/YoggieEditor_workingGuizmo.png" width="300"></img> | ||||
|  | ||||
| __A first more complete look of the engine__ | ||||
|  | ||||
| <img src="Screenshots/YoggieEditorV0.2.png" width="300"></img> | ||||
|  | ||||
| __Mixing deferred and forward rendering and adding a skybox__ | ||||
|  | ||||
| <img src="Screenshots/ImprovedRendering.png" width="300"></img>      | ||||
							
								
								
									
										40
									
								
								SandboxApp/premake5.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								SandboxApp/premake5.lua
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| project "SandboxApp" | ||||
| kind "ConsoleApp" | ||||
|  | ||||
| buildmessage "Building SandboxApp ..." | ||||
|  | ||||
| links{ | ||||
|   "YoggieEngine" | ||||
| } | ||||
|  | ||||
| includedirs{ | ||||
|   "./../YoggieEngine/Include", | ||||
|  | ||||
|   -- I'd prefer if didn't need these.. | ||||
|   -- We'll figure that out some time later | ||||
|   "./../libs/lua/include", | ||||
|   "./../libs/spdlog/include", | ||||
|   "./../libs/glm", | ||||
|   "./../libs/GorillaAudio/include", | ||||
|  | ||||
|   "./../libs/assimp/include", | ||||
|   "./../libs/glad/include", | ||||
|   "./../libs/glfw/include", | ||||
|   "./../libs/tinygltf", | ||||
|   "./../libs/glew/include", | ||||
|   "./../libs/glm", | ||||
|   "./../libs/ImGui", | ||||
|    | ||||
|   "../libs/entt/src", | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| libdirs { | ||||
|   './../YoggieEngine/build/Debug' | ||||
| } | ||||
|  | ||||
| files {  | ||||
|   "./src/*.h", | ||||
|   "./src/*.cpp" | ||||
| } | ||||
							
								
								
									
										87
									
								
								SandboxApp/src/GUI.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								SandboxApp/src/GUI.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | ||||
| #include "GUI.h" | ||||
|  | ||||
|  | ||||
| void SceneExplorer(const std::string& PanelName) { | ||||
|     ImGui::Begin(PanelName.c_str());  | ||||
|         //if (ImGui::ListBoxHeader("##ObjectList")) { | ||||
|             //Node& current = scene.GetRoot(); | ||||
|  | ||||
|            //Node* next = ¤t; | ||||
|  | ||||
|            // Show first node | ||||
|            //ImGui::Selectable(next->name.c_str(), true); | ||||
|            // ImGui::Selectable("Scene Node", true); | ||||
|             // ImGui::Indent(); | ||||
|  | ||||
|              /* | ||||
|  | ||||
|              if (next->children.size() != 0) { | ||||
|                  for (auto child : next->children) | ||||
|                  { | ||||
|                      std::string& name = child->name; | ||||
|                      ImGui::Selectable(name.c_str(), false); | ||||
|                  } | ||||
|              } | ||||
|  | ||||
|              */ | ||||
|  | ||||
|          //   ImGui::ListBoxFooter(); | ||||
|         // } | ||||
|     ImGui::End(); | ||||
| }   | ||||
|  | ||||
|      | ||||
|  | ||||
| void CameraTool() { | ||||
|     static float Zoom = 0; | ||||
|     static glm::vec3 Position = glm::vec3(0.0f, 0.0f, 0.0f); | ||||
|     static glm::vec3 Rotation = glm::vec3(0.0f, 0.0f, 0.0f); | ||||
|  | ||||
|  | ||||
|     ImGui::Begin("Camera"); | ||||
|  | ||||
|  | ||||
|     ImGui::SliderFloat("Zoom:", &Zoom, 10, 190); | ||||
|  | ||||
|     ImGui::InputFloat3("Position:", &Position[0]); | ||||
|  | ||||
|     ImGui::InputFloat3("Rotation:", &Rotation[0]); | ||||
|  | ||||
|     ImGui::End(); | ||||
| } | ||||
|  | ||||
| void ScriptingTool(char* code) { | ||||
|     ImGui::Begin("Scripting"); | ||||
|  | ||||
|     ImGui::Text("Lua Code"); | ||||
|     ImGui::InputTextMultiline("##", code, 255); | ||||
|     bool runCode = ImGui::Button("Run"); | ||||
|  | ||||
|  | ||||
|     ImGui::End(); | ||||
|  | ||||
| } | ||||
|  | ||||
| void SceneView(Framebuffer& framebuffer ) { | ||||
|     ImGui::Begin("Viewport"); | ||||
|         ImGui::Image((void*)(intptr_t)framebuffer.GetColourAttachment(), ImVec2{800, 600}); | ||||
|     ImGui::End(); | ||||
| } | ||||
|  | ||||
| /* | ||||
| * void transformWindow(Transform& transform, std::string PanelName) { | ||||
|     ImGui::Begin(PanelName.c_str()); | ||||
|     ImGui::InputFloat3("Position:", (float*)&transform.Position[0]); | ||||
|     ImGui::InputFloat3("Rotation:", (float*)&transform.Rotation[0]); | ||||
|     ImGui::InputFloat3("Scale:", (float*)&transform.Scale[0]); | ||||
|     ImGui::End(); | ||||
|  | ||||
| } | ||||
|  | ||||
| */ | ||||
|  | ||||
| void materialWindow(Material& material, std::string PanelName) { | ||||
|     ImGui::Begin(PanelName.c_str()); | ||||
|     ImGui::ColorPicker3("Color:", &material.Color[0]); | ||||
|     ImGui::End(); | ||||
| } | ||||
							
								
								
									
										11
									
								
								SandboxApp/src/GUI.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								SandboxApp/src/GUI.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| #pragma once | ||||
| #include "imgui.h" | ||||
| #include "../../YoggieEngine/src/BarinkEngine.h" | ||||
| #include "../../YoggieEngine/src/Graphics/Memory/Framebuffer.h" | ||||
|  | ||||
| void CameraTool(); | ||||
| void ScriptingTool(char* code); | ||||
| ///void transformWindow(Transform& transform, std::string PanelName); | ||||
| void materialWindow(Material& material, std::string PanelName); | ||||
| void SceneExplorer(const std::string& PanelName); | ||||
| void SceneView(Framebuffer& framebuffer); | ||||
							
								
								
									
										123
									
								
								SandboxApp/src/Sandbox.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								SandboxApp/src/Sandbox.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,123 @@ | ||||
| #include <imgui.h> | ||||
| #include "GUI.h" | ||||
| #include "Util.h" | ||||
| #include <entt/entt.hpp> | ||||
|  | ||||
| #include "../../YoggieEngine/src/BarinkEngine.h" | ||||
| #include "../../YoggieEngine/src/Scene/Components.h" | ||||
| #include "../../YoggieEngine/src/Scene/Scene.h" | ||||
| #include "../../YoggieEngine/src/Scene/Entity.h" | ||||
| #include "../../YoggieEngine/src/AssetManager/ModelImporter.h" | ||||
| #include "../../YoggieEngine/src/PerfCounter.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
| * Define globals | ||||
| */ | ||||
| Scene scene; | ||||
|  | ||||
| BarinkEngine::Renderable* renderable; | ||||
| BarinkEngine::SceneObject* object; | ||||
| Entity cube; | ||||
|  | ||||
| /* | ||||
| * Runs once at startup  | ||||
| * - USe to initialize the game/sandbox/demo | ||||
| */ | ||||
| void Start() { | ||||
|     auto importer = BarinkEngine::ModelImporter(); | ||||
|  | ||||
|     // Load in asset(S) | ||||
|     object = importer.Import("build/Debug/Models/Cube.obj"); | ||||
|     renderable = object->renderable; | ||||
|  | ||||
|  | ||||
|     // Add Entities to the scene | ||||
|     cube  = scene.AddEntity("cube"); | ||||
|     auto& render3DComponent = cube.AddComponent<BarinkEngine::Render3DComponent>(); | ||||
|     render3DComponent.mesh = *renderable->mesh; | ||||
|     cube.GetComponent<BarinkEngine::TransformComponent>() | ||||
|         .transform = glm::rotate(glm::mat4(1.0f), 32.0f, glm::vec3(0.5f,1.0f,0.0f)); | ||||
|  | ||||
|  | ||||
|     // Create a second cube | ||||
|     | ||||
|     auto cube2 = scene.AddEntity("Cube2"); | ||||
|     auto& cube2Render = cube2.AddComponent<BarinkEngine::Render3DComponent>(); | ||||
|     cube2Render.mesh = *renderable->mesh; | ||||
|     cube2Render.color = glm::vec3(0.0f, 1.0f, 0.0f); | ||||
|     auto& cube2Trans = cube2.GetComponent<BarinkEngine::TransformComponent>(); | ||||
|     cube2Trans.transform = glm::translate( glm::mat4(1.0f), glm::vec3(1.0f,0.0f, 5.0f)); | ||||
|  | ||||
|     // Create a light  | ||||
|     auto AmbientLight = scene.AddEntity("AmbientLight"); | ||||
|     AmbientLight.AddComponent<BarinkEngine::LightComponent>(); | ||||
|  | ||||
|     renderer.Prepare(scene); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
| * Runs every frame | ||||
| * - Use to draw Immediate mode graphics (Not meant for HUD's ) | ||||
| */ | ||||
| void ImmediateGraphicsDraw()  | ||||
| { | ||||
|     // Show internal BarinkEngine stats | ||||
|     EngineInstrumentation::ShowStats(); | ||||
|  | ||||
|     ImGui::Begin("Scene view"); | ||||
|     auto group = scene.getReg().view<BarinkEngine::IdentifierComponent>(); | ||||
|     group.each([](auto entity, BarinkEngine::IdentifierComponent& identifier) { | ||||
|          | ||||
|         ImGui::Text("%s", identifier.name.c_str()); | ||||
|          | ||||
|         }); | ||||
|     ImGui::End(); | ||||
|  | ||||
|     ImGui::ShowMetricsWindow(); | ||||
|  | ||||
|     ImGui::Begin("Settings"); | ||||
|          | ||||
|  | ||||
|         auto& a = cube.GetComponent<BarinkEngine::Render3DComponent>(); | ||||
|      | ||||
|         auto& b = cube.GetComponent<BarinkEngine::TransformComponent>(); | ||||
|  | ||||
|         ImGui::DragFloat3("Color", &a.color[0], 0.01f, 0.0f, 1.0f); | ||||
|  | ||||
|         ImGui::DragFloat3("Position", &b.transform[3][0], 0.01f, 0.0f, 16.0f); | ||||
|  | ||||
|         auto l = scene.getReg().view<BarinkEngine::LightComponent>(); | ||||
|         l.each([](auto entity, BarinkEngine::LightComponent& light) { | ||||
|             ImGui::Text("Lighting"); | ||||
|             ImGui::SliderFloat("Intensity", &light.Strength, 0.0f, 1.0f); | ||||
|             ImGui::SliderFloat3("l-Color", &light.Color[0], 0.0f, 1.0f); | ||||
|  | ||||
|         }); | ||||
|      | ||||
|     ImGui::End(); | ||||
|  | ||||
| } | ||||
|  | ||||
| /* | ||||
| * Runs every frame | ||||
| * - Meant for game logic ( non-physics related)  | ||||
| */ | ||||
| void Update() | ||||
| { | ||||
| } | ||||
|  | ||||
| void Render()  | ||||
| { | ||||
|     renderer.Render(scene); | ||||
| } | ||||
|  | ||||
| /* | ||||
| * Runs at the end of the program | ||||
| * - Meant for cleanup | ||||
| */ | ||||
| void Stop() | ||||
| { | ||||
| } | ||||
| @ -1,6 +1,7 @@ | ||||
| #include "Util.h" | ||||
| 
 | ||||
| void PrintSceneTree(SceneNode& node, int depth) { | ||||
| /*
 | ||||
| * void PrintSceneTree(Node& node, int depth) { | ||||
|     // Indent name based on depth
 | ||||
|     std::cout << " "; | ||||
|     for (int i = 0; i < depth; i++) { | ||||
| @ -30,3 +31,5 @@ glm::mat4 CalculateModelMat(Transform& transform) { | ||||
|     return tran * rot * scale; | ||||
| } | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
							
								
								
									
										6
									
								
								SandboxApp/src/Util.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								SandboxApp/src/Util.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| #pragma once | ||||
| #include "../../YoggieEngine/src/BarinkEngine.h" | ||||
|  | ||||
| //void PrintSceneTree(Node& node, int depth); | ||||
|  | ||||
| //glm::mat4 CalculateModelMat(Transform& transform); | ||||
| @ -1,41 +0,0 @@ | ||||
| #include "GUI.h" | ||||
|  | ||||
| void CameraTool(Camera* cam) { | ||||
|  | ||||
|     ImGui::Begin("Camera"); | ||||
|  | ||||
|     ImGui::SliderFloat("Zoom:", &cam->Zoom, 10, 190); | ||||
|  | ||||
|     ImGui::InputFloat3("Position:", &cam->Position[0]); | ||||
|  | ||||
|     ImGui::InputFloat3("Rotation:", &cam->Rotation[0]); | ||||
|  | ||||
|     ImGui::End(); | ||||
| } | ||||
|  | ||||
| void ScriptingTool(char* code) { | ||||
|     ImGui::Begin("Scripting"); | ||||
|  | ||||
|     ImGui::InputTextMultiline("Lua Script", code, 255); | ||||
|     bool runCode = ImGui::Button("Run"); | ||||
|  | ||||
|  | ||||
|     ImGui::End(); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| void transformWindow(Transform& transform, std::string PanelName) { | ||||
|     ImGui::Begin(PanelName.c_str()); | ||||
|     ImGui::InputFloat3("Position:", (float*)&transform.Position[0]); | ||||
|     ImGui::InputFloat3("Rotation:", (float*)&transform.Rotation[0]); | ||||
|     ImGui::InputFloat3("Scale:", (float*)&transform.Scale[0]); | ||||
|     ImGui::End(); | ||||
|  | ||||
| } | ||||
|  | ||||
| void materialWindow(Material& material, std::string PanelName) { | ||||
|     ImGui::Begin(PanelName.c_str()); | ||||
|     ImGui::ColorPicker3("Color:", &material.Color[0]); | ||||
|     ImGui::End(); | ||||
| } | ||||
| @ -1,8 +0,0 @@ | ||||
| #pragma once | ||||
| #include "imgui.h" | ||||
| #include <BarinkEngine.h> | ||||
|  | ||||
| void CameraTool(Camera* camera); | ||||
| void ScriptingTool(char* code); | ||||
| void transformWindow(Transform& transform, std::string PanelName); | ||||
| void materialWindow(Material& material, std::string PanelName); | ||||
| @ -1,174 +0,0 @@ | ||||
| #include "BarinkEngine.h" | ||||
| #include "imgui.h" | ||||
| #include "GUI.h" | ||||
| #include "Util.h" | ||||
|  | ||||
| /* | ||||
| * Define globals | ||||
| */ | ||||
| Camera* cam; | ||||
|  | ||||
|  | ||||
| Shader* shader; | ||||
|  | ||||
| Renderable* Cube; | ||||
| Material* matCube; | ||||
| Texture* textureCube; | ||||
|  | ||||
| Renderable* Cube2; | ||||
| Material* matCube2; | ||||
|  | ||||
| char* code = new char[254]; | ||||
|  | ||||
|  | ||||
| const std::string vertexShaderSource = "build/SandboxApplication/Debug/test.vs"; | ||||
| const std::string fragmentShaderSource = "build/SandboxApplication/Debug/test.fs"; | ||||
|  | ||||
|  | ||||
|  | ||||
| /* | ||||
| * Runs once at startup  | ||||
| * - USe to initialize the game/sandbox/demo | ||||
| */ | ||||
| void Start() { | ||||
|  | ||||
|     /* | ||||
|         Building a very basic scene graph | ||||
|     */ | ||||
|     SceneNode MyCube = SceneNode(); | ||||
|     MyCube.name = "MyCube"; | ||||
|  | ||||
|     SceneNode MyBaby = SceneNode(); | ||||
|     MyBaby.name = "Baby"; | ||||
|  | ||||
|     SceneNode MySecondCube = SceneNode(); | ||||
|     MySecondCube.name = "MySecondCube"; | ||||
|  | ||||
|  | ||||
|     MyCube.addChild(MyBaby); | ||||
|  | ||||
|      | ||||
|     Scene scene = Scene("My awesome Game Scene"); | ||||
|     scene.GetRoot().addChild(MyCube); | ||||
|     scene.GetRoot().addChild(MySecondCube); | ||||
|  | ||||
|  | ||||
|    // Walk scene graph | ||||
|     PrintSceneTree(scene.GetRoot(),0); | ||||
|  | ||||
|     shader = new Shader(vertexShaderSource, fragmentShaderSource); | ||||
|  | ||||
|     textureCube = new Texture("build/SandboxApplication/Debug/Textures/wall.jpg"); | ||||
|  | ||||
|     matCube = new Material(*shader); | ||||
|     matCube->Color = glm::vec3(1.0, 0.0, 0.0); | ||||
|  | ||||
|     matCube2 = new Material(*shader); | ||||
|     matCube2->Color = glm::vec3(0.0, 1.0f, 0.0); | ||||
|  | ||||
|     /* | ||||
|     * load meshes  | ||||
|     */ | ||||
|     Cube = Renderable::Load(); | ||||
|     Cube2 = Renderable::Load(); | ||||
|     Cube->addChild(*Cube2); | ||||
|  | ||||
|     Cube->shader = shader; | ||||
|     Cube2->shader = shader; | ||||
|  | ||||
|     Cube->texture = textureCube; | ||||
|     Cube2->texture = textureCube; | ||||
|  | ||||
|     Cube2->transform.Position = glm::vec3(-9.0f, 0.0f, 0.0f); | ||||
|  | ||||
|     Cube->transform.Position = glm::vec3(-8.0f, 0.0f, -2.0f); | ||||
|  | ||||
|     cam = new Camera(glm::vec3(0.0f, 1.5f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f), 90.0f); | ||||
|  | ||||
|     memset(code, '\0', 254); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
| * Runs every frame | ||||
| * - Use to draw Immediate mode graphics (Not meant for HUD's ) | ||||
| */ | ||||
| void ImmediateGraphicsDraw() { | ||||
|     ImGui::NewFrame(); | ||||
|  | ||||
|     // Show ImGui demo such that I can easily look | ||||
|     // at possible GUI elements to use | ||||
|     ImGui::ShowDemoWindow(); | ||||
|  | ||||
|  | ||||
|     // Show internal BarinkEngine stats | ||||
|     ShowStats(); | ||||
|  | ||||
|  | ||||
|     // Show different tooling for this specific sandbox | ||||
|     CameraTool(cam); | ||||
|     ScriptingTool(code); | ||||
|  | ||||
|     transformWindow(Cube->transform, "Transform (Cube)"); | ||||
|  | ||||
|     transformWindow(Cube2->transform, "Transform (Cube2)"); | ||||
|  | ||||
|     materialWindow(*matCube, "Material Cube"); | ||||
|     materialWindow(*matCube2, "Material Cube2"); | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /* | ||||
| * Runs every frame | ||||
| * - Meant for game logic ( non-physics related)  | ||||
| */ | ||||
| void Update() | ||||
| { | ||||
|  | ||||
|  | ||||
|     /* | ||||
|     * NOTE: this needs to move to the renderer | ||||
|     * Render code should not appear in the sandbox file | ||||
|     */ | ||||
|     glm::mat4 projection = glm::perspective(glm::radians(cam->Zoom), (800.0f / 600.0f), 0.001f, 100.0f); | ||||
|  | ||||
|     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | ||||
|  | ||||
|     shader->Use(); | ||||
|     shader->setUniformMat4("P", projection); | ||||
|     shader->setUniformMat4("M", CalculateModelMat(Cube->transform)); | ||||
|     shader->setUniformMat4("V", cam->GetViewMatrix()); | ||||
|     matCube->Apply(); | ||||
|  | ||||
|     Cube->Draw(); | ||||
|  | ||||
|     shader->setUniformMat4("M", CalculateModelMat(Cube2->transform)); | ||||
|     matCube2->Apply(); | ||||
|  | ||||
|     Cube2->Draw(); | ||||
|  | ||||
| } | ||||
|  | ||||
| /* | ||||
| * Runs at the end of the program | ||||
| * - Meant for cleanup | ||||
| */ | ||||
| void Stop() { | ||||
|     // Cleanup | ||||
|     Cube->VAO.Delete(); | ||||
|     Cube->elementBuffer.Delete(); | ||||
|  | ||||
|     Cube2->VAO.Delete(); | ||||
|     Cube2->elementBuffer.Delete(); | ||||
|  | ||||
|     delete Cube2; | ||||
|     delete Cube; | ||||
|  | ||||
|     delete matCube; | ||||
|     delete matCube2; | ||||
|  | ||||
|     delete shader; | ||||
| } | ||||
| @ -1,6 +0,0 @@ | ||||
| #pragma once | ||||
| #include "BarinkEngine.h" | ||||
|  | ||||
| void PrintSceneTree(SceneNode& node, int depth); | ||||
|  | ||||
| glm::mat4 CalculateModelMat(Transform& transform); | ||||
							
								
								
									
										
											BIN
										
									
								
								Screenshots/ImprovedRendering.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Screenshots/ImprovedRendering.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Screenshots/Yoggie.webp
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Screenshots/Yoggie.webp
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Screenshots/YoggieEditorV0.2.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Screenshots/YoggieEditorV0.2.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Screenshots/YoggieEditor_workingGuizmo.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Screenshots/YoggieEditor_workingGuizmo.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Screenshots/screen2.png
									 (Stored with Git LFS)
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Screenshots/screen2.png
									 (Stored with Git LFS)
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										42
									
								
								TODO.md
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								TODO.md
									
									
									
									
									
								
							| @ -1,25 +1,25 @@ | ||||
| # Project Planning | ||||
|  | ||||
| **NOTE:** __Fairly detailed planning__ | ||||
|  | ||||
|  | ||||
| <input type="checkbox" checked></input> Setup build system  \ | ||||
| <input type="checkbox" checked></input> Link with GLFW  \ | ||||
| <input type="checkbox" checked></input> Basic Window  \ | ||||
| <input type="checkbox" checked></input> Basic Triangle rendering  \ | ||||
| <input type="checkbox" checked></input> Basic IMGui \ | ||||
| <input type="checkbox"></input> Basic Textures  \ | ||||
| <input type="checkbox" checked></input> Link GLEW or GLAD \ | ||||
| <input type="checkbox" checked></input> Work on basic logging  \ | ||||
| <input type="checkbox"></input> Input handling  \ | ||||
| <input type="checkbox"></input> More shader work  \ | ||||
| <input type="checkbox" checked></input> Load FBX model files  \ | ||||
| <input type="checkbox"></input> Basic Physics  \ | ||||
| <input type="checkbox" checked> Running LUA \ | ||||
| <input type="checkbox"> Lua Scripting   \ | ||||
| <input type="checkbox"></input> To far in the future  | ||||
|  | ||||
| <input type="checkbox" checked> Setup build system</input>\ | ||||
| <input type="checkbox" checked>Link with GLFW</input>\ | ||||
| <input type="checkbox" checked>Link GLEW or GLAD</input>\ | ||||
| <input type="checkbox" checked>Basic Window</input>\ | ||||
| <input type="checkbox" checked>Work on basic logging</input>\ | ||||
| <input type="checkbox" checked>Running LUA</input>\ | ||||
| <input type="checkbox" checked>Basic triangle rendering</input>\ | ||||
| <input type="checkbox" checked>Load model files</input>\ | ||||
| <input type="checkbox" checked>Basic ImGui </input>\ | ||||
| <input type="checkbox" checked>Skybox support</input>\ | ||||
| <input type="checkbox">Basic Textures <i>(Soon)</i></input>\ | ||||
| <input type="checkbox">More shader work <i>(Hopefully coming in January)</i></input>   \ | ||||
| <input type="checkbox">Input handling <i>(Soon)</i></input>\ | ||||
| <input type="checkbox">Basic Physics <i>(Almost implemented)</i></input>\ | ||||
| <input type="checkbox">Lua Scripting <i>(Soon)</i> </input>\ | ||||
| <input type="checkbox">Basic Sound system</input> | ||||
| ### What's next? | ||||
| I am not sure what's going to be added next  | ||||
|  | ||||
| ## Resources  | ||||
| https://renderdoc.org/ | ||||
| https://api.projectchrono.org/tutorial_table_of_content_chrono.html | ||||
| https://renderdoc.org/  \ | ||||
| https://api.projectchrono.org/tutorial_table_of_content_chrono.html \ | ||||
| https://github.com/epezent/implot  -- Useful when displaying graphs of any kind \  | ||||
							
								
								
									
										83
									
								
								YoggieEngine/premake5.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								YoggieEngine/premake5.lua
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,83 @@ | ||||
| project "YoggieEngine" | ||||
|   kind "StaticLib" | ||||
|  | ||||
|   pchheader "YoggieEngine.h" | ||||
|   pchsource "src/YoggieEngine.cpp" | ||||
|  | ||||
|  | ||||
|   buildmessage "Building Yoggie Engine" | ||||
|   disablewarnings{ | ||||
|     "4099" -- Ignore the missing debug signals for GLFW warning | ||||
|      | ||||
|   }   | ||||
|  | ||||
|  | ||||
|   includedirs { | ||||
|     "./src", | ||||
|     "../libs/spdlog/include", | ||||
|     "../libs/glm", | ||||
|  | ||||
|     "../libs/glfw/include", | ||||
|     "../libs/glew/include", | ||||
|     "../libs/glad/include", | ||||
|  | ||||
|  | ||||
|     "../libs/assimp/include", | ||||
|     "../libs/entt/src", | ||||
|  | ||||
|     "../libs/physx/pxshared/include", | ||||
|     "../libs/physx/physx/include", | ||||
|      | ||||
|     "../libs/lua/include", | ||||
|  | ||||
|     "../libs/GorillaAudio/include", | ||||
|     "../libs/steam-audio/include", | ||||
|  | ||||
|     "../libs/ImGui", | ||||
|   } | ||||
|  | ||||
|   links { | ||||
|     -- This needs to fall under the filter as the names can differ on different platforms  | ||||
|     "phonon", | ||||
|     "lua54", | ||||
|     "spdlog", | ||||
|     "assimp-vc143-mtd", | ||||
|     "glfw3", | ||||
|     "ImGui", | ||||
|  | ||||
|     "PhysX_64", | ||||
|     "PhysXCooking_64", | ||||
|     "PhysXCommon_64", | ||||
|     "PhysXFoundation_64", | ||||
|     "PhysXPvdSDK_static_64", | ||||
|     "PhysXExtensions_static_64" | ||||
|      | ||||
|   } | ||||
|  | ||||
|  | ||||
|   libdirs { | ||||
|     "../libs/steam-audio/lib/windows-x64", | ||||
|     "../libs/lua", | ||||
|     "../libs/spdlog/build/Release", | ||||
|     "../libs/assimp/lib/Debug", | ||||
|     "../libs/glfw/build/src/Debug", | ||||
|     "../libs/physx/physx/bin/win.x86_64.vc142.md/debug" | ||||
|     | ||||
|   } | ||||
|  | ||||
|   files { | ||||
|  | ||||
|     "./src/**.cpp", | ||||
|     "./src/**.h" | ||||
|   } | ||||
|  | ||||
|   prebuildcommands  | ||||
|   { | ||||
|     ok,err = os.copyfile("YoggieEngine/src/Graphics/shaders/*" ,"SandboxApp/build/Debug/") | ||||
|   } | ||||
|  | ||||
|   postbuildcommands  | ||||
|   { | ||||
|     ok,err = os.copyfile("YoggieEngine/build/Debug/intermediates/YoggieEngine.pch", "YoggieEngine/build/Debug/YoggieEngine.pch") | ||||
|   } | ||||
|  | ||||
							
								
								
									
										20
									
								
								YoggieEngine/src/Application.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								YoggieEngine/src/Application.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| #include <YoggieEngine.h> | ||||
| #include "Application.h" | ||||
|  | ||||
| namespace YoggieEngine { | ||||
|  | ||||
| 	Application::Application(const std::string& name) | ||||
| 		: m_AppName(name) | ||||
| 	{ | ||||
| 		EngineInstrumentation::PerfomanceSamplerInit(); | ||||
|  | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	void Application::Run() { | ||||
| 		std::cout << "No run function implemented!"; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	Application::~Application() {} | ||||
| } | ||||
							
								
								
									
										19
									
								
								YoggieEngine/src/Application.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								YoggieEngine/src/Application.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| #pragma once | ||||
| #include "YoggieEngine.h" | ||||
|  | ||||
|  | ||||
| namespace YoggieEngine { | ||||
|  | ||||
| 	class Application { | ||||
| 	public: | ||||
| 		Application(const std::string& name); | ||||
| 		~Application(); | ||||
| 		virtual void Run(); | ||||
|  | ||||
|  | ||||
| 	protected: | ||||
| 		std::string m_AppName; | ||||
| 		friend class ApplicationRuntime; | ||||
| 	}; | ||||
|  | ||||
| }; | ||||
							
								
								
									
										102
									
								
								YoggieEngine/src/AssetManager/ModelImporter.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								YoggieEngine/src/AssetManager/ModelImporter.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | ||||
| #include <YoggieEngine.h> | ||||
| #include "ModelImporter.h" | ||||
|  | ||||
| namespace YoggieEngine { | ||||
|  | ||||
|     SceneObject* ModelImporter::Import(const std::string path) | ||||
|     { | ||||
|         SceneObject* root = new SceneObject(std::string(path), nullptr); | ||||
|  | ||||
|         Assimp::Importer importer; | ||||
|         const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs); | ||||
|  | ||||
|         aiNode* currentNode = scene->mRootNode; | ||||
|  | ||||
|         std::vector<Mesh> meshes = processNode(currentNode, scene); | ||||
|  | ||||
|         std::cout << "[DEBUG]: Loaded " << meshes.size() << " meshes!" << std::endl; | ||||
|  | ||||
|         // create a renderable (per mesh ?? )  | ||||
|         root->renderable = new Renderable(); | ||||
|         root->renderable->mesh = new Mesh(meshes[0]); | ||||
|  | ||||
|         return root; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     std::vector<Mesh> ModelImporter::processNode(aiNode* node, const aiScene* scene) | ||||
|     { | ||||
|  | ||||
|         std::vector<Mesh> meshes; | ||||
|  | ||||
|         for (unsigned int i = 0; i < node->mNumMeshes; i++) { | ||||
|             aiMesh* mesh = scene->mMeshes[node->mMeshes[i]]; | ||||
|             meshes.push_back(processMesh(mesh, scene)); | ||||
|         } | ||||
|  | ||||
|         for (unsigned int i = 0; i < node->mNumChildren; i++) { | ||||
|             auto m2 = processNode(node->mChildren[i], scene); | ||||
|  | ||||
|             for (auto m : m2) { | ||||
|                 meshes.push_back(m); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return meshes; | ||||
|     } | ||||
|  | ||||
|     Mesh ModelImporter::processMesh(aiMesh* mesh, const aiScene* scene) { | ||||
|         std::vector<unsigned int> indices; | ||||
|         std::vector<Vertex> vertices; | ||||
|  | ||||
|         ProcessVertices(mesh, vertices); | ||||
|  | ||||
|         ProcessIndices(mesh, indices); | ||||
|  | ||||
|         Mesh result; | ||||
|         result.vertices = vertices; | ||||
|         result.elements = indices; | ||||
|  | ||||
|  | ||||
|         return result; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     void ProcessVertices(aiMesh* mesh, std::vector<Vertex>& out_vertices) { | ||||
|         // Process vertices | ||||
|         for (unsigned int i = 0; i < mesh->mNumVertices; i++) { | ||||
|             Vertex v{}; | ||||
|             glm::vec3 vector; | ||||
|             vector.x = mesh->mVertices[i].x; | ||||
|             vector.y = mesh->mVertices[i].y; | ||||
|             vector.z = mesh->mVertices[i].z; | ||||
|  | ||||
|             v.vertices = vector; | ||||
|  | ||||
|             if (mesh->mTextureCoords[0]) { | ||||
|  | ||||
|                 glm::vec2 texCoord; | ||||
|  | ||||
|                 texCoord.x = mesh->mTextureCoords[0][i].x; | ||||
|                 texCoord.y = mesh->mTextureCoords[0][i].y; | ||||
|  | ||||
|                 v.uv = texCoord; | ||||
|  | ||||
|             } | ||||
|  | ||||
|             out_vertices.push_back(v); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void ProcessIndices(aiMesh* mesh, std::vector<unsigned int>& out_indices) { | ||||
|         // Process Indices | ||||
|         for (unsigned int i = 0; i < mesh->mNumFaces; i++) { | ||||
|             aiFace face = mesh->mFaces[i]; | ||||
|             if (face.mNumIndices < 3) | ||||
|                 continue; | ||||
|             for (unsigned int j = 0; j < face.mNumIndices; j++) { | ||||
|                 out_indices.push_back(face.mIndices[j]); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										31
									
								
								YoggieEngine/src/AssetManager/ModelImporter.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								YoggieEngine/src/AssetManager/ModelImporter.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| #pragma once | ||||
| #define STB_IMAGE_IMPLEMENTATION | ||||
| #define STB_IMAGE_WRITE_IMPLEMENTATION | ||||
|  | ||||
| #include "../Graphics/Primitives/Mesh.h" | ||||
| #include <assimp/Importer.hpp> | ||||
| #include <assimp/scene.h> | ||||
| #include <assimp/postprocess.h>  | ||||
| #include <string> | ||||
| #include "../Scene/TransformTree/SceneNodeTypes.h" | ||||
|  | ||||
| namespace YoggieEngine { | ||||
| 	void ProcessVertices(aiMesh* mesh, std::vector<Vertex>& out_vertices); | ||||
| 	void ProcessIndices(aiMesh* mesh, std::vector<unsigned int>& out_indices); | ||||
|  | ||||
| 	class ModelImporter { | ||||
|  | ||||
| 	public: | ||||
|  | ||||
| 		SceneObject* Import(const std::string path); | ||||
|  | ||||
|  | ||||
| 	private: | ||||
|  | ||||
| 		static Mesh ModelImporter::processMesh(aiMesh* mesh, const aiScene* scene); | ||||
| 		static std::vector<Mesh> ModelImporter::processNode(aiNode* node, const aiScene* scene); | ||||
|  | ||||
|  | ||||
|  | ||||
| 	}; | ||||
| } | ||||
							
								
								
									
										22
									
								
								YoggieEngine/src/EntryPoint.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								YoggieEngine/src/EntryPoint.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| #pragma once | ||||
| #include "YoggieEngine.h" | ||||
|  | ||||
| extern YoggieEngine::Application* CreateApplication(); | ||||
|  | ||||
| namespace YoggieEngine  | ||||
| { | ||||
| 	int entryPoint()  | ||||
| 	{ | ||||
| 		Application* app = CreateApplication(); | ||||
| 		app->Run(); | ||||
|  | ||||
| 		delete app; | ||||
| 		return 0; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| int main(int argc, char** argv) { | ||||
|  | ||||
| 	return YoggieEngine::entryPoint(); | ||||
|  | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user