mirror of
https://github.com/bailwillharr/engine.git
synced 2024-09-21 04:51:18 +00:00
Allow changing present mode
This commit is contained in:
parent
5b60668f71
commit
e9e78966be
@ -29,23 +29,24 @@ enum class MSAALevel {
|
|||||||
k16X,
|
k16X,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class PresentMode {
|
||||||
|
kDoubleBufferedNoVsync,
|
||||||
|
kDoubleBufferedVsync,
|
||||||
|
kTripleBuffered,
|
||||||
|
};
|
||||||
|
|
||||||
struct GraphicsSettings {
|
struct GraphicsSettings {
|
||||||
GraphicsSettings()
|
GraphicsSettings()
|
||||||
{
|
{
|
||||||
// sane defaults
|
// sane defaults
|
||||||
enable_validation = true;
|
enable_validation = false;
|
||||||
vsync = true;
|
present_mode = PresentMode::kDoubleBufferedVsync;
|
||||||
// not all GPUs/drivers support immediate present with V-sync enabled
|
|
||||||
wait_for_present = true;
|
|
||||||
msaa_level = MSAALevel::kOff;
|
msaa_level = MSAALevel::kOff;
|
||||||
enable_anisotropy = false; // anisotropic filtering can severely affect performance on intel iGPUs
|
enable_anisotropy = false; // anisotropic filtering can severely affect performance on intel iGPUs
|
||||||
}
|
}
|
||||||
|
|
||||||
bool enable_validation;
|
bool enable_validation;
|
||||||
bool vsync;
|
PresentMode present_mode;
|
||||||
// idle CPU after render until the frame has been presented
|
|
||||||
// (no affect with V-sync disabled)
|
|
||||||
bool wait_for_present;
|
|
||||||
MSAALevel msaa_level;
|
MSAALevel msaa_level;
|
||||||
bool enable_anisotropy;
|
bool enable_anisotropy;
|
||||||
};
|
};
|
||||||
|
@ -19,6 +19,9 @@ class GFXDevice {
|
|||||||
|
|
||||||
void GetViewportSize(uint32_t* w, uint32_t* h);
|
void GetViewportSize(uint32_t* w, uint32_t* h);
|
||||||
|
|
||||||
|
void ChangePresentMode(gfx::PresentMode mode);
|
||||||
|
gfx::PresentMode GetPresentMode();
|
||||||
|
|
||||||
void SetupImguiBackend();
|
void SetupImguiBackend();
|
||||||
void ShutdownImguiBackend();
|
void ShutdownImguiBackend();
|
||||||
void CmdRenderImguiDrawData(gfx::DrawBuffer* draw_buffer, ImDrawData* draw_data);
|
void CmdRenderImguiDrawData(gfx::DrawBuffer* draw_buffer, ImDrawData* draw_data);
|
||||||
|
@ -118,8 +118,9 @@ void main() {
|
|||||||
|
|
||||||
lighting *= (1.0 - shadow);
|
lighting *= (1.0 - shadow);
|
||||||
|
|
||||||
const vec3 ambient_light = vec3(0.09082, 0.13281, 0.18164) * 2.4;
|
const vec3 ambient_light = vec3(0.09082, 0.13281, 0.18164) * 2.4 * 0.1;
|
||||||
lighting += mix(ambient_light, texture(globalSetSkybox, R).rgb, metallic) * ao * diffuse_brdf; // this is NOT physically-based, it just looks cool
|
//lighting += mix(ambient_light, texture(globalSetSkybox, R).rgb, metallic) * ao * diffuse_brdf; // this is NOT physically-based, it just looks cool
|
||||||
|
lighting += (ambient_light * ao * diffuse_brdf);
|
||||||
|
|
||||||
// tone mapping
|
// tone mapping
|
||||||
const vec3 hdr_color = emission + lighting;
|
const vec3 hdr_color = emission + lighting;
|
||||||
|
@ -75,6 +75,39 @@ static std::filesystem::path getResourcesPath()
|
|||||||
return resourcesPath;
|
return resourcesPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
static std::string openGLTFDialog() {
|
||||||
|
OPENFILENAMEA ofn; // common dialog box structure
|
||||||
|
CHAR szFile[260] = { 0 }; // if using TCHAR macros, use TCHAR array
|
||||||
|
|
||||||
|
// Initialize OPENFILENAME
|
||||||
|
ZeroMemory(&ofn, sizeof(ofn));
|
||||||
|
ofn.lStructSize = sizeof(ofn);
|
||||||
|
ofn.hwndOwner = NULL;
|
||||||
|
ofn.lpstrFile = szFile;
|
||||||
|
ofn.lpstrFile[0] = '\0';
|
||||||
|
ofn.nMaxFile = sizeof(szFile);
|
||||||
|
ofn.lpstrFilter = "GLTF Files (*.gltf;*.glb)\0*.gltf;*.glb\0All Files (*.*)\0*.*\0";
|
||||||
|
ofn.nFilterIndex = 1;
|
||||||
|
ofn.lpstrFileTitle = NULL;
|
||||||
|
ofn.nMaxFileTitle = 0;
|
||||||
|
ofn.lpstrInitialDir = NULL;
|
||||||
|
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;
|
||||||
|
|
||||||
|
// Display the Open dialog box
|
||||||
|
if (GetOpenFileNameA(&ofn) == TRUE)
|
||||||
|
{
|
||||||
|
return ofn.lpstrFile;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ""; // User cancelled the dialog
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static auto frametimeFromFPS(int fps) { return std::chrono::nanoseconds(1'000'000'000 / fps); }
|
||||||
|
|
||||||
Application::Application(const char* appName, const char* appVersion, gfx::GraphicsSettings graphicsSettings, Configuration configuration)
|
Application::Application(const char* appName, const char* appVersion, gfx::GraphicsSettings graphicsSettings, Configuration configuration)
|
||||||
: app_name(appName), app_version(appVersion), configuration_(configuration)
|
: app_name(appName), app_version(appVersion), configuration_(configuration)
|
||||||
{
|
{
|
||||||
@ -184,11 +217,6 @@ void Application::GameLoop()
|
|||||||
{
|
{
|
||||||
LOG_DEBUG("Begin game loop...");
|
LOG_DEBUG("Begin game loop...");
|
||||||
|
|
||||||
constexpr int FPS_LIMIT = 240;
|
|
||||||
constexpr auto FRAMETIME_LIMIT = std::chrono::nanoseconds(1000000000 / FPS_LIMIT);
|
|
||||||
auto beginFrame = std::chrono::steady_clock::now();
|
|
||||||
auto endFrame = beginFrame + FRAMETIME_LIMIT;
|
|
||||||
|
|
||||||
auto lastTick = window_->GetNanos();
|
auto lastTick = window_->GetNanos();
|
||||||
std::array<float, 20> delta_times{};
|
std::array<float, 20> delta_times{};
|
||||||
|
|
||||||
@ -196,8 +224,29 @@ void Application::GameLoop()
|
|||||||
bool menu_active = false;
|
bool menu_active = false;
|
||||||
bool show_entity_boxes = false;
|
bool show_entity_boxes = false;
|
||||||
bool show_bounding_volumes = false;
|
bool show_bounding_volumes = false;
|
||||||
|
bool enable_frame_limiter = false;
|
||||||
|
bool triple_buffering = false;
|
||||||
|
bool vsync = false;
|
||||||
bool show_info_window = false;
|
bool show_info_window = false;
|
||||||
} debug_menu_state;
|
} debug_menu_state;
|
||||||
|
debug_menu_state.enable_frame_limiter = configuration_.enable_frame_limiter;
|
||||||
|
switch (renderer_->GetDevice()->GetPresentMode()) {
|
||||||
|
case gfx::PresentMode::kDoubleBufferedNoVsync:
|
||||||
|
debug_menu_state.triple_buffering = false;
|
||||||
|
debug_menu_state.vsync = false;
|
||||||
|
break;
|
||||||
|
case gfx::PresentMode::kDoubleBufferedVsync:
|
||||||
|
debug_menu_state.triple_buffering = false;
|
||||||
|
debug_menu_state.vsync = true;
|
||||||
|
break;
|
||||||
|
case gfx::PresentMode::kTripleBuffered:
|
||||||
|
debug_menu_state.triple_buffering = true;
|
||||||
|
debug_menu_state.vsync = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fps_limit = 240;
|
||||||
|
auto beginFrame = std::chrono::steady_clock::now();
|
||||||
|
auto endFrame = beginFrame + frametimeFromFPS(fps_limit);
|
||||||
|
|
||||||
// single-threaded game loop
|
// single-threaded game loop
|
||||||
while (window_->IsRunning()) {
|
while (window_->IsRunning()) {
|
||||||
@ -225,16 +274,71 @@ void Application::GameLoop()
|
|||||||
debug_menu_state.show_info_window = !debug_menu_state.show_info_window;
|
debug_menu_state.show_info_window = !debug_menu_state.show_info_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (window_->GetKeyPress(inputs::Key::K_L)) {
|
||||||
|
debug_menu_state.enable_frame_limiter ^= true;
|
||||||
|
}
|
||||||
|
|
||||||
ImGui_ImplVulkan_NewFrame();
|
ImGui_ImplVulkan_NewFrame();
|
||||||
ImGui_ImplSDL2_NewFrame();
|
ImGui_ImplSDL2_NewFrame();
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
|
|
||||||
|
//ImGui::ShowDemoWindow();
|
||||||
|
|
||||||
|
// Stop mouse from moving the camera when the settings menu is open
|
||||||
|
input_manager_->SetDeviceActive(InputDevice::kMouse, !debug_menu_state.menu_active);
|
||||||
|
|
||||||
if (debug_menu_state.menu_active) {
|
if (debug_menu_state.menu_active) {
|
||||||
if (ImGui::Begin("debugMenu", 0)) {
|
if (ImGui::Begin("Settings", 0)) {
|
||||||
ImGui::Text("Test!");
|
|
||||||
ImGui::Text("FPS: %.3f", std::roundf(avg_fps));
|
ImGui::Text("FPS: %.3f", std::roundf(avg_fps));
|
||||||
ImGui::Checkbox("Show entity hitboxes?", &debug_menu_state.show_entity_boxes);
|
ImGui::Checkbox("Enable FPS limiter", &debug_menu_state.enable_frame_limiter);
|
||||||
ImGui::Checkbox("Show bounding volumes?", &debug_menu_state.show_bounding_volumes);
|
if (debug_menu_state.enable_frame_limiter) {
|
||||||
|
ImGui::SliderInt("FPS limit", &fps_limit, 10, 360);
|
||||||
|
}
|
||||||
|
if (debug_menu_state.triple_buffering) {
|
||||||
|
ImGui::BeginDisabled();
|
||||||
|
}
|
||||||
|
if (ImGui::Checkbox("Enable vsync", &debug_menu_state.vsync)) {
|
||||||
|
if (debug_menu_state.vsync) {
|
||||||
|
renderer_->GetDevice()->ChangePresentMode(gfx::PresentMode::kDoubleBufferedVsync);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
renderer_->GetDevice()->ChangePresentMode(gfx::PresentMode::kDoubleBufferedNoVsync);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (debug_menu_state.triple_buffering) {
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
}
|
||||||
|
if (ImGui::Checkbox("Triple buffering", &debug_menu_state.triple_buffering)) {
|
||||||
|
if (debug_menu_state.triple_buffering) {
|
||||||
|
debug_menu_state.vsync = false;
|
||||||
|
renderer_->GetDevice()->ChangePresentMode(gfx::PresentMode::kTripleBuffered);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (debug_menu_state.vsync) {
|
||||||
|
renderer_->GetDevice()->ChangePresentMode(gfx::PresentMode::kDoubleBufferedVsync);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
renderer_->GetDevice()->ChangePresentMode(gfx::PresentMode::kDoubleBufferedNoVsync);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::Separator();
|
||||||
|
ImGui::Checkbox("Show entity hitboxes", &debug_menu_state.show_entity_boxes);
|
||||||
|
ImGui::Checkbox("Show bounding volumes", &debug_menu_state.show_bounding_volumes);
|
||||||
|
ImGui::Separator();
|
||||||
|
#ifndef _WIN32
|
||||||
|
ImGui::BeginDisabled();
|
||||||
|
#endif
|
||||||
|
// load gltf file dialog
|
||||||
|
if (ImGui::Button("Load glTF")) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
std::string path = std::filesystem::path(openGLTFDialog()).string();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifndef _WIN32
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
@ -282,61 +386,85 @@ void Application::GameLoop()
|
|||||||
if (node.type1 == CollisionSystem::BiTreeNode::Type::Entity) {
|
if (node.type1 == CollisionSystem::BiTreeNode::Type::Entity) {
|
||||||
const glm::vec3 col =
|
const glm::vec3 col =
|
||||||
(node.type1 == CollisionSystem::BiTreeNode::Type::BoundingVolume) ? glm::vec3{1.0f, 0.0f, 0.0f} : glm::vec3{0.0f, 1.0f, 0.0f};
|
(node.type1 == CollisionSystem::BiTreeNode::Type::BoundingVolume) ? glm::vec3{1.0f, 0.0f, 0.0f} : glm::vec3{0.0f, 1.0f, 0.0f};
|
||||||
Line line1{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, col };
|
Line line1{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, col};
|
||||||
debug_lines.push_back(line1);
|
debug_lines.push_back(line1);
|
||||||
Line line2{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, col };
|
Line line2{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, col};
|
||||||
debug_lines.push_back(line2);
|
debug_lines.push_back(line2);
|
||||||
Line line3{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, col };
|
Line line3{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, col};
|
||||||
debug_lines.push_back(line3);
|
debug_lines.push_back(line3);
|
||||||
Line line4{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, col };
|
Line line4{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, col};
|
||||||
debug_lines.push_back(line4);
|
debug_lines.push_back(line4);
|
||||||
|
|
||||||
Line line5{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z}, glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z}, col };
|
Line line5{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line5);
|
debug_lines.push_back(line5);
|
||||||
Line line6{ glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col };
|
Line line6{glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line6);
|
debug_lines.push_back(line6);
|
||||||
Line line7{ glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col };
|
Line line7{glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line7);
|
debug_lines.push_back(line7);
|
||||||
Line line8{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z}, glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z}, col };
|
Line line8{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line8);
|
debug_lines.push_back(line8);
|
||||||
|
|
||||||
Line line9{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col };
|
Line line9{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line9);
|
debug_lines.push_back(line9);
|
||||||
Line line10{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col };
|
Line line10{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line10);
|
debug_lines.push_back(line10);
|
||||||
Line line11{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col };
|
Line line11{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line11);
|
debug_lines.push_back(line11);
|
||||||
Line line12{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col };
|
Line line12{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line12);
|
debug_lines.push_back(line12);
|
||||||
}
|
}
|
||||||
if (node.type2 == CollisionSystem::BiTreeNode::Type::Entity) {
|
if (node.type2 == CollisionSystem::BiTreeNode::Type::Entity) {
|
||||||
const glm::vec3 col =
|
const glm::vec3 col =
|
||||||
(node.type2 == CollisionSystem::BiTreeNode::Type::BoundingVolume) ? glm::vec3{1.0f, 0.0f, 0.0f} : glm::vec3{0.0f, 1.0f, 0.0f};
|
(node.type2 == CollisionSystem::BiTreeNode::Type::BoundingVolume) ? glm::vec3{1.0f, 0.0f, 0.0f} : glm::vec3{0.0f, 1.0f, 0.0f};
|
||||||
Line line1{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, col };
|
Line line1{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, col};
|
||||||
debug_lines.push_back(line1);
|
debug_lines.push_back(line1);
|
||||||
Line line2{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, col };
|
Line line2{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, col};
|
||||||
debug_lines.push_back(line2);
|
debug_lines.push_back(line2);
|
||||||
Line line3{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, col };
|
Line line3{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, col};
|
||||||
debug_lines.push_back(line3);
|
debug_lines.push_back(line3);
|
||||||
Line line4{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, col };
|
Line line4{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, col};
|
||||||
debug_lines.push_back(line4);
|
debug_lines.push_back(line4);
|
||||||
|
|
||||||
Line line5{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z}, glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z}, col };
|
Line line5{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line5);
|
debug_lines.push_back(line5);
|
||||||
Line line6{ glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col };
|
Line line6{glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line6);
|
debug_lines.push_back(line6);
|
||||||
Line line7{ glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col };
|
Line line7{glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line7);
|
debug_lines.push_back(line7);
|
||||||
Line line8{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z}, glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z}, col };
|
Line line8{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line8);
|
debug_lines.push_back(line8);
|
||||||
|
|
||||||
Line line9{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col };
|
Line line9{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line9);
|
debug_lines.push_back(line9);
|
||||||
Line line10{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col };
|
Line line10{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line10);
|
debug_lines.push_back(line10);
|
||||||
Line line11{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col };
|
Line line11{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line11);
|
debug_lines.push_back(line11);
|
||||||
Line line12{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col };
|
Line line12{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line12);
|
debug_lines.push_back(line12);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -348,61 +476,85 @@ void Application::GameLoop()
|
|||||||
if (node.type1 == CollisionSystem::BiTreeNode::Type::BoundingVolume) {
|
if (node.type1 == CollisionSystem::BiTreeNode::Type::BoundingVolume) {
|
||||||
const glm::vec3 col =
|
const glm::vec3 col =
|
||||||
(node.type1 == CollisionSystem::BiTreeNode::Type::BoundingVolume) ? glm::vec3{1.0f, 0.0f, 0.0f} : glm::vec3{0.0f, 1.0f, 0.0f};
|
(node.type1 == CollisionSystem::BiTreeNode::Type::BoundingVolume) ? glm::vec3{1.0f, 0.0f, 0.0f} : glm::vec3{0.0f, 1.0f, 0.0f};
|
||||||
Line line1{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, col };
|
Line line1{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, col};
|
||||||
debug_lines.push_back(line1);
|
debug_lines.push_back(line1);
|
||||||
Line line2{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, col };
|
Line line2{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, col};
|
||||||
debug_lines.push_back(line2);
|
debug_lines.push_back(line2);
|
||||||
Line line3{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, col };
|
Line line3{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, col};
|
||||||
debug_lines.push_back(line3);
|
debug_lines.push_back(line3);
|
||||||
Line line4{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, col };
|
Line line4{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, col};
|
||||||
debug_lines.push_back(line4);
|
debug_lines.push_back(line4);
|
||||||
|
|
||||||
Line line5{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z}, glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z}, col };
|
Line line5{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line5);
|
debug_lines.push_back(line5);
|
||||||
Line line6{ glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col };
|
Line line6{glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line6);
|
debug_lines.push_back(line6);
|
||||||
Line line7{ glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col };
|
Line line7{glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line7);
|
debug_lines.push_back(line7);
|
||||||
Line line8{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z}, glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z}, col };
|
Line line8{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.min.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line8);
|
debug_lines.push_back(line8);
|
||||||
|
|
||||||
Line line9{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col };
|
Line line9{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line9);
|
debug_lines.push_back(line9);
|
||||||
Line line10{ glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col };
|
Line line10{glm::vec3{node.box1.min.x, node.box1.min.y, node.box1.max.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line10);
|
debug_lines.push_back(line10);
|
||||||
Line line11{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z}, glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col };
|
Line line11{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z},
|
||||||
|
glm::vec3{node.box1.max.x, node.box1.min.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line11);
|
debug_lines.push_back(line11);
|
||||||
Line line12{ glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z}, glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col };
|
Line line12{glm::vec3{node.box1.max.x, node.box1.max.y, node.box1.max.z},
|
||||||
|
glm::vec3{node.box1.min.x, node.box1.max.y, node.box1.max.z}, col};
|
||||||
debug_lines.push_back(line12);
|
debug_lines.push_back(line12);
|
||||||
}
|
}
|
||||||
if (node.type2 == CollisionSystem::BiTreeNode::Type::BoundingVolume) {
|
if (node.type2 == CollisionSystem::BiTreeNode::Type::BoundingVolume) {
|
||||||
const glm::vec3 col =
|
const glm::vec3 col =
|
||||||
(node.type2 == CollisionSystem::BiTreeNode::Type::BoundingVolume) ? glm::vec3{1.0f, 0.0f, 0.0f} : glm::vec3{0.0f, 1.0f, 0.0f};
|
(node.type2 == CollisionSystem::BiTreeNode::Type::BoundingVolume) ? glm::vec3{1.0f, 0.0f, 0.0f} : glm::vec3{0.0f, 1.0f, 0.0f};
|
||||||
Line line1{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, col };
|
Line line1{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, col};
|
||||||
debug_lines.push_back(line1);
|
debug_lines.push_back(line1);
|
||||||
Line line2{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, col };
|
Line line2{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, col};
|
||||||
debug_lines.push_back(line2);
|
debug_lines.push_back(line2);
|
||||||
Line line3{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, col };
|
Line line3{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, col};
|
||||||
debug_lines.push_back(line3);
|
debug_lines.push_back(line3);
|
||||||
Line line4{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, col };
|
Line line4{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, col};
|
||||||
debug_lines.push_back(line4);
|
debug_lines.push_back(line4);
|
||||||
|
|
||||||
Line line5{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z}, glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z}, col };
|
Line line5{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line5);
|
debug_lines.push_back(line5);
|
||||||
Line line6{ glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col };
|
Line line6{glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line6);
|
debug_lines.push_back(line6);
|
||||||
Line line7{ glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col };
|
Line line7{glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line7);
|
debug_lines.push_back(line7);
|
||||||
Line line8{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z}, glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z}, col };
|
Line line8{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.min.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line8);
|
debug_lines.push_back(line8);
|
||||||
|
|
||||||
Line line9{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col };
|
Line line9{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line9);
|
debug_lines.push_back(line9);
|
||||||
Line line10{ glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col };
|
Line line10{glm::vec3{node.box2.min.x, node.box2.min.y, node.box2.max.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line10);
|
debug_lines.push_back(line10);
|
||||||
Line line11{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z}, glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col };
|
Line line11{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z},
|
||||||
|
glm::vec3{node.box2.max.x, node.box2.min.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line11);
|
debug_lines.push_back(line11);
|
||||||
Line line12{ glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z}, glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col };
|
Line line12{glm::vec3{node.box2.max.x, node.box2.max.y, node.box2.max.z},
|
||||||
|
glm::vec3{node.box2.min.x, node.box2.max.y, node.box2.max.z}, col};
|
||||||
debug_lines.push_back(line12);
|
debug_lines.push_back(line12);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -420,11 +572,22 @@ void Application::GameLoop()
|
|||||||
window_->GetInputAndEvents();
|
window_->GetInputAndEvents();
|
||||||
|
|
||||||
/* fps limiter */
|
/* fps limiter */
|
||||||
|
if (configuration_.enable_frame_limiter != debug_menu_state.enable_frame_limiter) {
|
||||||
|
if (debug_menu_state.enable_frame_limiter) {
|
||||||
|
configuration_.enable_frame_limiter = true;
|
||||||
|
// reset beginFrame and endFrame so the limiter doesn't hang for ages
|
||||||
|
beginFrame = std::chrono::steady_clock::now();
|
||||||
|
endFrame = beginFrame;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
configuration_.enable_frame_limiter = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (configuration_.enable_frame_limiter) {
|
if (configuration_.enable_frame_limiter) {
|
||||||
std::this_thread::sleep_until(endFrame);
|
std::this_thread::sleep_until(endFrame);
|
||||||
}
|
}
|
||||||
beginFrame = endFrame;
|
beginFrame = endFrame;
|
||||||
endFrame = beginFrame + FRAMETIME_LIMIT;
|
endFrame = beginFrame + frametimeFromFPS(fps_limit);
|
||||||
delta_times[window_->GetFrameCount() % delta_times.size()] = window_->dt();
|
delta_times[window_->GetFrameCount() % delta_times.size()] = window_->dt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,8 +474,7 @@ GFXDevice::GFXDevice(const char* appName, const char* appVersion, SDL_Window* wi
|
|||||||
pimpl->swapchainInfo.physicalDevice = pimpl->device.physicalDevice;
|
pimpl->swapchainInfo.physicalDevice = pimpl->device.physicalDevice;
|
||||||
pimpl->swapchainInfo.surface = pimpl->surface;
|
pimpl->swapchainInfo.surface = pimpl->surface;
|
||||||
pimpl->swapchainInfo.window = pimpl->window;
|
pimpl->swapchainInfo.window = pimpl->window;
|
||||||
pimpl->swapchainInfo.vsync = pimpl->graphicsSettings.vsync;
|
pimpl->swapchainInfo.requested_present_mode = pimpl->graphicsSettings.present_mode;
|
||||||
pimpl->swapchainInfo.waitForPresent = pimpl->graphicsSettings.wait_for_present;
|
|
||||||
createSwapchain(&pimpl->swapchain, pimpl->swapchainInfo);
|
createSwapchain(&pimpl->swapchain, pimpl->swapchainInfo);
|
||||||
|
|
||||||
/* make synchronisation primitives for rendering and allocate command buffers
|
/* make synchronisation primitives for rendering and allocate command buffers
|
||||||
@ -577,6 +576,26 @@ void GFXDevice::GetViewportSize(uint32_t* w, uint32_t* h)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GFXDevice::ChangePresentMode(gfx::PresentMode mode)
|
||||||
|
{
|
||||||
|
pimpl->swapchainInfo.requested_present_mode = mode;
|
||||||
|
// need to recreate swapchain to apply changes
|
||||||
|
pimpl->swapchainIsOutOfDate = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx::PresentMode GFXDevice::GetPresentMode() {
|
||||||
|
switch (pimpl->swapchain.presentMode) {
|
||||||
|
case VK_PRESENT_MODE_FIFO_KHR:
|
||||||
|
return gfx::PresentMode::kDoubleBufferedVsync;
|
||||||
|
case VK_PRESENT_MODE_IMMEDIATE_KHR:
|
||||||
|
return gfx::PresentMode::kDoubleBufferedNoVsync;
|
||||||
|
case VK_PRESENT_MODE_MAILBOX_KHR:
|
||||||
|
return gfx::PresentMode::kTripleBuffered;
|
||||||
|
default:
|
||||||
|
throw std::runtime_error("Unknown present mode");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GFXDevice::SetupImguiBackend()
|
void GFXDevice::SetupImguiBackend()
|
||||||
{
|
{
|
||||||
auto loaderFunc = [](const char* function_name, void* user_data) -> PFN_vkVoidFunction {
|
auto loaderFunc = [](const char* function_name, void* user_data) -> PFN_vkVoidFunction {
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "application_component.h"
|
#include "application_component.h"
|
||||||
#include "util/files.h"
|
#include "util/files.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
#include <glm/mat4x4.hpp>
|
#include <glm/mat4x4.hpp>
|
||||||
#include <glm/trigonometric.hpp>
|
#include <glm/trigonometric.hpp>
|
||||||
|
@ -89,6 +89,8 @@ static glm::mat4 MatFromDoubleArray(const std::vector<double>& arr)
|
|||||||
engine::Entity LoadGLTF(Scene& scene, const std::string& path, bool isStatic)
|
engine::Entity LoadGLTF(Scene& scene, const std::string& path, bool isStatic)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
LOG_INFO("Loading gltf file: {}", path);
|
||||||
|
|
||||||
tg::TinyGLTF loader;
|
tg::TinyGLTF loader;
|
||||||
tg::Model model;
|
tg::Model model;
|
||||||
std::string err, warn;
|
std::string err, warn;
|
||||||
@ -407,6 +409,7 @@ engine::Entity LoadGLTF(Scene& scene, const std::string& path, bool isStatic)
|
|||||||
std::vector<uint32_t> indices;
|
std::vector<uint32_t> indices;
|
||||||
indices.reserve(num_indices);
|
indices.reserve(num_indices);
|
||||||
|
|
||||||
|
// TODO: natively support indices of these sizes instead of having to convert to uint32
|
||||||
if (indices_accessor.componentType == TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE) {
|
if (indices_accessor.componentType == TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE) {
|
||||||
for (size_t i = 0; i < num_indices; ++i) {
|
for (size_t i = 0; i < num_indices; ++i) {
|
||||||
indices.push_back(*reinterpret_cast<const uint8_t*>(&indices_data_start[i * 1]));
|
indices.push_back(*reinterpret_cast<const uint8_t*>(&indices_data_start[i * 1]));
|
||||||
@ -630,7 +633,6 @@ engine::Entity LoadGLTF(Scene& scene, const std::string& path, bool isStatic)
|
|||||||
|
|
||||||
if (node.mesh != -1) {
|
if (node.mesh != -1) {
|
||||||
const auto& primitives = primitive_arrays.at(node.mesh);
|
const auto& primitives = primitive_arrays.at(node.mesh);
|
||||||
int i = 0;
|
|
||||||
if (primitives.size() == 1) {
|
if (primitives.size() == 1) {
|
||||||
auto meshren = scene.AddComponent<MeshRenderableComponent>(e);
|
auto meshren = scene.AddComponent<MeshRenderableComponent>(e);
|
||||||
meshren->mesh = primitives.front().mesh;
|
meshren->mesh = primitives.front().mesh;
|
||||||
@ -639,12 +641,14 @@ engine::Entity LoadGLTF(Scene& scene, const std::string& path, bool isStatic)
|
|||||||
collider->aabb = primitives.front().aabb;
|
collider->aabb = primitives.front().aabb;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
int i = 0;
|
||||||
for (const EnginePrimitive& prim : primitives) {
|
for (const EnginePrimitive& prim : primitives) {
|
||||||
auto prim_entity = scene.CreateEntity(std::string("_mesh") + std::to_string(i), e);
|
auto prim_entity = scene.CreateEntity(std::string("_mesh") + std::to_string(i), e);
|
||||||
|
scene.GetTransform(prim_entity)->is_static = isStatic;
|
||||||
auto meshren = scene.AddComponent<MeshRenderableComponent>(prim_entity);
|
auto meshren = scene.AddComponent<MeshRenderableComponent>(prim_entity);
|
||||||
meshren->mesh = prim.mesh;
|
meshren->mesh = prim.mesh;
|
||||||
meshren->material = prim.material;
|
meshren->material = prim.material;
|
||||||
auto collider = scene.AddComponent<ColliderComponent>(e);
|
auto collider = scene.AddComponent<ColliderComponent>(prim_entity);
|
||||||
collider->aabb = prim.aabb;
|
collider->aabb = prim.aabb;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
@ -660,7 +664,7 @@ engine::Entity LoadGLTF(Scene& scene, const std::string& path, bool isStatic)
|
|||||||
generateEntities(parent, model.nodes.at(i));
|
generateEntities(parent, model.nodes.at(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEBUG("Loaded glTF model: {}", path);
|
LOG_DEBUG("Loaded glTF file: {}", path);
|
||||||
|
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
@ -53,21 +53,23 @@ namespace engine {
|
|||||||
res = vkGetPhysicalDeviceSurfacePresentModesKHR(info.physicalDevice, info.surface, &surfacePresentModeCount, presentModes.data());
|
res = vkGetPhysicalDeviceSurfacePresentModesKHR(info.physicalDevice, info.surface, &surfacePresentModeCount, presentModes.data());
|
||||||
assert(res == VK_SUCCESS);
|
assert(res == VK_SUCCESS);
|
||||||
|
|
||||||
|
VkPresentModeKHR present_mode_requested;
|
||||||
|
switch (info.requested_present_mode) {
|
||||||
|
case gfx::PresentMode::kDoubleBufferedNoVsync:
|
||||||
|
present_mode_requested = VK_PRESENT_MODE_IMMEDIATE_KHR;
|
||||||
|
break;
|
||||||
|
case gfx::PresentMode::kDoubleBufferedVsync:
|
||||||
|
present_mode_requested = VK_PRESENT_MODE_FIFO_KHR;
|
||||||
|
break;
|
||||||
|
case gfx::PresentMode::kTripleBuffered:
|
||||||
|
present_mode_requested = VK_PRESENT_MODE_MAILBOX_KHR;
|
||||||
|
}
|
||||||
sc->presentMode = VK_PRESENT_MODE_FIFO_KHR; // This mode is always available
|
sc->presentMode = VK_PRESENT_MODE_FIFO_KHR; // This mode is always available
|
||||||
if (info.vsync == true) {
|
// check requested mode is available
|
||||||
if (info.waitForPresent == false) {
|
for (VkPresentModeKHR mode : presentModes) {
|
||||||
for (const auto& presMode : presentModes) {
|
if (mode == present_mode_requested) {
|
||||||
if (presMode == VK_PRESENT_MODE_MAILBOX_KHR) {
|
sc->presentMode = mode;
|
||||||
sc->presentMode = presMode; // this mode allows V-sync without fixing FPS to refresh rate
|
break;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (const auto& presMode : presentModes) {
|
|
||||||
if (presMode == VK_PRESENT_MODE_IMMEDIATE_KHR) {
|
|
||||||
sc->presentMode = presMode; // V-sync off
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
#include <vk_mem_alloc.h>
|
#include <vk_mem_alloc.h>
|
||||||
|
|
||||||
|
#include "gfx.h"
|
||||||
|
|
||||||
namespace engine {
|
namespace engine {
|
||||||
|
|
||||||
struct DepthStencil {
|
struct DepthStencil {
|
||||||
@ -38,8 +40,7 @@ namespace engine {
|
|||||||
VkSurfaceKHR surface;
|
VkSurfaceKHR surface;
|
||||||
SDL_Window* window;
|
SDL_Window* window;
|
||||||
VmaAllocator allocator;
|
VmaAllocator allocator;
|
||||||
bool vsync;
|
gfx::PresentMode requested_present_mode;
|
||||||
bool waitForPresent;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void createSwapchain(Swapchain* sc, const SwapchainInfo& info);
|
void createSwapchain(Swapchain* sc, const SwapchainInfo& info);
|
||||||
|
@ -169,8 +169,9 @@ void Window::OnMouseMotionEvent(SDL_MouseMotionEvent& e)
|
|||||||
else {
|
else {
|
||||||
mouse_.x = e.x;
|
mouse_.x = e.x;
|
||||||
mouse_.y = e.y;
|
mouse_.y = e.y;
|
||||||
mouse_.dx = e.xrel;
|
// mouse motion events can occur multiple times per frame when FPS drops, these need to be accumulated
|
||||||
mouse_.dy = e.yrel;
|
mouse_.dx += e.xrel;
|
||||||
|
mouse_.dy += e.yrel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,6 +290,7 @@ bool Window::SetRelativeMouseMode(bool enabled)
|
|||||||
int code = SDL_SetRelativeMouseMode(static_cast<SDL_bool>(enabled));
|
int code = SDL_SetRelativeMouseMode(static_cast<SDL_bool>(enabled));
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
throw std::runtime_error("Unable to set relative mouse mode");
|
throw std::runtime_error("Unable to set relative mouse mode");
|
||||||
|
// return false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return true;
|
return true;
|
||||||
|
@ -202,6 +202,10 @@ void CameraControllerSystem::OnUpdate(float ts)
|
|||||||
scene_->app()->scene_manager()->SetActiveScene(next_scene_);
|
scene_->app()->scene_manager()->SetActiveScene(next_scene_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (scene_->app()->window()->GetKeyPress(engine::inputs::Key::K_Q)) {
|
||||||
|
c->noclip ^= true;
|
||||||
|
}
|
||||||
|
|
||||||
if (scene_->app()->window()->GetButtonPress(engine::inputs::MouseButton::M_LEFT)) {
|
if (scene_->app()->window()->GetButtonPress(engine::inputs::MouseButton::M_LEFT)) {
|
||||||
engine::Ray ray{};
|
engine::Ray ray{};
|
||||||
ray.origin = t->position;
|
ray.origin = t->position;
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
struct CameraControllerComponent {
|
struct CameraControllerComponent {
|
||||||
// looking
|
// looking
|
||||||
static constexpr float kCameraSensitivity = 0.007f;
|
static constexpr float kCameraSensitivity = 0.001f;
|
||||||
static constexpr float kMaxPitch = glm::pi<float>();
|
static constexpr float kMaxPitch = glm::pi<float>();
|
||||||
static constexpr float kMinPitch = 0.0f;
|
static constexpr float kMinPitch = 0.0f;
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ struct CameraControllerComponent {
|
|||||||
static constexpr float kSpeedForwardBack = 4.0f;
|
static constexpr float kSpeedForwardBack = 4.0f;
|
||||||
static constexpr float kSpeedStrafe = 4.0f;
|
static constexpr float kSpeedStrafe = 4.0f;
|
||||||
static constexpr float kSprintMultiplier = 2.0f;
|
static constexpr float kSprintMultiplier = 2.0f;
|
||||||
static constexpr float kJumpVelocity = 4.4f;
|
static constexpr float kJumpVelocity = 4.4f * 2.0f;
|
||||||
|
|
||||||
// collision
|
// collision
|
||||||
static constexpr float kPlayerHeight = 2.0f; // 71.0f * 25.4f / 1000.0f;
|
static constexpr float kPlayerHeight = 2.0f; // 71.0f * 25.4f / 1000.0f;
|
||||||
@ -31,7 +31,8 @@ struct CameraControllerComponent {
|
|||||||
bool noclip = false;
|
bool noclip = false;
|
||||||
|
|
||||||
float yaw = 0.0f;
|
float yaw = 0.0f;
|
||||||
float pitch = glm::half_pi<float>();
|
//float pitch = glm::half_pi<float>();
|
||||||
|
float pitch = 0.0f;
|
||||||
glm::vec3 vel{0.0f, 0.0f, 0.0f};
|
glm::vec3 vel{0.0f, 0.0f, 0.0f};
|
||||||
bool grounded = false;
|
bool grounded = false;
|
||||||
|
|
||||||
|
@ -46,8 +46,7 @@ void PlayGame(GameSettings settings)
|
|||||||
|
|
||||||
engine::gfx::GraphicsSettings graphics_settings{};
|
engine::gfx::GraphicsSettings graphics_settings{};
|
||||||
graphics_settings.enable_validation = settings.enable_validation;
|
graphics_settings.enable_validation = settings.enable_validation;
|
||||||
graphics_settings.vsync = false;
|
graphics_settings.present_mode = engine::gfx::PresentMode::kTripleBuffered;
|
||||||
graphics_settings.wait_for_present = false;
|
|
||||||
graphics_settings.msaa_level = engine::gfx::MSAALevel::kOff;
|
graphics_settings.msaa_level = engine::gfx::MSAALevel::kOff;
|
||||||
graphics_settings.enable_anisotropy = true;
|
graphics_settings.enable_anisotropy = true;
|
||||||
|
|
||||||
@ -66,12 +65,12 @@ void PlayGame(GameSettings settings)
|
|||||||
/* as of right now, the entity with tag 'camera' is used to build the view
|
/* as of right now, the entity with tag 'camera' is used to build the view
|
||||||
* matrix */
|
* matrix */
|
||||||
|
|
||||||
engine::Entity sponza = engine::util::LoadGLTF(*start_scene, app.GetResourcePath("models/tree.glb"), true);
|
//engine::Entity temple = engine::util::LoadGLTF(*start_scene, "C:/games/temple.glb", true);
|
||||||
start_scene->GetPosition(sponza).z += 90.0f;
|
|
||||||
|
|
||||||
start_scene->RegisterComponent<CameraControllerComponent>();
|
start_scene->RegisterComponent<CameraControllerComponent>();
|
||||||
start_scene->RegisterSystem<CameraControllerSystem>();
|
start_scene->RegisterSystem<CameraControllerSystem>();
|
||||||
start_scene->AddComponent<CameraControllerComponent>(camera)->noclip = true;
|
start_scene->AddComponent<CameraControllerComponent>(camera)->noclip = true;
|
||||||
|
start_scene->GetPosition(camera).z += 10.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
engine::Scene* main_scene = app.scene_manager()->CreateEmptyScene();
|
engine::Scene* main_scene = app.scene_manager()->CreateEmptyScene();
|
||||||
@ -107,7 +106,7 @@ void PlayGame(GameSettings settings)
|
|||||||
// main_scene->GetComponent<engine::TransformComponent>(bottle)->position.z += 5.0f;
|
// main_scene->GetComponent<engine::TransformComponent>(bottle)->position.z += 5.0f;
|
||||||
|
|
||||||
engine::Entity helmet = engine::util::LoadGLTF(*main_scene, app.GetResourcePath("models/DamagedHelmet.glb"), true);
|
engine::Entity helmet = engine::util::LoadGLTF(*main_scene, app.GetResourcePath("models/DamagedHelmet.glb"), true);
|
||||||
main_scene->GetPosition(helmet) += glm::vec3{5.0f, 5.0f, 1.0f};
|
main_scene->GetPosition(helmet) += glm::vec3{5.0f, 5.0f, 5.0f};
|
||||||
main_scene->GetScale(helmet) *= 3.0f;
|
main_scene->GetScale(helmet) *= 3.0f;
|
||||||
main_scene->GetRotation(helmet) = glm::angleAxis(glm::pi<float>(), glm::vec3{ 0.0f, 0.0f, 1.0f });
|
main_scene->GetRotation(helmet) = glm::angleAxis(glm::pi<float>(), glm::vec3{ 0.0f, 0.0f, 1.0f });
|
||||||
main_scene->GetRotation(helmet) *= glm::angleAxis(glm::half_pi<float>(), glm::vec3{ 1.0f, 0.0f, 0.0f });
|
main_scene->GetRotation(helmet) *= glm::angleAxis(glm::half_pi<float>(), glm::vec3{ 1.0f, 0.0f, 0.0f });
|
||||||
|
Loading…
Reference in New Issue
Block a user