Compiles!

This commit is contained in:
SimoZ64
2025-05-05 22:15:45 +02:00
parent 20e8e720a6
commit b4c5c7a3e4
25 changed files with 598 additions and 422 deletions

View File

@@ -1,125 +1,105 @@
#include <Core.hpp>
#include <KaizenGui.hpp>
#include <nfd.hpp>
#include <backend/Core.hpp>
#include <ImGuiImpl/StatusBar.hpp>
namespace fs = std::filesystem;
KaizenGui::KaizenGui() noexcept : core(std::make_shared<n64::Core>()), vulkanWidget(core), emuThread(core, fpsCounter, vulkanWidget, settingsWindow) {
emuExitFunc = [&]() {
quit = true;
if (emuThread.isRunning) {
emuThread.requestInterruption();
while (emuThread.isRunning) {}
}
};
menuBar.addMenu({"File",
{
{"Open", [&]() {
NFD::Guard guard;
NFD::UniquePath path;
nfdfilteritem_t filterItem = {"Nintendo 64 roms", "n64,z64,v64,N64,Z64,V64"};
KaizenGui::KaizenGui() noexcept : mainWindow(core), emuThread(core, mainWindow.fpsCounter, mainWindow.vulkanWidget, settingsWindow) {
// debugger = std::make_unique<Debugger>();
auto result = NFD::OpenDialog(path, &filterItem, 1);
if(result == NFD_CANCEL) return;
if(result == NFD_ERROR)
Util::panic("Error: {}", NFD::GetError());
LoadROM(path.get());
}},
{"Exit", std::move(emuExitFunc)}
}
});
ConnectMainWindowSignalsToSlots();
Util::RPC::GetInstance().Update(Util::RPC::Idling);
menuBar.addMenu({"Emulation",
{
actionPause,
actionStop,
actionReset,
{"Settings", [&]() {
settingsWindow.render();
}},
}
});
menuBar.addMenu({"Help",
{
{"About", [&]() {
gui::PopupWindow about{"About Kaizen", [&]() {
ImGui::Text("Kaizen is a Nintendo 64 emulator that strives");
ImGui::Text("to offer a friendly user experience and compatibility.");
ImGui::Text("Kaizen is licensed under the BSD 3-clause license.");
ImGui::Text("Nintendo 64 is a registered trademarks of Nintendo Co., Ltd.");
}};
}},
}
});
}
void KaizenGui::ConnectMainWindowSignalsToSlots() noexcept {
connect(settingsWindow.get(), &SettingsWindow::regrabKeyboard, this, [&] { grabKeyboard(); });
void KaizenGui::LoadROM(const std::string &path) noexcept {
actionPause.setEnabled(true);
actionReset.setEnabled(true);
actionStop.setEnabled(true);
emuThread.start();
emuThread.core->LoadROM(path);
const auto gameNameDB = emuThread.core->cpu->GetMem().rom.gameNameDB;
Util::RPC::GetInstance().Update(Util::RPC::Playing, gameNameDB);
}
connect(settingsWindow.get(), &SettingsWindow::gotClosed, this,
[&] { mainWindow->vulkanWidget->wsiPlatform->EnableEventPolling(); });
connect(settingsWindow.get(), &SettingsWindow::gotOpened, this,
[&] { mainWindow->vulkanWidget->wsiPlatform->DisableEventPolling(); });
connect(mainWindow.get(), &MainWindow::OpenSettings, this, [this] { settingsWindow->show(); });
// connect(mainWindow.get(), &MainWindow::OpenDebugger, this, [this] { debugger->show(); });
connect(mainWindow.get(), &MainWindow::OpenROM, this, &KaizenGui::LoadROM);
connect(mainWindow.get(), &MainWindow::Exit, this, &KaizenGui::Quit);
connect(mainWindow.get(), &MainWindow::Reset, emuThread.get(), &EmuThread::Reset);
connect(mainWindow.get(), &MainWindow::Stop, this, [this] { emuThread->requestInterruption(); });
connect(mainWindow.get(), &MainWindow::Pause, emuThread.get(), &EmuThread::TogglePause);
void KaizenGui::handleEvents() {
SDL_Event e;
while(SDL_PollEvent(&e)) {
switch(e.type) {
case SDL_EVENT_QUIT:
emuExitFunc();
break;
}
}
}
int KaizenGui::run() {
bool inputForEmu = true;
while(!quit) {
handleEvents();
if(settingsWindow.render()) {
inputForEmu = false;
menuBar.render();
// TODO VULKAN CANVAS
gui::StatusBar statusBar{[&]() {
ImGui::Text("GUI FPS: %.2f, Emulation FPS: %.2f", ImGui::GetIO().Framerate, fpsCounter);
}};
statusBar.render();
}
mainWindow.render();
return 0;
}
void KaizenGui::LoadROM(const QString &path) const noexcept {
mainWindow->actionPause->setEnabled(true);
mainWindow->actionReset->setEnabled(true);
mainWindow->actionStop->setEnabled(true);
emuThread->start();
emuThread->core->LoadROM(path.toStdString());
const auto gameNameDB = emuThread->core->cpu->GetMem().rom.gameNameDB;
mainWindow->setWindowTitle(emuThread->core->cpu->GetMem().rom.gameNameDB.c_str());
Util::RPC::GetInstance().Update(Util::RPC::Playing, gameNameDB);
}
void KaizenGui::Quit() const noexcept {
if (emuThread) {
emuThread->requestInterruption();
while (emuThread->isRunning) {}
}
QApplication::quit();
}
void KaizenGui::LoadTAS(const QString &path) const noexcept {
if (emuThread->core->LoadTAS(fs::path(path.toStdString()))) {
const auto gameNameDB = emuThread->core->cpu->GetMem().rom.gameNameDB;
const auto movieName = fs::path(path.toStdString()).stem().string();
void KaizenGui::LoadTAS(const std::string &path) const noexcept {
if (emuThread.core->LoadTAS(fs::path(path))) {
const auto gameNameDB = emuThread.core->cpu->GetMem().rom.gameNameDB;
const auto movieName = fs::path(path).stem().string();
Util::RPC::GetInstance().Update(Util::RPC::MovieReplay, gameNameDB, movieName);
return;
}
Util::panic("Could not load TAS movie {}!", path.toStdString());
}
void KaizenGui::keyPressEvent(QKeyEvent *e) {
if (settingsWindow->inputSettings->selectedDeviceIsNotKeyboard)
return;
emuThread->core->pause = true;
n64::Mem &mem = emuThread->core->cpu->GetMem();
n64::PIF &pif = mem.mmio.si.pif;
const auto k = static_cast<Qt::Key>(e->key());
for (int i = 0; i < 14; i++) {
if (k == settingsWindow->keyMap[i])
pif.UpdateButton(0, static_cast<n64::Controller::Key>(i), true);
}
if (k == settingsWindow->keyMap[14])
pif.UpdateAxis(0, n64::Controller::Axis::Y, 86);
if (k == settingsWindow->keyMap[15])
pif.UpdateAxis(0, n64::Controller::Axis::Y, -86);
if (k == settingsWindow->keyMap[16])
pif.UpdateAxis(0, n64::Controller::Axis::X, -86);
if (k == settingsWindow->keyMap[17])
pif.UpdateAxis(0, n64::Controller::Axis::X, 86);
emuThread->core->pause = false;
QWidget::keyPressEvent(e);
}
void KaizenGui::keyReleaseEvent(QKeyEvent *e) {
if (settingsWindow->inputSettings->selectedDeviceIsNotKeyboard)
return;
emuThread->core->pause = true;
n64::Mem &mem = emuThread->core->cpu->GetMem();
n64::PIF &pif = mem.mmio.si.pif;
const auto k = static_cast<Qt::Key>(e->key());
for (int i = 0; i < 14; i++) {
if (k == settingsWindow->keyMap[i])
pif.UpdateButton(0, static_cast<n64::Controller::Key>(i), false);
}
if (k == settingsWindow->keyMap[14])
pif.UpdateAxis(0, n64::Controller::Axis::Y, 0);
if (k == settingsWindow->keyMap[15])
pif.UpdateAxis(0, n64::Controller::Axis::Y, 0);
if (k == settingsWindow->keyMap[16])
pif.UpdateAxis(0, n64::Controller::Axis::X, 0);
if (k == settingsWindow->keyMap[17])
pif.UpdateAxis(0, n64::Controller::Axis::X, 0);
emuThread->core->pause = false;
QWidget::keyReleaseEvent(e);
}
Util::panic("Could not load TAS movie {}!", path);
}