Compare commits
3 Commits
1f1a776686
...
3fa5455b43
Author | SHA1 | Date | |
---|---|---|---|
3fa5455b43 | |||
ad79aa2865 | |||
fd68c5dde3 |
@ -16,6 +16,8 @@ includedirs{
|
|||||||
|
|
||||||
-- I'd prefer if didn't need these..
|
-- I'd prefer if didn't need these..
|
||||||
-- We'll figure that out some time later
|
-- We'll figure that out some time later
|
||||||
|
"../libs/physx/physx/include",
|
||||||
|
"../libs/physx/pxshared/include",
|
||||||
incfolder["lua"],
|
incfolder["lua"],
|
||||||
incfolder["spdlog"],
|
incfolder["spdlog"],
|
||||||
incfolder["glm"],
|
incfolder["glm"],
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
class EditorWindow {
|
class EditorWindow {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EditorWindow(const std::string& name ) { ImGui::Begin(name.c_str()); }
|
EditorWindow(const std::string& name, ImGuiWindowFlags_ flags = ImGuiWindowFlags_None ) { ImGui::Begin(name.c_str(), false ,flags); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ public:
|
|||||||
ImGui_ImplGlfw_InitForOpenGL(window.GetGLFWHandle(), true);
|
ImGui_ImplGlfw_InitForOpenGL(window.GetGLFWHandle(), true);
|
||||||
ImGui_ImplOpenGL3_Init("#version 450");
|
ImGui_ImplOpenGL3_Init("#version 450");
|
||||||
|
|
||||||
|
ImGuizmo::SetImGuiContext(ImGui::GetCurrentContext());
|
||||||
ImGuizmo::SetOrthographic(true);
|
ImGuizmo::SetOrthographic(true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -138,6 +138,33 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DebugMenu()
|
||||||
|
{
|
||||||
|
if (ImGui::BeginMenu("Debug")) {
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectMenu() {
|
||||||
|
if (ImGui::BeginMenu("Select")) {
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindowMenu() {
|
||||||
|
if (ImGui::BeginMenu("Window")) {
|
||||||
|
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Help() {
|
||||||
|
if (ImGui::BeginMenu("Help")) {
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
~MainMenuBar() { ImGui::EndMainMenuBar(); }
|
~MainMenuBar() { ImGui::EndMainMenuBar(); }
|
||||||
private:
|
private:
|
||||||
char* path = nullptr;
|
char* path = nullptr;
|
||||||
|
@ -17,6 +17,11 @@
|
|||||||
typedef void ( *voidFunction ) (void);
|
typedef void ( *voidFunction ) (void);
|
||||||
using namespace YoggieEngine;
|
using namespace YoggieEngine;
|
||||||
|
|
||||||
|
auto matrix = glm::mat4(1.0f);
|
||||||
|
auto worldOrigin = glm::mat4(1.0f);
|
||||||
|
auto projection = glm::perspective(45.0f, 0.89f, 0.001f, 1.0f);
|
||||||
|
auto view = glm::mat4(1.0f);
|
||||||
|
|
||||||
inline void ComponentView(const std::string& componentName, voidFunction func)
|
inline void ComponentView(const std::string& componentName, voidFunction func)
|
||||||
{
|
{
|
||||||
ImGuiWindowFlags_ window_flags = ImGuiWindowFlags_None;
|
ImGuiWindowFlags_ window_flags = ImGuiWindowFlags_None;
|
||||||
@ -123,28 +128,108 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Viewport : EditorWindow {
|
class Viewport : EditorWindow {
|
||||||
public:
|
public:
|
||||||
Viewport (Framebuffer& fb) : EditorWindow("SceneView") {
|
Viewport (Framebuffer& fb, Camera cam ) : EditorWindow("SceneView")
|
||||||
ImGui::Image(
|
{
|
||||||
|
ImVec2 WinPos = ImGui::GetWindowPos();
|
||||||
|
ImVec2 ContentRegionMin = ImGui::GetWindowContentRegionMin();
|
||||||
|
ImVec2 ContentRegionMax = ImGui::GetWindowContentRegionMax();
|
||||||
|
ImVec2 ScreenSpaceMin = { ContentRegionMin.x + WinPos.x, ContentRegionMin.y + WinPos.y };
|
||||||
|
ImVec2 ScreenSpaceMax = { ContentRegionMax.x + WinPos.x,ContentRegionMax.y + WinPos.y };
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::Image(
|
||||||
(void*)(intptr_t)fb.GetColourAttachment(),
|
(void*)(intptr_t)fb.GetColourAttachment(),
|
||||||
ImVec2{ (float)ImGui::GetWindowWidth(),(float)ImGui::GetWindowHeight() }
|
ImVec2{ (float)ImGui::GetWindowWidth(),(float)ImGui::GetWindowHeight() }
|
||||||
);
|
);
|
||||||
|
|
||||||
//ImGuizmo::SetDrawlist();
|
|
||||||
//ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, ImGui::GetWindowWidth(), ImGui::GetWindowHeight());
|
ImGuizmo::Enable(true);
|
||||||
//ImGuizmo::Enable(true);
|
ImGuizmo::SetRect(ScreenSpaceMin.x, ScreenSpaceMin.y,ContentRegionMax.x, ContentRegionMax.y);
|
||||||
//ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection), ImGuizmo::TRANSLATE, ImGuizmo::WORLD, glm::value_ptr(trans));
|
|
||||||
|
ImGuizmo::ViewManipulate(glm::value_ptr(cam.ViewMatrix), 1, { ScreenSpaceMin.x,ScreenSpaceMin.y }, { 90,90 }, 0x22CCCCCC);
|
||||||
|
ImGuizmo::DrawGrid(glm::value_ptr(cam.ViewMatrix), glm::value_ptr(cam.ProjectionMatrix), glm::value_ptr(worldOrigin), 100.0f);
|
||||||
|
|
||||||
|
// Matrix is the model matrix we would want to manipulate
|
||||||
|
ImGuizmo::Manipulate(glm::value_ptr(cam.ViewMatrix), glm::value_ptr(cam.ProjectionMatrix), ImGuizmo::TRANSLATE, ImGuizmo::WORLD, glm::value_ptr(matrix));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int selectedGfxAPI = 0;
|
||||||
|
int selectedPhysicsEngine = 0;
|
||||||
|
glm::vec3 Gravity = glm::vec3(0.0f, -9.81f, 0.0f);
|
||||||
|
bool ShowAdvancedOptions = false;
|
||||||
|
bool DebugEngine = false;
|
||||||
class Settings : EditorWindow {
|
class Settings : EditorWindow {
|
||||||
public:
|
public:
|
||||||
Settings() : EditorWindow("Settings") {
|
Settings() : EditorWindow("Settings")
|
||||||
ImGui::LabelText("##title-settings", "Fine grain control over your engine... ");
|
{
|
||||||
|
ImGui::LabelText("##title-settings", "Fine grain control over the engine!");
|
||||||
|
|
||||||
|
if (ImGui::BeginCombo("Graphics API", GraphicsAPI[selectedGfxAPI])) {
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
bool isSelected = i == selectedGfxAPI;
|
||||||
|
if (ImGui::Selectable(GraphicsAPI[i], isSelected)) {
|
||||||
|
selectedGfxAPI = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isSelected)
|
||||||
|
ImGui::SetItemDefaultFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndCombo();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::NewLine();
|
||||||
|
|
||||||
|
if (ImGui::BeginCombo("Physics Engine", PhysicsEngine[selectedPhysicsEngine])) {
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
bool isSelected = i == selectedPhysicsEngine;
|
||||||
|
if (ImGui::Selectable(PhysicsEngine[i], isSelected)) {
|
||||||
|
selectedGfxAPI = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSelected)
|
||||||
|
ImGui::SetItemDefaultFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndCombo();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::InputFloat3("Gravity", glm::value_ptr(Gravity));
|
||||||
|
|
||||||
|
ImGui::NewLine();
|
||||||
|
if (ImGui::Button("Show Advanced options ")) {
|
||||||
|
ShowAdvancedOptions = !ShowAdvancedOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ShowAdvancedOptions)
|
||||||
|
{
|
||||||
|
ImGui::Checkbox("Debug Engine", &DebugEngine);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
const char* PhysicsEngine[2] = {
|
||||||
|
"PhysX",
|
||||||
|
"Jolt Physics"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* GraphicsAPI[3] = {
|
||||||
|
"OpenGL",
|
||||||
|
"Vulkan",
|
||||||
|
"Metal (Apple)"
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class ProjectInfo : EditorWindow {
|
class ProjectInfo : EditorWindow {
|
||||||
@ -183,6 +268,9 @@ public:
|
|||||||
ImGui::PushStyleColor(ImGuiCol_ButtonActive, 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));
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.f, 1.f, 1.f, 0.2f));
|
||||||
|
|
||||||
|
Texture folderIcon = Texture("rsc/folderIcon.png");
|
||||||
|
Texture assetIcon = Texture("rsc/assetIcon.png");
|
||||||
|
|
||||||
|
|
||||||
int row = 0;
|
int row = 0;
|
||||||
int column = 0;
|
int column = 0;
|
||||||
@ -197,14 +285,14 @@ public:
|
|||||||
|
|
||||||
if (asset.isFolder) {
|
if (asset.isFolder) {
|
||||||
ImGui::ImageButton(
|
ImGui::ImageButton(
|
||||||
(ImTextureID)(Texture("rsc/folderIcon.png")).GetID(),
|
(ImTextureID)folderIcon.GetID(),
|
||||||
ImVec2{ (float)iconSize,(float)iconSize });
|
ImVec2{ (float)iconSize,(float)iconSize });
|
||||||
ImGui::Text(asset.GetName(), row);
|
ImGui::Text(asset.GetName(), row);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ImGui::ImageButton(
|
ImGui::ImageButton(
|
||||||
(ImTextureID)(Texture("rsc/assetIcon.png")).GetID(),
|
(ImTextureID)assetIcon.GetID(),
|
||||||
ImVec2{ (float)iconSize, (float)iconSize });
|
ImVec2{ (float)iconSize, (float)iconSize });
|
||||||
ImGui::Text(asset.GetName(), row);
|
ImGui::Text(asset.GetName(), row);
|
||||||
|
|
||||||
@ -217,12 +305,58 @@ public:
|
|||||||
|
|
||||||
ImGui::PopStyleColor(3);
|
ImGui::PopStyleColor(3);
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
|
const GLuint textures[2]{ assetIcon.GetID(), folderIcon.GetID() };
|
||||||
|
glDeleteTextures(2, textures );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
static Texture folderIcon;
|
|
||||||
static Texture AssetIcon;
|
|
||||||
int iconSize = 60;
|
int iconSize = 60;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define RuntimeControlWindowFlags (ImGuiWindowFlags_)(ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse)
|
||||||
|
|
||||||
|
struct ButtonInfo {
|
||||||
|
const char* Name;
|
||||||
|
ImVec4 Color;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class RuntimeControls : EditorWindow {
|
||||||
|
public:
|
||||||
|
RuntimeControls() : EditorWindow("RuntimeControls", RuntimeControlWindowFlags) {
|
||||||
|
|
||||||
|
ImGui::SameLine((ImGui::GetWindowContentRegionMax().x / 2) - ( numButtons * buttonSize.x ));
|
||||||
|
for (int i = 0; i < numButtons; i++) {
|
||||||
|
ImVec4 color = button[i].Color;
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, color);
|
||||||
|
const float strengthIncrease = 1.5f;
|
||||||
|
ImGui::PushStyleColor(
|
||||||
|
ImGuiCol_ButtonHovered,
|
||||||
|
ImVec4{
|
||||||
|
color.x * strengthIncrease,
|
||||||
|
color.y * strengthIncrease,
|
||||||
|
color.z * strengthIncrease,
|
||||||
|
color.w
|
||||||
|
}
|
||||||
|
);
|
||||||
|
if (ImGui::Button(button[i].Name, buttonSize)) {
|
||||||
|
|
||||||
|
}
|
||||||
|
ImGui::PopStyleColor();
|
||||||
|
ImGui::PopStyleColor();
|
||||||
|
ImGui::SameLine();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ImVec2 buttonSize = ImVec2{ 90 ,25 };
|
||||||
|
unsigned int numButtons = 2;
|
||||||
|
ButtonInfo button[2] = {
|
||||||
|
{"Play" , ImVec4{ 0.001 * 12 , 0.001 * 201 , 0.001* 69, 1.0f}},
|
||||||
|
{"Simulate", ImVec4{ 0.001 * 14, 0.001 * 157, 0.001 * 201, 1.0f}}
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
@ -1,5 +1,6 @@
|
|||||||
#include "../../YoggieEngine/src/EntryPoint.h"
|
#include "../../YoggieEngine/src/EntryPoint.h"
|
||||||
#include "../../YoggieEngine/src/AssetManager/ModelImporter.h"
|
#include "../../YoggieEngine/src/AssetManager/ModelImporter.h"
|
||||||
|
#include "../../YoggieEngine/src/Physics/Physics.h"
|
||||||
|
|
||||||
#include <nfd.h>
|
#include <nfd.h>
|
||||||
|
|
||||||
@ -18,99 +19,64 @@
|
|||||||
const unsigned int MS_PER_UPDATE = 2;
|
const unsigned int MS_PER_UPDATE = 2;
|
||||||
void CreateTestProject(std::unique_ptr<Project>& project, Scene& scene);
|
void CreateTestProject(std::unique_ptr<Project>& project, Scene& scene);
|
||||||
|
|
||||||
|
RendererConfig EditorSceneRendererConfig{
|
||||||
|
1200, // Screen Width
|
||||||
|
700, // Screen Height
|
||||||
|
glm::vec3{0,0,0}, // Clear Color
|
||||||
|
true // Depth testing
|
||||||
|
};
|
||||||
|
|
||||||
class Editor : public Application {
|
class Editor : public Application {
|
||||||
public:
|
public:
|
||||||
Editor() : Application("Editor"){
|
Editor()
|
||||||
}
|
: Application("Editor"),
|
||||||
|
AppWindow(1200,700),
|
||||||
void Run() override
|
framebuffer(new Framebuffer(1200,700)),
|
||||||
|
viewportRenderer(EditorSceneRendererConfig),
|
||||||
|
EditorGUIRenderer(AppWindow),
|
||||||
|
Selected((entt::entity)-1)
|
||||||
{
|
{
|
||||||
|
viewportRenderer.setCurrentFrameBuffer(*framebuffer);
|
||||||
auto NativeEditorWindow = NativeWindow(1200, 700);
|
|
||||||
|
|
||||||
framebuffer = new Framebuffer(800, 600);
|
|
||||||
auto renderer = Renderer(RendererConfig{
|
|
||||||
1200, // Screen Width
|
|
||||||
700, // Screen Height
|
|
||||||
glm::vec3{0,0,0}, // Clear Color
|
|
||||||
true // Depth testing
|
|
||||||
});
|
|
||||||
|
|
||||||
auto GuiRenderer = GUIRenderer(NativeEditorWindow);
|
|
||||||
|
|
||||||
Selected = (entt::entity)-1;
|
|
||||||
|
|
||||||
CreateTestProject(CurrentProject, ActiveScene);
|
|
||||||
|
|
||||||
ActiveScene.Start();
|
|
||||||
|
|
||||||
renderer.setCurrentFrameBuffer(*framebuffer);
|
|
||||||
|
|
||||||
|
|
||||||
double previous = glfwGetTime();
|
|
||||||
double lag = 0.0;
|
|
||||||
while (!NativeEditorWindow.WindowShouldClose())
|
|
||||||
{
|
|
||||||
|
|
||||||
double current = glfwGetTime();
|
|
||||||
double elapsed = current - previous;
|
|
||||||
previous = current;
|
|
||||||
lag += elapsed;
|
|
||||||
|
|
||||||
NativeEditorWindow.Poll();
|
|
||||||
|
|
||||||
while (lag >= MS_PER_UPDATE)
|
|
||||||
{
|
|
||||||
ActiveScene.Update();
|
|
||||||
lag -= MS_PER_UPDATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// submit DrawCommands for all render3DComponents
|
|
||||||
|
|
||||||
auto group = ActiveScene.getReg().view<TransformComponent, Render3DComponent>();
|
|
||||||
group.each([&renderer](auto enity, TransformComponent& t, Render3DComponent& renderComponent) {
|
|
||||||
renderer.Submit(renderComponent, t);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
renderer.Render();
|
|
||||||
|
|
||||||
GuiRenderer.Begin();
|
|
||||||
RenderGUI();
|
|
||||||
GuiRenderer.End();
|
|
||||||
|
|
||||||
NativeEditorWindow.SwapBuffers();
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
delete framebuffer;
|
|
||||||
ActiveScene.Stop();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderScene() {
|
||||||
void RenderGUI() {
|
// submit DrawCommands for all render3DComponents
|
||||||
|
auto group = ActiveScene.getReg().view<TransformComponent, Render3DComponent>();
|
||||||
|
group.each([&](auto enity, TransformComponent& t, Render3DComponent& renderComponent) {
|
||||||
|
viewportRenderer.Submit(renderComponent, t);
|
||||||
|
});
|
||||||
|
|
||||||
|
viewportRenderer.Render();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderEditorGUI() {
|
||||||
|
EditorGUIRenderer.Begin();
|
||||||
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport());
|
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport());
|
||||||
|
|
||||||
// Show a menu bar
|
// Show a menu bar
|
||||||
{
|
{
|
||||||
MainMenuBar menuBar= MainMenuBar();
|
MainMenuBar menuBar = MainMenuBar();
|
||||||
menuBar.ApplicationMenu(CurrentProject);
|
menuBar.ApplicationMenu(CurrentProject);
|
||||||
menuBar.SceneMenu(CurrentProject, ActiveScene);
|
menuBar.SceneMenu(CurrentProject, ActiveScene);
|
||||||
|
menuBar.SelectMenu();
|
||||||
|
menuBar.WindowMenu();
|
||||||
|
menuBar.DebugMenu();
|
||||||
|
menuBar.Help();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
ProjectInfo projectInfo(*(CurrentProject.get()));
|
ProjectInfo projectInfo(*(CurrentProject.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Viewport sceneview = Viewport(*framebuffer);
|
Viewport sceneview = Viewport(*framebuffer, viewportRenderer.getCamera());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
RuntimeControls rc = RuntimeControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
SceneExplorer explorer(Selected, ActiveScene);
|
SceneExplorer explorer(Selected, ActiveScene);
|
||||||
}
|
}
|
||||||
@ -126,14 +92,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Settings();
|
Settings settings = Settings();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
AssetFinder assetsView = AssetFinder();
|
// AssetFinder assetsView = AssetFinder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Console console = Console();
|
Console console = Console();
|
||||||
console.Show();
|
console.Show();
|
||||||
@ -141,15 +107,74 @@ public:
|
|||||||
|
|
||||||
ImGui::ShowDemoWindow();
|
ImGui::ShowDemoWindow();
|
||||||
ImGui::ShowMetricsWindow();
|
ImGui::ShowMetricsWindow();
|
||||||
|
EditorGUIRenderer.End();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Run() override
|
||||||
|
{
|
||||||
|
CreateTestProject(CurrentProject, ActiveScene);
|
||||||
|
ActiveScene.Start();
|
||||||
|
|
||||||
|
|
||||||
|
// Create the physics engine demo!
|
||||||
|
Physics Physics;
|
||||||
|
//Physics.Demo();
|
||||||
|
|
||||||
|
|
||||||
|
double previous = glfwGetTime();
|
||||||
|
double lag = 0.0;
|
||||||
|
while (!AppWindow.WindowShouldClose())
|
||||||
|
{
|
||||||
|
|
||||||
|
double current = glfwGetTime();
|
||||||
|
double elapsed = current - previous;
|
||||||
|
previous = current;
|
||||||
|
lag += elapsed;
|
||||||
|
|
||||||
|
AppWindow.Poll();
|
||||||
|
|
||||||
|
if (SimulatePhysics)
|
||||||
|
{
|
||||||
|
Physics.Step(1.0f / 60.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while (lag >= MS_PER_UPDATE)
|
||||||
|
{
|
||||||
|
ActiveScene.Update();
|
||||||
|
lag -= MS_PER_UPDATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderScene();
|
||||||
|
|
||||||
|
RenderEditorGUI();
|
||||||
|
|
||||||
|
AppWindow.SwapBuffers();
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
delete framebuffer;
|
||||||
|
ActiveScene.Stop();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
NativeWindow AppWindow;
|
||||||
|
|
||||||
|
Framebuffer* framebuffer;
|
||||||
|
Renderer viewportRenderer;
|
||||||
|
|
||||||
|
GUIRenderer EditorGUIRenderer;
|
||||||
|
|
||||||
|
// Editor State
|
||||||
|
bool SimulatePhysics = false;
|
||||||
|
entt::entity Selected;
|
||||||
|
|
||||||
std::unique_ptr<Project> CurrentProject;
|
std::unique_ptr<Project> CurrentProject;
|
||||||
Scene ActiveScene;
|
Scene ActiveScene;
|
||||||
entt::entity Selected;
|
|
||||||
Framebuffer* framebuffer ;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -174,7 +199,7 @@ void CreateTestProject(std::unique_ptr<Project>& project, Scene& scene ) {
|
|||||||
|
|
||||||
// Create a cube
|
// Create a cube
|
||||||
auto model = importer.Import("build/Debug/Models/Cube.obj");
|
auto model = importer.Import("build/Debug/Models/Cube.obj");
|
||||||
auto cube = scene.AddEntity("cube");
|
auto cube = scene.AddEntity("Cube");
|
||||||
|
|
||||||
auto& render3DComponent = cube.AddComponent<Render3DComponent>();
|
auto& render3DComponent = cube.AddComponent<Render3DComponent>();
|
||||||
render3DComponent.mesh = *(model->renderable->mesh);
|
render3DComponent.mesh = *(model->renderable->mesh);
|
||||||
|
@ -7,7 +7,9 @@
|
|||||||
|
|
||||||
<img src="Screenshots/screen1.png" width="300"></img> \
|
<img src="Screenshots/screen1.png" width="300"></img> \
|
||||||
<img src="Screenshots/screen2.png" width="300"></img> \
|
<img src="Screenshots/screen2.png" width="300"></img> \
|
||||||
<img src="Screenshots/YoggieEditor.png" width="300"></img>
|
<img src="Screenshots/YoggieEditor.png" width="300"></img> \
|
||||||
|
<img src="Screenshots/YoggieEditor_workingGuizmo.png" width="300"></img> \
|
||||||
|
<img src="Screenshots/YoggieEditorV0.2.png" width="300"></img>
|
||||||
## Planning
|
## Planning
|
||||||
see [TODO](docs/TODO.md) \
|
see [TODO](docs/TODO.md) \
|
||||||
see [Features](Features.md)
|
see [Features](Features.md)
|
||||||
|
BIN
Screenshots/YoggieEditorV0.2.png
(Stored with Git LFS)
Normal file
BIN
Screenshots/YoggieEditorV0.2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Screenshots/YoggieEditor_workingGuizmo.png
(Stored with Git LFS)
Normal file
BIN
Screenshots/YoggieEditor_workingGuizmo.png
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -1,45 +1,13 @@
|
|||||||
#include <YoggieEngine.h>
|
#include <YoggieEngine.h>
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include <PxPhysicsAPI.h>
|
|
||||||
#define PVD_HOST "127.0.0.1"
|
|
||||||
|
|
||||||
using namespace physx;
|
|
||||||
|
|
||||||
namespace YoggieEngine {
|
namespace YoggieEngine {
|
||||||
|
|
||||||
static PxDefaultErrorCallback gDefaultErrorCallback;
|
Application::Application(const std::string& name)
|
||||||
static PxDefaultAllocator gDefaultAllocatorCallback;
|
|
||||||
static PxFoundation* mFoundation;
|
|
||||||
static PxPvd* mPvd;
|
|
||||||
static PxPvdTransport* transport;
|
|
||||||
static PxPhysics* mPhysics;
|
|
||||||
bool recordMemoryAllocations = true;
|
|
||||||
|
|
||||||
|
|
||||||
Application::Application(const std::string& name )
|
|
||||||
: m_AppName(name)
|
: m_AppName(name)
|
||||||
{
|
{
|
||||||
EngineInstrumentation::PerfomanceSamplerInit();
|
EngineInstrumentation::PerfomanceSamplerInit();
|
||||||
|
|
||||||
// startup PhysX
|
|
||||||
mFoundation = PxCreateFoundation(PX_PHYSICS_VERSION, gDefaultAllocatorCallback, gDefaultErrorCallback);
|
|
||||||
if (!mFoundation) {
|
|
||||||
spdlog::critical("PxCreateFoundation failed!");
|
|
||||||
}
|
|
||||||
|
|
||||||
mPvd = physx::PxCreatePvd(*mFoundation);
|
|
||||||
if (!mPvd) {
|
|
||||||
spdlog::critical("pxCreatPvd failed!");
|
|
||||||
}
|
|
||||||
transport = PxDefaultPvdSocketTransportCreate(PVD_HOST, 5425, 10);
|
|
||||||
mPvd->connect(*transport, PxPvdInstrumentationFlag::eALL);
|
|
||||||
|
|
||||||
|
|
||||||
mPhysics = PxCreatePhysics(PX_PHYSICS_VERSION, *mFoundation, PxTolerancesScale(), recordMemoryAllocations, mPvd);
|
|
||||||
if (!mPhysics) {
|
|
||||||
spdlog::critical("pxCreatePhysics failed!");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -48,24 +16,5 @@ namespace YoggieEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Application::~Application(){
|
Application::~Application() {}
|
||||||
|
}
|
||||||
if (mPhysics)
|
|
||||||
mPhysics->release();
|
|
||||||
|
|
||||||
if (mPvd) {
|
|
||||||
if (mPvd->isConnected()) {
|
|
||||||
mPvd->disconnect();
|
|
||||||
}
|
|
||||||
mPvd->release();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (transport)
|
|
||||||
transport->release();
|
|
||||||
|
|
||||||
|
|
||||||
if (mFoundation)
|
|
||||||
mFoundation->release();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <YoggieEngine.h>
|
#include <YoggieEngine.h>
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
namespace YoggieEngine {
|
namespace YoggieEngine {
|
||||||
|
|
||||||
Camera::Camera(glm::vec3 position, glm::vec3 rotation, float zoom)
|
Camera::Camera(glm::vec3 position, glm::vec3 rotation, float zoom)
|
||||||
: Position(position), Rotation(rotation), Zoom(zoom) {
|
: Position(position), Rotation(rotation), Zoom(zoom) {
|
||||||
|
|
||||||
@ -8,17 +9,28 @@ namespace YoggieEngine {
|
|||||||
Right = glm::vec3(0.0f, 0.0f, 1.0f);
|
Right = glm::vec3(0.0f, 0.0f, 1.0f);
|
||||||
Up = glm::vec3(0.0f, 1.0f, 0.0f);
|
Up = glm::vec3(0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
|
|
||||||
|
auto rotated_position = glm::rotate(glm::mat4(1.0f), Rotation.x, glm::vec3(1.0f, 0.0f, 0.0f)) * glm::vec4(Position, 1.0f);
|
||||||
|
ViewMatrix = glm::lookAt(
|
||||||
|
Position,
|
||||||
|
glm::vec3{ rotated_position.x, rotated_position.y , rotated_position.z } + Front,
|
||||||
|
Up);
|
||||||
|
|
||||||
|
ProjectionMatrix = glm::perspective(glm::radians(Zoom), (800.0f / 600.0f), 0.001f, 100.0f);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Camera::~Camera() {
|
Camera::~Camera() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::mat4 Camera::GetViewMatrix() {
|
|
||||||
return glm::lookAt(
|
|
||||||
|
void Camera::Update() {
|
||||||
|
ViewMatrix = glm::lookAt(
|
||||||
Position,
|
Position,
|
||||||
Position + Front,
|
Position + Front,
|
||||||
Up
|
Up);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,20 +2,24 @@
|
|||||||
namespace YoggieEngine {
|
namespace YoggieEngine {
|
||||||
class Camera {
|
class Camera {
|
||||||
public:
|
public:
|
||||||
|
Camera(glm::vec3 position, glm::vec3 rotation, float zoom);
|
||||||
|
~Camera();
|
||||||
|
|
||||||
|
void Update();
|
||||||
|
|
||||||
glm::vec3 Position;
|
glm::vec3 Position;
|
||||||
glm::vec3 Rotation;
|
glm::vec3 Rotation;
|
||||||
float Zoom;
|
float Zoom;
|
||||||
|
|
||||||
Camera(glm::vec3 position, glm::vec3 rotation, float zoom);
|
glm::mat4 ViewMatrix;
|
||||||
~Camera();
|
glm::mat4 ProjectionMatrix;
|
||||||
|
|
||||||
glm::mat4 GetViewMatrix();
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
glm::vec3 Front;
|
glm::vec3 Front;
|
||||||
glm::vec3 Right;
|
glm::vec3 Right;
|
||||||
glm::vec3 Up;
|
glm::vec3 Up;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -101,29 +101,29 @@ namespace YoggieEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Shader::setUniformMat4(std::string uniformName, glm::mat4 matrix4) const
|
void Shader::setUniformMat4(std::string uniformName, const glm::mat4& matrix4) const
|
||||||
{
|
{
|
||||||
glUniformMatrix4fv(glGetUniformLocation(id, uniformName.c_str()), 1, GL_FALSE, glm::value_ptr(matrix4));
|
glUniformMatrix4fv(glGetUniformLocation(id, uniformName.c_str()), 1, GL_FALSE, glm::value_ptr(matrix4));
|
||||||
}
|
}
|
||||||
void Shader::setUniformVec4(std::string uniformName, glm::vec4 vector4) const
|
void Shader::setUniformVec4(std::string uniformName, const glm::vec4& vector4) const
|
||||||
{
|
{
|
||||||
glUniform4fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector4));
|
glUniform4fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector4));
|
||||||
}
|
}
|
||||||
void Shader::setUniformVec3(std::string uniformName, glm::vec3 vector3) const
|
void Shader::setUniformVec3(std::string uniformName, const glm::vec3& vector3) const
|
||||||
{
|
{
|
||||||
glUniform3fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector3));
|
glUniform3fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector3));
|
||||||
}
|
}
|
||||||
void Shader::setUniformVec2(std::string uniformName, glm::vec2 vector2) const
|
void Shader::setUniformVec2(std::string uniformName,const glm::vec2& vector2) const
|
||||||
{
|
{
|
||||||
glUniform2fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector2));
|
glUniform2fv(glGetUniformLocation(id, uniformName.c_str()), 1, glm::value_ptr(vector2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shader::setUniformFloat(std::string uniformName, float value) const
|
void Shader::setUniformFloat(std::string uniformName, const float& value) const
|
||||||
{
|
{
|
||||||
glUniform1f(glGetUniformLocation(id, uniformName.c_str()), value);
|
glUniform1f(glGetUniformLocation(id, uniformName.c_str()), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shader::setUniformInt(std::string uniformName, int value) const
|
void Shader::setUniformInt(std::string uniformName, const int& value) const
|
||||||
{
|
{
|
||||||
glUniform1i(glGetUniformLocation(id, uniformName.c_str()), value);
|
glUniform1i(glGetUniformLocation(id, uniformName.c_str()), value);
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,12 @@ namespace YoggieEngine {
|
|||||||
public:
|
public:
|
||||||
Shader(const std::string vertexShaderPath, const std::string fragmentShaderPath);
|
Shader(const std::string vertexShaderPath, const std::string fragmentShaderPath);
|
||||||
void Use() const;
|
void Use() const;
|
||||||
void setUniformMat4(std::string uniformName, glm::mat4 matrix4)const;
|
void setUniformMat4(std::string uniformName, const glm::mat4& matrix4)const;
|
||||||
void setUniformVec4(std::string uniformName, glm::vec4 vector4)const;
|
void setUniformVec4(std::string uniformName, const glm::vec4& vector4)const;
|
||||||
void setUniformVec3(std::string uniformName, glm::vec3 vector3)const;
|
void setUniformVec3(std::string uniformName, const glm::vec3& vector3)const;
|
||||||
void setUniformVec2(std::string uniformName, glm::vec2 vector2)const;
|
void setUniformVec2(std::string uniformName, const glm::vec2& vector2)const;
|
||||||
void setUniformFloat(std::string uniformName, float value)const;
|
void setUniformFloat(std::string uniformName, const float& value)const;
|
||||||
void setUniformInt(std::string uniformName, int value) const;
|
void setUniformInt(std::string uniformName, const int& value) const;
|
||||||
|
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
|
@ -7,9 +7,7 @@
|
|||||||
#include "../Graphics/Primitives/DrawCommand.h"
|
#include "../Graphics/Primitives/DrawCommand.h"
|
||||||
|
|
||||||
namespace YoggieEngine {
|
namespace YoggieEngine {
|
||||||
float Angle = 0.0;
|
Camera cam = Camera(glm::vec3(12.0f, 0.0f, 0.0f), glm::vec3(45.0f, 0.0f, 0.0f), 90.0f);
|
||||||
Camera cam = Camera(glm::vec3(12.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f), 90.0f);
|
|
||||||
glm::mat4 projection = glm::perspective(glm::radians(cam.Zoom), (800.0f / 600.0f), 0.001f, 100.0f);
|
|
||||||
|
|
||||||
Renderer::Renderer(RendererConfig& config)
|
Renderer::Renderer(RendererConfig& config)
|
||||||
: m_framebuffer(Framebuffer(config.ScreenWidth, config.ScreenHeight))
|
: m_framebuffer(Framebuffer(config.ScreenWidth, config.ScreenHeight))
|
||||||
@ -20,6 +18,10 @@ Renderer::Renderer(RendererConfig& config)
|
|||||||
Renderer::~Renderer(){}
|
Renderer::~Renderer(){}
|
||||||
|
|
||||||
|
|
||||||
|
Camera& Renderer::getCamera() {
|
||||||
|
return cam;
|
||||||
|
}
|
||||||
|
|
||||||
void Renderer::Submit( Render3DComponent& renderComponent, TransformComponent& transform) {
|
void Renderer::Submit( Render3DComponent& renderComponent, TransformComponent& transform) {
|
||||||
|
|
||||||
if (renderComponent.VAO == 0 || renderComponent.IBO == 0)
|
if (renderComponent.VAO == 0 || renderComponent.IBO == 0)
|
||||||
@ -63,7 +65,7 @@ void Renderer::Submit( Render3DComponent& renderComponent, TransformComponent& t
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::Render()
|
void Renderer::Render()
|
||||||
{
|
{
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer.GetId());
|
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer.GetId());
|
||||||
|
|
||||||
@ -89,10 +91,10 @@ void Renderer::Render()
|
|||||||
glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), command.transform.Position) * glm::scale(glm::mat4(1.0f), command.transform.Scale) * rotation;
|
glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), command.transform.Position) * glm::scale(glm::mat4(1.0f), command.transform.Scale) * rotation;
|
||||||
|
|
||||||
|
|
||||||
command.shader.setUniformVec3("Color", glm::vec3(1.0f, 0.0f, 0.0f));
|
command.shader.setUniformVec3("Color", glm::vec3(0.3f, 0.3f, 0.3f));
|
||||||
command.shader.setUniformMat4("M", modelMatrix);
|
command.shader.setUniformMat4("M", modelMatrix);
|
||||||
command.shader.setUniformMat4("V", cam.GetViewMatrix());
|
command.shader.setUniformMat4("V", cam.ViewMatrix);
|
||||||
command.shader.setUniformMat4("P", projection);
|
command.shader.setUniformMat4("P", cam.ProjectionMatrix);
|
||||||
|
|
||||||
glDrawElements(GL_TRIANGLES, static_cast<unsigned int>(command.num_elements),
|
glDrawElements(GL_TRIANGLES, static_cast<unsigned int>(command.num_elements),
|
||||||
GL_UNSIGNED_INT, NULL);
|
GL_UNSIGNED_INT, NULL);
|
||||||
|
@ -24,11 +24,13 @@ namespace YoggieEngine {
|
|||||||
|
|
||||||
|
|
||||||
void Submit(Render3DComponent& renderComponent, TransformComponent& transform); // Collects DrawCommands
|
void Submit(Render3DComponent& renderComponent, TransformComponent& transform); // Collects DrawCommands
|
||||||
void Render(); // Draw to screen (usingthe drawCalls
|
void Render(); // Draw to screen (using drawCall structs)
|
||||||
|
|
||||||
void setCurrentFrameBuffer(const Framebuffer& fb);
|
void setCurrentFrameBuffer(const Framebuffer& fb);
|
||||||
void setClearColor(const glm::vec3& ClearColor);
|
void setClearColor(const glm::vec3& ClearColor);
|
||||||
|
|
||||||
|
Camera& getCamera();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Framebuffer m_framebuffer;
|
Framebuffer m_framebuffer;
|
||||||
glm::vec3 m_clearColor;
|
glm::vec3 m_clearColor;
|
||||||
|
132
YoggieEngine/src/Physics/Physics.cpp
Normal file
132
YoggieEngine/src/Physics/Physics.cpp
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
#include <YoggieEngine.h>
|
||||||
|
#include "Physics.h"
|
||||||
|
|
||||||
|
namespace YoggieEngine {
|
||||||
|
|
||||||
|
Physics::Physics()
|
||||||
|
{
|
||||||
|
// startup PhysX
|
||||||
|
mFoundation = PxCreateFoundation(PX_PHYSICS_VERSION, gDefaultAllocatorCallback, gDefaultErrorCallback);
|
||||||
|
if (!mFoundation) {
|
||||||
|
spdlog::critical("PxCreateFoundation failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
mPvd = physx::PxCreatePvd(*mFoundation);
|
||||||
|
if (!mPvd) {
|
||||||
|
spdlog::critical("pxCreatPvd failed!");
|
||||||
|
}
|
||||||
|
transport = PxDefaultPvdSocketTransportCreate(PVD_HOST, 5425, 10);
|
||||||
|
mPvd->connect(*transport, PxPvdInstrumentationFlag::eALL);
|
||||||
|
|
||||||
|
|
||||||
|
mPhysics = PxCreatePhysics(PX_PHYSICS_VERSION, *mFoundation, PxTolerancesScale(), recordMemoryAllocations, mPvd);
|
||||||
|
if (!mPhysics) {
|
||||||
|
spdlog::critical("pxCreatePhysics failed!");
|
||||||
|
}
|
||||||
|
gDispatcher = nullptr;
|
||||||
|
gMaterial = nullptr;
|
||||||
|
mScene = nullptr;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Physics::~Physics()
|
||||||
|
{
|
||||||
|
if (mScene)
|
||||||
|
mScene->release();
|
||||||
|
|
||||||
|
if (gDispatcher)
|
||||||
|
gDispatcher->release();
|
||||||
|
|
||||||
|
if (mPhysics)
|
||||||
|
mPhysics->release();
|
||||||
|
|
||||||
|
if (mPvd) {
|
||||||
|
if (mPvd->isConnected()) {
|
||||||
|
mPvd->disconnect();
|
||||||
|
}
|
||||||
|
mPvd->release();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transport)
|
||||||
|
transport->release();
|
||||||
|
|
||||||
|
|
||||||
|
if (mFoundation)
|
||||||
|
mFoundation->release();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Physics::Step(float dt)
|
||||||
|
{
|
||||||
|
mScene->simulate(dt);
|
||||||
|
mScene->fetchResults(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Physics::Demo()
|
||||||
|
{
|
||||||
|
createScene();
|
||||||
|
|
||||||
|
SetupPvdDebug();
|
||||||
|
|
||||||
|
createGroundPlane();
|
||||||
|
|
||||||
|
createStack(PxTransform(PxVec3(0, 0, stackZ -= 10.0f)), 10, 2.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
PxRigidDynamic* Physics::createDynamic(const PxTransform& t, const PxGeometry& geometry, const PxVec3& velocity = PxVec3(0)) {
|
||||||
|
PxRigidDynamic* dynamic = PxCreateDynamic(*mPhysics, t, geometry, *gMaterial, 10.0f);
|
||||||
|
dynamic->setAngularDamping(0.5f);
|
||||||
|
dynamic->setLinearVelocity(velocity);
|
||||||
|
mScene->addActor(*dynamic);
|
||||||
|
return dynamic;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Physics::createStack(const PxTransform& t, PxU32 size, PxReal halfextent)
|
||||||
|
{
|
||||||
|
PxShape* shape = mPhysics->createShape(PxBoxGeometry(halfextent, halfextent, halfextent), *gMaterial);
|
||||||
|
for (PxU32 i = 0; i < size; i++) {
|
||||||
|
for (PxU32 j = 0; j < size - i; j++) {
|
||||||
|
PxTransform localTm(PxVec3(PxReal(j * 2) - PxReal(size - i), PxReal(i * 2 + 1), 0) * halfextent);
|
||||||
|
PxRigidDynamic* body = mPhysics->createRigidDynamic(t.transform(localTm));
|
||||||
|
body->attachShape(*shape);
|
||||||
|
PxRigidBodyExt::updateMassAndInertia(*body, 10.0f);
|
||||||
|
mScene->addActor(*body);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shape->release();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Physics::createScene()
|
||||||
|
{
|
||||||
|
PxSceneDesc sceneDesc(mPhysics->getTolerancesScale());
|
||||||
|
sceneDesc.gravity = PxVec3(0.0f, -9.81f, 0.0f);
|
||||||
|
gDispatcher = PxDefaultCpuDispatcherCreate(2);
|
||||||
|
sceneDesc.cpuDispatcher = gDispatcher;
|
||||||
|
sceneDesc.filterShader = PxDefaultSimulationFilterShader;
|
||||||
|
mScene = mPhysics->createScene(sceneDesc);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Physics::createGroundPlane()
|
||||||
|
{
|
||||||
|
gMaterial = mPhysics->createMaterial(0.5f, 0.5f, 0.6f);
|
||||||
|
PxRigidStatic* groundPlane = PxCreatePlane(*mPhysics, PxPlane(0,1,0,0), *gMaterial);
|
||||||
|
mScene->addActor(*groundPlane);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Physics::SetupPvdDebug()
|
||||||
|
{
|
||||||
|
PxPvdSceneClient* pvdClient = mScene->getScenePvdClient();
|
||||||
|
if (pvdClient) {
|
||||||
|
pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_CONSTRAINTS, true);
|
||||||
|
pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_CONTACTS, true);
|
||||||
|
pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_SCENEQUERIES, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
66
YoggieEngine/src/Physics/Physics.h
Normal file
66
YoggieEngine/src/Physics/Physics.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <PxPhysicsAPI.h>
|
||||||
|
using namespace physx; // For now will just focus on getting Physx working in its most basic form
|
||||||
|
|
||||||
|
#define PVD_HOST "127.0.0.1"
|
||||||
|
#define MAX_IP_CHAR_COUNT 16
|
||||||
|
|
||||||
|
namespace YoggieEngine {
|
||||||
|
|
||||||
|
struct PhysicsConfig {
|
||||||
|
|
||||||
|
bool recordMemoryAllocations;
|
||||||
|
const char PvdHost[MAX_IP_CHAR_COUNT];
|
||||||
|
float StackZ;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Physics {
|
||||||
|
public:
|
||||||
|
|
||||||
|
Physics();
|
||||||
|
~Physics();
|
||||||
|
|
||||||
|
void Step(float dt);
|
||||||
|
|
||||||
|
void Demo();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
PxRigidDynamic* createDynamic(const PxTransform& t, const PxGeometry& geometry, const PxVec3& velocity);
|
||||||
|
void createStack(const PxTransform& t, PxU32 size, PxReal halfextent);
|
||||||
|
void createScene();
|
||||||
|
void createGroundPlane();
|
||||||
|
|
||||||
|
void SetupPvdDebug();
|
||||||
|
|
||||||
|
|
||||||
|
// Memory Management
|
||||||
|
bool recordMemoryAllocations = true;
|
||||||
|
PxDefaultErrorCallback gDefaultErrorCallback;
|
||||||
|
PxDefaultAllocator gDefaultAllocatorCallback;
|
||||||
|
PxDefaultCpuDispatcher* gDispatcher;
|
||||||
|
|
||||||
|
// Basics
|
||||||
|
PxFoundation* mFoundation;
|
||||||
|
PxPhysics* mPhysics;
|
||||||
|
|
||||||
|
// Simulation
|
||||||
|
PxScene* mScene;
|
||||||
|
PxMaterial* gMaterial;
|
||||||
|
|
||||||
|
PxReal stackZ = 10.0f;
|
||||||
|
|
||||||
|
// DEBUG
|
||||||
|
PxPvd* mPvd;
|
||||||
|
PxPvdTransport* transport;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -39,8 +39,11 @@ extern "C"
|
|||||||
#include "Graphics/Primitives/Material.h"
|
#include "Graphics/Primitives/Material.h"
|
||||||
#include "Graphics/Renderer.h"
|
#include "Graphics/Renderer.h"
|
||||||
|
|
||||||
|
#include "Physics/Physics.h"
|
||||||
|
|
||||||
#include "EventSystem/EventEmitter.h"
|
#include "EventSystem/EventEmitter.h"
|
||||||
#include "EventSystem/EventListener.h"
|
#include "EventSystem/EventListener.h"
|
||||||
|
|
||||||
|
|
||||||
#include "Scene/Scene.h"
|
#include "Scene/Scene.h"
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user