Compare commits
84 Commits
Feature/In
...
0b2148ad55
Author | SHA1 | Date | |
---|---|---|---|
0b2148ad55 | |||
95f77209cf | |||
f7e087ee8d | |||
e52db0fafd | |||
5bdc0034d1 | |||
ceb485018f | |||
daf26c304b | |||
550c1b6e5b | |||
c82398205a | |||
43fc721413 | |||
52747202d3 | |||
fef75ec64b | |||
3c38e2a988 | |||
e9852fe0e7 | |||
8e202f9d59 | |||
d8627d0357 | |||
ec8045c4f4 | |||
042dc3a457 | |||
28927d9a4e | |||
89f5b1497f | |||
7448017701 | |||
ba69726e33 | |||
7223c20f1d | |||
282844b905 | |||
145338d666 | |||
79b68fbff1 | |||
13f67a7cdb | |||
d5a6ddb9d5 | |||
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
|
*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.webp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xcf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
13
.gitignore
vendored
13
.gitignore
vendored
@ -1,12 +1,11 @@
|
|||||||
build/
|
**/build/
|
||||||
intermediates/
|
**/intermediates/
|
||||||
tools/
|
tools/
|
||||||
*.make
|
*.make
|
||||||
Makefile
|
Makefile
|
||||||
.vscode/
|
.vscode/
|
||||||
libs/lua
|
libs/lua
|
||||||
libs/glad
|
libs/glad
|
||||||
Debug/
|
|
||||||
*.sln
|
*.sln
|
||||||
*.vcxproj
|
*.vcxproj
|
||||||
*.vcxproj.filters
|
*.vcxproj.filters
|
||||||
@ -18,3 +17,11 @@ x64/
|
|||||||
!sponza.gltf
|
!sponza.gltf
|
||||||
|
|
||||||
imgui.ini
|
imgui.ini
|
||||||
|
libs/physx/physx/include/
|
||||||
|
libs/physx/physx/compiler/
|
||||||
|
libs/physx/physx/buildtools/
|
||||||
|
libs/physx/physx/bin/
|
||||||
|
libs/nativefiledialog/build/
|
||||||
|
.docker
|
||||||
|
|
||||||
|
**/bin/
|
||||||
|
25
.gitmodules
vendored
25
.gitmodules
vendored
@ -4,12 +4,10 @@
|
|||||||
[submodule "glm"]
|
[submodule "glm"]
|
||||||
path = libs/glm
|
path = libs/glm
|
||||||
url = https://github.com/nigelbarink/glm.git
|
url = https://github.com/nigelbarink/glm.git
|
||||||
|
ignore = untracked
|
||||||
[submodule "spdlog"]
|
[submodule "spdlog"]
|
||||||
path = libs/spdlog
|
path = libs/spdlog
|
||||||
url = https://github.com/nigelbarink/spdlog.git
|
url = https://github.com/nigelbarink/spdlog.git
|
||||||
[submodule "tinygltf"]
|
|
||||||
path = libs/tinygltf
|
|
||||||
url = https://github.com/syoyo/tinygltf.git
|
|
||||||
[submodule "GorrillaAudio"]
|
[submodule "GorrillaAudio"]
|
||||||
path = libs/GorillaAudio
|
path = libs/GorillaAudio
|
||||||
url = https://github.com/mewspring/gorilla-audio.git
|
url = https://github.com/mewspring/gorilla-audio.git
|
||||||
@ -22,6 +20,27 @@
|
|||||||
[submodule "libs/steam-audio"]
|
[submodule "libs/steam-audio"]
|
||||||
path = libs/steam-audio
|
path = libs/steam-audio
|
||||||
url = https://github.com/ValveSoftware/steam-audio.git
|
url = https://github.com/ValveSoftware/steam-audio.git
|
||||||
|
ignore = untracked
|
||||||
[submodule "libs/physx"]
|
[submodule "libs/physx"]
|
||||||
path = libs/physx
|
path = libs/physx
|
||||||
url = https://git.barink.dev/Nigel/PhysX.git
|
url = https://git.barink.dev/Nigel/PhysX.git
|
||||||
|
ignore = dirty
|
||||||
|
[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
|
||||||
|
ignore = dirty
|
||||||
|
[submodule "libs/mINI"]
|
||||||
|
path = libs/mINI
|
||||||
|
url = https://github.com/pulzed/mINI.git
|
||||||
|
[submodule "libs/imgui-filebrowser"]
|
||||||
|
path = libs/imgui-filebrowser
|
||||||
|
url = https://github.com/AirGuanZ/imgui-filebrowser.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,27 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <vector>
|
|
||||||
#include "Graphics/Window.h"
|
|
||||||
#include "EventSystem/EventEmitter.h"
|
|
||||||
|
|
||||||
namespace BarinkEngine {
|
|
||||||
|
|
||||||
class InputManager : EventEmitter {
|
|
||||||
public:
|
|
||||||
InputManager();
|
|
||||||
|
|
||||||
void PollEvents();
|
|
||||||
void attach(BarinkWindow* window);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// GLFW Handlers
|
|
||||||
static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
|
|
||||||
static void CursorPositionCallback(GLFWwindow* window, double x, double y);
|
|
||||||
static void CursorEnterCallback(GLFWwindow* window, int entered);
|
|
||||||
static void MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
|
|
||||||
static void ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
|
|
||||||
private:
|
|
||||||
std::vector<BarinkWindow*> windows;
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
@ -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
|
||||||
|
```
|
1
Editor/.gitignore
vendored
Normal file
1
Editor/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
**.dll
|
47
Editor/premake5.lua
Normal file
47
Editor/premake5.lua
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
project "Editor"
|
||||||
|
kind "ConsoleApp"
|
||||||
|
|
||||||
|
buildmessage "Building editor ..."
|
||||||
|
|
||||||
|
links{
|
||||||
|
"YoggieEngine",
|
||||||
|
"ImGuizmo",
|
||||||
|
"yaml-cpp",
|
||||||
|
"nfd"
|
||||||
|
}
|
||||||
|
|
||||||
|
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"],
|
||||||
|
incfolder["mINI"]
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
BIN
Editor/rsc/Yoggie.png
(Stored with Git LFS)
Normal file
BIN
Editor/rsc/Yoggie.png
(Stored with Git LFS)
Normal file
Binary file not shown.
56
Editor/src/AssetManagement/Asset.h
Normal file
56
Editor/src/AssetManagement/Asset.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
#include <filesystem>
|
||||||
|
#include <string>
|
||||||
|
#include "uuid.h"
|
||||||
|
|
||||||
|
enum class ASSET_TYPE {
|
||||||
|
Unknown = -1,
|
||||||
|
Mesh,
|
||||||
|
Texture,
|
||||||
|
Material,
|
||||||
|
Shader,
|
||||||
|
Model,
|
||||||
|
File
|
||||||
|
};
|
||||||
|
|
||||||
|
class Asset {
|
||||||
|
public:
|
||||||
|
Asset(const char* name): name(name) {}
|
||||||
|
|
||||||
|
virtual ASSET_TYPE GetType() { return detectAssetType(); }
|
||||||
|
|
||||||
|
const char* GetName() const { return name.c_str(); }
|
||||||
|
void setName(std::string& name) { name = name.c_str(); }
|
||||||
|
void setFilPath(std::string& path) { file = std::filesystem::path(path); }
|
||||||
|
|
||||||
|
std::string getId() { return Id.String(); }
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uuid::v4::UUID Id = uuid::v4::UUID::New();
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
std::filesystem::path file;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ASSET_TYPE detectAssetType() {
|
||||||
|
auto ext = (file.extension()).string();
|
||||||
|
if (ext == ".obj" || ext == ".gltf" || ext == ".fbx" || ext == ".stl") {
|
||||||
|
return ASSET_TYPE::Model;
|
||||||
|
}
|
||||||
|
else if (ext == ".yproj") {
|
||||||
|
return ASSET_TYPE::File;
|
||||||
|
}
|
||||||
|
else if (ext == ".vs" || ext == ".fs") {
|
||||||
|
return ASSET_TYPE::File;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
spdlog::warn("unknown file!");
|
||||||
|
return ASSET_TYPE::Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
105
Editor/src/AssetManagement/AssetFinder.h
Normal file
105
Editor/src/AssetManagement/AssetFinder.h
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
#include "../EditorWindow.h"
|
||||||
|
#include "AssetRegistry.h"
|
||||||
|
|
||||||
|
const char* hidden_extensions [] {
|
||||||
|
".exe",
|
||||||
|
".pdb",
|
||||||
|
".idb",
|
||||||
|
".dll",
|
||||||
|
".ini"
|
||||||
|
};
|
||||||
|
|
||||||
|
class AssetFinder : public EditorWindow {
|
||||||
|
public:
|
||||||
|
AssetFinder () : EditorWindow("Assets") {}
|
||||||
|
AssetFinder(const std::filesystem::path& projectdirectory) : EditorWindow("Assets")
|
||||||
|
{
|
||||||
|
assetIcon = YoggieEngine::Texture("rsc/AssetIcon.png");
|
||||||
|
|
||||||
|
spdlog::info("asset iconID: {0}", assetIcon.GetID());
|
||||||
|
|
||||||
|
for (auto& dir_entry : std::filesystem::directory_iterator(projectdirectory)) {
|
||||||
|
auto filepath = dir_entry.path();
|
||||||
|
|
||||||
|
if (dir_entry.is_directory() || dir_entry.is_symlink() || dir_entry.is_socket())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool has_hidden_extension = false;
|
||||||
|
for (auto hide : hidden_extensions) {
|
||||||
|
if (filepath.extension() == hide)
|
||||||
|
{
|
||||||
|
has_hidden_extension = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_hidden_extension)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Asset asset(filepath.filename().string().c_str());
|
||||||
|
|
||||||
|
auto filepathStr = filepath.string();
|
||||||
|
asset.setFilPath(filepathStr);
|
||||||
|
spdlog::info("Created asset: {0}", asset.GetName());
|
||||||
|
files.push_back(asset);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Draw() override {
|
||||||
|
|
||||||
|
ImGui::DragInt("IconSize", &iconSize, 1, 30, 90);
|
||||||
|
ImGui::DragInt("Maximum Columns", &maxColumns, 1, 1, 6);
|
||||||
|
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));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int row = 0;
|
||||||
|
int column = 0;
|
||||||
|
for (auto& asset : files ) {
|
||||||
|
if (column % 3 == 0) {
|
||||||
|
ImGui::TableNextRow();
|
||||||
|
column = 0;
|
||||||
|
row++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::TableSetColumnIndex(column);
|
||||||
|
|
||||||
|
ImGui::ImageButton(
|
||||||
|
(ImTextureID)assetIcon.GetID(),
|
||||||
|
ImVec2{ (float)iconSize, (float)iconSize });
|
||||||
|
ImGui::Text(asset.GetName(), row);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
column++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::PopStyleColor(3);
|
||||||
|
ImGui::EndTable();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector <Asset> files = std::vector<Asset>();
|
||||||
|
|
||||||
|
int iconSize = 60;
|
||||||
|
int maxColumns = 3;
|
||||||
|
|
||||||
|
YoggieEngine::Texture folderIcon;
|
||||||
|
YoggieEngine::Texture assetIcon;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
9
Editor/src/AssetManagement/AssetLoaders/AssetLoader.h
Normal file
9
Editor/src/AssetManagement/AssetLoaders/AssetLoader.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <filesystem>
|
||||||
|
#include "../Asset.h"
|
||||||
|
class AssetLoader {
|
||||||
|
public:
|
||||||
|
virtual Asset LoadAsset(std::filesystem::path& path) = 0;
|
||||||
|
// virtual void PackageAsset(Asset& asset ) = 0;
|
||||||
|
|
||||||
|
};
|
109
Editor/src/AssetManagement/AssetLoaders/ModelLoader.cpp
Normal file
109
Editor/src/AssetManagement/AssetLoaders/ModelLoader.cpp
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#include "ModelLoader.h"
|
||||||
|
#include <assimp/Importer.hpp>
|
||||||
|
#include <assimp/postprocess.h>
|
||||||
|
#include <assimp/scene.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ProcessVertices(aiMesh* mesh, std::vector<YoggieEngine::Vertex>& out_vertices) {
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumVertices; i++) {
|
||||||
|
YoggieEngine::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) {
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
YoggieEngine::Mesh processMesh(aiMesh* mesh, const aiScene* scene) {
|
||||||
|
std::vector<unsigned int> indices;
|
||||||
|
std::vector<YoggieEngine::Vertex> vertices;
|
||||||
|
|
||||||
|
ProcessVertices(mesh, vertices);
|
||||||
|
ProcessIndices(mesh, indices);
|
||||||
|
|
||||||
|
YoggieEngine::Mesh result;
|
||||||
|
result.vertices = vertices;
|
||||||
|
result.elements = indices;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<YoggieEngine::Mesh> processNode(aiNode* node, const aiScene* scene) {
|
||||||
|
|
||||||
|
std::vector<YoggieEngine::Mesh> meshes = std::vector<YoggieEngine::Mesh>();
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Asset ModelLoader::LoadAsset(std::filesystem::path& path) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Assimp::Importer importer;
|
||||||
|
|
||||||
|
const aiScene* scene = importer.ReadFile(path.string(), aiProcess_Triangulate | aiProcess_FlipUVs);
|
||||||
|
|
||||||
|
aiNode* currentNode = scene->mRootNode;
|
||||||
|
|
||||||
|
|
||||||
|
spdlog::info("Loading meshes!" );
|
||||||
|
|
||||||
|
auto meshes = processNode(currentNode, scene);
|
||||||
|
|
||||||
|
spdlog::info("Model file contained {0} meshes", meshes.size() );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return Asset("Mesh");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
8
Editor/src/AssetManagement/AssetLoaders/ModelLoader.h
Normal file
8
Editor/src/AssetManagement/AssetLoaders/ModelLoader.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "AssetLoader.h"
|
||||||
|
|
||||||
|
class ModelLoader : AssetLoader {
|
||||||
|
public:
|
||||||
|
Asset LoadAsset(std::filesystem::path& path);
|
||||||
|
|
||||||
|
};
|
139
Editor/src/AssetManagement/AssetRegistry.cpp
Normal file
139
Editor/src/AssetManagement/AssetRegistry.cpp
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
#include "AssetRegistry.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
/*
|
||||||
|
* this is still a very naive approach to the asset manager
|
||||||
|
*/
|
||||||
|
|
||||||
|
AssetRegistry::AssetRegistry()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AssetRegistry::RegisterAsset(Asset& asset)
|
||||||
|
{
|
||||||
|
Assets.try_emplace(asset.getId() , asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AssetRegistry::UnregisterAsset(Asset& asset) {
|
||||||
|
Assets.erase(asset.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
YoggieEngine::Mesh* AssetRegistry::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
|
||||||
|
spdlog::info("File has header: {0}", Header);
|
||||||
|
spdlog::info ( "Vertex size: {0}", Vsize );
|
||||||
|
spdlog::info("Number of Vertices: {0}" ,Vnum );
|
||||||
|
spdlog::info ("Number of Elements: " , Enum );
|
||||||
|
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 {
|
||||||
|
spdlog::error( "Failed ot open mesh " );
|
||||||
|
}
|
||||||
|
|
||||||
|
return imported;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
YoggieEngine::Renderable* AssetRegistry::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");
|
||||||
|
spdlog::info( "Save path: {0}" , MeshFileName );
|
||||||
|
|
||||||
|
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);
|
||||||
|
spdlog::info( "size of vertex: {0}" ,Vsize );
|
||||||
|
spdlog::info("Addr of vSize: {0}" , &Vsize );
|
||||||
|
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;
|
||||||
|
|
||||||
|
*/
|
||||||
|
return nullptr;
|
||||||
|
}
|
26
Editor/src/AssetManagement/AssetRegistry.h
Normal file
26
Editor/src/AssetManagement/AssetRegistry.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
#include "Asset.h"
|
||||||
|
#include "uuid.h"
|
||||||
|
|
||||||
|
class AssetRegistry {
|
||||||
|
public:
|
||||||
|
|
||||||
|
AssetRegistry();
|
||||||
|
//AssetRegistry(AssetPack);
|
||||||
|
|
||||||
|
void RegisterAsset(Asset& asset);
|
||||||
|
void UnregisterAsset(Asset& asset);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Update();
|
||||||
|
|
||||||
|
|
||||||
|
static YoggieEngine::Mesh* LoadFromAssetFile(const std::filesystem::path assetPath);
|
||||||
|
static YoggieEngine::Renderable* LoadFromSource(const std::filesystem::path srcPath, const std::filesystem::path assetFolder);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int unique_number = 0;
|
||||||
|
std::map<std::string , Asset> Assets = std::map<std::string, Asset> ();
|
||||||
|
};
|
129
Editor/src/AssetManagement/SceneSerializer.cpp
Normal file
129
Editor/src/AssetManagement/SceneSerializer.cpp
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
#include "SceneSerializer.h"
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
#include <yaml-cpp/yaml.h>
|
||||||
|
#include <yaml-cpp/node/type.h>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
void WriteFile(std::string& emitter, std::filesystem::path path)
|
||||||
|
{
|
||||||
|
spdlog::info( "Writing Scene file to: {0}" , path.u8string());
|
||||||
|
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(YoggieEngine::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([&emitter, &scene](entt::entity enttNumber) {
|
||||||
|
|
||||||
|
YoggieEngine::Entity entity = YoggieEngine::Entity(enttNumber, &scene);
|
||||||
|
|
||||||
|
emitter << YAML::BeginMap;
|
||||||
|
emitter << YAML::Key << "Entity" << YAML::Value << entity.GetComponent<YoggieEngine::IdentifierComponent>().name;
|
||||||
|
|
||||||
|
if (entity.HasComponent<YoggieEngine::IdentifierComponent>()) {
|
||||||
|
emitter << YAML::Key << "Ident";
|
||||||
|
emitter << YAML::BeginMap;
|
||||||
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::IdentifierComponent>().name;
|
||||||
|
emitter << YAML::EndMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entity.HasComponent<YoggieEngine::TransformComponent>()) {
|
||||||
|
emitter << YAML::Key << "Transform" << YAML::Value;
|
||||||
|
|
||||||
|
emitter << YAML::BeginMap;
|
||||||
|
|
||||||
|
emitter << YAML::Key << "Position";
|
||||||
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::TransformComponent>().Position;
|
||||||
|
|
||||||
|
emitter << YAML::Key << "Rotation";
|
||||||
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::TransformComponent>().Rotation;
|
||||||
|
|
||||||
|
emitter << YAML::Key << "Scale";
|
||||||
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::TransformComponent>().Scale;
|
||||||
|
|
||||||
|
emitter << YAML::EndMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (entity.HasComponent<YoggieEngine::LightComponent>()) {
|
||||||
|
emitter << YAML::Key << "Light";
|
||||||
|
emitter << YAML::Value;
|
||||||
|
emitter << YAML::BeginMap;
|
||||||
|
emitter << YAML::Key << "Color";
|
||||||
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::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, YoggieEngine::Scene& scene) {
|
||||||
|
std::string YAMLString = Serialize(scene);
|
||||||
|
WriteFile(YAMLString, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LoadScene(std::filesystem::path path, YoggieEngine::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"])
|
||||||
|
{
|
||||||
|
YoggieEngine::TransformComponent tc = SE.GetComponent <YoggieEngine::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"]) {
|
||||||
|
YoggieEngine::LightComponent lc = SE.AddComponent<YoggieEngine::LightComponent>();
|
||||||
|
lc.Color = glm::vec3(entity["Light"]["Color"][0].as<float>(), entity["Light"]["Color"][1].as<float>(), entity["Light"]["Color"][2].as<float>());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
16
Editor/src/AssetManagement/SceneSerializer.h
Normal file
16
Editor/src/AssetManagement/SceneSerializer.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <entt/entity/fwd.hpp>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
#include <yaml-cpp/yaml.h>
|
||||||
|
#include <filesystem>
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
|
||||||
|
void WriteFile(std::string& emitter, std::filesystem::path path);
|
||||||
|
|
||||||
|
YAML::Emitter& operator<< (YAML::Emitter& emitter, glm::vec3& vector);
|
||||||
|
|
||||||
|
std::string Serialize(YoggieEngine::Scene& scene);
|
||||||
|
|
||||||
|
void SaveScene(std::filesystem::path path, YoggieEngine::Scene& scene);
|
||||||
|
|
||||||
|
void LoadScene(std::filesystem::path path, YoggieEngine::Scene& scene);
|
63
Editor/src/AssetManagement/uuid.h
Normal file
63
Editor/src/AssetManagement/uuid.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* SOURCE: https://github.com/rkg82/uuid-v4/blob/main/uuid/v4/uuid.h
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __UUID__
|
||||||
|
#define __UUID__
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace uuid::v4
|
||||||
|
{
|
||||||
|
// Encaasulate the genaeration of a Version 4 UUID object
|
||||||
|
// A Version 4 UUID is a universally unique identifier that is generated using random numbers.
|
||||||
|
class UUID
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Factory method for creating UUID object.
|
||||||
|
static UUID New()
|
||||||
|
{
|
||||||
|
UUID uuid;
|
||||||
|
std::random_device rd;
|
||||||
|
std::mt19937 engine{ rd() };
|
||||||
|
std::uniform_int_distribution<int> dist{ 0, 256 }; //Limits of the interval
|
||||||
|
|
||||||
|
for (int index = 0; index < 16; ++index)
|
||||||
|
{
|
||||||
|
uuid._data[index] = (unsigned char)dist(engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
uuid._data[6] = ((uuid._data[6] & 0x0f) | 0x40); // Version 4
|
||||||
|
uuid._data[8] = ((uuid._data[8] & 0x3f) | 0x80); // Variant is 10
|
||||||
|
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns UUID as formatted string
|
||||||
|
std::string String()
|
||||||
|
{
|
||||||
|
// Formats to "0065e7d7-418c-4da4-b4d6-b54b6cf7466a"
|
||||||
|
char buffer[256] = { 0 };
|
||||||
|
std::snprintf(buffer, 255,
|
||||||
|
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||||
|
_data[0], _data[1], _data[2], _data[3],
|
||||||
|
_data[4], _data[5],
|
||||||
|
_data[6], _data[7],
|
||||||
|
_data[8], _data[9],
|
||||||
|
_data[10], _data[11], _data[12], _data[13], _data[14], _data[15]);
|
||||||
|
|
||||||
|
std::string uuid = buffer;
|
||||||
|
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
UUID() {}
|
||||||
|
|
||||||
|
unsigned char _data[16] = { 0 };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef __UUID__
|
38
Editor/src/Console.cpp
Normal file
38
Editor/src/Console.cpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include "Console.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
Console::Console()
|
||||||
|
: EditorWindow("Console"), Items(ImVector<char*>()), AutoScroll(false), ScrollToBottom(false)
|
||||||
|
{
|
||||||
|
AddLog("Hello Editor console!");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console::~Console() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Console::Show() {
|
||||||
|
Draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Console::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 Console::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));
|
||||||
|
}
|
22
Editor/src/Console.h
Normal file
22
Editor/src/Console.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
#include "EditorWindow.h"
|
||||||
|
#include <imgui.h>
|
||||||
|
|
||||||
|
class Console : public EditorWindow {
|
||||||
|
public:
|
||||||
|
|
||||||
|
Console();
|
||||||
|
~Console();
|
||||||
|
|
||||||
|
void Draw() override;
|
||||||
|
|
||||||
|
void Show();
|
||||||
|
|
||||||
|
void AddLog(const char* fmt, ...);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ImVector<char*> Items;
|
||||||
|
bool AutoScroll;
|
||||||
|
bool ScrollToBottom;
|
||||||
|
};
|
72
Editor/src/Dialog.h
Normal file
72
Editor/src/Dialog.h
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
#include <imgui.h>
|
||||||
|
#include <nfd.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <functional>
|
||||||
|
#include "Project/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):
|
||||||
|
spdlog::info("NFD_CANCEL" );
|
||||||
|
case (NFD_ERROR):
|
||||||
|
spdlog::error("NFD_Error: {0}" , NFD_GetError() );
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
30
Editor/src/EditorCamera.h
Normal file
30
Editor/src/EditorCamera.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
|
||||||
|
class EditorCamera : public YoggieEngine::Camera {
|
||||||
|
public:
|
||||||
|
EditorCamera () : Camera(){
|
||||||
|
Front = glm::vec3(0.0f, 0.0f, 1.0f);
|
||||||
|
Right = glm::vec3(-1.0f, 0.0f, 0.0f);
|
||||||
|
Up = glm::vec3(0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
|
|
||||||
|
view = glm::translate(glm::mat4(1.0f), Position) * glm::toMat4(glm::quat(Rotation));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update() {
|
||||||
|
|
||||||
|
view = glm::translate(glm::mat4(1.0f), Position) * glm::toMat4(glm::quat(Rotation));
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 Position = glm::vec3(0.0f);
|
||||||
|
glm::vec3 Rotation = glm::vec3(0.0f);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
glm::vec3 Front;
|
||||||
|
glm::vec3 Right;
|
||||||
|
glm::vec3 Up;
|
||||||
|
};
|
604
Editor/src/EditorLayer.h
Normal file
604
Editor/src/EditorLayer.h
Normal file
@ -0,0 +1,604 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <iostream>
|
||||||
|
#include <mini/ini.h>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
#include <glm/gtc/type_ptr.hpp>
|
||||||
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
#include <nfd.h>
|
||||||
|
|
||||||
|
#include "AssetManagement/SceneSerializer.h"
|
||||||
|
#include "AssetManagement/AssetFinder.h"
|
||||||
|
#include "PropertyPanels/Inspector.h"
|
||||||
|
#include "AssetManagement/uuid.h"
|
||||||
|
#include "Project/Settings.h"
|
||||||
|
#include "Console.h"
|
||||||
|
#include "AssetManagement/AssetLoaders/ModelLoader.h"
|
||||||
|
#include "IconsMaterialDesign.h"
|
||||||
|
#include "Project/Project.h"
|
||||||
|
#include <ImGuizmo.h>
|
||||||
|
#include "EditorCamera.h"
|
||||||
|
#include "../../YoggieEngine/src/Graphics/Memory/VertexArray.h"
|
||||||
|
#include "../../YoggieEngine/src/Graphics/Memory/Buffer.h"
|
||||||
|
|
||||||
|
using namespace YoggieEngine;
|
||||||
|
class EditorLayer : public Layer {
|
||||||
|
|
||||||
|
public:
|
||||||
|
EditorLayer() :
|
||||||
|
Layer(),
|
||||||
|
Logo("rsc/Yoggie.png"),
|
||||||
|
inspector(Selected),
|
||||||
|
scene(),
|
||||||
|
renderer()
|
||||||
|
{
|
||||||
|
|
||||||
|
spdlog::info("Colour attachment id: {0}", renderer.getCurrentFrameBuffer().GetColourAttachment());
|
||||||
|
|
||||||
|
Selected = YoggieEngine::Entity((entt::entity)-1, &scene);
|
||||||
|
|
||||||
|
AssetRegistry assetManager = AssetRegistry();
|
||||||
|
// ModelLoader modelLoader = ModelLoader();
|
||||||
|
|
||||||
|
spdlog::info("{0}", project.GetProjectDirectory().string());
|
||||||
|
|
||||||
|
//auto latern = modelLoader.LoadAsset(std::filesystem::path("build/debug/Models/Latern.gltf"));
|
||||||
|
//spdlog::info("Loaded mesh: {0}", latern.GetName());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnStartup() override {
|
||||||
|
std::string path = (std::filesystem::current_path()).string();
|
||||||
|
project.setProjectDirectory(path);
|
||||||
|
assetsView = AssetFinder(project.GetProjectDirectory());
|
||||||
|
LoadLastOrEmptyProject();
|
||||||
|
|
||||||
|
|
||||||
|
auto cubePath = std::filesystem::path("build/debug/Models/cube.obj");
|
||||||
|
|
||||||
|
cube = (ModelLoader()).LoadAsset(cubePath);
|
||||||
|
//Settings settings = Settings();
|
||||||
|
//Console console = Console();
|
||||||
|
|
||||||
|
}
|
||||||
|
glm::vec3 cameraPosition = glm::vec3(0.0f, 0.0f, -5.0f);
|
||||||
|
glm::vec3 cameraRotation = glm::vec3(0.0f);
|
||||||
|
void OnUpdate() override {
|
||||||
|
scene.Update();
|
||||||
|
/*
|
||||||
|
* if (Sceneview.isFocused) {
|
||||||
|
UpdateSceneCamera(sceneview);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
auto components = scene.getReg().view<Render3DComponent>();
|
||||||
|
for(auto component : components){
|
||||||
|
auto& renderComponent = YoggieEngine::Entity(component, &scene).GetComponent<Render3DComponent>();
|
||||||
|
|
||||||
|
renderComponent.mesh = cube;
|
||||||
|
|
||||||
|
if (renderComponent.VAO == 0 || renderComponent.IBO == 0) {
|
||||||
|
VertexArray va = VertexArray();
|
||||||
|
Buffer vertexBuffer = Buffer();
|
||||||
|
Buffer elementBuffer = Buffer();
|
||||||
|
|
||||||
|
va.Create();
|
||||||
|
va.Bind();
|
||||||
|
|
||||||
|
vertexBuffer.createBuffer();
|
||||||
|
vertexBuffer.Bind(false);
|
||||||
|
vertexBuffer.setBufferData((void*)&renderComponent.mesh.vertices[0], renderComponent.mesh.vertices.size() * sizeof(Vertex), false);
|
||||||
|
|
||||||
|
elementBuffer.createBuffer();
|
||||||
|
elementBuffer.Bind(true);
|
||||||
|
elementBuffer.setBufferData((void*)&renderComponent.mesh.elements[0], renderComponent.mesh.elements.size() * sizeof(unsigned int), true);
|
||||||
|
|
||||||
|
va.AttachAttribute(0, 3, sizeof(Vertex));
|
||||||
|
|
||||||
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glEnableVertexAttribArray(1);
|
||||||
|
|
||||||
|
va.Unbind();
|
||||||
|
vertexBuffer.Unbind(false);
|
||||||
|
elementBuffer.Unbind(true);
|
||||||
|
|
||||||
|
renderComponent.VAO = va.getID();
|
||||||
|
renderComponent.IBO = elementBuffer.getBufferID();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
camera->view = glm::translate(glm::mat4(1.0f), cameraPosition) * glm::toMat4(glm::quat(cameraRotation));
|
||||||
|
|
||||||
|
renderer.Render(scene, *camera);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ImGuizmo::OPERATION activeOperation = ImGuizmo::OPERATION::TRANSLATE;
|
||||||
|
|
||||||
|
void OnUI() override {
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { ImGui::GetWindowWidth(), 7 });
|
||||||
|
ImGui::BeginMainMenuBar();
|
||||||
|
int scaleFactor = 30;
|
||||||
|
ImGui::Image((ImTextureID)Logo.GetID(), { Logo.getSize().x / scaleFactor , Logo.getSize().y / scaleFactor });
|
||||||
|
ImGui::PopStyleVar();
|
||||||
|
|
||||||
|
if (ImGui::BeginMenu("App")) {
|
||||||
|
|
||||||
|
if (ImGui::MenuItem("Load Project"))
|
||||||
|
{
|
||||||
|
nfdresult_t result = NFD_OpenDialog({ "yproj" }, NULL, &path);
|
||||||
|
switch (result) {
|
||||||
|
case(NFD_OKAY):
|
||||||
|
//Project::LoadProject(path, project);
|
||||||
|
//AssetRegistry::setAssetPath(project.GetProjectDirectory());
|
||||||
|
//AssetRegistry::BuildAssetView();
|
||||||
|
break;
|
||||||
|
case(NFD_CANCEL):
|
||||||
|
break;
|
||||||
|
case(NFD_ERROR):
|
||||||
|
spdlog::error("NFD_Error: {0}", NFD_GetError());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::MenuItem("Save project as...")) {
|
||||||
|
nfdresult_t result = NFD_SaveDialog({ "yproj" }, NULL, &path);
|
||||||
|
switch (result) {
|
||||||
|
case(NFD_OKAY):
|
||||||
|
spdlog::info("Save as: {0}", path);
|
||||||
|
//Project::SaveProject(path, project);
|
||||||
|
break;
|
||||||
|
case(NFD_CANCEL):
|
||||||
|
break;
|
||||||
|
case(NFD_ERROR):
|
||||||
|
spdlog::error("NFD_Error: {0}", NFD_GetError());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
|
||||||
|
//project.AddScene(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
|
||||||
|
|
||||||
|
AssetRegistry::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 = AssetRegistry::LoadFromAssetFile(path);
|
||||||
|
if (importedMesh != nullptr)
|
||||||
|
{
|
||||||
|
auto full_name = std::filesystem::path(path);
|
||||||
|
// auto importedModel = scene.AddEntity(full_name.filename().u8string());
|
||||||
|
// auto& rendererComponent = importedModel.AddComponent<YoggieEngine::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();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::SameLine(ImGui::GetWindowWidth() / 4 * 3);
|
||||||
|
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.3f, 0.3f, 0.3f, 1.0f));
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);
|
||||||
|
ImGui::Button(ICON_MD_ROCKET_LAUNCH "Project");
|
||||||
|
|
||||||
|
ImGui::SameLine(ImGui::GetWindowWidth() - 120);
|
||||||
|
|
||||||
|
/*
|
||||||
|
ImGui::PopStyleColor();
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.1f, 0.1f, 0.1f, 0.01f));
|
||||||
|
if (ImGui::Button(ICON_MD_MINIMIZE)) { spdlog::info("Minimize"); }
|
||||||
|
if (ImGui::Button(ICON_MD_MAXIMIZE)) { spdlog::info("Maximize"); }
|
||||||
|
if (ImGui::Button(ICON_MD_CLOSE)) { spdlog::info("Quit"); }
|
||||||
|
*/
|
||||||
|
ImGui::PopStyleColor(1);
|
||||||
|
ImGui::PopStyleVar();
|
||||||
|
|
||||||
|
ImGui::EndMainMenuBar();
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::Begin("RuntimeControls");
|
||||||
|
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::Text(ICON_MD_TRANSFORM);
|
||||||
|
|
||||||
|
auto spacing = 10;
|
||||||
|
float buttonWidth = 75.0f;
|
||||||
|
float buttonHeight = 30;
|
||||||
|
float ColorIntensity = 0.5f;
|
||||||
|
float ColorIntensityHovered = 0.75;
|
||||||
|
float ColorIntensityActive = 0.85;
|
||||||
|
float yPadding = 6.f;
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{0, yPadding });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.0f,ColorIntensity ,0.0f ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.0f,ColorIntensityHovered ,0.0f ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.0f,ColorIntensityActive ,0.0f ,1.0f });
|
||||||
|
ImGui::SameLine(0, spacing);
|
||||||
|
if (ImGui::Button("Translate", { buttonWidth,buttonHeight }))
|
||||||
|
activeOperation = ImGuizmo::OPERATION::TRANSLATE;
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{ 0, yPadding });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ ColorIntensity, 0.0f ,0.0f ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ ColorIntensityHovered, 0.0f ,0.0f ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ ColorIntensityActive, 0.0f ,0.0f ,1.0f });
|
||||||
|
ImGui::SameLine(0, spacing);
|
||||||
|
if (ImGui::Button("Rotate", { buttonWidth,buttonHeight }))
|
||||||
|
activeOperation = ImGuizmo::OPERATION::ROTATE;
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{ 0, yPadding });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.0f, 0.0f ,ColorIntensity ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.0f, 0.0f ,ColorIntensityHovered ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.0f, 0.0f ,ColorIntensityActive ,1.0f });
|
||||||
|
ImGui::SameLine(0, spacing);
|
||||||
|
if (ImGui::Button("Scale", { buttonWidth,buttonHeight }))
|
||||||
|
activeOperation = ImGuizmo::OPERATION::SCALE;
|
||||||
|
|
||||||
|
ImGui::PopStyleColor(9);
|
||||||
|
ImGui::PopStyleVar(3);
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::EndGroup();
|
||||||
|
|
||||||
|
ImGui::SameLine((ImGui::GetWindowContentRegionMax().x / 2) - (90));
|
||||||
|
auto color = ImVec4{ 0.001 * 12 , 0.001 * 201 , 0.001 * 69, 1.0f };
|
||||||
|
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(ICON_MD_PLAY_ARROW, { 90,25 })) {
|
||||||
|
// Play game
|
||||||
|
}
|
||||||
|
ImGui::PopStyleColor(2);
|
||||||
|
ImGui::SameLine();
|
||||||
|
color = ImVec4{ 0.001 * 14, 0.001 * 157, 0.001 * 201, 1.0f };
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, color);
|
||||||
|
|
||||||
|
ImGui::PushStyleColor(
|
||||||
|
ImGuiCol_ButtonHovered,
|
||||||
|
ImVec4{
|
||||||
|
color.x * strengthIncrease,
|
||||||
|
color.y * strengthIncrease,
|
||||||
|
color.z * strengthIncrease,
|
||||||
|
color.w
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ImGui::Button(ICON_MD_ELECTRIC_BOLT, { 90,25 })) {
|
||||||
|
// Simulate physics
|
||||||
|
}
|
||||||
|
ImGui::PopStyleColor(2);
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int viewportWindowFlags = ImGuiWindowFlags_NoTitleBar
|
||||||
|
| ImGuiWindowFlags_NoDecoration
|
||||||
|
| ImGuiWindowFlags_NoScrollbar
|
||||||
|
| ImGuiWindowFlags_NoMove
|
||||||
|
| ImGuiWindowFlags_NoCollapse;
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{ 0,0 });
|
||||||
|
ImGui::Begin("SceneView",nullptr,viewportWindowFlags);
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::Image((ImTextureID)(intptr_t)renderer.getCurrentFrameBuffer().GetColourAttachment(),
|
||||||
|
ImVec2{(float)ImGui::GetWindowWidth(),(float)ImGui::GetWindowHeight()});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//ImGuizmo::ViewManipulate(glm::value_ptr(cameraView), 1, ImGui::GetWindowPos(), { 90,90 }, 0x22CCCCCCC);
|
||||||
|
|
||||||
|
|
||||||
|
if(Selected.isValid()){
|
||||||
|
|
||||||
|
|
||||||
|
ImGuizmo::SetOrthographic(false);
|
||||||
|
ImGuizmo::SetDrawlist();
|
||||||
|
|
||||||
|
ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, ImGui::GetWindowWidth(), ImGui::GetWindowHeight());
|
||||||
|
|
||||||
|
const auto& ProjMatrix = camera->projection;
|
||||||
|
|
||||||
|
const glm::mat4& viewMatrix = ((EditorCamera*)camera)->view;
|
||||||
|
glm::mat4 cameraView = glm::inverse(viewMatrix);
|
||||||
|
glm::mat4 cameraDelta = glm::mat4(1.0f);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
auto& tc = Selected.GetComponent<YoggieEngine::TransformComponent>();
|
||||||
|
auto transform = tc.GetTransform();
|
||||||
|
ImGuizmo::Manipulate(glm::value_ptr(cameraView), glm::value_ptr(ProjMatrix), activeOperation, ImGuizmo::WORLD, glm::value_ptr(transform), nullptr, nullptr);
|
||||||
|
if(ImGuizmo::IsUsing())
|
||||||
|
tc.Decompose(transform);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
|
ImGui::PopStyleVar();
|
||||||
|
|
||||||
|
ImGui::Begin("EditorCamera");
|
||||||
|
|
||||||
|
ImGui::SliderFloat3("position", glm::value_ptr(cameraPosition), -50, 50);
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::Begin(ICON_MD_MENU "SceneExplorer",nullptr);
|
||||||
|
scene.getReg().each([&](entt::entity enttNumber) {
|
||||||
|
YoggieEngine::Entity entity = YoggieEngine::Entity(enttNumber, &scene);
|
||||||
|
auto id = entity.GetComponent<YoggieEngine::IdentifierComponent>();
|
||||||
|
if (ImGui::Selectable(id.name.c_str(), entity == Selected)) {
|
||||||
|
Selected = YoggieEngine::Entity(enttNumber, &scene);
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
|
inspector.Update();
|
||||||
|
|
||||||
|
|
||||||
|
//settings.Update();
|
||||||
|
//console.Update();
|
||||||
|
|
||||||
|
assetsView.Update();
|
||||||
|
|
||||||
|
ImGui::ShowDemoWindow();
|
||||||
|
//ImGui::ShowMetricsWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OnCreate() override {
|
||||||
|
spdlog::info(" Layer Create!" );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDestroy() override {
|
||||||
|
spdlog::info( " Layer Destroy!" );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
Inspector inspector;
|
||||||
|
AssetFinder assetsView;
|
||||||
|
|
||||||
|
bool SimulatePhysics = true;
|
||||||
|
YoggieEngine::Entity Selected;
|
||||||
|
Project project;
|
||||||
|
Scene scene;
|
||||||
|
char* path = nullptr;
|
||||||
|
Texture Logo;
|
||||||
|
Renderer renderer;
|
||||||
|
Camera* camera = new EditorCamera();
|
||||||
|
Mesh cube ;
|
||||||
|
|
||||||
|
void LoadLastOrEmptyProject() {
|
||||||
|
// Check if there is a last known loaded project and
|
||||||
|
// load that one .
|
||||||
|
|
||||||
|
// Otherwise load no project..
|
||||||
|
// OR
|
||||||
|
// Load an empty project.
|
||||||
|
mINI::INIStructure ini;
|
||||||
|
|
||||||
|
if (std::filesystem::exists("build\\Debug\\Editor.ini"))
|
||||||
|
{
|
||||||
|
mINI::INIFile file("build\\Debug\\Editor.ini");
|
||||||
|
file.read(ini);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spdlog::debug("Could not find an `Editor.ini` file.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ini["editor"]["openlastproject"] == "TRUE")
|
||||||
|
{
|
||||||
|
|
||||||
|
Project::LoadProject(ini["cache"]["project"], project);
|
||||||
|
LoadScene(ini["cache"]["scene"], scene);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spdlog::debug("Starting without a project. Please create one.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void UpdateSceneCamera() {
|
||||||
|
const float movement_speed = 0.01f;
|
||||||
|
static float lastX = 400, lastY = 300;
|
||||||
|
const float sensitivity = 0.1;
|
||||||
|
static bool firstMouse = true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
if (MouseButtonPressed(YOGGIE_MOUSE_BUTTON_RIGHT)) {
|
||||||
|
|
||||||
|
glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
||||||
|
auto newX = getCursorPosX(appWindow);
|
||||||
|
auto newY = getCursorPosY(appWindow);
|
||||||
|
|
||||||
|
if (firstMouse)
|
||||||
|
{
|
||||||
|
lastX = newX;
|
||||||
|
lastY = newY;
|
||||||
|
firstMouse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float xoffset = newX - lastX;
|
||||||
|
float yoffset = newY - lastY;
|
||||||
|
|
||||||
|
lastX = newX;
|
||||||
|
lastY = newY;
|
||||||
|
|
||||||
|
xoffset *= sensitivity;
|
||||||
|
yoffset *= sensitivity;
|
||||||
|
|
||||||
|
sceneview.cam.Rotation.x += (xoffset / 2);
|
||||||
|
sceneview.cam.Rotation.y += (xoffset /2);
|
||||||
|
sceneview.cam.Rotation.z += yoffset;
|
||||||
|
|
||||||
|
|
||||||
|
if (sceneview.cam.pitch > 89.0f)
|
||||||
|
sceneview.cam.pitch = 89.0f;
|
||||||
|
if (sceneview.cam.pitch < -89.0f)
|
||||||
|
sceneview.cam.pitch = -89.0f;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (firstMouse == false)
|
||||||
|
{
|
||||||
|
glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
||||||
|
firstMouse = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
EditorCamera& cam = sceneview.GetCamera();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (keyIsPressed(YOGGIE_KEY_UP))
|
||||||
|
cam.Rotation.x += movement_speed;
|
||||||
|
|
||||||
|
if (keyIsPressed(YOGGIE_KEY_DOWN))
|
||||||
|
cam.Rotation.x -= movement_speed;
|
||||||
|
|
||||||
|
if (keyIsPressed(YOGGIE_KEY_LEFT))
|
||||||
|
cam.Rotation.y += movement_speed;
|
||||||
|
|
||||||
|
if (keyIsPressed(YOGGIE_KEY_RIGHT))
|
||||||
|
cam.Rotation.y -= movement_speed;
|
||||||
|
|
||||||
|
|
||||||
|
cam.Update();
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
// Check for Camara movement input here!
|
||||||
|
if (keyIsPressed(YOGGIE_KEY_W))
|
||||||
|
sceneview.cam.Position -= sceneview.cam.Front * movement_speed;
|
||||||
|
|
||||||
|
if (keyIsPressed(YOGGIE_KEY_A))
|
||||||
|
sceneview.cam.Position += sceneview.cam.Right * movement_speed;
|
||||||
|
|
||||||
|
if (keyIsPressed(YOGGIE_KEY_S))
|
||||||
|
sceneview.cam.Position += sceneview.cam.Front * movement_speed;
|
||||||
|
|
||||||
|
if (keyIsPressed(YOGGIE_KEY_D))
|
||||||
|
sceneview.cam.Position -= sceneview.cam.Right * movement_speed;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
27
Editor/src/EditorWindow.h
Normal file
27
Editor/src/EditorWindow.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <imgui.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class EditorWindow {
|
||||||
|
|
||||||
|
public:
|
||||||
|
EditorWindow (const std::string& name, ImGuiWindowFlags_ flags = ImGuiWindowFlags_None ) : name(name) , flags(flags) {}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
|
||||||
|
ImGui::Begin(name.c_str(), nullptr, flags);
|
||||||
|
Draw();
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
~EditorWindow() = default;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
private:
|
||||||
|
ImGuiWindowFlags_ flags;
|
||||||
|
|
||||||
|
virtual void Draw() = 0;
|
||||||
|
};
|
2244
Editor/src/IconsMaterialDesign.h
Normal file
2244
Editor/src/IconsMaterialDesign.h
Normal file
File diff suppressed because it is too large
Load Diff
86
Editor/src/Project/Project.cpp
Normal file
86
Editor/src/Project/Project.cpp
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
#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;
|
||||||
|
projectYAML << YAML::BeginMap;
|
||||||
|
|
||||||
|
|
||||||
|
projectYAML << YAML::Key << "Scenes" << YAML::Value << YAML::BeginSeq;
|
||||||
|
for (auto scene : project.Scenes) {
|
||||||
|
projectYAML << scene->name;
|
||||||
|
}
|
||||||
|
projectYAML << YAML::EndSeq;
|
||||||
|
|
||||||
|
std::ofstream projectFile;
|
||||||
|
|
||||||
|
projectFile.open(path.u8string());
|
||||||
|
projectFile << projectYAML.c_str();
|
||||||
|
projectFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Project::LoadProject(std::filesystem::path path, Project& project)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!std::filesystem::exists(path)) {
|
||||||
|
throw std::runtime_error("Couldn't find project file!");
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = node.as<Project>();
|
||||||
|
|
||||||
|
spdlog::info("loaded project {0}", project.Name);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace YAML {
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class convert<Project> {
|
||||||
|
public:
|
||||||
|
static bool decode(const Node& node , Project& rhs)
|
||||||
|
{
|
||||||
|
if (!node.IsMap())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::string projectName = node["Project"].as<std::string>();
|
||||||
|
rhs.setName(projectName);
|
||||||
|
|
||||||
|
|
||||||
|
std::string projectDirectory = node["Directory"].as<std::string>();
|
||||||
|
rhs.setProjectDirectory(projectDirectory);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
37
Editor/src/Project/Project.h
Normal file
37
Editor/src/Project/Project.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <filesystem>
|
||||||
|
#include <iostream>
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
#include <yaml-cpp/yaml.h>
|
||||||
|
|
||||||
|
|
||||||
|
class Project {
|
||||||
|
public:
|
||||||
|
Project() = default;
|
||||||
|
Project(const std::string& name): Name(name){}
|
||||||
|
~Project() { spdlog::info("Unloading project {0}...", Name);}
|
||||||
|
|
||||||
|
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; }
|
||||||
|
|
||||||
|
|
||||||
|
void AddScene(YoggieEngine::Scene& scene)
|
||||||
|
{
|
||||||
|
Scenes.push_back(&scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SaveProject(std::filesystem::path path, Project& project);
|
||||||
|
static void LoadProject(std::filesystem::path path, Project& project);
|
||||||
|
private:
|
||||||
|
std::string Name;
|
||||||
|
std::filesystem::path ProjectDirectory;
|
||||||
|
|
||||||
|
std::vector<YoggieEngine::Scene*> Scenes;
|
||||||
|
|
||||||
|
friend class YAML::convert<Project>;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
48
Editor/src/Project/Settings.cpp
Normal file
48
Editor/src/Project/Settings.cpp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
void Settings::Draw() {
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
30
Editor/src/Project/Settings.h
Normal file
30
Editor/src/Project/Settings.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
#include "../EditorWindow.h"
|
||||||
|
|
||||||
|
|
||||||
|
class Settings : public EditorWindow {
|
||||||
|
public:
|
||||||
|
Settings() : EditorWindow("Settings") {}
|
||||||
|
|
||||||
|
void Draw() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int selectedGfxAPI = 0;
|
||||||
|
int selectedPhysicsEngine = 0;
|
||||||
|
glm::vec3 Gravity = glm::vec3(0.0f, -9.81f, 0.0f);
|
||||||
|
bool ShowAdvancedOptions = false;
|
||||||
|
bool DebugEngine = false;
|
||||||
|
|
||||||
|
const char* PhysicsEngine[2] = {
|
||||||
|
"PhysX",
|
||||||
|
"Jolt Physics"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* GraphicsAPI[3] = {
|
||||||
|
"OpenGL",
|
||||||
|
"Vulkan",
|
||||||
|
"Metal (Apple)"
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
197
Editor/src/PropertyPanels/Inspector.cpp
Normal file
197
Editor/src/PropertyPanels/Inspector.cpp
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
#include "Inspector.h"
|
||||||
|
#include "../TransformVec3.h"
|
||||||
|
#include "../IconsMaterialDesign.h"
|
||||||
|
|
||||||
|
void Inspector::Draw()
|
||||||
|
{
|
||||||
|
if (selected.isValid()) {
|
||||||
|
AddComponentDropDown();
|
||||||
|
ShowComponents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void AddComponent(YoggieEngine::Entity selected , int i) {
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
selected.AddComponent<YoggieEngine::ScriptComponent>();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
selected.AddComponent<YoggieEngine::CameraComponent>();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
selected.AddComponent<YoggieEngine::LightComponent>();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
selected.AddComponent<YoggieEngine::Render3DComponent>();
|
||||||
|
default:
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Inspector::AddComponentDropDown()
|
||||||
|
{
|
||||||
|
static char* names[] = { "Script Component", "Camera Component", "Light Component", "Render3D"};
|
||||||
|
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]))
|
||||||
|
AddComponent(selected, i);
|
||||||
|
}
|
||||||
|
ImGui::EndPopup();
|
||||||
|
|
||||||
|
}
|
||||||
|
ImGui::NewLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Inspector::ShowComponents()
|
||||||
|
{
|
||||||
|
auto component = selected.GetComponent<YoggieEngine::IdentifierComponent>();
|
||||||
|
ImGui::InputText("Name:", (char*)component.name.c_str(), component.name.size() * sizeof(char), ImGuiInputTextFlags_ReadOnly);
|
||||||
|
|
||||||
|
|
||||||
|
if (selected.HasComponent<YoggieEngine::TransformComponent>()) {
|
||||||
|
auto& transform = selected.GetComponent<YoggieEngine::TransformComponent>();
|
||||||
|
if (ImGui::CollapsingHeader("Transform", ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||||
|
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 1.0, 1.0f, 1.0f, 0.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 1.0, 1.0f, 1.0f, 0.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 1.0, 1.0f, 1.0f, 0.0f });
|
||||||
|
ImGui::SetCursorPosX(ImGui::GetContentRegionMax().x - 20);
|
||||||
|
ImGui::Button(ICON_MD_SETTINGS, { 20,20 });
|
||||||
|
ImGui::OpenPopupOnItemClick("##myContext", ImGuiPopupFlags_MouseButtonRight);
|
||||||
|
if (ImGui::BeginPopupContextWindow("##myContext")) {
|
||||||
|
if (ImGui::MenuItem("Reset")) {
|
||||||
|
spdlog::info("Reset component");
|
||||||
|
}
|
||||||
|
if (ImGui::MenuItem("Copy Component")) {
|
||||||
|
spdlog::info("Copy component");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::EndPopup();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopStyleColor(3);
|
||||||
|
|
||||||
|
/*
|
||||||
|
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);
|
||||||
|
*/
|
||||||
|
auto something = glm::value_ptr(transform.Position);
|
||||||
|
|
||||||
|
ImGuiExtension::TransformVec3("Position", transform.Position);
|
||||||
|
ImGuiExtension::TransformVec3("Rotation", transform.Rotation);
|
||||||
|
ImGuiExtension::TransformVec3("Scale", transform.Scale);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
if (selected.HasComponent<YoggieEngine::RelationComponent>()) {
|
||||||
|
ImGui::Text("Has relation");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (selected.HasComponent<YoggieEngine::Render3DComponent>()) {
|
||||||
|
auto& render3d = selected.GetComponent<YoggieEngine::Render3DComponent>();
|
||||||
|
const char* AssetNames[]{ "Asset1" , "Asset2" };
|
||||||
|
if (ImGui::CollapsingHeader("Render3D", ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||||
|
|
||||||
|
if (ImGui::Button("Select Renderable Asset"))
|
||||||
|
ImGui::OpenPopup("Renderable_list_popup");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::TextUnformatted(render3d.mesh.elements.empty() ? "<None>" : "ASSET_GUID_OR_ID");
|
||||||
|
if (ImGui::BeginPopup("Renderable_list_popup")) {
|
||||||
|
ImGui::Text("None");
|
||||||
|
ImGui::Separator();
|
||||||
|
for (int i = 0; i < IM_ARRAYSIZE(AssetNames); i++) {
|
||||||
|
if(ImGui::Selectable(AssetNames[i]))
|
||||||
|
{ }
|
||||||
|
}
|
||||||
|
ImGui::EndPopup();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::ColorEdit3("Colour", glm::value_ptr(render3d.color));
|
||||||
|
|
||||||
|
ImGui::Checkbox("Use static rendering:", &render3d.isStatic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static bool deferred = true;
|
||||||
|
|
||||||
|
|
||||||
|
if (selected.HasComponent<YoggieEngine::LightComponent>()) {
|
||||||
|
auto& light = selected.GetComponent<YoggieEngine::LightComponent>();
|
||||||
|
if (ImGui::CollapsingHeader("Light", ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||||
|
ImGui::ColorEdit3("Colour", glm::value_ptr(light.Color));
|
||||||
|
ImGui::Checkbox("Deferred", &deferred);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selected.HasComponent <YoggieEngine::CameraComponent>()) {
|
||||||
|
auto& camera = selected.GetComponent<YoggieEngine::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<YoggieEngine::RigidBody>()) {
|
||||||
|
auto& rigibody = selected.GetComponent<YoggieEngine::RigidBody>();
|
||||||
|
if (ImGui::CollapsingHeader("RigidBody")) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selected.HasComponent<YoggieEngine::ScriptComponent>()) {
|
||||||
|
const char* AssetNames[]{ "Script 1" , "Script 2" };
|
||||||
|
if (ImGui::CollapsingHeader("Script", ImGuiTreeNodeFlags_Leaf)) {
|
||||||
|
|
||||||
|
if (ImGui::Button("Select Renderable Asset"))
|
||||||
|
ImGui::OpenPopup("Scripts_list_popup");
|
||||||
|
|
||||||
|
if (ImGui::BeginPopup("Scripts_list_popup")) {
|
||||||
|
ImGui::Text("None");
|
||||||
|
ImGui::Separator();
|
||||||
|
for (int i = 0; i < IM_ARRAYSIZE(AssetNames); i++) {
|
||||||
|
if (ImGui::Selectable(AssetNames[i]))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndPopup();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::SameLine();
|
||||||
|
std::string scriptAssetId = "<Random_GUID>";
|
||||||
|
ImGui::InputText("asset", scriptAssetId.data(), scriptAssetId.length(), ImGuiInputTextFlags_ReadOnly | ImGuiInputTextFlags_AutoSelectAll);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
22
Editor/src/PropertyPanels/Inspector.h
Normal file
22
Editor/src/PropertyPanels/Inspector.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
||||||
|
#include "../EditorWindow.h"
|
||||||
|
|
||||||
|
typedef void (*voidFunction) (void);
|
||||||
|
|
||||||
|
inline void ComponentView(const std::string& componentName, voidFunction func);
|
||||||
|
|
||||||
|
class Inspector : public EditorWindow {
|
||||||
|
public:
|
||||||
|
Inspector( YoggieEngine::Entity& selected ) : EditorWindow("Inspector"), selected(selected){}
|
||||||
|
|
||||||
|
void Draw()override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void AddComponentDropDown();
|
||||||
|
void ShowComponents();
|
||||||
|
|
||||||
|
|
||||||
|
YoggieEngine::Entity& selected;
|
||||||
|
};
|
59
Editor/src/TransformVec3.h
Normal file
59
Editor/src/TransformVec3.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <imgui_widgets.cpp>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
namespace ImGuiExtension {
|
||||||
|
|
||||||
|
|
||||||
|
void TransformVec3(const char* label, glm::vec3& vector) {
|
||||||
|
|
||||||
|
ImGui::PushID(label);
|
||||||
|
ImGui::Columns(2);
|
||||||
|
ImGui::SetColumnWidth(0, 100.0f);
|
||||||
|
ImGui::Text(label);
|
||||||
|
|
||||||
|
ImGui::NextColumn();
|
||||||
|
|
||||||
|
ImGui::PushMultiItemsWidths(3, ImGui::CalcItemWidth());
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{ 0, 0 });
|
||||||
|
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.8f, 0.1f, 0.15f, 1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.9f,0.2f,0.2f, 1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.8f,0.1f,0.15f, 1.0f });
|
||||||
|
if (ImGui::Button("X"))
|
||||||
|
vector.x = 0;
|
||||||
|
ImGui::PopStyleColor(3);
|
||||||
|
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::DragFloat("##X", &glm::value_ptr(vector)[0], 0.1f, 0.0f, 0.0f, "%.2f");
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
ImGui::SameLine();
|
||||||
|
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.2f, 0.7f, 0.2f, 1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.3f,0.8f,0.3f, 1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.2f,0.7f,0.2f, 1.0f });
|
||||||
|
if (ImGui::Button("Y"))
|
||||||
|
vector.y = 0;
|
||||||
|
ImGui::PopStyleColor(3);
|
||||||
|
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::DragFloat("##Y", &glm::value_ptr(vector)[1], 0.1f, 0.0f, 0.0f, "%.2f");
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
ImGui::SameLine();
|
||||||
|
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.1f, 0.25f, 0.8f, 1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.2f,0.35f,0.9f, 1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.1f,0.25f,0.8f, 1.0f });
|
||||||
|
if (ImGui::Button("Z"))
|
||||||
|
vector.z = 0;
|
||||||
|
ImGui::PopStyleColor(3);
|
||||||
|
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::DragFloat("##Z", &glm::value_ptr(vector)[2], 0.1f, 0.0f, 0.0f, "%.2f");
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
ImGui::PopStyleVar();
|
||||||
|
|
||||||
|
ImGui::Columns(1);
|
||||||
|
ImGui::PopID();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
59
Editor/src/app.cpp
Normal file
59
Editor/src/app.cpp
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#include "../../YoggieEngine/src/EntryPoint.h"
|
||||||
|
#include <stack>
|
||||||
|
#include "EditorLayer.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace YoggieEngine;
|
||||||
|
|
||||||
|
class Editor : public Application {
|
||||||
|
public:
|
||||||
|
Editor() : Application("Editor"){}
|
||||||
|
|
||||||
|
void Run() override
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
// Create EditorLayer
|
||||||
|
EditorLayer* firstLayer = new EditorLayer();
|
||||||
|
|
||||||
|
firstLayer->OnStartup();
|
||||||
|
|
||||||
|
|
||||||
|
double previous = glfwGetTime();
|
||||||
|
double lag = 0.0;
|
||||||
|
while (!appWindow->WindowShouldClose()) {
|
||||||
|
PollEvents();
|
||||||
|
double now = glfwGetTime();
|
||||||
|
double elapsed = now - previous;
|
||||||
|
previous = now;
|
||||||
|
lag += elapsed;
|
||||||
|
GuiBegin();
|
||||||
|
firstLayer->OnUpdate();
|
||||||
|
firstLayer->OnUI();
|
||||||
|
GuiEnd();
|
||||||
|
|
||||||
|
SwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
firstLayer->OnDestroy();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<Layer*> layers = std::vector<Layer*>();
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
YoggieEngine::Application* CreateApplication() {
|
||||||
|
|
||||||
|
return new Editor();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
project "ImGUI_Opengl3"
|
|
||||||
kind "StaticLib"
|
|
||||||
|
|
||||||
includedirs {
|
|
||||||
"../libs/glfw/include",
|
|
||||||
"../libs/ImGui"
|
|
||||||
}
|
|
||||||
|
|
||||||
files {
|
|
||||||
"../libs/ImGui/*.cpp",
|
|
||||||
"../libs/ImGui/backends/imgui_impl_glfw.cpp",
|
|
||||||
"../libs/ImGui/backends/imgui_impl_Opengl3.cpp",
|
|
||||||
}
|
|
||||||
|
|
||||||
libdirs{
|
|
||||||
"../libs/ImGui",
|
|
||||||
"../libs/glad"
|
|
||||||
}
|
|
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
|
## 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
|
- Rendering
|
||||||
- OpenGL
|
- OpenGL
|
||||||
- Vulkan
|
- Vulkan
|
||||||
|
- Metal (Possibly)
|
||||||
- Logging
|
- Logging
|
||||||
- Different for debug and release
|
- Different for debug and release
|
||||||
- Different per OS
|
|
||||||
|
|
||||||
- Physics
|
- Physics
|
||||||
- PhysX
|
- PhysX
|
||||||
- Alternative for non-nvidia stuff?!
|
- Jolt Physics
|
||||||
|
- Entity Component system
|
||||||
- Basic Entity Component system
|
- Graphical scripting (Possibly)
|
||||||
|
- Scripting support
|
||||||
- Graphical scripting ??
|
|
||||||
|
|
||||||
- Scripting support ( idk what language)
|
|
||||||
- LUA
|
- LUA
|
||||||
|
- C# (for object orientated approaches to gamedev)
|
||||||
- Configuration options
|
- Configuration options
|
||||||
- JSON
|
- JSON
|
||||||
- LUA
|
- YAML
|
||||||
- others ?!?!?
|
- INI
|
||||||
|
|
||||||
## Screenshots
|
## More docs
|
||||||
|
[Todo list](TODO.md) \
|
||||||
<img src="Screenshots/screen1.png" width="300"></img>
|
[Planning](https://git.barink.dev/Nigel/MyGameEngine/projects)\
|
||||||
<img src="Screenshots/screen2.png" width="300"></img>
|
[Development](DEVELOPMENT.md)\
|
||||||
|
[Show case](SHOWCASE.md)
|
||||||
## 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
|
|
||||||
```
|
|
||||||
|
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"
|
#include "Util.h"
|
||||||
|
|
||||||
void PrintSceneTree(SceneNode& node, int depth) {
|
/*
|
||||||
|
* void PrintSceneTree(Node& node, int depth) {
|
||||||
// Indent name based on depth
|
// Indent name based on depth
|
||||||
std::cout << " ";
|
std::cout << " ";
|
||||||
for (int i = 0; i < depth; i++) {
|
for (int i = 0; i < depth; i++) {
|
||||||
@ -30,3 +31,5 @@ glm::mat4 CalculateModelMat(Transform& transform) {
|
|||||||
return tran * rot * scale;
|
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.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user