GUI work
This commit is contained in:
@@ -4,16 +4,15 @@
|
|||||||
|
|
||||||
void App::Run() {
|
void App::Run() {
|
||||||
// Main loop
|
// Main loop
|
||||||
bool done = false;
|
|
||||||
const u8* state = SDL_GetKeyboardState(nullptr);
|
const u8* state = SDL_GetKeyboardState(nullptr);
|
||||||
while (!done) {
|
while (!core.done) {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||||
switch(event.type) {
|
switch(event.type) {
|
||||||
case SDL_QUIT: done = true; break;
|
case SDL_QUIT: core.done = true; break;
|
||||||
case SDL_WINDOWEVENT:
|
case SDL_WINDOWEVENT:
|
||||||
done = window.gotClosed(event);
|
core.done = window.gotClosed(event);
|
||||||
break;
|
break;
|
||||||
case SDL_CONTROLLERDEVICEADDED: {
|
case SDL_CONTROLLERDEVICEADDED: {
|
||||||
const int index = event.cdevice.which;
|
const int index = event.cdevice.which;
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ void Window::InitSDL() {
|
|||||||
SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI
|
SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI
|
||||||
);
|
);
|
||||||
|
|
||||||
|
windowID = SDL_GetWindowID(window);
|
||||||
|
|
||||||
if(volkInitialize() != VK_SUCCESS) {
|
if(volkInitialize() != VK_SUCCESS) {
|
||||||
util::panic("Failed to load Volk!");
|
util::panic("Failed to load Volk!");
|
||||||
}
|
}
|
||||||
@@ -187,7 +189,7 @@ ImDrawData* Window::Present(n64::Core& core) {
|
|||||||
ImGui_ImplVulkan_NewFrame();
|
ImGui_ImplVulkan_NewFrame();
|
||||||
ImGui_ImplSDL2_NewFrame(window);
|
ImGui_ImplSDL2_NewFrame(window);
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
//
|
|
||||||
Render(core);
|
Render(core);
|
||||||
|
|
||||||
ImGui::Render();
|
ImGui::Render();
|
||||||
@@ -195,31 +197,35 @@ ImDrawData* Window::Present(n64::Core& core) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Window::Render(n64::Core& core) {
|
void Window::Render(n64::Core& core) {
|
||||||
ImGui::BeginMainMenuBar();
|
if(windowID == SDL_GetWindowID(SDL_GetMouseFocus())) {
|
||||||
if(ImGui::BeginMenu("File")) {
|
ImGui::BeginMainMenuBar();
|
||||||
if(ImGui::BeginMenu("Open")) {
|
if (ImGui::BeginMenu("File")) {
|
||||||
if(ImGui::MenuItem("Nintendo 64")) {
|
if (ImGui::MenuItem("Open", "O")) {
|
||||||
nfdchar_t* outpath;
|
nfdchar_t *outpath;
|
||||||
const nfdu8filteritem_t filter {"Nintendo 64 roms", "n64,z64,v64,N64,Z64,V64"};
|
const nfdu8filteritem_t filter{"Nintendo 64 roms", "n64,z64,v64,N64,Z64,V64"};
|
||||||
nfdresult_t result = NFD_OpenDialog(&outpath, &filter, 1, nullptr);
|
nfdresult_t result = NFD_OpenDialog(&outpath, &filter, 1, nullptr);
|
||||||
if(result == NFD_OKAY) {
|
if (result == NFD_OKAY) {
|
||||||
core.LoadROM(outpath);
|
core.LoadROM(outpath);
|
||||||
NFD_FreePath(outpath);
|
NFD_FreePath(outpath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(ImGui::MenuItem("Game Boy")) {
|
if (ImGui::MenuItem("Exit")) {
|
||||||
if(ImGui::BeginPopup("##unimplemented_Core")) {
|
core.done = true;
|
||||||
ImGui::TextColored({1.0, 0.0, 0.0, 0.7}, "Unimplemented core 'Game Boy'!");
|
|
||||||
ImGui::EndPopup();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
if(ImGui::BeginMenu("Exit")) {
|
if (ImGui::BeginMenu("Emulation")) {
|
||||||
|
if (ImGui::MenuItem("Reset")) {
|
||||||
|
core.Reset();
|
||||||
|
}
|
||||||
|
if (ImGui::MenuItem("Stop")) {
|
||||||
|
core.Stop();
|
||||||
|
}
|
||||||
|
if (ImGui::MenuItem(core.pause ? "Resume" : "Pause", nullptr, false, core.romLoaded)) {
|
||||||
|
core.TogglePause();
|
||||||
|
}
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
ImGui::EndMenu();
|
ImGui::EndMainMenuBar();
|
||||||
}
|
}
|
||||||
ImGui::EndMainMenuBar();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ struct Window {
|
|||||||
[[nodiscard]] bool gotClosed(SDL_Event event);
|
[[nodiscard]] bool gotClosed(SDL_Event event);
|
||||||
private:
|
private:
|
||||||
SDL_Window* window;
|
SDL_Window* window;
|
||||||
|
u32 windowID;
|
||||||
void InitSDL();
|
void InitSDL();
|
||||||
void InitImgui();
|
void InitImgui();
|
||||||
void Render(n64::Core& core);
|
void Render(n64::Core& core);
|
||||||
|
|||||||
@@ -6,18 +6,31 @@
|
|||||||
|
|
||||||
namespace n64 {
|
namespace n64 {
|
||||||
Core::Core() {
|
Core::Core() {
|
||||||
Reset();
|
Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Stop() {
|
||||||
|
cpu.Reset();
|
||||||
|
mem.Reset();
|
||||||
|
pause = true;
|
||||||
|
romLoaded = false;
|
||||||
|
rom.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Reset() {
|
void Core::Reset() {
|
||||||
cpu.Reset();
|
cpu.Reset();
|
||||||
mem.Reset();
|
mem.Reset();
|
||||||
|
pause = true;
|
||||||
romLoaded = false;
|
romLoaded = false;
|
||||||
|
if(!rom.empty()) {
|
||||||
|
LoadROM(rom);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::LoadROM(const std::string& rom) {
|
void Core::LoadROM(const std::string& rom_) {
|
||||||
Reset();
|
rom = rom_;
|
||||||
mem.LoadROM(rom);
|
mem.LoadROM(rom);
|
||||||
|
pause = false;
|
||||||
romLoaded = true;
|
romLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,8 +38,7 @@ void Core::Run(Window& window) {
|
|||||||
MMIO& mmio = mem.mmio;
|
MMIO& mmio = mem.mmio;
|
||||||
int cycles = 0;
|
int cycles = 0;
|
||||||
for(int field = 0; field < mmio.vi.numFields; field++) {
|
for(int field = 0; field < mmio.vi.numFields; field++) {
|
||||||
if(romLoaded) {
|
if(!pause && romLoaded) {
|
||||||
//timerInstructions.Start();
|
|
||||||
for (int i = 0; i < mmio.vi.numHalflines; i++) {
|
for (int i = 0; i < mmio.vi.numHalflines; i++) {
|
||||||
if ((mmio.vi.current & 0x3FE) == mmio.vi.intr) {
|
if ((mmio.vi.current & 0x3FE) == mmio.vi.intr) {
|
||||||
InterruptRaise(mmio.mi, cpu.regs, Interrupt::VI);
|
InterruptRaise(mmio.mi, cpu.regs, Interrupt::VI);
|
||||||
@@ -48,7 +60,9 @@ void Core::Run(Window& window) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
UpdateScreenParallelRdp(*this, window, GetVI());
|
UpdateScreenParallelRdp(*this, window, GetVI());
|
||||||
} else {
|
} else if(pause && romLoaded) {
|
||||||
|
UpdateScreenParallelRdp(*this, window, GetVI());
|
||||||
|
} else if(pause && !romLoaded) {
|
||||||
UpdateScreenParallelRdpNoGame(*this, window);
|
UpdateScreenParallelRdpNoGame(*this, window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,14 +9,19 @@ namespace n64 {
|
|||||||
struct Core {
|
struct Core {
|
||||||
~Core() = default;
|
~Core() = default;
|
||||||
Core();
|
Core();
|
||||||
|
void Stop();
|
||||||
void Reset();
|
void Reset();
|
||||||
void LoadROM(const std::string&);
|
void LoadROM(const std::string&);
|
||||||
void Run(Window&);
|
void Run(Window&);
|
||||||
void UpdateController(const u8*);
|
void UpdateController(const u8*);
|
||||||
|
void TogglePause() { pause = !pause; }
|
||||||
VI& GetVI() { return mem.mmio.vi; }
|
VI& GetVI() { return mem.mmio.vi; }
|
||||||
|
bool pause = true;
|
||||||
bool romLoaded = false;
|
bool romLoaded = false;
|
||||||
SDL_GameController* gamepad;
|
SDL_GameController* gamepad;
|
||||||
bool gamepadConnected = false;
|
bool gamepadConnected = false;
|
||||||
|
bool done = false;
|
||||||
|
std::string rom;
|
||||||
private:
|
private:
|
||||||
friend struct ::Window;
|
friend struct ::Window;
|
||||||
Mem mem;
|
Mem mem;
|
||||||
|
|||||||
Reference in New Issue
Block a user