rpcsx/rpcs3/Gui/CgDisasm.cpp

83 lines
2.3 KiB
C++

#include "stdafx_gui.h"
#include "CgDisasm.h"
#include "Emu/System.h"
#include "Emu/RSX/CgBinaryProgram.h"
BEGIN_EVENT_TABLE(CgDisasm, wxFrame)
EVT_SIZE(CgDisasm::OnSize)
END_EVENT_TABLE()
CgDisasm::CgDisasm(wxWindow* parent)
: wxFrame(parent, wxID_ANY, "Cg Disasm", wxDefaultPosition, wxSize(640, 480))
{
wxMenuBar* menubar = new wxMenuBar();
wxMenu* menu_general = new wxMenu();
menubar->Append(menu_general, "&Open");
menu_general->Append(id_open_file, "Open &Cg binary program");
wxNotebook* nb_cg = new wxNotebook(this, wxID_ANY);
wxPanel* p_cg_disasm = new wxPanel(nb_cg, wxID_ANY);
wxPanel* p_glsl_shader = new wxPanel(nb_cg, wxID_ANY);
nb_cg->AddPage(p_cg_disasm, wxT("ASM"));
nb_cg->AddPage(p_glsl_shader, wxT("GLSL"));
m_disasm_text = new wxTextCtrl(p_cg_disasm, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(620, 395), wxTE_MULTILINE | wxNO_BORDER | wxTE_READONLY | wxTE_RICH2);
m_glsl_text = new wxTextCtrl(p_glsl_shader, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(620, 395), wxTE_MULTILINE | wxNO_BORDER | wxTE_READONLY | wxTE_RICH2);
SetMenuBar(menubar);
m_disasm_text->Bind(wxEVT_RIGHT_DOWN, &CgDisasm::OnRightClick, this);
m_glsl_text->Bind(wxEVT_RIGHT_DOWN, &CgDisasm::OnRightClick, this);
Bind(wxEVT_MENU, &CgDisasm::OpenCg, this, id_open_file);
Bind(wxEVT_MENU, &CgDisasm::OnContextMenu, this, id_clear);
}
void CgDisasm::OpenCg(wxCommandEvent& event)
{
wxFileDialog ctrl(this, L"Select Cg program object", wxEmptyString, wxEmptyString,
"Cg program objects (*.fpo;*.vpo)|*.fpo;*.vpo"
"|All files (*.*)|*.*",
wxFD_OPEN | wxFD_FILE_MUST_EXIST);
if (ctrl.ShowModal() == wxID_CANCEL)
{
return;
}
CgBinaryDisasm disasm(fmt::ToUTF8(ctrl.GetPath()));
disasm.BuildShaderBody();
*m_disasm_text << disasm.GetArbShader();
*m_glsl_text << disasm.GetGlslShader();
}
void CgDisasm::OnSize(wxSizeEvent& event)
{
m_disasm_text->SetSize(GetSize().x - 20, GetSize().y - 85);
m_glsl_text->SetSize(GetSize().x - 20, GetSize().y - 85);
event.Skip();
}
void CgDisasm::OnRightClick(wxMouseEvent& event)
{
wxMenu* menu = new wxMenu();
menu->Append(id_clear, "&Clear");
PopupMenu(menu);
}
void CgDisasm::OnContextMenu(wxCommandEvent& event)
{
switch (event.GetId())
{
case id_clear:
m_disasm_text->Clear();
m_glsl_text->Clear();
break;
default:
event.Skip();
}
}