revert to r4531, but keep the changes from the following revisions: 4533,4550-4551,4556-4559
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4566 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
18305c7c49
commit
06aa62504c
|
@ -201,23 +201,3 @@ std::string CPUInfo::Summarize()
|
||||||
if (bLongMode) sum += ", 64-bit support";
|
if (bLongMode) sum += ", 64-bit support";
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Turn the cpu info into a string we can show(This version uses headings and line breaks)
|
|
||||||
std::string CPUInfo::Summarize_long()
|
|
||||||
{
|
|
||||||
std::string sum;
|
|
||||||
sum = StringFromFormat("CPU Brand: %s\n",cpu_string);
|
|
||||||
|
|
||||||
sum += StringFromFormat("Number of cores: %i \n ",num_cores);
|
|
||||||
|
|
||||||
sum+= "Supported instruction sets:\n";
|
|
||||||
|
|
||||||
if (bSSE) sum += " -SSE\n";
|
|
||||||
if (bSSE2) sum += " -SSE2\n";
|
|
||||||
if (bSSE3) sum += " -SSE3\n";
|
|
||||||
if (bSSSE3) sum += " -SSSE3\n";
|
|
||||||
if (bSSE4_1) sum += " -SSE4.1\n";
|
|
||||||
if (bSSE4_2) sum += " -SSE4.2\n";
|
|
||||||
if (bLongMode) sum += "64-bit supported";
|
|
||||||
return sum;
|
|
||||||
}
|
|
|
@ -58,9 +58,6 @@ struct CPUInfo
|
||||||
|
|
||||||
// Turn the cpu info into a string we can show
|
// Turn the cpu info into a string we can show
|
||||||
std::string Summarize();
|
std::string Summarize();
|
||||||
|
|
||||||
// Turn the cpu info into a string we can show(This version uses headings and line breaks)
|
|
||||||
std::string Summarize_long();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CPUInfo cpu_info;
|
extern CPUInfo cpu_info;
|
||||||
|
|
|
@ -251,14 +251,6 @@ void ConsoleListener::PixelSpace(int Left, int Top, int Width, int Height, bool
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConsoleListener::CustomLog(const char *Text)
|
|
||||||
{
|
|
||||||
#ifdef _WIN32
|
|
||||||
DWORD cCharsWritten;
|
|
||||||
WriteConsole(hConsole, Text, (DWORD)strlen(Text), &cCharsWritten, NULL);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConsoleListener::Log(LogTypes::LOG_LEVELS Level, const char *Text)
|
void ConsoleListener::Log(LogTypes::LOG_LEVELS Level, const char *Text)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
|
|
|
@ -83,7 +83,6 @@ public:
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
COORD GetCoordinates(int BytesRead, int BufferWidth);
|
COORD GetCoordinates(int BytesRead, int BufferWidth);
|
||||||
#endif
|
#endif
|
||||||
void CustomLog(const char *Text);
|
|
||||||
void Log(LogTypes::LOG_LEVELS, const char *Text);
|
void Log(LogTypes::LOG_LEVELS, const char *Text);
|
||||||
void ClearScreen(bool Cursor = true);
|
void ClearScreen(bool Cursor = true);
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ enum
|
||||||
ZCODE_END = 0x00,
|
ZCODE_END = 0x00,
|
||||||
ZCODE_NORM = 0x02,
|
ZCODE_NORM = 0x02,
|
||||||
ZCODE_ROW = 0x03,
|
ZCODE_ROW = 0x03,
|
||||||
ZCODE_04 = 0x04,
|
ZCODE_MEM_COPY = 0x04,
|
||||||
|
|
||||||
// Conditonal Codes
|
// Conditonal Codes
|
||||||
CONDTIONAL_IF_EQUAL = 0x01,
|
CONDTIONAL_IF_EQUAL = 0x01,
|
||||||
|
@ -227,17 +227,16 @@ void LogInfo(const char *format, ...)
|
||||||
|
|
||||||
void RunAllActive()
|
void RunAllActive()
|
||||||
{
|
{
|
||||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats)
|
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats) {
|
||||||
{
|
|
||||||
for (std::vector<ARCode>::iterator i = activeCodes.begin(); i != activeCodes.end(); ++i)
|
for (std::vector<ARCode>::iterator i = activeCodes.begin(); i != activeCodes.end(); ++i)
|
||||||
{
|
{
|
||||||
if (i->active)
|
if (i->active)
|
||||||
{
|
{
|
||||||
i->active = RunCode(*i);
|
if (!RunCode(*i))
|
||||||
|
i->active = false;
|
||||||
LogInfo("\n");
|
LogInfo("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!b_RanOnce)
|
if (!b_RanOnce)
|
||||||
b_RanOnce = true;
|
b_RanOnce = true;
|
||||||
}
|
}
|
||||||
|
@ -293,8 +292,7 @@ bool RunCode(const ARCode &arcode) {
|
||||||
LogInfo("Command: %08x", cmd);
|
LogInfo("Command: %08x", cmd);
|
||||||
|
|
||||||
// Do Fill & Slide
|
// Do Fill & Slide
|
||||||
if (doFillNSlide)
|
if (doFillNSlide) {
|
||||||
{
|
|
||||||
doFillNSlide = false;
|
doFillNSlide = false;
|
||||||
LogInfo("Doing Fill And Slide");
|
LogInfo("Doing Fill And Slide");
|
||||||
if (!ZeroCode_FillAndSlide(val_last, addr, data))
|
if (!ZeroCode_FillAndSlide(val_last, addr, data))
|
||||||
|
@ -303,8 +301,7 @@ bool RunCode(const ARCode &arcode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Memory Copy
|
// Memory Copy
|
||||||
if (doMemoryCopy)
|
if (doMemoryCopy) {
|
||||||
{
|
|
||||||
doMemoryCopy = false;
|
doMemoryCopy = false;
|
||||||
LogInfo("Doing Memory Copy");
|
LogInfo("Doing Memory Copy");
|
||||||
if (!ZeroCode_MemoryCopy(val_last, addr, data))
|
if (!ZeroCode_MemoryCopy(val_last, addr, data))
|
||||||
|
@ -313,8 +310,7 @@ bool RunCode(const ARCode &arcode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ActionReplay program self modification codes
|
// ActionReplay program self modification codes
|
||||||
if (addr >= 0x00002000 && addr < 0x00003000)
|
if (addr >= 0x00002000 && addr < 0x00003000) {
|
||||||
{
|
|
||||||
LogInfo("This action replay simulator does not support codes that modify Action Replay itself.");
|
LogInfo("This action replay simulator does not support codes that modify Action Replay itself.");
|
||||||
PanicAlert("This action replay simulator does not support codes that modify Action Replay itself.");
|
PanicAlert("This action replay simulator does not support codes that modify Action Replay itself.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -343,7 +339,7 @@ bool RunCode(const ARCode &arcode) {
|
||||||
LogInfo("ZCode: Executes all codes in the same row, Set register 1BB4 to 1 (zcode not supported)");
|
LogInfo("ZCode: Executes all codes in the same row, Set register 1BB4 to 1 (zcode not supported)");
|
||||||
PanicAlert("Zero 3 code not supported");
|
PanicAlert("Zero 3 code not supported");
|
||||||
return false;
|
return false;
|
||||||
case ZCODE_04: // Fill & Slide or Memory Copy
|
case ZCODE_MEM_COPY: // Fill & Slide or Memory Copy
|
||||||
if (((addr >> 25) & 0x03) == 0x3)
|
if (((addr >> 25) & 0x03) == 0x3)
|
||||||
{
|
{
|
||||||
LogInfo("ZCode: Memory Copy");
|
LogInfo("ZCode: Memory Copy");
|
||||||
|
@ -558,7 +554,7 @@ bool Subtype_WriteToPointer(u32 addr, u32 data)
|
||||||
bool Subtype_AddCode(u32 addr, u32 data)
|
bool Subtype_AddCode(u32 addr, u32 data)
|
||||||
{
|
{
|
||||||
// Used to incrment a value in memory
|
// Used to incrment a value in memory
|
||||||
u32 new_addr = (addr & 0x81FFFFFF);
|
u32 new_addr = (addr & 0x01FFFFFF) | 0x80000000;
|
||||||
u8 size = (addr >> 25) & 0x03;
|
u8 size = (addr >> 25) & 0x03;
|
||||||
LogInfo("Hardware Address: %08x", new_addr);
|
LogInfo("Hardware Address: %08x", new_addr);
|
||||||
LogInfo("Size: %08x", size);
|
LogInfo("Size: %08x", size);
|
||||||
|
@ -589,15 +585,12 @@ bool Subtype_AddCode(u32 addr, u32 data)
|
||||||
{
|
{
|
||||||
LogInfo("32-bit floating Add");
|
LogInfo("32-bit floating Add");
|
||||||
LogInfo("--------");
|
LogInfo("--------");
|
||||||
|
union conv {float x; u32 y;};
|
||||||
u32 read = Memory::Read_U32(new_addr);
|
conv c1;
|
||||||
float fread = *((float*)&read);
|
c1.y = Memory::Read_U32(new_addr);
|
||||||
fread += (float)data;
|
c1.x += (float)data;
|
||||||
u32 newval = *((u32*)&fread);
|
Memory::Write_U32((u32)c1.x, new_addr);
|
||||||
Memory::Write_U32(newval, new_addr);
|
LogInfo("Wrote %08x to address %08x", (u32)c1.x, new_addr);
|
||||||
LogInfo("Old Value %08x", read);
|
|
||||||
LogInfo("Increment %08x", data);
|
|
||||||
LogInfo("New value %08x", newval);
|
|
||||||
LogInfo("--------");
|
LogInfo("--------");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -622,7 +615,7 @@ bool Subtype_MasterCodeAndWriteToCCXXXXXX(u32 addr, u32 data)
|
||||||
|
|
||||||
bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more testing
|
bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more testing
|
||||||
{
|
{
|
||||||
u32 new_addr = (val_last & 0x81FFFFFF);
|
u32 new_addr = (val_last & 0x01FFFFFF) | 0x80000000;
|
||||||
u8 size = (val_last >> 25) & 0x03;
|
u8 size = (val_last >> 25) & 0x03;
|
||||||
s16 addr_incr = (s16)(data & 0xFFFF);
|
s16 addr_incr = (s16)(data & 0xFFFF);
|
||||||
s8 val_incr = (s8)((data & 0xFF000000) >> 24);
|
s8 val_incr = (s8)((data & 0xFF000000) >> 24);
|
||||||
|
|
|
@ -235,7 +235,8 @@ void PatchEngineCallback(u64 userdata, int cyclesLate)
|
||||||
// Patch mem and run the Action Replay
|
// Patch mem and run the Action Replay
|
||||||
PatchEngine::ApplyFramePatches();
|
PatchEngine::ApplyFramePatches();
|
||||||
PatchEngine::ApplyARPatches();
|
PatchEngine::ApplyARPatches();
|
||||||
CoreTiming::ScheduleEvent((CPU_CORE_CLOCK / 5000) - cyclesLate, et_PatchEngine);
|
|
||||||
|
CoreTiming::ScheduleEvent((GetTicksPerSecond() / 60) - cyclesLate, et_PatchEngine);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
// Supports simple memory patches, and has a partial Action Replay implementation
|
// Supports simple memory patches, and has a partial Action Replay implementation
|
||||||
// in ActionReplay.cpp/h.
|
// in ActionReplay.cpp/h.
|
||||||
|
|
||||||
// TODO: Still even needed? Zelda WW now works with improved DSP code.
|
|
||||||
// Zelda item hang fixes:
|
// Zelda item hang fixes:
|
||||||
// [Tue Aug 21 2007] [18:30:40] <Knuckles-> 0x802904b4 in US released
|
// [Tue Aug 21 2007] [18:30:40] <Knuckles-> 0x802904b4 in US released
|
||||||
// [Tue Aug 21 2007] [18:30:53] <Knuckles-> 0x80294d54 in EUR Demo version
|
// [Tue Aug 21 2007] [18:30:53] <Knuckles-> 0x80294d54 in EUR Demo version
|
||||||
|
|
|
@ -76,11 +76,12 @@ CPluginManager::~CPluginManager()
|
||||||
|
|
||||||
for (int i = 0; i < MAXPADS; i++)
|
for (int i = 0; i < MAXPADS; i++)
|
||||||
{
|
{
|
||||||
if (m_pad[i] && (OkayToInitPlugin(i) == -1) && !m_params->m_strPadPlugin[i].empty())
|
if (m_pad[i] && (OkayToInitPlugin(i) == -1))
|
||||||
{
|
{
|
||||||
INFO_LOG(CONSOLE, "Delete: %i\n", i);
|
INFO_LOG(CONSOLE, "Delete: %i\n", i);
|
||||||
FreePad(i);
|
delete m_pad[i];
|
||||||
}
|
}
|
||||||
|
m_pad[i] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < MAXWIIMOTES; i++)
|
for (int i = 0; i < MAXWIIMOTES; i++)
|
||||||
|
@ -164,7 +165,7 @@ void CPluginManager::ShutdownPlugins()
|
||||||
if (m_pad[i])
|
if (m_pad[i])
|
||||||
{
|
{
|
||||||
m_pad[i]->Shutdown();
|
m_pad[i]->Shutdown();
|
||||||
//delete m_pad[i]; Causes crash on stop
|
//delete m_pad[i];
|
||||||
}
|
}
|
||||||
//m_pad[i] = NULL;
|
//m_pad[i] = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,14 +103,11 @@ void dsp_write_aram_d3(u16 value)
|
||||||
case 0xA: // 16-bit writes
|
case 0xA: // 16-bit writes
|
||||||
DSPHost_WriteHostMemory(value >> 8, Address);
|
DSPHost_WriteHostMemory(value >> 8, Address);
|
||||||
DSPHost_WriteHostMemory(value & 0xFF, Address + 1);
|
DSPHost_WriteHostMemory(value & 0xFF, Address + 1);
|
||||||
Address += 2;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ERROR_LOG(DSPLLE, "dsp_write_aram_d3: Unseen Format %i", gdsp_ifx_regs[DSP_FORMAT]);
|
ERROR_LOG(DSPLLE, "dsp_write_aram_d3: Unseen Format %i", gdsp_ifx_regs[DSP_FORMAT]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
gdsp_ifx_regs[DSP_ACCAH] = Address >> 16;
|
|
||||||
gdsp_ifx_regs[DSP_ACCAL] = Address & 0xffff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 dsp_read_accelerator()
|
u16 dsp_read_accelerator()
|
||||||
|
@ -156,10 +153,9 @@ u16 dsp_read_accelerator()
|
||||||
// Set address back to start address.
|
// Set address back to start address.
|
||||||
Address = (gdsp_ifx_regs[DSP_ACSAH] << 16) | gdsp_ifx_regs[DSP_ACSAL];
|
Address = (gdsp_ifx_regs[DSP_ACSAH] << 16) | gdsp_ifx_regs[DSP_ACSAL];
|
||||||
|
|
||||||
// Do we really need both? (nakee: seems to cause problems with some
|
// Do we really need both?
|
||||||
// AX games)
|
DSPHost_InterruptRequest();
|
||||||
// DSPHost_InterruptRequest();
|
DSPCore_SetException(EXP_2);
|
||||||
// DSPCore_SetException(EXP_2);
|
|
||||||
DSPCore_SetException(EXP_ACCOV);
|
DSPCore_SetException(EXP_ACCOV);
|
||||||
|
|
||||||
// Somehow, YN1 and YN2 must be initialized with their "loop" values,
|
// Somehow, YN1 and YN2 must be initialized with their "loop" values,
|
||||||
|
|
|
@ -161,7 +161,7 @@ void gdsp_ifx_write(u16 addr, u16 val)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd3: // ZeldaUnk (accelerator WRITE)
|
case 0xd3: // ZeldaUnk (accelerator WRITE)
|
||||||
// NOTICE_LOG(DSPLLE, "Write To ZeldaUnk pc=%04x (%04x)", g_dsp.pc, val);
|
NOTICE_LOG(DSPLLE, "Write To ZeldaUnk pc=%04x (%04x)", g_dsp.pc, val);
|
||||||
dsp_write_aram_d3(val);
|
dsp_write_aram_d3(val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@ u16 gdsp_ifx_read(u16 addr)
|
||||||
return dsp_read_accelerator();
|
return dsp_read_accelerator();
|
||||||
|
|
||||||
case 0xd3:
|
case 0xd3:
|
||||||
//NOTICE_LOG(DSPLLE, "Read from ZeldaUnk pc=%04x", g_dsp.pc);
|
NOTICE_LOG(DSPLLE, "Read from ZeldaUnk pc=%04x", g_dsp.pc);
|
||||||
return dsp_read_aram_d3();
|
return dsp_read_aram_d3();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -316,7 +316,7 @@ void gdsp_do_dma()
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
#if defined(_DEBUG) || defined(DEBUGFAST)
|
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||||
DEBUG_LOG(DSPLLE, "DMA pc: %04x ctl: %04x addr: %08x da: %04x size: %04x", g_dsp.pc, ctl, addr, dsp_addr, len);
|
NOTICE_LOG(DSPLLE, "DMA pc: %04x ctl: %04x addr: %08x da: %04x size: %04x", g_dsp.pc, ctl, addr, dsp_addr, len);
|
||||||
#endif
|
#endif
|
||||||
switch (ctl & 0x3)
|
switch (ctl & 0x3)
|
||||||
{
|
{
|
||||||
|
|
|
@ -42,8 +42,6 @@ const DSPOPCTemplate opcodes[] =
|
||||||
{"DAR", 0x0004, 0xfffc, DSPInterpreter::dar, nop, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false},
|
{"DAR", 0x0004, 0xfffc, DSPInterpreter::dar, nop, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false},
|
||||||
{"IAR", 0x0008, 0xfffc, DSPInterpreter::iar, nop, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false},
|
{"IAR", 0x0008, 0xfffc, DSPInterpreter::iar, nop, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false},
|
||||||
|
|
||||||
{"ADDARN", 0x0010, 0xfff0, DSPInterpreter::addarn, nop, 1, 2, {{P_REG, 1, 0, 0, 0x0003}, {P_REG04, 1, 0, 2, 0x000c}}, false},
|
|
||||||
|
|
||||||
{"HALT", 0x0021, 0xffff, DSPInterpreter::halt, nop, 1, 0, {}, false},
|
{"HALT", 0x0021, 0xffff, DSPInterpreter::halt, nop, 1, 0, {}, false},
|
||||||
|
|
||||||
{"RETGE", 0x02d0, 0xffff, DSPInterpreter::ret, nop, 1, 0, {}, false},
|
{"RETGE", 0x02d0, 0xffff, DSPInterpreter::ret, nop, 1, 0, {}, false},
|
||||||
|
@ -127,8 +125,9 @@ const DSPOPCTemplate opcodes[] =
|
||||||
{"ASL", 0x1480, 0xfec0, DSPInterpreter::asl, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false},
|
{"ASL", 0x1480, 0xfec0, DSPInterpreter::asl, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false},
|
||||||
{"ASR", 0x14c0, 0xfec0, DSPInterpreter::asr, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false},
|
{"ASR", 0x14c0, 0xfec0, DSPInterpreter::asr, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false},
|
||||||
|
|
||||||
{"LSRN", 0x02ca, 0xffff, DSPInterpreter::lsrn, nop, 1, 0, {}, false}, // discovered by ector!
|
// discovered by ector!
|
||||||
{"ASRN", 0x02cb, 0xffff, DSPInterpreter::asrn, nop, 1, 0, {}, false}, // discovered by ector!
|
{"LSRN", 0x02ca, 0xffff, DSPInterpreter::lsrn, nop, 1, 0, {}, false},
|
||||||
|
{"ASRN", 0x02cb, 0xffff, DSPInterpreter::asrn, nop, 1, 0, {}, false},
|
||||||
|
|
||||||
{"LRI", 0x0080, 0xffe0, DSPInterpreter::lri, nop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
{"LRI", 0x0080, 0xffe0, DSPInterpreter::lri, nop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
||||||
{"LR", 0x00c0, 0xffe0, DSPInterpreter::lr, nop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_MEM, 2, 1, 0, 0xffff}}, false},
|
{"LR", 0x00c0, 0xffe0, DSPInterpreter::lr, nop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_MEM, 2, 1, 0, 0xffff}}, false},
|
||||||
|
@ -138,20 +137,25 @@ const DSPOPCTemplate opcodes[] =
|
||||||
|
|
||||||
{"SI", 0x1600, 0xff00, DSPInterpreter::si, nop, 2, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
{"SI", 0x1600, 0xff00, DSPInterpreter::si, nop, 2, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
||||||
|
|
||||||
{"ADDIS", 0x0400, 0xfe00, DSPInterpreter::addis, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
|
{"LRS", 0x2000, 0xf800, DSPInterpreter::lrs, nop, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_MEM, 1, 0, 0, 0x00ff}}, false},
|
||||||
{"CMPIS", 0x0600, 0xfe00, DSPInterpreter::cmpis, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
|
{"SRS", 0x2800, 0xf800, DSPInterpreter::srs, nop, 1, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_REG18, 1, 0, 8, 0x0700}}, false},
|
||||||
|
|
||||||
{"LRIS", 0x0800, 0xf800, DSPInterpreter::lris, nop, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
|
{"LRIS", 0x0800, 0xf800, DSPInterpreter::lris, nop, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
|
||||||
|
|
||||||
{"ADDI", 0x0200, 0xfeff, DSPInterpreter::addi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, // F|RES: missing S64
|
{"ADDIS", 0x0400, 0xfe00, DSPInterpreter::addis, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
|
||||||
{"XORI", 0x0220, 0xfeff, DSPInterpreter::xori, nop, 2, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
{"CMPIS", 0x0600, 0xfe00, DSPInterpreter::cmpis, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
|
||||||
{"ANDI", 0x0240, 0xfeff, DSPInterpreter::andi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
{"ANDI", 0x0240, 0xfeff, DSPInterpreter::andi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
||||||
{"ORI", 0x0260, 0xfeff, DSPInterpreter::ori, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
|
||||||
{"CMPI", 0x0280, 0xfeff, DSPInterpreter::cmpi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
|
||||||
|
|
||||||
{"ANDF", 0x02a0, 0xfeff, DSPInterpreter::andf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
|
||||||
{"ANDCF", 0x02c0, 0xfeff, DSPInterpreter::andcf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
{"ANDCF", 0x02c0, 0xfeff, DSPInterpreter::andcf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
||||||
|
|
||||||
|
{"XORI", 0x0220, 0xfeff, DSPInterpreter::xori, nop, 2, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
||||||
|
{"ANDF", 0x02a0, 0xfeff, DSPInterpreter::andf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
||||||
|
|
||||||
|
{"ORI", 0x0260, 0xfeff, DSPInterpreter::ori, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
||||||
{"ORF", 0x02e0, 0xfeff, DSPInterpreter::orf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, // Hermes: ??? (has it commented out)
|
{"ORF", 0x02e0, 0xfeff, DSPInterpreter::orf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, // Hermes: ??? (has it commented out)
|
||||||
|
|
||||||
|
{"ADDI", 0x0200, 0xfeff, DSPInterpreter::addi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, // F|RES: missing S64
|
||||||
|
{"CMPI", 0x0280, 0xfeff, DSPInterpreter::cmpi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
|
||||||
|
|
||||||
{"ILRR", 0x0210, 0xfefc, DSPInterpreter::ilrr, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false},
|
{"ILRR", 0x0210, 0xfefc, DSPInterpreter::ilrr, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false},
|
||||||
{"ILRRD", 0x0214, 0xfefc, DSPInterpreter::ilrrd, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false}, // Hermes doesn't list this
|
{"ILRRD", 0x0214, 0xfefc, DSPInterpreter::ilrrd, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false}, // Hermes doesn't list this
|
||||||
{"ILRRI", 0x0218, 0xfefc, DSPInterpreter::ilrri, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false},
|
{"ILRRI", 0x0218, 0xfefc, DSPInterpreter::ilrri, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false},
|
||||||
|
@ -174,9 +178,7 @@ const DSPOPCTemplate opcodes[] =
|
||||||
{"LOOPI", 0x1000, 0xff00, DSPInterpreter::loopi, nop, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}}, false},
|
{"LOOPI", 0x1000, 0xff00, DSPInterpreter::loopi, nop, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}}, false},
|
||||||
{"BLOOPI", 0x1100, 0xff00, DSPInterpreter::bloopi, nop, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false},
|
{"BLOOPI", 0x1100, 0xff00, DSPInterpreter::bloopi, nop, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false},
|
||||||
|
|
||||||
//2
|
{"ADDARN", 0x0010, 0xfff0, DSPInterpreter::addarn, nop, 1, 2, {{P_REG, 1, 0, 0, 0x0003}, {P_REG04, 1, 0, 2, 0x000c}}, false},
|
||||||
{"LRS", 0x2000, 0xf800, DSPInterpreter::lrs, nop, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_MEM, 1, 0, 0, 0x00ff}}, false},
|
|
||||||
{"SRS", 0x2800, 0xf800, DSPInterpreter::srs, nop, 1, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_REG18, 1, 0, 8, 0x0700}}, false},
|
|
||||||
|
|
||||||
// opcodes that can be extended
|
// opcodes that can be extended
|
||||||
// extended opcodes, note size of opcode will be set to 0
|
// extended opcodes, note size of opcode will be set to 0
|
||||||
|
|
|
@ -33,7 +33,7 @@ void clr(const UDSPInstruction& opc)
|
||||||
u8 reg = (opc.hex >> 11) & 0x1;
|
u8 reg = (opc.hex >> 11) & 0x1;
|
||||||
|
|
||||||
dsp_set_long_acc(reg, 0);
|
dsp_set_long_acc(reg, 0);
|
||||||
Update_SR_Register64(0);
|
Update_SR_Register64((s64)0); // really?
|
||||||
zeroWriteBackLog();
|
zeroWriteBackLog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -455,7 +455,7 @@ void maddx(const UDSPInstruction& opc)
|
||||||
|
|
||||||
u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0);
|
u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0);
|
||||||
u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1);
|
u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1);
|
||||||
s64 prod = dsp_multiply_add(val1, val2);
|
s64 prod = dsp_multiply_add(val1, val2, true);
|
||||||
|
|
||||||
zeroWriteBackLog();
|
zeroWriteBackLog();
|
||||||
dsp_set_long_prod(prod);
|
dsp_set_long_prod(prod);
|
||||||
|
@ -474,7 +474,7 @@ void msubx(const UDSPInstruction& opc)
|
||||||
|
|
||||||
u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0);
|
u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0);
|
||||||
u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1);
|
u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1);
|
||||||
s64 prod = dsp_multiply_sub(val1, val2);
|
s64 prod = dsp_multiply_sub(val1, val2, true);
|
||||||
|
|
||||||
zeroWriteBackLog();
|
zeroWriteBackLog();
|
||||||
dsp_set_long_prod(prod);
|
dsp_set_long_prod(prod);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="9,00"
|
Version="9.00"
|
||||||
Name="Dolphin"
|
Name="Dolphin"
|
||||||
ProjectGUID="{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}"
|
ProjectGUID="{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}"
|
||||||
RootNamespace="DolphinWX"
|
RootNamespace="DolphinWX"
|
||||||
|
@ -91,7 +91,7 @@
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
||||||
OutputFile=""$(SolutionDir)../Binary/$(PlatformName)/Dolphin.exe""
|
OutputFile="../../../Binary/Win32/Dolphin.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="true"
|
SuppressStartupBanner="true"
|
||||||
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
|
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
|
||||||
|
@ -208,13 +208,13 @@
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="comctl32.lib rpcrt4.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib"
|
AdditionalDependencies="comctl32.lib rpcrt4.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib"
|
||||||
OutputFile=""$(SolutionDir)../Binary/$(PlatformName)/Dolphin.exe""
|
OutputFile="../../../Binary/x64/Dolphin.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="true"
|
SuppressStartupBanner="true"
|
||||||
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
|
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
|
||||||
IgnoreAllDefaultLibraries="false"
|
IgnoreAllDefaultLibraries="false"
|
||||||
IgnoreDefaultLibraryNames=""
|
IgnoreDefaultLibraryNames=""
|
||||||
GenerateDebugInformation="false"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
SubSystem="2"
|
SubSystem="2"
|
||||||
BaseAddress="0x00400000"
|
BaseAddress="0x00400000"
|
||||||
|
@ -321,7 +321,7 @@
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/TLBID:1"
|
AdditionalOptions="/TLBID:1"
|
||||||
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
||||||
OutputFile=""$(SolutionDir)../Binary/$(PlatformName)/DolphinD.exe""
|
OutputFile="../../../Binary/Win32/DolphinD.exe"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
SuppressStartupBanner="true"
|
SuppressStartupBanner="true"
|
||||||
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
|
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
|
||||||
|
@ -432,7 +432,7 @@
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/TLBID:1"
|
AdditionalOptions="/TLBID:1"
|
||||||
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib"
|
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib"
|
||||||
OutputFile=""$(SolutionDir)../Binary/$(PlatformName)/DolphinD.exe""
|
OutputFile="../../../Binary/x64/DolphinD.exe"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
SuppressStartupBanner="true"
|
SuppressStartupBanner="true"
|
||||||
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
|
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
|
||||||
|
@ -546,7 +546,7 @@
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalOptions="/NODEFAULTLIB:msvcrt.lib
/NODEFAULTLIB:libcmtd.lib"
|
AdditionalOptions="/NODEFAULTLIB:msvcrt.lib
/NODEFAULTLIB:libcmtd.lib"
|
||||||
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
||||||
OutputFile=""$(SolutionDir)../Binary/$(PlatformName)/DolphinDF.exe""
|
OutputFile="../../../Binary/Win32/DolphinDF.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="true"
|
SuppressStartupBanner="true"
|
||||||
AdditionalLibraryDirectories=""$(SolutionDir)\Release\$(PlatformName)";"..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)""
|
AdditionalLibraryDirectories=""$(SolutionDir)\Release\$(PlatformName)";"..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)""
|
||||||
|
@ -659,7 +659,7 @@
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
||||||
OutputFile=""$(SolutionDir)../Binary/$(PlatformName)/DolphinDF.exe"
|
OutputFile="../../../Binary/x64/DolphinDF.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="true"
|
SuppressStartupBanner="true"
|
||||||
AdditionalLibraryDirectories=""$(SolutionDir)\Release\$(PlatformName)";"..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)""
|
AdditionalLibraryDirectories=""$(SolutionDir)\Release\$(PlatformName)";"..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)""
|
||||||
|
@ -773,7 +773,7 @@
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
||||||
OutputFile=""$(SolutionDir)../Binary/$(PlatformName)/Dolphin.exeIL""
|
OutputFile="../../../Binary/Win32/DolphinIL.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="true"
|
SuppressStartupBanner="true"
|
||||||
AdditionalLibraryDirectories=""$(SolutionDir)\Release\$(PlatformName)";"..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)""
|
AdditionalLibraryDirectories=""$(SolutionDir)\Release\$(PlatformName)";"..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)""
|
||||||
|
@ -889,7 +889,7 @@
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="comctl32.lib rpcrt4.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
AdditionalDependencies="comctl32.lib rpcrt4.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
|
||||||
OutputFile=""$(SolutionDir)../Binary/$(PlatformName)/DolphinIL.exe""
|
OutputFile="../../../Binary/x64/DolphinIL.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="true"
|
SuppressStartupBanner="true"
|
||||||
AdditionalLibraryDirectories=""$(SolutionDir)\Release\$(PlatformName)";"..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)""
|
AdditionalLibraryDirectories=""$(SolutionDir)\Release\$(PlatformName)";"..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)""
|
||||||
|
|
|
@ -116,8 +116,8 @@ void CARCodeAddEdit::SaveCheatData(wxCommandEvent& WXUNUSED (event))
|
||||||
|
|
||||||
if (pieces.size() == 2 && pieces[0].size() == 8 && pieces[1].size() == 8)
|
if (pieces.size() == 2 && pieces[0].size() == 8 && pieces[1].size() == 8)
|
||||||
{
|
{
|
||||||
u32 addr = strtoul(pieces[0].c_str(), NULL, 16);
|
u32 addr = strtol(pieces[0].c_str(), NULL, 16);
|
||||||
u32 value = strtoul(pieces[1].c_str(), NULL, 16);
|
u32 value = strtol(pieces[1].c_str(), NULL, 16);
|
||||||
// Decrypted code
|
// Decrypted code
|
||||||
tempEntries.push_back(ActionReplay::AREntry(addr, value));
|
tempEntries.push_back(ActionReplay::AREntry(addr, value));
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,11 +145,11 @@ int abc = 0;
|
||||||
switch(wParam)
|
switch(wParam)
|
||||||
{
|
{
|
||||||
// Stop
|
// Stop
|
||||||
case WM_USER_STOP:
|
case OPENGL_WM_USER_STOP:
|
||||||
main_frame->DoStop();
|
main_frame->DoStop();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WM_USER_CREATE:
|
case OPENGL_WM_USER_CREATE:
|
||||||
// We don't have a local setting for bRenderToMain but we can detect it this way instead
|
// We don't have a local setting for bRenderToMain but we can detect it this way instead
|
||||||
//PanicAlert("main call %i %i %i %i", lParam, (HWND)Core::GetWindowHandle(), MSWGetParent_((HWND)Core::GetWindowHandle()), (HWND)this->GetHWND());
|
//PanicAlert("main call %i %i %i %i", lParam, (HWND)Core::GetWindowHandle(), MSWGetParent_((HWND)Core::GetWindowHandle()), (HWND)this->GetHWND());
|
||||||
if (lParam == NULL)
|
if (lParam == NULL)
|
||||||
|
@ -232,7 +232,6 @@ EVT_MENU(IDM_BROWSE, CFrame::OnBrowse)
|
||||||
EVT_MENU(IDM_MEMCARD, CFrame::OnMemcard)
|
EVT_MENU(IDM_MEMCARD, CFrame::OnMemcard)
|
||||||
EVT_MENU(IDM_CHEATS, CFrame::OnShow_CheatsWindow)
|
EVT_MENU(IDM_CHEATS, CFrame::OnShow_CheatsWindow)
|
||||||
EVT_MENU(IDM_INFO, CFrame::OnShow_InfoWindow)
|
EVT_MENU(IDM_INFO, CFrame::OnShow_InfoWindow)
|
||||||
EVT_MENU(IDM_RESTART, CFrame::OnRestart)
|
|
||||||
EVT_MENU(IDM_CHANGEDISC, CFrame::OnChangeDisc)
|
EVT_MENU(IDM_CHANGEDISC, CFrame::OnChangeDisc)
|
||||||
EVT_MENU(IDM_LOAD_WII_MENU, CFrame::OnLoadWiiMenu)
|
EVT_MENU(IDM_LOAD_WII_MENU, CFrame::OnLoadWiiMenu)
|
||||||
EVT_MENU(IDM_TOGGLE_FULLSCREEN, CFrame::OnToggleFullscreen)
|
EVT_MENU(IDM_TOGGLE_FULLSCREEN, CFrame::OnToggleFullscreen)
|
||||||
|
@ -304,7 +303,7 @@ CFrame::CFrame(wxFrame* parent,
|
||||||
, m_ToolBar(NULL), m_ToolBarDebug(NULL), m_ToolBarAui(NULL)
|
, m_ToolBar(NULL), m_ToolBarDebug(NULL), m_ToolBarAui(NULL)
|
||||||
, m_pStatusBar(NULL), m_GameListCtrl(NULL), m_Panel(NULL)
|
, m_pStatusBar(NULL), m_GameListCtrl(NULL), m_Panel(NULL)
|
||||||
, UseDebugger(_UseDebugger), m_bEdit(false), m_bTabSplit(false), m_bNoDocking(false)
|
, UseDebugger(_UseDebugger), m_bEdit(false), m_bTabSplit(false), m_bNoDocking(false)
|
||||||
, bRenderToMain(false), bFloatLogWindow(false), bFloatConsoleWindow(false)
|
, bRenderToMain(true), bFloatLogWindow(false), bFloatConsoleWindow(false)
|
||||||
, HaveLeds(false), HaveSpeakers(false)
|
, HaveLeds(false), HaveSpeakers(false)
|
||||||
, m_fLastClickTime(0), m_iLastMotionTime(0), LastMouseX(0), LastMouseY(0)
|
, m_fLastClickTime(0), m_iLastMotionTime(0), LastMouseX(0), LastMouseY(0)
|
||||||
#if wxUSE_TIMER
|
#if wxUSE_TIMER
|
||||||
|
@ -495,24 +494,6 @@ void CFrame::OnQuit(wxCommandEvent& WXUNUSED (event))
|
||||||
Close(true);
|
Close(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CFrame::OnRestart(wxCommandEvent& WXUNUSED (event))
|
|
||||||
{
|
|
||||||
if (Core::GetState() != Core::CORE_UNINITIALIZED)
|
|
||||||
{
|
|
||||||
wxMessageBox(wxT("Please stop the current game before restarting."), wxT("Notice"), wxOK, this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Get exe path and restart
|
|
||||||
#ifdef _WIN32
|
|
||||||
char Str[MAX_PATH + 1];
|
|
||||||
DWORD Size = sizeof(Str)/sizeof(char);
|
|
||||||
DWORD n = GetModuleFileNameA(NULL, Str, Size);
|
|
||||||
ShellExecuteA(NULL, "open", Str, g_pCodeWindow ? "" : "-d", NULL, SW_SHOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Close(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------
|
// --------
|
||||||
// Events
|
// Events
|
||||||
|
|
||||||
|
@ -691,7 +672,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event)
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if(event.GetKeyCode() == 'M', '3', '4', '5', '6', '7') // Send this to the video plugin WndProc
|
if(event.GetKeyCode() == 'M', '3', '4', '5', '6', '7') // Send this to the video plugin WndProc
|
||||||
{
|
{
|
||||||
PostMessage((HWND)Core::GetWindowHandle(), WM_USER, WM_USER_KEYDOWN, event.GetKeyCode());
|
PostMessage((HWND)Core::GetWindowHandle(), WM_USER, OPENGL_WM_USER_KEYDOWN, event.GetKeyCode());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -250,7 +250,6 @@ class CFrame : public wxFrame
|
||||||
#endif
|
#endif
|
||||||
// Event functions
|
// Event functions
|
||||||
void OnQuit(wxCommandEvent& event);
|
void OnQuit(wxCommandEvent& event);
|
||||||
void OnRestart(wxCommandEvent& WXUNUSED (event));
|
|
||||||
void OnHelp(wxCommandEvent& event);
|
void OnHelp(wxCommandEvent& event);
|
||||||
void OnToolBar(wxCommandEvent& event);
|
void OnToolBar(wxCommandEvent& event);
|
||||||
void OnAuiToolBar(wxAuiToolBarEvent& event);
|
void OnAuiToolBar(wxAuiToolBarEvent& event);
|
||||||
|
|
|
@ -127,12 +127,6 @@ void CFrame::ToggleConsole(bool bShow, int i)
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
ConsoleListener *Console = LogManager::GetInstance()->getConsoleListener();
|
ConsoleListener *Console = LogManager::GetInstance()->getConsoleListener();
|
||||||
|
|
||||||
// For developers: Use this to get a regular separate console window
|
|
||||||
/*
|
|
||||||
if(!GetConsoleWindow()) Console->Open(); else ShowWindow(GetConsoleWindow(), SW_SHOW);
|
|
||||||
return;
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (bShow)
|
if (bShow)
|
||||||
{
|
{
|
||||||
//Console->Log(LogTypes::LNOTICE, StringFromFormat(" >>> Show\n").c_str());
|
//Console->Log(LogTypes::LNOTICE, StringFromFormat(" >>> Show\n").c_str());
|
||||||
|
@ -754,7 +748,7 @@ void CFrame::ResizeConsole()
|
||||||
wxBorder = 2;
|
wxBorder = 2;
|
||||||
Border = 4;
|
Border = 4;
|
||||||
LowerBorder = 6;
|
LowerBorder = 6;
|
||||||
MenuBar = 26; // Including upper border
|
MenuBar = 30; // Including upper border
|
||||||
ScrollBar = 19;
|
ScrollBar = 19;
|
||||||
}
|
}
|
||||||
else // XP
|
else // XP
|
||||||
|
|
|
@ -121,8 +121,6 @@ void CFrame::CreateMenu()
|
||||||
fileMenu->AppendSeparator();
|
fileMenu->AppendSeparator();
|
||||||
fileMenu->Append(IDM_BROWSE, _T("&Browse for ISOs..."));
|
fileMenu->Append(IDM_BROWSE, _T("&Browse for ISOs..."));
|
||||||
fileMenu->AppendSeparator();
|
fileMenu->AppendSeparator();
|
||||||
fileMenu->Append(IDM_RESTART, g_pCodeWindow ? _T("Restart in regular mode") : _T("Restart in debugging mode"));
|
|
||||||
fileMenu->AppendSeparator();
|
|
||||||
fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt+F4"));
|
fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt+F4"));
|
||||||
m_MenuBar->Append(fileMenu, _T("&File"));
|
m_MenuBar->Append(fileMenu, _T("&File"));
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,7 @@ void wxInfoWindow::Init_ChildControls()
|
||||||
|
|
||||||
|
|
||||||
Info.append(StringFromFormat(
|
Info.append(StringFromFormat(
|
||||||
"\n\n_-Computer Information-_\n\n%s\n%s\n%s\n\n_-Dolphin Information-_\n\n%s\n\n%s\n\n",
|
"\n\n%s\n%s\n%s\n\n%s\n\n",
|
||||||
Summarize_OS().c_str(),
|
|
||||||
Summarize_Drives().c_str(),
|
Summarize_Drives().c_str(),
|
||||||
Summarize_CPU().c_str(),
|
Summarize_CPU().c_str(),
|
||||||
Summarize_Plug().c_str(),
|
Summarize_Plug().c_str(),
|
||||||
|
|
|
@ -517,12 +517,11 @@ void CLogWindow::UpdateLog()
|
||||||
m_LogTimer->Start(UPDATETIME);
|
m_LogTimer->Start(UPDATETIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Receive log messages
|
|
||||||
void CLogWindow::Log(LogTypes::LOG_LEVELS level, const char *text)
|
void CLogWindow::Log(LogTypes::LOG_LEVELS level, const char *text)
|
||||||
{
|
{
|
||||||
m_LogSection.Enter();
|
m_LogSection.Enter();
|
||||||
// Remove the first message if the queue is big
|
if (msgQueue.size() >= 100)
|
||||||
//if (msgQueue.size() >= 200) msgQueue.pop();
|
msgQueue.pop();
|
||||||
msgQueue.push(std::pair<u8, wxString>((u8)level, wxString::FromAscii(text)));
|
msgQueue.push(std::pair<u8, wxString>((u8)level, wxString::FromAscii(text)));
|
||||||
m_LogSection.Leave();
|
m_LogSection.Leave();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
#ifndef __SUMMARIZE_H__
|
#ifndef __SUMMARIZE_H__
|
||||||
#define __SUMMARIZE_H__
|
#define __SUMMARIZE_H__
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
std::string Summarize_Plug()
|
std::string Summarize_Plug()
|
||||||
{
|
{
|
||||||
return StringFromFormat(
|
return StringFromFormat(
|
||||||
|
@ -106,7 +104,7 @@ std::string Summarize_CPU()
|
||||||
{
|
{
|
||||||
return StringFromFormat(
|
return StringFromFormat(
|
||||||
"Processor Information: \n%s\n",
|
"Processor Information: \n%s\n",
|
||||||
cpu_info.Summarize_long().c_str()
|
cpu_info.Summarize().c_str()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,66 +124,4 @@ std::string Summarize_Drives()
|
||||||
return drive;
|
return drive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string Summarize_OS(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
std::string operatingSystem;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
OSVERSIONINFO osver;
|
|
||||||
osver.dwOSVersionInfoSize = sizeof(osver);
|
|
||||||
|
|
||||||
if (GetVersionEx(&osver))
|
|
||||||
{
|
|
||||||
switch(osver.dwMajorVersion)
|
|
||||||
{
|
|
||||||
case 6:
|
|
||||||
switch(osver.dwMinorVersion)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
if(osver.dwPlatformId == VER_NT_WORKSTATION)
|
|
||||||
operatingSystem = "Windows 7";
|
|
||||||
else
|
|
||||||
operatingSystem += "Windows Server 2008 R2";
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
if(osver.dwPlatformId == VER_NT_WORKSTATION)
|
|
||||||
operatingSystem = "Windows Vista";
|
|
||||||
else
|
|
||||||
operatingSystem = "Windows Server 2008";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
switch(osver.dwMinorVersion)
|
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
if(GetSystemMetrics(SM_SERVERR2) != 0)
|
|
||||||
operatingSystem = "Windows Server 2003 R2";
|
|
||||||
else
|
|
||||||
operatingSystem = "Windows Server 2003";
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
operatingSystem = "Windows XP";
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
operatingSystem = "Windows 2000";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#ifdef __linux__
|
|
||||||
#include "linux/version.h"
|
|
||||||
operatingSystem = UTS_RELEASE;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
return StringFromFormat("Operating System: %s",operatingSystem);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__SUMMARIZE_H__
|
#endif //__SUMMARIZE_H__
|
|
@ -35,59 +35,42 @@
|
||||||
#define _SDL_MAIN_ // Avoid certain declarations in SDL.h
|
#define _SDL_MAIN_ // Avoid certain declarations in SDL.h
|
||||||
#include "SDL.h" // Local
|
#include "SDL.h" // Local
|
||||||
#include "XInput.h"
|
#include "XInput.h"
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
#include <dinput.h>
|
|
||||||
#pragma comment(lib, "dxguid.lib")
|
|
||||||
#pragma comment(lib, "dinput8.lib")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Definitions
|
||||||
|
// -------------------
|
||||||
|
int g_LastPad = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace InputCommon
|
namespace InputCommon
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
// Definitions
|
// Definitions
|
||||||
// -------------------
|
// -------------------
|
||||||
int g_LastPad = 0;
|
|
||||||
int NumDIDevices = 0;
|
|
||||||
|
|
||||||
|
|
||||||
// Reset and search for devices
|
|
||||||
|
|
||||||
|
|
||||||
|
// Search attached devices. Populate joyinfo for all attached physical devices.
|
||||||
// -----------------------
|
// -----------------------
|
||||||
bool SearchDevicesReset(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
|
||||||
{
|
{
|
||||||
// This is needed to update SDL_NumJoysticks
|
|
||||||
if (SDL_WasInit(0))
|
|
||||||
SDL_Quit();
|
|
||||||
|
|
||||||
return SearchDevices(_joyinfo, _NumPads);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize if not previously initialized
|
|
||||||
// -----------------------
|
|
||||||
bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
|
||||||
{
|
|
||||||
// Init Joystick + Haptic (force feedback) subsystem on SDL 1.3
|
|
||||||
if (!SDL_WasInit(0))
|
if (!SDL_WasInit(0))
|
||||||
{
|
#if SDL_VERSION_ATLEAST(1, 3, 0)
|
||||||
#if SDL_VERSION_ATLEAST(1, 3, 0) && !defined(_WIN32)
|
|
||||||
NOTICE_LOG(PAD, "SDL_Init | HAPTIC");
|
|
||||||
if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0)
|
if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0)
|
||||||
#else
|
#else
|
||||||
//NOTICE_LOG(PAD, "SDL_Init");
|
|
||||||
if (SDL_Init(SDL_INIT_JOYSTICK) < 0)
|
if (SDL_Init(SDL_INIT_JOYSTICK) < 0)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
PanicAlert("Could not initialize SDL: %s", SDL_GetError());
|
PanicAlert("Could not initialize SDL: %s", SDL_GetError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Clear joyinfo
|
|
||||||
_joyinfo.clear();
|
|
||||||
// Get device status
|
// Get device status
|
||||||
int numjoy = SDL_NumJoysticks();
|
int numjoy = SDL_NumJoysticks();
|
||||||
for (int i = 0; i < numjoy; i++ )
|
for (int i = 0; i < numjoy; i++ )
|
||||||
|
@ -103,160 +86,39 @@ bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
||||||
Tmp.Name = SDL_JoystickName(i);
|
Tmp.Name = SDL_JoystickName(i);
|
||||||
|
|
||||||
// Check if the device is okay
|
// Check if the device is okay
|
||||||
if ( !( Tmp.NumAxes == 0
|
if ( Tmp.NumAxes == 0
|
||||||
&& Tmp.NumBalls == 0
|
&& Tmp.NumBalls == 0
|
||||||
&& Tmp.NumButtons == 0
|
&& Tmp.NumButtons == 0
|
||||||
&& Tmp.NumHats == 0)
|
&& Tmp.NumHats == 0
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_joyinfo.push_back(Tmp);
|
Tmp.Good = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//if (SDL_JoystickOpened(i)) SDL_JoystickClose(Tmp.joy);
|
_NumGoodPads++;
|
||||||
|
Tmp.Good = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_joyinfo.push_back(Tmp);
|
||||||
|
|
||||||
|
// We have now read the values we need so we close the device
|
||||||
|
if (SDL_JoystickOpened(i)) SDL_JoystickClose(_joyinfo[i].joy);
|
||||||
}
|
}
|
||||||
|
|
||||||
_NumPads = (int)_joyinfo.size();
|
_NumPads = (int)_joyinfo.size();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Show the current pad status
|
|
||||||
// -----------------
|
|
||||||
std::string ShowStatus(int Slot, int Device, CONTROLLER_MAPPING PadMapping[], CONTROLLER_STATE PadState[],
|
|
||||||
std::vector<InputCommon::CONTROLLER_INFO> joyinfo)
|
|
||||||
{
|
|
||||||
CONTROLLER_MAPPING_NEW _PadMapping[4];
|
|
||||||
CONTROLLER_STATE_NEW _PadState[4];
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
_PadMapping[i].ID = PadMapping[i].ID;
|
|
||||||
_PadMapping[i].Name = PadMapping[i].Name;
|
|
||||||
_PadState[i].joy = PadState[i].joy;
|
|
||||||
}
|
|
||||||
return DoShowStatus(Slot, Device, _PadMapping, _PadState, joyinfo);
|
|
||||||
}
|
|
||||||
std::string DoShowStatus(int Slot, int Device,
|
|
||||||
CONTROLLER_MAPPING_NEW PadMapping[], CONTROLLER_STATE_NEW PadState[],
|
|
||||||
std::vector<InputCommon::CONTROLLER_INFO> joyinfo)
|
|
||||||
{
|
|
||||||
// Save the physical device
|
|
||||||
int ID = PadMapping[Slot].ID;
|
|
||||||
// Make local shortcut
|
|
||||||
SDL_Joystick *joy = PadState[Slot].joy;
|
|
||||||
|
|
||||||
// Make shortcuts for all pads
|
|
||||||
SDL_Joystick *joy0 = PadState[0].joy;
|
|
||||||
SDL_Joystick *joy1 = PadState[1].joy;
|
|
||||||
SDL_Joystick *joy2 = PadState[2].joy;
|
|
||||||
SDL_Joystick *joy3 = PadState[3].joy;
|
|
||||||
|
|
||||||
// Temporary storage
|
|
||||||
std::string
|
|
||||||
StrAllHandles, StrAllName,
|
|
||||||
StrHandles, StrId, StrName,
|
|
||||||
StrAxes, StrHats, StrBut;
|
|
||||||
int value;
|
|
||||||
|
|
||||||
// All devices
|
|
||||||
int numjoy = SDL_NumJoysticks();
|
|
||||||
for (int i = 0; i < numjoy; i++ )
|
|
||||||
{
|
|
||||||
SDL_Joystick *AllJoy = SDL_JoystickOpen(i);
|
|
||||||
StrAllHandles += StringFromFormat(" %i:%06i", i, AllJoy);
|
|
||||||
StrAllName += StringFromFormat("Name %i: %s\n", i, SDL_JoystickName(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get handles
|
|
||||||
for(int i = 0; i < joyinfo.size(); i++)
|
|
||||||
{
|
|
||||||
StrHandles += StringFromFormat(" %i:%06i", i, joyinfo.at(i).joy);
|
|
||||||
StrId += StringFromFormat(" %i:%i", i, joyinfo.at(i).ID);
|
|
||||||
StrName += StringFromFormat("Name %i:%s\n", i, joyinfo.at(i).Name.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get status
|
|
||||||
int Axes = joyinfo[Device].NumAxes;
|
|
||||||
int Balls = joyinfo[Device].NumBalls;
|
|
||||||
int Hats = joyinfo[Device].NumHats;
|
|
||||||
int Buttons = joyinfo[Device].NumButtons;
|
|
||||||
|
|
||||||
// Update the internal values
|
|
||||||
SDL_JoystickUpdate();
|
|
||||||
|
|
||||||
// Go through all axes and read out their values
|
|
||||||
for(int i = 0; i < Axes; i++)
|
|
||||||
{
|
|
||||||
value = SDL_JoystickGetAxis(joy, i);
|
|
||||||
StrAxes += StringFromFormat(" %i:%06i", i, value);
|
|
||||||
}
|
|
||||||
for(int i = 0;i < Hats; i++)
|
|
||||||
{
|
|
||||||
value = SDL_JoystickGetHat(joy, i);
|
|
||||||
StrHats += StringFromFormat(" %i:%i", i, value);
|
|
||||||
}
|
|
||||||
for(int i = 0;i < Buttons; i++)
|
|
||||||
{
|
|
||||||
value = SDL_JoystickGetButton(joy, i);
|
|
||||||
StrBut += StringFromFormat(" %i:%i", i+1, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return StringFromFormat(
|
|
||||||
"All devices:\n"
|
|
||||||
"Handles: %s\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
"\nAll pads:\n"
|
|
||||||
"Handles: %s\n"
|
|
||||||
"ID: %s\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
"\nAll slots:\n"
|
|
||||||
"ID: %i %i %i %i\n"
|
|
||||||
"Name: '%s' '%s' '%s' '%s'\n"
|
|
||||||
//"Controllertype: %i %i %i %i\n"
|
|
||||||
//"SquareToCircle: %i %i %i %i\n\n"
|
|
||||||
#ifdef _WIN32
|
|
||||||
"Handles: %i %i %i %i\n"
|
|
||||||
//"XInput: %i %i %i\n"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
"\nThis pad:\n"
|
|
||||||
"Handle: %06i\n"
|
|
||||||
"ID: %i\n"
|
|
||||||
//"Slot: %i\n"
|
|
||||||
"Axes: %s\n"
|
|
||||||
"Hats: %s\n"
|
|
||||||
"But: %s\n"
|
|
||||||
"Device: Ax: %i Balls:%i Hats:%i But:%i",
|
|
||||||
StrAllHandles.c_str(), StrAllName.c_str(),
|
|
||||||
StrHandles.c_str(), StrId.c_str(), StrName.c_str(),
|
|
||||||
|
|
||||||
PadMapping[0].ID, PadMapping[1].ID, PadMapping[2].ID, PadMapping[3].ID,
|
|
||||||
PadMapping[0].Name.c_str(), PadMapping[1].Name.c_str(), PadMapping[2].Name.c_str(), PadMapping[3].Name.c_str(),
|
|
||||||
//PadMapping[0].controllertype, PadMapping[1].controllertype, PadMapping[2].controllertype, PadMapping[3].controllertype,
|
|
||||||
//PadMapping[0].bSquareToCircle, PadMapping[1].bSquareToCircle, PadMapping[2].bSquareToCircle, PadMapping[3].bSquareToCircle,
|
|
||||||
#ifdef _WIN32
|
|
||||||
joy0, joy1, joy2, joy3,
|
|
||||||
//PadState[PadMapping[0].ID].joy, PadState[PadMapping[1].ID].joy, PadState[PadMapping[2].ID].joy, PadState[PadMapping[3].ID].joy,
|
|
||||||
//XInput::IsConnected(0), XInput::GetXI(0, InputCommon::XI_TRIGGER_L), XInput::GetXI(0, InputCommon::XI_TRIGGER_R),
|
|
||||||
joy,
|
|
||||||
#endif
|
|
||||||
//Slot,
|
|
||||||
ID,
|
|
||||||
StrAxes.c_str(), StrHats.c_str(), StrBut.c_str(),
|
|
||||||
Axes, Balls, Hats, Buttons
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Supporting functions
|
// Supporting functions
|
||||||
// ====================
|
// ----------------
|
||||||
|
|
||||||
// Read current joystick status
|
// Read current joystick status
|
||||||
/* --------------------
|
/* ----------------
|
||||||
The value PadMapping[].buttons[] is the number of the assigned joypad button,
|
The value PadMapping[].buttons[] is the number of the assigned joypad button,
|
||||||
PadState[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */
|
PadState[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */
|
||||||
|
|
||||||
|
@ -278,15 +140,10 @@ void ReadButton(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int
|
||||||
Input: The virtual device 0, 1, 2 or 3
|
Input: The virtual device 0, 1, 2 or 3
|
||||||
Function: Updates the PadState struct with the current pad status. The input value "controller" is
|
Function: Updates the PadState struct with the current pad status. The input value "controller" is
|
||||||
for a virtual controller 0 to 3. */
|
for a virtual controller 0 to 3. */
|
||||||
void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping)
|
void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int Controller, int NumButtons)
|
||||||
{
|
{
|
||||||
if (SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE) return;
|
|
||||||
//NOTICE_LOG(PAD, "SDL_JoystickEventState: %s", (SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE) ? "SDL_ENABLE" : "SDL_IGNORE");
|
|
||||||
|
|
||||||
// Update the gamepad status
|
// Update the gamepad status
|
||||||
SDL_JoystickUpdate();
|
SDL_JoystickUpdate();
|
||||||
// Read info
|
|
||||||
int NumButtons = SDL_JoystickNumButtons(_PadState.joy);
|
|
||||||
|
|
||||||
// Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here.
|
// Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here.
|
||||||
_PadState.axis[CTL_MAIN_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_X]);
|
_PadState.axis[CTL_MAIN_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_X]);
|
||||||
|
@ -349,13 +206,12 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SHOW_PAD_STATUS
|
#ifdef SHOW_PAD_STATUS
|
||||||
/*
|
|
||||||
// Show the status of all connected pads
|
// Show the status of all connected pads
|
||||||
//ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
|
//ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
|
||||||
//if ((g_LastPad == 0 && _PadMapping.ID == 0) || Controller < g_LastPad) Console->ClearScreen();
|
//if ((g_LastPad == 0 && Controller == 0) || Controller < g_LastPad) Console->ClearScreen();
|
||||||
g_LastPad = Controller;
|
g_LastPad = Controller;
|
||||||
NOTICE_LOG(CONSOLE,
|
NOTICE_LOG(CONSOLE,
|
||||||
"Pad | Number:%i Handle:%i\n"
|
"Pad | Number:%i Enabled:%i Handle:%i\n"
|
||||||
"Main Stick | X:%03i Y:%03i\n"
|
"Main Stick | X:%03i Y:%03i\n"
|
||||||
"C Stick | X:%03i Y:%03i\n"
|
"C Stick | X:%03i Y:%03i\n"
|
||||||
"Trigger | Type:%s DigitalL:%i DigitalR:%i AnalogL:%03i AnalogR:%03i HalfPress:%i\n"
|
"Trigger | Type:%s DigitalL:%i DigitalR:%i AnalogL:%03i AnalogR:%03i HalfPress:%i\n"
|
||||||
|
@ -363,7 +219,7 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping)
|
||||||
"D-Pad | Type:%s Hat:%i U:%i D:%i\n"
|
"D-Pad | Type:%s Hat:%i U:%i D:%i\n"
|
||||||
"======================================================\n",
|
"======================================================\n",
|
||||||
|
|
||||||
_PadMapping.ID, _PadState.joy,
|
Controller, _PadMapping.enabled, _PadState.joy,
|
||||||
|
|
||||||
_PadState.axis[InputCommon::CTL_MAIN_X], _PadState.axis[InputCommon::CTL_MAIN_Y],
|
_PadState.axis[InputCommon::CTL_MAIN_X], _PadState.axis[InputCommon::CTL_MAIN_Y],
|
||||||
_PadState.axis[InputCommon::CTL_SUB_X], _PadState.axis[InputCommon::CTL_SUB_Y],
|
_PadState.axis[InputCommon::CTL_SUB_X], _PadState.axis[InputCommon::CTL_SUB_Y],
|
||||||
|
@ -379,7 +235,6 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping)
|
||||||
_PadState.dpad,
|
_PadState.dpad,
|
||||||
_PadState.dpad2[InputCommon::CTL_D_PAD_UP], _PadState.dpad2[InputCommon::CTL_D_PAD_DOWN]
|
_PadState.dpad2[InputCommon::CTL_D_PAD_UP], _PadState.dpad2[InputCommon::CTL_D_PAD_DOWN]
|
||||||
);
|
);
|
||||||
*/
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,18 +263,13 @@ bool AvoidValues(int value, bool NoTriggerFilter)
|
||||||
|
|
||||||
// Detect a pressed button
|
// Detect a pressed button
|
||||||
// ---------------------
|
// ---------------------
|
||||||
void GetButton(SDL_Joystick *joy, int ControllerID,
|
void GetButton(SDL_Joystick *joy, int ControllerID, int buttons, int axes, int hats,
|
||||||
int &KeyboardKey, int &value, int &type, int &pressed, bool &Succeed, bool &Stop,
|
int &KeyboardKey, int &value, int &type, int &pressed, bool &Succeed, bool &Stop,
|
||||||
bool LeftRight, bool Axis, bool XInput, bool Button, bool Hat, bool NoTriggerFilter)
|
bool LeftRight, bool Axis, bool XInput, bool Button, bool Hat, bool NoTriggerFilter)
|
||||||
{
|
{
|
||||||
// It needs the wxWidgets excape keycode
|
// It needs the wxWidgets excape keycode
|
||||||
static const int WXK_ESCAPE = 27;
|
static const int WXK_ESCAPE = 27;
|
||||||
|
|
||||||
// Save info
|
|
||||||
int buttons = SDL_JoystickNumButtons(joy);
|
|
||||||
int axes = SDL_JoystickNumAxes(joy);;
|
|
||||||
int hats = SDL_JoystickNumHats(joy);;
|
|
||||||
|
|
||||||
// Update the internal status
|
// Update the internal status
|
||||||
SDL_JoystickUpdate();
|
SDL_JoystickUpdate();
|
||||||
|
|
||||||
|
@ -520,41 +370,5 @@ void GetButton(SDL_Joystick *joy, int ControllerID,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// **********************************************
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Search for DirectInput devices
|
|
||||||
// ----------------
|
|
||||||
#ifdef _WIN32
|
|
||||||
BOOL CALLBACK EnumDICallback(const DIDEVICEINSTANCE* pInst, VOID* pContext)
|
|
||||||
{
|
|
||||||
NumDIDevices++;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
int SearchDIDevices()
|
|
||||||
{
|
|
||||||
#ifdef _WIN32
|
|
||||||
LPDIRECTINPUT8 g_pObject;
|
|
||||||
LPDIRECTINPUTDEVICE8 g_pDevice;
|
|
||||||
DIPROPDWORD dipdw;
|
|
||||||
HRESULT hr;
|
|
||||||
NumDIDevices = 0;
|
|
||||||
|
|
||||||
// Register with the DirectInput subsystem and get a pointer to a IDirectInput interface we can use.
|
|
||||||
if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_pObject, NULL)))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// Look for a device
|
|
||||||
if (FAILED(hr = g_pObject->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumDICallback, NULL, DIEDFL_ATTACHEDONLY)))
|
|
||||||
return 0;
|
|
||||||
return NumDIDevices;
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // InputCommon
|
} // InputCommon
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "Common.h" // Common
|
#include "Common.h" // Common
|
||||||
#include "StringUtil.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace InputCommon
|
namespace InputCommon
|
||||||
|
@ -62,7 +62,7 @@ namespace InputCommon
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
// ----------
|
// ----------
|
||||||
// Show a status window with the detected devices etc
|
// Show a status window with the detected axes, buttons and so on
|
||||||
//#define SHOW_PAD_STATUS
|
//#define SHOW_PAD_STATUS
|
||||||
|
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ struct CONTROLLER_STATE // GC PAD INFO/STATE
|
||||||
int dpad; // Automatic SDL D-Pad (8 directions + neutral)
|
int dpad; // Automatic SDL D-Pad (8 directions + neutral)
|
||||||
int dpad2[4]; // D-pad using buttons
|
int dpad2[4]; // D-pad using buttons
|
||||||
int axis[6]; // 2 x 2 Axes (Main & Sub)
|
int axis[6]; // 2 x 2 Axes (Main & Sub)
|
||||||
int halfpress; // L and R triggers half pressed
|
int halfpress; // Halfpress... you know, like not fully pressed ;)...
|
||||||
SDL_Joystick *joy; // SDL joystick device
|
SDL_Joystick *joy; // SDL joystick device
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -95,7 +95,6 @@ struct CONTROLLER_MAPPING // GC PAD MAPPING
|
||||||
int halfpress; // (See above)
|
int halfpress; // (See above)
|
||||||
int deadzone; // Deadzone... what else?
|
int deadzone; // Deadzone... what else?
|
||||||
int ID; // SDL joystick device ID
|
int ID; // SDL joystick device ID
|
||||||
std::string Name; // SDL joystick device name
|
|
||||||
int controllertype; // Hat: Hat or custom buttons
|
int controllertype; // Hat: Hat or custom buttons
|
||||||
int triggertype; // Triggers range
|
int triggertype; // Triggers range
|
||||||
std::string SRadius, SDiagonal, SRadiusC, SDiagonalC;
|
std::string SRadius, SDiagonal, SRadiusC, SDiagonalC;
|
||||||
|
@ -112,6 +111,7 @@ struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO
|
||||||
int NumHats; // Amount of Hats (POV)
|
int NumHats; // Amount of Hats (POV)
|
||||||
std::string Name; // Joypad/stickname
|
std::string Name; // Joypad/stickname
|
||||||
int ID; // SDL joystick device ID
|
int ID; // SDL joystick device ID
|
||||||
|
bool Good; // Pad is good (it has at least one button or axis)
|
||||||
SDL_Joystick *joy; // SDL joystick device
|
SDL_Joystick *joy; // SDL joystick device
|
||||||
};
|
};
|
||||||
enum
|
enum
|
||||||
|
@ -220,7 +220,6 @@ struct CONTROLLER_MAPPING_NEW // GC PAD MAPPING
|
||||||
int DeadZoneL; // Analog 1 Deadzone
|
int DeadZoneL; // Analog 1 Deadzone
|
||||||
int DeadZoneR; // Analog 2 Deadzone
|
int DeadZoneR; // Analog 2 Deadzone
|
||||||
int ID; // SDL joystick device ID
|
int ID; // SDL joystick device ID
|
||||||
std::string Name; // SDL joystick device name
|
|
||||||
int controllertype; // D-Pad type: Hat or custom buttons
|
int controllertype; // D-Pad type: Hat or custom buttons
|
||||||
int triggertype; // SDL or XInput trigger
|
int triggertype; // SDL or XInput trigger
|
||||||
std::string SDiagonal;
|
std::string SDiagonal;
|
||||||
|
@ -237,14 +236,9 @@ struct CONTROLLER_MAPPING_NEW // GC PAD MAPPING
|
||||||
// ---------
|
// ---------
|
||||||
|
|
||||||
// General functions
|
// General functions
|
||||||
bool SearchDevicesReset(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads);
|
bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads, int &NumGoodPads);
|
||||||
bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads);
|
void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int controller, int NumButtons);
|
||||||
std::string ShowStatus(int Slot, int Device, CONTROLLER_MAPPING PadMapping[], CONTROLLER_STATE PadState[],
|
void GetButton(SDL_Joystick*, int,int,int,int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool);
|
||||||
std::vector<InputCommon::CONTROLLER_INFO> joyinfo);
|
|
||||||
std::string DoShowStatus(int Slot, int Device, CONTROLLER_MAPPING_NEW PadMapping[], CONTROLLER_STATE_NEW PadState[],
|
|
||||||
std::vector<InputCommon::CONTROLLER_INFO> joyinfo);
|
|
||||||
void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping);
|
|
||||||
void GetButton(SDL_Joystick*, int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool);
|
|
||||||
|
|
||||||
// Value conversion
|
// Value conversion
|
||||||
float Deg2Rad(float Deg);
|
float Deg2Rad(float Deg);
|
||||||
|
@ -262,9 +256,7 @@ std::string VKToString(int keycode);
|
||||||
extern int g_LastPad;
|
extern int g_LastPad;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// DirectInput
|
|
||||||
extern int NumDIDevices;
|
|
||||||
int SearchDIDevices();
|
|
||||||
|
|
||||||
} // InputCommon
|
} // InputCommon
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ void PixelShaderManager::SetConstants()
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
// 24 bits
|
// 24 bits
|
||||||
ftemp[0] = ffrac/65536.0f; ftemp[1] = ffrac/256.0f; ftemp[2] = ffrac; ftemp[3] = 0;
|
ftemp[0] = ffrac/65536.0f; ftemp[1] = ffrac/256.0f; ftemp[2] = ffrac; ftemp[3] = ffrac/16777216.0f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
SetPSConstant4fv(C_ZBIAS, ftemp);
|
SetPSConstant4fv(C_ZBIAS, ftemp);
|
||||||
|
|
|
@ -60,25 +60,6 @@ int TexDecoder_GetTexelSizeInNibbles(int format)
|
||||||
case GX_TF_C8: return 2;
|
case GX_TF_C8: return 2;
|
||||||
case GX_TF_C14X2: return 4;
|
case GX_TF_C14X2: return 4;
|
||||||
case GX_TF_CMPR: return 1;
|
case GX_TF_CMPR: return 1;
|
||||||
case GX_CTF_R4: return 1;
|
|
||||||
case GX_CTF_RA4: return 2;
|
|
||||||
case GX_CTF_RA8: return 4;
|
|
||||||
case GX_CTF_YUVA8: return 8;
|
|
||||||
case GX_CTF_A8: return 2;
|
|
||||||
case GX_CTF_R8: return 2;
|
|
||||||
case GX_CTF_G8: return 2;
|
|
||||||
case GX_CTF_B8: return 2;
|
|
||||||
case GX_CTF_RG8: return 4;
|
|
||||||
case GX_CTF_GB8: return 4;
|
|
||||||
|
|
||||||
case GX_TF_Z8: return 2;
|
|
||||||
case GX_TF_Z16: return 4;
|
|
||||||
case GX_TF_Z24X8: return 8;
|
|
||||||
|
|
||||||
case GX_CTF_Z4: return 1;
|
|
||||||
case GX_CTF_Z8M: return 2;
|
|
||||||
case GX_CTF_Z8L: return 2;
|
|
||||||
case GX_CTF_Z16L: return 4;
|
|
||||||
default: return 1;
|
default: return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_nJoy_SDL", "Plugins\
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
|
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
|
||||||
{11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED}
|
{11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED}
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68} = {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}
|
|
||||||
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
|
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
|
@ -115,7 +114,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_Wiimote", "Plugins\P
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
|
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
|
||||||
{11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED}
|
{11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED}
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68} = {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}
|
|
||||||
{0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} = {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}
|
{0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} = {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}
|
||||||
{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}
|
{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}
|
||||||
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
|
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
|
||||||
|
@ -201,8 +199,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_VideoSoftware", "Plu
|
||||||
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
|
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL", "..\Externals\SDL\VisualC\SDL\SDL_VS2008.vcproj", "{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Win32 = Debug|Win32
|
Debug|Win32 = Debug|Win32
|
||||||
|
@ -700,22 +696,6 @@ Global
|
||||||
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|Win32.Build.0 = Release|Win32
|
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|Win32.Build.0 = Release|Win32
|
||||||
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.ActiveCfg = Release|x64
|
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.ActiveCfg = Release|x64
|
||||||
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.Build.0 = Release|x64
|
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.Build.0 = Release|x64
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.DebugFast|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.DebugFast|Win32.Build.0 = Debug|Win32
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.DebugFast|x64.ActiveCfg = Debug|x64
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.DebugFast|x64.Build.0 = Debug|x64
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_JITIL|Win32.ActiveCfg = Release|Win32
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_JITIL|Win32.Build.0 = Release|Win32
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_JITIL|x64.ActiveCfg = Release|x64
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_JITIL|x64.Build.0 = Release|x64
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.Build.0 = Release|x64
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
|
@ -23,10 +23,10 @@
|
||||||
enum PLUGIN_COMM
|
enum PLUGIN_COMM
|
||||||
{
|
{
|
||||||
// Begin at 10 in case there is already messages with wParam = 0, 1, 2 and so on
|
// Begin at 10 in case there is already messages with wParam = 0, 1, 2 and so on
|
||||||
WM_USER_STOP = 10,
|
OPENGL_WM_USER_STOP = 10,
|
||||||
WM_USER_CREATE,
|
OPENGL_WM_USER_CREATE,
|
||||||
WM_USER_KEYDOWN,
|
OPENGL_WM_USER_KEYDOWN,
|
||||||
WM_USER_VIDEO_STOP,
|
OPENGL_VIDEO_STOP,
|
||||||
TOGGLE_FULLSCREEN,
|
TOGGLE_FULLSCREEN,
|
||||||
VIDEO_DESTROY, // The video debugging window was destroyed
|
VIDEO_DESTROY, // The video debugging window was destroyed
|
||||||
AUDIO_DESTROY, // The audio debugging window was destroyed
|
AUDIO_DESTROY, // The audio debugging window was destroyed
|
||||||
|
|
|
@ -48,6 +48,7 @@ CUCode_AXWii::CUCode_AXWii(CMailHandler& _rMailHandler, u32 l_CRC)
|
||||||
{
|
{
|
||||||
// we got loaded
|
// we got loaded
|
||||||
m_rMailHandler.PushMail(0xDCD10000);
|
m_rMailHandler.PushMail(0xDCD10000);
|
||||||
|
m_rMailHandler.PushMail(0x80000000); // handshake ??? only (crc == 0xe2136399) needs it ...
|
||||||
|
|
||||||
templbuffer = new int[1024 * 1024];
|
templbuffer = new int[1024 * 1024];
|
||||||
temprbuffer = new int[1024 * 1024];
|
temprbuffer = new int[1024 * 1024];
|
||||||
|
@ -69,12 +70,9 @@ void CUCode_AXWii::HandleMail(u32 _uMail)
|
||||||
{
|
{
|
||||||
// a new List
|
// a new List
|
||||||
}
|
}
|
||||||
else if (_uMail == 0xCDD10000) // Action 0 - restart
|
else if ((_uMail & 0xFFFF0000) == 0xCDD10000)
|
||||||
{
|
|
||||||
m_rMailHandler.PushMail(0xDCD10001);
|
|
||||||
}
|
|
||||||
else if ((_uMail & 0xFFFF0000) == 0xCDD10000) // Action 1/2/3
|
|
||||||
{
|
{
|
||||||
|
//NOTICE_LOG(DSPHLE, "action mail %08X", _uMail);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -373,13 +371,11 @@ bool CUCode_AXWii::AXTask(u32& _uMail)
|
||||||
case 0x000b:
|
case 0x000b:
|
||||||
uAddress += 2; // one 0x8000 in rabbids
|
uAddress += 2; // one 0x8000 in rabbids
|
||||||
uAddress += 4 * 2; // then two RAM addressses
|
uAddress += 4 * 2; // then two RAM addressses
|
||||||
m_rMailHandler.PushMail(0xDCD10004);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x000c:
|
case 0x000c:
|
||||||
uAddress += 2; // one 0x8000 in rabbids
|
uAddress += 2; // one 0x8000 in rabbids
|
||||||
uAddress += 4 * 2; // then two RAM addressses
|
uAddress += 4 * 2; // then two RAM addressses
|
||||||
m_rMailHandler.PushMail(0xDCD10004);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x000d:
|
case 0x000d:
|
||||||
|
@ -389,7 +385,7 @@ bool CUCode_AXWii::AXTask(u32& _uMail)
|
||||||
case 0x000e:
|
case 0x000e:
|
||||||
// This is the end.
|
// This is the end.
|
||||||
bExecuteList = false;
|
bExecuteList = false;
|
||||||
m_rMailHandler.PushMail(0xDCD10002);
|
SaveLog("%08x : AXLIST end, wii stylee.", uAddress);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -432,6 +428,7 @@ bool CUCode_AXWii::AXTask(u32& _uMail)
|
||||||
SaveLog("=====================================================================");
|
SaveLog("=====================================================================");
|
||||||
SaveLog("End");
|
SaveLog("End");
|
||||||
|
|
||||||
|
m_rMailHandler.PushMail(0xDCD10002);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -319,13 +319,7 @@ void DSP_WriteMailboxLow(bool _CPUMailbox, u16 _uLowMail)
|
||||||
void DSP_Update(int cycles)
|
void DSP_Update(int cycles)
|
||||||
{
|
{
|
||||||
// This gets called VERY OFTEN. The soundstream update might be expensive so only do it 200 times per second or something.
|
// This gets called VERY OFTEN. The soundstream update might be expensive so only do it 200 times per second or something.
|
||||||
int cycles_between_ss_update;
|
const int cycles_between_ss_update = 80000000 / 200;
|
||||||
|
|
||||||
if (g_dspInitialize.bWii)
|
|
||||||
cycles_between_ss_update = 121500000 / 200;
|
|
||||||
else
|
|
||||||
cycles_between_ss_update = 81000000 / 200;
|
|
||||||
|
|
||||||
static int cycle_count = 0;
|
static int cycle_count = 0;
|
||||||
cycle_count += cycles;
|
cycle_count += cycles;
|
||||||
if (cycle_count > cycles_between_ss_update)
|
if (cycle_count > cycles_between_ss_update)
|
||||||
|
|
|
@ -398,18 +398,18 @@ void drawShadedTexQuad(IDirect3DTexture9 *texture,
|
||||||
{
|
{
|
||||||
SaveRenderStates();
|
SaveRenderStates();
|
||||||
|
|
||||||
//float span = ((rSource->right-rSource->left - 1.0f) * (rDest->right - rDest->left))/(SourceWidth*((rDest->right - rDest->left)-1.0f));
|
float span = ((rSource->right-rSource->left - 1.0f) * (rDest->right - rDest->left))/(SourceWidth*((rDest->right - rDest->left)-1.0f));
|
||||||
float u1=((float)rSource->left+1.0f)/(float) SourceWidth;//*/((0.5f+rSource->left)/(float) SourceWidth)-(span*0.5f/(float)(rDest->right - rDest->left));
|
float u1=((0.5f+rSource->left)/(float) SourceWidth)-(span*0.5f/(float)(rDest->right - rDest->left));
|
||||||
float u2=((float)rSource->right-1.0f)/(float) SourceWidth;;//*/u1+span;
|
float u2=u1+span;
|
||||||
//span = ((rSource->bottom-rSource->top - 1.0f) * (rDest->bottom - rDest->top))/(SourceHeight*((rDest->bottom - rDest->top)-1.0f));
|
span = ((rSource->bottom-rSource->top - 1.0f) * (rDest->bottom - rDest->top))/(SourceHeight*((rDest->bottom - rDest->top)-1.0f));
|
||||||
float v1=((float)rSource->top+1.0f)/(float) SourceHeight;//*/((0.5f+rSource->top)/(float) SourceHeight)-(span*0.5f/(float)(rDest->bottom - rDest->top));
|
float v1=((0.5f+rSource->top)/(float) SourceHeight)-(span*0.5f/(float)(rDest->bottom - rDest->top));
|
||||||
float v2=((float)rSource->bottom-1.0f)/(float) SourceHeight;//*/v1+span;
|
float v2=v1+span;
|
||||||
|
|
||||||
struct Q2DVertex { float x,y,z,rhw,u,v; } coords[4] = {
|
struct Q2DVertex { float x,y,z,rhw,u,v; } coords[4] = {
|
||||||
{(float)rDest->left-0.5f, (float)rDest->top-0.5f, 0.0f, 1.0f, u1, v1},
|
{(float)rDest->left-1.0f, (float)rDest->top-1.0f, 0.0f, 1.0f, u1, v1},
|
||||||
{(float)rDest->right-0.5f, (float)rDest->top-0.5f, 0.0f,1.0f, u2, v1},
|
{(float)rDest->right, (float)rDest->top-1.0f, 0.0f,1.0f, u2, v1},
|
||||||
{(float)rDest->right-0.5f, (float)rDest->bottom-0.5f, 0.0f,1.0f, u2, v2},
|
{(float)rDest->right, (float)rDest->bottom, 0.0f,1.0f, u2, v2},
|
||||||
{(float)rDest->left-0.5f, (float)rDest->bottom-0.5f, 0.0f,1.0f, u1, v2}
|
{(float)rDest->left-1.0f, (float)rDest->bottom, 0.0f,1.0f, u1, v2}
|
||||||
};
|
};
|
||||||
dev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
|
dev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
|
||||||
dev->SetVertexShader(Vshader);
|
dev->SetVertexShader(Vshader);
|
||||||
|
|
|
@ -359,9 +359,6 @@ static void DX9DebuggerUpdateScreen()
|
||||||
D3D::dev->Present(NULL, NULL, NULL, NULL);
|
D3D::dev->Present(NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
||||||
|
|
||||||
if(D3D::GetCaps().NumSimultaneousRTs > 1)
|
|
||||||
D3D::dev->SetRenderTarget(1,FBManager::GetEFBDepthEncodedSurface());
|
|
||||||
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
|
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
|
||||||
D3D::dev->BeginScene();
|
D3D::dev->BeginScene();
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
namespace EmuWindow
|
namespace EmuWindow
|
||||||
{
|
{
|
||||||
HWND m_hWnd = NULL;
|
HWND m_hWnd = NULL;
|
||||||
HWND m_hMain = NULL;
|
|
||||||
HWND m_hParent = NULL;
|
HWND m_hParent = NULL;
|
||||||
HINSTANCE m_hInstance = NULL;
|
HINSTANCE m_hInstance = NULL;
|
||||||
WNDCLASSEX wndClass;
|
WNDCLASSEX wndClass;
|
||||||
|
@ -37,9 +36,6 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
|
||||||
{
|
{
|
||||||
switch( iMsg )
|
switch( iMsg )
|
||||||
{
|
{
|
||||||
case WM_CREATE:
|
|
||||||
PostMessage( m_hMain, WM_USER, WM_USER_CREATE, g_Config.RenderToMainframe );
|
|
||||||
break;
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
{
|
{
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
|
@ -60,16 +56,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
switch( LOWORD( wParam ))
|
switch( LOWORD( wParam ))
|
||||||
{
|
{
|
||||||
case VK_ESCAPE:
|
case VK_ESCAPE: // Pressing Esc switch FullScreen/Windowed
|
||||||
SendMessage(m_hWnd, WM_CLOSE, 0, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0);
|
|
||||||
break;
|
|
||||||
case WM_SYSKEYDOWN:
|
|
||||||
switch( LOWORD( wParam ))
|
|
||||||
{
|
|
||||||
case VK_RETURN: // Pressing Esc switch FullScreen/Windowed
|
|
||||||
if (g_ActiveConfig.bFullscreen)
|
if (g_ActiveConfig.bFullscreen)
|
||||||
{
|
{
|
||||||
DestroyWindow(hWnd);
|
DestroyWindow(hWnd);
|
||||||
|
@ -131,7 +118,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
|
||||||
}*/
|
}*/
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0);
|
g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Post thes mouse events to the main window, it's nessesary because in difference to the
|
/* Post thes mouse events to the main window, it's nessesary because in difference to the
|
||||||
|
@ -145,7 +132,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
//Fifo_ExitLoopNonBlocking();
|
//Fifo_ExitLoopNonBlocking();
|
||||||
//Shutdown();
|
//Shutdown();
|
||||||
PostMessage( m_hMain, WM_USER, WM_USER_STOP, 0 );
|
PostMessage( m_hParent, WM_USER, OPENGL_WM_USER_STOP, 0 );
|
||||||
// Simple hack to easily exit without stopping. Hope to fix the stopping errors soon.
|
// Simple hack to easily exit without stopping. Hope to fix the stopping errors soon.
|
||||||
//ExitProcess(0);
|
//ExitProcess(0);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -200,7 +187,7 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
|
||||||
|
|
||||||
if (g_Config.RenderToMainframe)
|
if (g_Config.RenderToMainframe)
|
||||||
{
|
{
|
||||||
m_hParent = m_hMain = parent;
|
m_hParent = parent;
|
||||||
|
|
||||||
m_hWnd = CreateWindowEx(0, m_szClassName, title, WS_CHILD,
|
m_hWnd = CreateWindowEx(0, m_szClassName, title, WS_CHILD,
|
||||||
0, 0, width, height,
|
0, 0, width, height,
|
||||||
|
@ -211,8 +198,6 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_hMain = parent;
|
|
||||||
|
|
||||||
DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW;
|
DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW;
|
||||||
|
|
||||||
RECT rc = {0, 0, width, height};
|
RECT rc = {0, 0, width, height};
|
||||||
|
|
|
@ -75,31 +75,6 @@ void TextureCache::Invalidate(bool shutdown)
|
||||||
textures.clear();
|
textures.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureCache::InvalidateRange(u32 start_address, u32 size)
|
|
||||||
{
|
|
||||||
TexCache::iterator iter = textures.begin();
|
|
||||||
while (iter != textures.end())
|
|
||||||
{
|
|
||||||
if (iter->second.IntersectsMemoryRange(start_address, size))
|
|
||||||
{
|
|
||||||
iter->second.Destroy(false);
|
|
||||||
ERASE_THROUGH_ITERATOR(textures, iter);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
++iter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TextureCache::TCacheEntry::IntersectsMemoryRange(u32 range_address, u32 range_size)
|
|
||||||
{
|
|
||||||
if (addr + size_in_bytes < range_address)
|
|
||||||
return false;
|
|
||||||
if (addr >= range_address + range_size)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextureCache::Shutdown()
|
void TextureCache::Shutdown()
|
||||||
{
|
{
|
||||||
Invalidate(true);
|
Invalidate(true);
|
||||||
|
@ -208,7 +183,6 @@ TextureCache::TCacheEntry *TextureCache::Load(int stage, u32 address, int width,
|
||||||
D3DFORMAT d3d_fmt;
|
D3DFORMAT d3d_fmt;
|
||||||
switch (pcfmt) {
|
switch (pcfmt) {
|
||||||
case PC_TEX_FMT_BGRA32:
|
case PC_TEX_FMT_BGRA32:
|
||||||
case PC_TEX_FMT_RGBA32:
|
|
||||||
d3d_fmt = D3DFMT_A8R8G8B8;
|
d3d_fmt = D3DFMT_A8R8G8B8;
|
||||||
break;
|
break;
|
||||||
case PC_TEX_FMT_RGB565:
|
case PC_TEX_FMT_RGB565:
|
||||||
|
@ -337,6 +311,24 @@ void TextureCache::CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, boo
|
||||||
}
|
}
|
||||||
|
|
||||||
have_texture:
|
have_texture:
|
||||||
|
/*TargetRectangle targetSource = Renderer::ConvertEFBRectangle(source_rect);
|
||||||
|
RECT source_rc;
|
||||||
|
source_rc.left = targetSource.left;
|
||||||
|
source_rc.top = targetSource.top;
|
||||||
|
source_rc.right = targetSource.right;
|
||||||
|
source_rc.bottom = targetSource.bottom;
|
||||||
|
RECT dest_rc;
|
||||||
|
dest_rc.left = 0;
|
||||||
|
dest_rc.top = 0;
|
||||||
|
dest_rc.right = tex_w;
|
||||||
|
dest_rc.bottom = tex_h;
|
||||||
|
|
||||||
|
LPDIRECT3DSURFACE9 srcSurface, destSurface;
|
||||||
|
tex->GetSurfaceLevel(0, &destSurface);
|
||||||
|
srcSurface = FBManager::GetEFBColorRTSurface();
|
||||||
|
D3D::dev->StretchRect(srcSurface, &source_rc, destSurface, &dest_rc, D3DTEXF_LINEAR);
|
||||||
|
destSurface->Release();
|
||||||
|
return;*/
|
||||||
float colmat[16]= {0.0f};
|
float colmat[16]= {0.0f};
|
||||||
float fConstAdd[4] = {0.0f};
|
float fConstAdd[4] = {0.0f};
|
||||||
|
|
||||||
|
@ -454,7 +446,6 @@ have_texture:
|
||||||
hr = tex->GetSurfaceLevel(0,&Rendersurf);
|
hr = tex->GetSurfaceLevel(0,&Rendersurf);
|
||||||
CHECK(hr);
|
CHECK(hr);
|
||||||
D3D::dev->SetDepthStencilSurface(NULL);
|
D3D::dev->SetDepthStencilSurface(NULL);
|
||||||
if(D3D::GetCaps().NumSimultaneousRTs > 1)
|
|
||||||
D3D::dev->SetRenderTarget(1, NULL);
|
D3D::dev->SetRenderTarget(1, NULL);
|
||||||
D3D::dev->SetRenderTarget(0, Rendersurf);
|
D3D::dev->SetRenderTarget(0, Rendersurf);
|
||||||
|
|
||||||
|
@ -477,17 +468,16 @@ have_texture:
|
||||||
|
|
||||||
|
|
||||||
PixelShaderManager::SetColorMatrix(colmat, fConstAdd); // set transformation
|
PixelShaderManager::SetColorMatrix(colmat, fConstAdd); // set transformation
|
||||||
TargetRectangle targetSource = Renderer::ConvertEFBRectangle(source_rect);
|
//TargetRectangle targetSource = Renderer::ConvertEFBRectangle(source_rect);
|
||||||
RECT sourcerect;
|
RECT sourcerect;
|
||||||
sourcerect.bottom = targetSource.bottom;
|
sourcerect.bottom = source_rect.bottom;
|
||||||
sourcerect.left = targetSource.left;
|
sourcerect.left = source_rect.left;
|
||||||
sourcerect.right = targetSource.right;
|
sourcerect.right = source_rect.right;
|
||||||
sourcerect.top = targetSource.top;
|
sourcerect.top = source_rect.top;
|
||||||
|
|
||||||
D3D::drawShadedTexQuad(read_texture,&sourcerect, Renderer::GetTargetWidth() , Renderer::GetTargetHeight(),&destrect,(FBManager::GetEFBDepthRTSurfaceFormat() == D3DFMT_R32F && bFromZBuffer)? PixelShaderCache::GetDepthMatrixProgram(): PixelShaderCache::GetColorMatrixProgram(),VertexShaderCache::GetSimpleVertexSahder());
|
D3D::drawShadedTexQuad(read_texture,&sourcerect, EFB_WIDTH , EFB_HEIGHT,&destrect,(FBManager::GetEFBDepthRTSurfaceFormat() == D3DFMT_R32F && bFromZBuffer)? PixelShaderCache::GetDepthMatrixProgram(): PixelShaderCache::GetColorMatrixProgram(),NULL);
|
||||||
|
|
||||||
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
||||||
if(D3D::GetCaps().NumSimultaneousRTs > 1)
|
|
||||||
D3D::dev->SetRenderTarget(1, FBManager::GetEFBDepthEncodedSurface());
|
D3D::dev->SetRenderTarget(1, FBManager::GetEFBDepthEncodedSurface());
|
||||||
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
|
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
|
||||||
VertexShaderManager::SetViewportChanged();
|
VertexShaderManager::SetViewportChanged();
|
||||||
|
|
|
@ -53,7 +53,6 @@ public:
|
||||||
oldpixel = 0;
|
oldpixel = 0;
|
||||||
}
|
}
|
||||||
void Destroy(bool shutdown);
|
void Destroy(bool shutdown);
|
||||||
bool IntersectsMemoryRange(u32 range_address, u32 range_size);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -68,7 +67,6 @@ public:
|
||||||
static void Cleanup();
|
static void Cleanup();
|
||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
static void Invalidate(bool shutdown);
|
static void Invalidate(bool shutdown);
|
||||||
static void InvalidateRange(u32 start_address, u32 size);
|
|
||||||
static TCacheEntry *Load(int stage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt);
|
static TCacheEntry *Load(int stage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt);
|
||||||
static void CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle &source_rect);
|
static void CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle &source_rect);
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -192,10 +192,10 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight
|
||||||
#elif defined(_WIN32)
|
#elif defined(_WIN32)
|
||||||
// Create rendering window in Windows
|
// Create rendering window in Windows
|
||||||
// Create a separate window
|
// Create a separate window
|
||||||
/*if (!g_Config.RenderToMainframe || g_VideoInitialize.pWindowHandle == NULL)
|
if (!g_Config.RenderToMainframe || g_VideoInitialize.pWindowHandle == NULL)
|
||||||
g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create(NULL, g_hInstance, _T("Please wait..."));
|
g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create(NULL, g_hInstance, _T("Please wait..."));
|
||||||
// Create a child window
|
// Create a child window
|
||||||
else*/
|
else
|
||||||
g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create((HWND)g_VideoInitialize.pWindowHandle, g_hInstance, _T("Please wait..."));
|
g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create((HWND)g_VideoInitialize.pWindowHandle, g_hInstance, _T("Please wait..."));
|
||||||
|
|
||||||
// Show the window
|
// Show the window
|
||||||
|
|
|
@ -146,8 +146,7 @@ namespace EmuWindow
|
||||||
{
|
{
|
||||||
|
|
||||||
HWND m_hWnd = NULL; // The new window that is created here
|
HWND m_hWnd = NULL; // The new window that is created here
|
||||||
HWND m_hParent = NULL;
|
HWND m_hParent = NULL; // The main CPanel
|
||||||
HWND m_hMain = NULL; // The main CPanel
|
|
||||||
|
|
||||||
HINSTANCE m_hInstance = NULL;
|
HINSTANCE m_hInstance = NULL;
|
||||||
WNDCLASSEX wndClass;
|
WNDCLASSEX wndClass;
|
||||||
|
@ -244,10 +243,16 @@ void OnKeyDown(WPARAM wParam)
|
||||||
switch (LOWORD( wParam ))
|
switch (LOWORD( wParam ))
|
||||||
{
|
{
|
||||||
case VK_ESCAPE:
|
case VK_ESCAPE:
|
||||||
if (!g_Config.RenderToMainframe)
|
if (g_Config.bFullscreen && !g_Config.RenderToMainframe)
|
||||||
{
|
{
|
||||||
// Pressing Esc stops the emulation
|
// Pressing Esc switch to Windowed in Fullscreen mode
|
||||||
SendMessage( m_hWnd, WM_CLOSE, 0, 0 );
|
ToggleFullscreen(m_hWnd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (!g_Config.RenderToMainframe)
|
||||||
|
{
|
||||||
|
// And stops the emulation when already in Windowed mode
|
||||||
|
PostMessage(m_hParent, WM_USER, OPENGL_WM_USER_STOP, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '3': // OSD keys
|
case '3': // OSD keys
|
||||||
|
@ -270,7 +275,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||||||
switch (iMsg)
|
switch (iMsg)
|
||||||
{
|
{
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
PostMessage(m_hMain, WM_USER, WM_USER_CREATE, g_Config.RenderToMainframe);
|
PostMessage((HWND)g_VideoInitialize.pWindowHandle, WM_USER, OPENGL_WM_USER_CREATE, (int)m_hParent);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
|
@ -320,7 +325,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||||||
it's nessesary for both the child window and separate rendering window because
|
it's nessesary for both the child window and separate rendering window because
|
||||||
moves over the rendering window do not reach the main program then. */
|
moves over the rendering window do not reach the main program then. */
|
||||||
if (GetParentWnd() == NULL) { // Separate rendering window
|
if (GetParentWnd() == NULL) { // Separate rendering window
|
||||||
PostMessage(m_hMain, iMsg, wParam, -1);
|
PostMessage(m_hParent, iMsg, wParam, -1);
|
||||||
SetCursor(hCursor);
|
SetCursor(hCursor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -331,14 +336,14 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||||||
only let it pass through Dolphin > Frame.cpp to determine if it should be on or off
|
only let it pass through Dolphin > Frame.cpp to determine if it should be on or off
|
||||||
and coordinate it with the other settings if nessesary */
|
and coordinate it with the other settings if nessesary */
|
||||||
case WM_USER:
|
case WM_USER:
|
||||||
if (wParam == WM_USER_STOP)
|
if (wParam == OPENGL_WM_USER_STOP)
|
||||||
{
|
{
|
||||||
if (lParam)
|
if (lParam)
|
||||||
SetCursor(hCursor);
|
SetCursor(hCursor);
|
||||||
else
|
else
|
||||||
SetCursor(hCursorBlank);
|
SetCursor(hCursorBlank);
|
||||||
}
|
}
|
||||||
if (wParam == WM_USER_KEYDOWN)
|
if (wParam == OPENGL_WM_USER_KEYDOWN)
|
||||||
OnKeyDown(lParam);
|
OnKeyDown(lParam);
|
||||||
if (wParam == TOGGLE_FULLSCREEN)
|
if (wParam == TOGGLE_FULLSCREEN)
|
||||||
ToggleFullscreen(m_hWnd);
|
ToggleFullscreen(m_hWnd);
|
||||||
|
@ -349,7 +354,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||||||
if (m_hParent == NULL)
|
if (m_hParent == NULL)
|
||||||
{
|
{
|
||||||
// Simple hack to easily exit without stopping. Hope to fix the stopping errors soon.
|
// Simple hack to easily exit without stopping. Hope to fix the stopping errors soon.
|
||||||
PostMessage(m_hMain, WM_USER, WM_USER_STOP, 0);
|
ExitProcess(0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,16 +405,16 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
|
||||||
CreateCursors(m_hInstance);
|
CreateCursors(m_hInstance);
|
||||||
|
|
||||||
// Create child window
|
// Create child window
|
||||||
if (g_Config.RenderToMainframe)
|
if (parent)
|
||||||
{
|
{
|
||||||
m_hParent = m_hMain = parent;
|
m_hParent = parent;
|
||||||
|
|
||||||
m_hWnd = CreateWindowEx(0, m_szClassName, title, WS_CHILD,
|
m_hWnd = CreateWindow(m_szClassName, title,
|
||||||
|
WS_CHILD,
|
||||||
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||||
parent, NULL, hInstance, NULL);
|
parent, NULL, hInstance, NULL);
|
||||||
|
|
||||||
if( !g_Config.bFullscreen )
|
ShowWindow(m_hWnd, SW_SHOWMAXIMIZED);
|
||||||
SetWindowPos( GetParent(m_hParent), NULL, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create new separate window
|
// Create new separate window
|
||||||
|
@ -419,7 +424,6 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
|
||||||
// render to main, stop, then render to separate window, as the GUI will still
|
// render to main, stop, then render to separate window, as the GUI will still
|
||||||
// think we're rendering to main because m_hParent will still contain the old HWND...
|
// think we're rendering to main because m_hParent will still contain the old HWND...
|
||||||
m_hParent = NULL;
|
m_hParent = NULL;
|
||||||
m_hMain = parent;
|
|
||||||
|
|
||||||
DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW;
|
DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW;
|
||||||
|
|
||||||
|
@ -434,9 +438,13 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
|
||||||
rc.top = (1024 - h)/2;
|
rc.top = (1024 - h)/2;
|
||||||
rc.bottom = rc.top + h;
|
rc.bottom = rc.top + h;
|
||||||
|
|
||||||
m_hWnd = CreateWindowEx(0, m_szClassName, title, style,
|
m_hWnd = CreateWindow(m_szClassName, title,
|
||||||
|
style,
|
||||||
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
|
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
|
||||||
NULL, NULL, hInstance, NULL);
|
parent, NULL, hInstance, NULL );
|
||||||
|
|
||||||
|
g_winstyle = GetWindowLong( m_hWnd, GWL_STYLE );
|
||||||
|
g_winstyle &= ~WS_MAXIMIZE & ~WS_MINIMIZE; // remove minimize/maximize style
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_hWnd;
|
return m_hWnd;
|
||||||
|
@ -531,9 +539,7 @@ void Show()
|
||||||
|
|
||||||
HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title)
|
HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title)
|
||||||
{
|
{
|
||||||
int width=640, height=480;
|
return OpenWindow(hParent, hInstance, 640, 480, title);
|
||||||
sscanf( g_Config.bFullscreen ? g_Config.cFSResolution : g_Config.cInternalRes, "%dx%d", &width, &height );
|
|
||||||
return OpenWindow(hParent, hInstance, width, height, title);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Close()
|
void Close()
|
||||||
|
@ -548,8 +554,7 @@ void Close()
|
||||||
void SetSize(int width, int height)
|
void SetSize(int width, int height)
|
||||||
{
|
{
|
||||||
RECT rc = {0, 0, width, height};
|
RECT rc = {0, 0, width, height};
|
||||||
DWORD dwStyle = GetWindowLong(m_hWnd, GWL_STYLE);
|
AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false);
|
||||||
AdjustWindowRect(&rc, dwStyle, false);
|
|
||||||
|
|
||||||
int w = rc.right - rc.left;
|
int w = rc.right - rc.left;
|
||||||
int h = rc.bottom - rc.top;
|
int h = rc.bottom - rc.top;
|
||||||
|
|
|
@ -129,7 +129,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
|
||||||
switch( iMsg )
|
switch( iMsg )
|
||||||
{
|
{
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
PostMessage(m_hMain, WM_USER, WM_USER_CREATE, (int)m_hParent);
|
PostMessage(m_hMain, WM_USER, OPENGL_WM_USER_CREATE, (int)m_hParent);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
|
@ -164,7 +164,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
|
||||||
else if (!g_Config.renderToMainframe)
|
else if (!g_Config.renderToMainframe)
|
||||||
{
|
{
|
||||||
// And stops the emulation when already in Windowed mode
|
// And stops the emulation when already in Windowed mode
|
||||||
PostMessage(m_hMain, WM_USER, WM_USER_STOP, 0);
|
PostMessage(m_hMain, WM_USER, OPENGL_WM_USER_STOP, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,10 +67,10 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="xinput.lib comctl32.lib winmm.lib wiiuse.lib rpcrt4.lib wxbase28ud.lib wxmsw28ud_core.lib"
|
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib rpcrt4.lib wxbase28ud.lib wxmsw28ud_core.lib"
|
||||||
OutputFile="..\..\..\Binary\Win32/Plugins\Plugin_WiimoteD.dll"
|
OutputFile="..\..\..\Binary\Win32/Plugins\Plugin_WiimoteD.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(ConfigurationName)";..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -154,7 +154,7 @@
|
||||||
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib rpcrt4.lib wxbase28ud.lib wxmsw28ud_core.lib"
|
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib rpcrt4.lib wxbase28ud.lib wxmsw28ud_core.lib"
|
||||||
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_WiimoteD.dll"
|
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_WiimoteD.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\$(ConfigurationName)";..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -238,7 +238,7 @@
|
||||||
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
|
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
|
||||||
OutputFile="..\..\..\Binary\Win32\Plugins\Plugin_Wiimote.dll"
|
OutputFile="..\..\..\Binary\Win32\Plugins\Plugin_Wiimote.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories="..\..\..\Externals\SDL\VisualC\SDL\$(ConfigurationName);..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -323,7 +323,7 @@
|
||||||
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
|
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
|
||||||
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_Wiimote.dll"
|
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_Wiimote.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\$(ConfigurationName)";..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -405,7 +405,7 @@
|
||||||
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
|
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
|
||||||
OutputFile="..\..\..\Binary\Win32\Plugins\Plugin_WiimoteDF.dll"
|
OutputFile="..\..\..\Binary\Win32\Plugins\Plugin_WiimoteDF.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories="..\..\..\Externals\SDL\VisualC\SDL\Debug;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -487,7 +487,7 @@
|
||||||
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
|
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
|
||||||
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_WiimoteDF.dll"
|
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_WiimoteDF.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\Debug";..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
|
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "EmuDefinitions.h" // for PadMapping
|
#include "EmuDefinitions.h" // for PadMapping
|
||||||
#include "EmuMain.h"
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
// Configuration file control names
|
// Configuration file control names
|
||||||
|
@ -243,13 +242,10 @@ Config::Config()
|
||||||
{
|
{
|
||||||
// Set all default values to zero
|
// Set all default values to zero
|
||||||
memset(this, 0, sizeof(Config));
|
memset(this, 0, sizeof(Config));
|
||||||
Loaded = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Config::Load(bool ChangePad)
|
void Config::Load(bool ChangePad)
|
||||||
{
|
{
|
||||||
Loaded = true;
|
|
||||||
|
|
||||||
std::string temp;
|
std::string temp;
|
||||||
IniFile iniFile;
|
IniFile iniFile;
|
||||||
iniFile.Load(FULL_CONFIG_DIR "Wiimote.ini");
|
iniFile.Load(FULL_CONFIG_DIR "Wiimote.ini");
|
||||||
|
@ -277,7 +273,6 @@ void Config::Load(bool ChangePad)
|
||||||
sprintf(SectionName, "Wiimote%i", i + 1);
|
sprintf(SectionName, "Wiimote%i", i + 1);
|
||||||
iniFile.Get(SectionName, "NoTriggerFilter", &bNoTriggerFilter, false);
|
iniFile.Get(SectionName, "NoTriggerFilter", &bNoTriggerFilter, false);
|
||||||
iniFile.Get(SectionName, "TriggerType", &Trigger.Type, Trigger.TRIGGER_OFF);
|
iniFile.Get(SectionName, "TriggerType", &Trigger.Type, Trigger.TRIGGER_OFF);
|
||||||
iniFile.Get(SectionName, "TriggerUpright", &Trigger.Upright, false);
|
|
||||||
iniFile.Get(SectionName, "TriggerRollRange", &Trigger.Range.Roll, 50);
|
iniFile.Get(SectionName, "TriggerRollRange", &Trigger.Range.Roll, 50);
|
||||||
iniFile.Get(SectionName, "TriggerPitchRange", &Trigger.Range.Pitch, false);
|
iniFile.Get(SectionName, "TriggerPitchRange", &Trigger.Range.Pitch, false);
|
||||||
|
|
||||||
|
@ -305,44 +300,33 @@ void Config::Load(bool ChangePad)
|
||||||
// This pad Id could possibly be higher than the number of pads that are connected,
|
// This pad Id could possibly be higher than the number of pads that are connected,
|
||||||
// but we check later, when needed, that that is not the case
|
// but we check later, when needed, that that is not the case
|
||||||
iniFile.Get(SectionName, "DeviceID", &WiiMoteEmu::PadMapping[i].ID, 0);
|
iniFile.Get(SectionName, "DeviceID", &WiiMoteEmu::PadMapping[i].ID, 0);
|
||||||
iniFile.Get(SectionName, "DeviceName", &WiiMoteEmu::PadMapping[i].Name, 0);
|
|
||||||
iniFile.Get(SectionName, "Enabled", &WiiMoteEmu::PadMapping[i].enabled, true);
|
iniFile.Get(SectionName, "Enabled", &WiiMoteEmu::PadMapping[i].enabled, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Joypad specific settings
|
// Joypad specific settings
|
||||||
// Current joypad device ID: PadMapping[i].ID
|
// Current joypad device ID: PadMapping[i].ID
|
||||||
// Current joypad name: PadMapping[i].Name
|
// Current joypad name: joyinfo[PadMapping[i].ID].Name
|
||||||
|
|
||||||
|
// Prevent a crash from illegal access to joyinfo that will only have values for
|
||||||
|
// the current amount of connected PadMapping
|
||||||
|
if((u32)WiiMoteEmu::PadMapping[i].ID >= WiiMoteEmu::joyinfo.size()) continue;
|
||||||
|
|
||||||
// Create a section name
|
// Create a section name
|
||||||
std::string JoySectionName = WiiMoteEmu::PadMapping[i].Name;
|
std::string joySectionName = WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[i].ID].Name;
|
||||||
// Don't load settings for a non-connected device
|
|
||||||
if (!WiiMoteEmu::IsConnected(JoySectionName))
|
|
||||||
{
|
|
||||||
ERROR_LOG(PAD, "Slot %i: The device '%s' is not connected, will not load settings", i, JoySectionName.c_str());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Don't load a blank ID
|
|
||||||
if (JoySectionName == "")
|
|
||||||
{
|
|
||||||
ERROR_LOG(PAD, "Slot %i has no device name, will not load settings", i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
iniFile.Get(JoySectionName.c_str(), "left_x", &WiiMoteEmu::PadMapping[i].Axis.Lx, 0);
|
iniFile.Get(joySectionName.c_str(), "left_x", &WiiMoteEmu::PadMapping[i].Axis.Lx, 0);
|
||||||
iniFile.Get(JoySectionName.c_str(), "left_y", &WiiMoteEmu::PadMapping[i].Axis.Ly, 1);
|
iniFile.Get(joySectionName.c_str(), "left_y", &WiiMoteEmu::PadMapping[i].Axis.Ly, 1);
|
||||||
iniFile.Get(JoySectionName.c_str(), "right_x", &WiiMoteEmu::PadMapping[i].Axis.Rx, 2);
|
iniFile.Get(joySectionName.c_str(), "right_x", &WiiMoteEmu::PadMapping[i].Axis.Rx, 2);
|
||||||
iniFile.Get(JoySectionName.c_str(), "right_y", &WiiMoteEmu::PadMapping[i].Axis.Ry, 3);
|
iniFile.Get(joySectionName.c_str(), "right_y", &WiiMoteEmu::PadMapping[i].Axis.Ry, 3);
|
||||||
iniFile.Get(JoySectionName.c_str(), "l_trigger", &WiiMoteEmu::PadMapping[i].Axis.Tl, 1004);
|
iniFile.Get(joySectionName.c_str(), "l_trigger", &WiiMoteEmu::PadMapping[i].Axis.Tl, 1004);
|
||||||
iniFile.Get(JoySectionName.c_str(), "r_trigger", &WiiMoteEmu::PadMapping[i].Axis.Tr, 1005);
|
iniFile.Get(joySectionName.c_str(), "r_trigger", &WiiMoteEmu::PadMapping[i].Axis.Tr, 1005);
|
||||||
iniFile.Get(JoySectionName.c_str(), "DeadZoneL", &WiiMoteEmu::PadMapping[i].DeadZoneL, 0);
|
iniFile.Get(joySectionName.c_str(), "DeadZoneL", &WiiMoteEmu::PadMapping[i].DeadZoneL, 0);
|
||||||
iniFile.Get(JoySectionName.c_str(), "DeadZoneR", &WiiMoteEmu::PadMapping[i].DeadZoneR, 0);
|
iniFile.Get(joySectionName.c_str(), "DeadZoneR", &WiiMoteEmu::PadMapping[i].DeadZoneR, 0);
|
||||||
iniFile.Get(JoySectionName.c_str(), "TriggerType", &WiiMoteEmu::PadMapping[i].triggertype, 0);
|
iniFile.Get(joySectionName.c_str(), "TriggerType", &WiiMoteEmu::PadMapping[i].triggertype, 0);
|
||||||
iniFile.Get(JoySectionName.c_str(), "Diagonal", &WiiMoteEmu::PadMapping[i].SDiagonal, "100%");
|
iniFile.Get(joySectionName.c_str(), "Diagonal", &WiiMoteEmu::PadMapping[i].SDiagonal, "100%");
|
||||||
iniFile.Get(JoySectionName.c_str(), "Circle2Square", &WiiMoteEmu::PadMapping[i].bCircle2Square, false);
|
iniFile.Get(joySectionName.c_str(), "Circle2Square", &WiiMoteEmu::PadMapping[i].bCircle2Square, false);
|
||||||
iniFile.Get(JoySectionName.c_str(), "RollInvert", &WiiMoteEmu::PadMapping[i].bRollInvert, false);
|
iniFile.Get(joySectionName.c_str(), "RollInvert", &WiiMoteEmu::PadMapping[i].bRollInvert, false);
|
||||||
iniFile.Get(JoySectionName.c_str(), "PitchInvert", &WiiMoteEmu::PadMapping[i].bPitchInvert, false);
|
iniFile.Get(joySectionName.c_str(), "PitchInvert", &WiiMoteEmu::PadMapping[i].bPitchInvert, false);
|
||||||
|
|
||||||
NOTICE_LOG(WIIMOTE, "Slot %i: Load settings for ID %i '%s'", i, WiiMoteEmu::PadMapping[i].ID, JoySectionName.c_str());
|
|
||||||
}
|
}
|
||||||
// Load the IR cursor settings if it's avaliable for the GameId, if not load the default settings
|
// Load the IR cursor settings if it's avaliable for the GameId, if not load the default settings
|
||||||
iniFile.Load(FULL_CONFIG_DIR "IR Pointer.ini");
|
iniFile.Load(FULL_CONFIG_DIR "IR Pointer.ini");
|
||||||
|
@ -391,7 +375,6 @@ void Config::Save(int Slot)
|
||||||
iniFile.Set(SectionName, "Enabled", WiiMoteEmu::PadMapping[i].enabled);
|
iniFile.Set(SectionName, "Enabled", WiiMoteEmu::PadMapping[i].enabled);
|
||||||
iniFile.Set(SectionName, "NoTriggerFilter", bNoTriggerFilter);
|
iniFile.Set(SectionName, "NoTriggerFilter", bNoTriggerFilter);
|
||||||
iniFile.Set(SectionName, "TriggerType", Trigger.Type);
|
iniFile.Set(SectionName, "TriggerType", Trigger.Type);
|
||||||
iniFile.Set(SectionName, "TriggerUpright", Trigger.Upright);
|
|
||||||
iniFile.Set(SectionName, "TriggerRollRange", Trigger.Range.Roll);
|
iniFile.Set(SectionName, "TriggerRollRange", Trigger.Range.Roll);
|
||||||
iniFile.Set(SectionName, "TriggerPitchRange", Trigger.Range.Pitch);
|
iniFile.Set(SectionName, "TriggerPitchRange", Trigger.Range.Pitch);
|
||||||
|
|
||||||
|
@ -417,22 +400,17 @@ void Config::Save(int Slot)
|
||||||
|
|
||||||
// Save the physical device ID number
|
// Save the physical device ID number
|
||||||
iniFile.Set(SectionName, "DeviceID", WiiMoteEmu::PadMapping[i].ID);
|
iniFile.Set(SectionName, "DeviceID", WiiMoteEmu::PadMapping[i].ID);
|
||||||
iniFile.Set(SectionName, "DeviceName", WiiMoteEmu::PadMapping[i].Name);
|
|
||||||
|
|
||||||
// Joypad specific settings
|
// Joypad specific settings
|
||||||
// Current joypad device ID: PadMapping[i].ID
|
// Current joypad device ID: PadMapping[i].ID
|
||||||
// Current joypad name: IDToName(PadMapping[i].ID])
|
// Current joypad name: joyinfo[PadMapping[i].ID].Name
|
||||||
|
|
||||||
|
// Save joypad specific settings. Check for "PadMapping[i].ID < SDL_NumJoysticks()" to
|
||||||
|
// avoid reading a joyinfo that does't exist
|
||||||
|
if((u32)WiiMoteEmu::PadMapping[i].ID >= WiiMoteEmu::joyinfo.size()) continue;
|
||||||
|
|
||||||
// Create a new section name after the joypad name
|
// Create a new section name after the joypad name
|
||||||
std::string joySectionName = WiiMoteEmu::IDToName(WiiMoteEmu::PadMapping[i].ID);
|
std::string joySectionName = WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[i].ID].Name;
|
||||||
// Don't save a blank name
|
|
||||||
if (SectionName == "")
|
|
||||||
{
|
|
||||||
ERROR_LOG(WIIMOTE, "ID %i has no name, will not load", WiiMoteEmu::PadMapping[i].ID);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
NOTICE_LOG(WIIMOTE, "Save settings for ID %i '%s' from PadMapping[%i]", WiiMoteEmu::PadMapping[i].ID, joySectionName.c_str(), i);
|
|
||||||
|
|
||||||
iniFile.Set(joySectionName.c_str(), "left_x", WiiMoteEmu::PadMapping[i].Axis.Lx);
|
iniFile.Set(joySectionName.c_str(), "left_x", WiiMoteEmu::PadMapping[i].Axis.Lx);
|
||||||
iniFile.Set(joySectionName.c_str(), "left_y", WiiMoteEmu::PadMapping[i].Axis.Ly);
|
iniFile.Set(joySectionName.c_str(), "left_y", WiiMoteEmu::PadMapping[i].Axis.Ly);
|
||||||
|
|
|
@ -41,7 +41,6 @@ struct Config
|
||||||
Config();
|
Config();
|
||||||
void Load(bool ChangePad = false);
|
void Load(bool ChangePad = false);
|
||||||
void Save(int Slot = -1);
|
void Save(int Slot = -1);
|
||||||
bool Loaded;
|
|
||||||
|
|
||||||
struct PadRange
|
struct PadRange
|
||||||
{
|
{
|
||||||
|
@ -60,7 +59,6 @@ struct Config
|
||||||
TRIGGER
|
TRIGGER
|
||||||
};
|
};
|
||||||
int Type;
|
int Type;
|
||||||
bool Upright;
|
|
||||||
PadRange Range;
|
PadRange Range;
|
||||||
};
|
};
|
||||||
struct PadNunchuck
|
struct PadNunchuck
|
||||||
|
|
|
@ -34,7 +34,6 @@ BEGIN_EVENT_TABLE(WiimoteBasicConfigDialog,wxDialog)
|
||||||
EVT_CHECKBOX(ID_CONNECT_REAL, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
EVT_CHECKBOX(ID_CONNECT_REAL, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_CHECKBOX(ID_USE_REAL, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
EVT_CHECKBOX(ID_USE_REAL, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_CHECKBOX(ID_SIDEWAYSDPAD, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
EVT_CHECKBOX(ID_SIDEWAYSDPAD, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_CHECKBOX(ID_UPRIGHTWIIMOTE, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
|
||||||
EVT_CHECKBOX(ID_MOTIONPLUSCONNECTED, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
EVT_CHECKBOX(ID_MOTIONPLUSCONNECTED, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
||||||
EVT_CHOICE(ID_EXTCONNECTED, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
EVT_CHOICE(ID_EXTCONNECTED, WiimoteBasicConfigDialog::GeneralSettingsChanged)
|
||||||
// IR cursor
|
// IR cursor
|
||||||
|
@ -208,9 +207,9 @@ void WiimoteBasicConfigDialog::CreateGUIControls()
|
||||||
// Emulated Wiimote
|
// Emulated Wiimote
|
||||||
m_SidewaysDPad[i] = new wxCheckBox(m_Controller[i], ID_SIDEWAYSDPAD, wxT("Sideways D-Pad"));
|
m_SidewaysDPad[i] = new wxCheckBox(m_Controller[i], ID_SIDEWAYSDPAD, wxT("Sideways D-Pad"));
|
||||||
m_SidewaysDPad[i]->SetValue(g_Config.bSidewaysDPad);
|
m_SidewaysDPad[i]->SetValue(g_Config.bSidewaysDPad);
|
||||||
m_UprightWiimote[i] = new wxCheckBox(m_Controller[i], ID_UPRIGHTWIIMOTE, wxT("Upright Wiimote"));
|
|
||||||
m_UprightWiimote[i]->SetValue(g_Config.Trigger.Upright);
|
m_SizeEmu[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Emulated Wiimote"));
|
||||||
m_UprightWiimote[i]->SetToolTip(wxT("Treat the upright position as neutral for roll and pitch"));
|
m_SizeEmu[i]->Add(m_SidewaysDPad[i], 0, wxEXPAND | wxALL, 5);
|
||||||
|
|
||||||
//IR Pointer
|
//IR Pointer
|
||||||
m_TextScreenWidth[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Width: 000"));
|
m_TextScreenWidth[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Width: 000"));
|
||||||
|
@ -252,12 +251,6 @@ void WiimoteBasicConfigDialog::CreateGUIControls()
|
||||||
m_CheckAR169[i]->Enable(false);
|
m_CheckAR169[i]->Enable(false);
|
||||||
m_Crop[i]->Enable(false);
|
m_Crop[i]->Enable(false);
|
||||||
|
|
||||||
// Sizers
|
|
||||||
|
|
||||||
m_SizeEmu[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Emulated Wiimote"));
|
|
||||||
m_SizeEmu[i]->Add(m_SidewaysDPad[i], 0, wxEXPAND | wxALL, 5);
|
|
||||||
m_SizeEmu[i]->Add(m_UprightWiimote[i], 0, wxEXPAND | (wxLEFT | wxDOWN | wxRIGHT), 5);
|
|
||||||
|
|
||||||
m_SizerIRPointerScreen[i] = new wxBoxSizer(wxHORIZONTAL);
|
m_SizerIRPointerScreen[i] = new wxBoxSizer(wxHORIZONTAL);
|
||||||
m_SizerIRPointerScreen[i]->Add(m_TextAR[i], 0, wxEXPAND | (wxTOP), 0);
|
m_SizerIRPointerScreen[i]->Add(m_TextAR[i], 0, wxEXPAND | (wxTOP), 0);
|
||||||
m_SizerIRPointerScreen[i]->Add(m_CheckAR43[i], 0, wxEXPAND | (wxLEFT), 5);
|
m_SizerIRPointerScreen[i]->Add(m_CheckAR43[i], 0, wxEXPAND | (wxLEFT), 5);
|
||||||
|
@ -399,9 +392,6 @@ void WiimoteBasicConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
|
||||||
case ID_SIDEWAYSDPAD:
|
case ID_SIDEWAYSDPAD:
|
||||||
g_Config.bSidewaysDPad = m_SidewaysDPad[Page]->IsChecked();
|
g_Config.bSidewaysDPad = m_SidewaysDPad[Page]->IsChecked();
|
||||||
break;
|
break;
|
||||||
case ID_UPRIGHTWIIMOTE:
|
|
||||||
g_Config.Trigger.Upright = m_UprightWiimote[Page]->IsChecked();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MOTIONPLUSCONNECTED:
|
case ID_MOTIONPLUSCONNECTED:
|
||||||
g_Config.bMotionPlusConnected = m_WiiMotionPlusConnected[Page]->IsChecked();
|
g_Config.bMotionPlusConnected = m_WiiMotionPlusConnected[Page]->IsChecked();
|
||||||
|
|
|
@ -79,7 +79,6 @@ class WiimoteBasicConfigDialog : public wxDialog
|
||||||
|
|
||||||
// Emulated Wiimote settings
|
// Emulated Wiimote settings
|
||||||
wxCheckBox *m_SidewaysDPad[4],
|
wxCheckBox *m_SidewaysDPad[4],
|
||||||
*m_UprightWiimote[4],
|
|
||||||
*m_WiimoteOnline[4],
|
*m_WiimoteOnline[4],
|
||||||
*m_WiiMotionPlusConnected[4],
|
*m_WiiMotionPlusConnected[4],
|
||||||
*m_CheckAR43[4],
|
*m_CheckAR43[4],
|
||||||
|
@ -127,7 +126,6 @@ class WiimoteBasicConfigDialog : public wxDialog
|
||||||
|
|
||||||
// Emulated Wiimote
|
// Emulated Wiimote
|
||||||
ID_SIDEWAYSDPAD,
|
ID_SIDEWAYSDPAD,
|
||||||
ID_UPRIGHTWIIMOTE,
|
|
||||||
ID_MOTIONPLUSCONNECTED,
|
ID_MOTIONPLUSCONNECTED,
|
||||||
ID_EXTCONNECTED,
|
ID_EXTCONNECTED,
|
||||||
IDC_WIMOTE_ON,
|
IDC_WIMOTE_ON,
|
||||||
|
|
|
@ -30,15 +30,36 @@
|
||||||
is only used the first time the pads are checked. */
|
is only used the first time the pads are checked. */
|
||||||
void WiimotePadConfigDialog::DoChangeJoystick()
|
void WiimotePadConfigDialog::DoChangeJoystick()
|
||||||
{
|
{
|
||||||
WARN_LOG(WIIMOTE, "---- DoChangeJoystick ----");
|
// Close the current pad, unless it's used by another slot
|
||||||
|
//if (PadMapping[notebookpage].enabled) PadClose(notebookpage);
|
||||||
|
|
||||||
// Before changing the pad we save potential changes to the current pad
|
// Before changing the pad we save potential changes to the current pad
|
||||||
DoSave(true);
|
DoSave(true);
|
||||||
|
|
||||||
// Load the settings for the new Id
|
// Load the settings for the new Id
|
||||||
g_Config.Load(true);
|
g_Config.Load(true);
|
||||||
// Update the GUI
|
UpdateGUI(Page); // Update the GUI
|
||||||
UpdateGUI(Page);
|
|
||||||
|
// Open the new pad
|
||||||
|
if (WiiMoteEmu::PadMapping[Page].enabled) PadOpen(Page);
|
||||||
|
}
|
||||||
|
void WiimotePadConfigDialog::PadOpen(int Open) // Open for slot 1, 2, 3 or 4
|
||||||
|
{
|
||||||
|
// Check that we got a good pad
|
||||||
|
if (!WiiMoteEmu::joyinfo.at(WiiMoteEmu::PadMapping[Open].ID).Good)
|
||||||
|
{
|
||||||
|
DEBUG_LOG(WIIMOTE, "A bad pad was selected");
|
||||||
|
WiiMoteEmu::PadState[Open].joy = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG_LOG(WIIMOTE, "Update the Slot %i handle to Id %i", Page, WiiMoteEmu::PadMapping[Open].ID);
|
||||||
|
WiiMoteEmu::PadState[Open].joy = SDL_JoystickOpen(WiiMoteEmu::PadMapping[Open].ID);
|
||||||
|
}
|
||||||
|
void WiimotePadConfigDialog::PadClose(int _Close) // Close for slot 1, 2, 3 or 4
|
||||||
|
{
|
||||||
|
if (SDL_JoystickOpened(WiiMoteEmu::PadMapping[_Close].ID)) SDL_JoystickClose(WiiMoteEmu::PadState[_Close].joy);
|
||||||
|
WiiMoteEmu::PadState[_Close].joy = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WiimotePadConfigDialog::DoChangeDeadZone(bool Left)
|
void WiimotePadConfigDialog::DoChangeDeadZone(bool Left)
|
||||||
|
@ -69,20 +90,23 @@ void WiimotePadConfigDialog::DoChangeDeadZone(bool Left)
|
||||||
// Set the button text for all four Wiimotes
|
// Set the button text for all four Wiimotes
|
||||||
void WiimotePadConfigDialog::SetButtonTextAll(int id, char text[128])
|
void WiimotePadConfigDialog::SetButtonTextAll(int id, char text[128])
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_WIIMOTES; i++)
|
for (int i = 0; i < 1; i++)
|
||||||
{
|
|
||||||
if (WiiMoteEmu::IDToName(WiiMoteEmu::PadMapping[i].ID) == WiiMoteEmu::IDToName(WiiMoteEmu::PadMapping[Page].ID))
|
|
||||||
{
|
{
|
||||||
|
// Safety check to avoid crash
|
||||||
|
if ((int)WiiMoteEmu::joyinfo.size() > WiiMoteEmu::PadMapping[i].ID)
|
||||||
|
if (WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[i].ID].Name == WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[Page].ID].Name)
|
||||||
SetButtonText(id, text, i);
|
SetButtonText(id, text, i);
|
||||||
DEBUG_LOG(PAD, "Updated button text for slot %i", i);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void WiimotePadConfigDialog::SaveButtonMappingAll(int Slot)
|
void WiimotePadConfigDialog::SaveButtonMappingAll(int Slot)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_WIIMOTES; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if (WiiMoteEmu::PadMapping[i].Name.length() > 0 && WiiMoteEmu::PadMapping[i].Name == WiiMoteEmu::PadMapping[Slot].Name)
|
// This can occur when no gamepad is detected
|
||||||
|
if ((int)WiiMoteEmu::joyinfo.size() > WiiMoteEmu::PadMapping[i].ID && WiiMoteEmu::PadMapping[i].ID >= 0)
|
||||||
|
if (WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[i].ID].Name == WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[Slot].ID].Name)
|
||||||
SaveButtonMapping(i, false, Slot);
|
SaveButtonMapping(i, false, Slot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -90,8 +114,6 @@ void WiimotePadConfigDialog::SaveButtonMappingAll(int Slot)
|
||||||
// Set dialog items from saved values
|
// Set dialog items from saved values
|
||||||
void WiimotePadConfigDialog::UpdateGUIButtonMapping(int controller)
|
void WiimotePadConfigDialog::UpdateGUIButtonMapping(int controller)
|
||||||
{
|
{
|
||||||
NOTICE_LOG(WIIMOTE, "Load ButtonMapping | controller:%i", controller);
|
|
||||||
|
|
||||||
// Temporary storage
|
// Temporary storage
|
||||||
wxString tmp;
|
wxString tmp;
|
||||||
|
|
||||||
|
@ -182,9 +204,6 @@ void WiimotePadConfigDialog::UpdateGUIButtonMapping(int controller)
|
||||||
|
|
||||||
void WiimotePadConfigDialog::SaveButtonMapping(int controller, bool DontChangeId, int FromSlot)
|
void WiimotePadConfigDialog::SaveButtonMapping(int controller, bool DontChangeId, int FromSlot)
|
||||||
{
|
{
|
||||||
// Log
|
|
||||||
NOTICE_LOG(WIIMOTE, "SaveButtonMapping | controller:%i FromSlot:%i", controller, FromSlot);
|
|
||||||
|
|
||||||
// Temporary storage
|
// Temporary storage
|
||||||
wxString tmp;
|
wxString tmp;
|
||||||
long value;
|
long value;
|
||||||
|
@ -192,10 +211,6 @@ void WiimotePadConfigDialog::SaveButtonMapping(int controller, bool DontChangeId
|
||||||
// Save from or to the same or different slots
|
// Save from or to the same or different slots
|
||||||
if (FromSlot == -1) FromSlot = controller;
|
if (FromSlot == -1) FromSlot = controller;
|
||||||
|
|
||||||
// TEMPORARY
|
|
||||||
// There is only one slot at the moment
|
|
||||||
if (FromSlot > MAX_WIIMOTES-1) FromSlot = MAX_WIIMOTES-1;
|
|
||||||
|
|
||||||
// Replace "" with "-1" in the GUI controls
|
// Replace "" with "-1" in the GUI controls
|
||||||
ToBlank(false);
|
ToBlank(false);
|
||||||
|
|
||||||
|
@ -203,11 +218,7 @@ void WiimotePadConfigDialog::SaveButtonMapping(int controller, bool DontChangeId
|
||||||
-1 that's a bug that should be fixed. Because the m_Joyname[] combo box should always show <No Gamepad Detected>, or a gamepad name, not a
|
-1 that's a bug that should be fixed. Because the m_Joyname[] combo box should always show <No Gamepad Detected>, or a gamepad name, not a
|
||||||
a blank selection. */
|
a blank selection. */
|
||||||
if (!DontChangeId)
|
if (!DontChangeId)
|
||||||
{
|
WiiMoteEmu::PadMapping[controller].ID = m_Joyname[FromSlot]->GetSelection();
|
||||||
if (m_Joyname[FromSlot]->GetSelection() >= WiiMoteEmu::joyinfo.size()) PanicAlert("Bug in SaveButtonMapping");
|
|
||||||
WiiMoteEmu::PadMapping[controller].ID = WiiMoteEmu::joyinfo.at(m_Joyname[FromSlot]->GetSelection()).ID;
|
|
||||||
WiiMoteEmu::PadMapping[controller].Name = m_Joyname[FromSlot]->GetValue().mb_str();
|
|
||||||
}
|
|
||||||
// Set enabled or disable status
|
// Set enabled or disable status
|
||||||
if (FromSlot == controller)
|
if (FromSlot == controller)
|
||||||
WiiMoteEmu::PadMapping[controller].enabled = true; //m_Joyattach[FromSlot]->GetValue(); // Only enable one
|
WiiMoteEmu::PadMapping[controller].enabled = true; //m_Joyattach[FromSlot]->GetValue(); // Only enable one
|
||||||
|
@ -361,11 +372,6 @@ void WiimotePadConfigDialog::GetButtons(wxCommandEvent& event)
|
||||||
|
|
||||||
void WiimotePadConfigDialog::DoGetButtons(int _GetId)
|
void WiimotePadConfigDialog::DoGetButtons(int _GetId)
|
||||||
{
|
{
|
||||||
DEBUG_LOG(WIIMOTE, "DoGetButtons");
|
|
||||||
|
|
||||||
bool _LiveUpdates = LiveUpdates;
|
|
||||||
LiveUpdates = false;
|
|
||||||
|
|
||||||
// Collect the starting values
|
// Collect the starting values
|
||||||
|
|
||||||
// Get the current controller
|
// Get the current controller
|
||||||
|
@ -393,7 +399,7 @@ void WiimotePadConfigDialog::DoGetButtons(int _GetId)
|
||||||
// Values used in this function
|
// Values used in this function
|
||||||
char format[128];
|
char format[128];
|
||||||
int Seconds = 4; // Seconds to wait for
|
int Seconds = 4; // Seconds to wait for
|
||||||
int TimesPerSecond = 60; // How often to run the check
|
int TimesPerSecond = 40; // How often to run the check
|
||||||
|
|
||||||
// Values returned from InputCommon::GetButton()
|
// Values returned from InputCommon::GetButton()
|
||||||
int value; // Axis value
|
int value; // Axis value
|
||||||
|
@ -443,7 +449,7 @@ void WiimotePadConfigDialog::DoGetButtons(int _GetId)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
InputCommon::GetButton(
|
InputCommon::GetButton(
|
||||||
WiiMoteEmu::PadState[Page].joy, PadID,
|
WiiMoteEmu::joyinfo[PadID].joy, PadID, WiiMoteEmu::joyinfo[PadID].NumButtons, WiiMoteEmu::joyinfo[PadID].NumAxes, WiiMoteEmu::joyinfo[PadID].NumHats,
|
||||||
g_Pressed, value, type, pressed, Succeed, Stop,
|
g_Pressed, value, type, pressed, Succeed, Stop,
|
||||||
LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter);
|
LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter);
|
||||||
}
|
}
|
||||||
|
@ -489,7 +495,6 @@ void WiimotePadConfigDialog::DoGetButtons(int _GetId)
|
||||||
{
|
{
|
||||||
m_ButtonMappingTimer->Stop();
|
m_ButtonMappingTimer->Stop();
|
||||||
GetButtonWaitingTimer = 0;
|
GetButtonWaitingTimer = 0;
|
||||||
LiveUpdates = _LiveUpdates;
|
|
||||||
|
|
||||||
/* Update the button mapping for all slots that use this device. (It
|
/* Update the button mapping for all slots that use this device. (It
|
||||||
doesn't make sense to have several slots controlled by the same
|
doesn't make sense to have several slots controlled by the same
|
||||||
|
@ -540,7 +545,7 @@ void WiimotePadConfigDialog::Convert2Box(int &x)
|
||||||
// Update the input status boxes
|
// Update the input status boxes
|
||||||
void WiimotePadConfigDialog::PadGetStatus()
|
void WiimotePadConfigDialog::PadGetStatus()
|
||||||
{
|
{
|
||||||
//DEBUG_LOG(WIIMOTE, "PadGetStatus");
|
//DEBUG_LOG(WIIMOTE, "SDL_WasInit: %i", SDL_WasInit(0));
|
||||||
|
|
||||||
/* Return if it's not detected. The ID should never be less than zero here,
|
/* Return if it's not detected. The ID should never be less than zero here,
|
||||||
it can only be that because of a manual ini file change, but we make
|
it can only be that because of a manual ini file change, but we make
|
||||||
|
@ -569,12 +574,14 @@ void WiimotePadConfigDialog::PadGetStatus()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get physical device status
|
// Get physical device status
|
||||||
int ID = WiiMoteEmu::PadMapping[Page].ID;
|
int PhysicalDevice = WiiMoteEmu::PadMapping[Page].ID;
|
||||||
int TriggerType = WiiMoteEmu::PadMapping[Page].triggertype;
|
int TriggerType = WiiMoteEmu::PadMapping[Page].triggertype;
|
||||||
|
|
||||||
// Check that Dolphin is in focus, otherwise don't update the pad status
|
// Check that Dolphin is in focus, otherwise don't update the pad status
|
||||||
//if (IsFocus())
|
//if (IsFocus())
|
||||||
WiiMoteEmu::GetJoyState(WiiMoteEmu::PadState[Page], WiiMoteEmu::PadMapping[Page], Page);
|
WiiMoteEmu::GetJoyState(WiiMoteEmu::PadState[Page], WiiMoteEmu::PadMapping[Page], Page, WiiMoteEmu::joyinfo.at(WiiMoteEmu::PadMapping[Page].ID).NumButtons);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Analog stick
|
// Analog stick
|
||||||
// Set Deadzones perhaps out of function
|
// Set Deadzones perhaps out of function
|
||||||
|
@ -688,45 +695,16 @@ void WiimotePadConfigDialog::PadGetStatus()
|
||||||
wxT("%03i"), TriggerRight));
|
wxT("%03i"), TriggerRight));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Slow timer, once a second
|
|
||||||
void WiimotePadConfigDialog::Update(wxTimerEvent& WXUNUSED(event))
|
|
||||||
{
|
|
||||||
if (!LiveUpdates) return;
|
|
||||||
|
|
||||||
// Don't run this the first time
|
|
||||||
int OldNumDIDevices;
|
|
||||||
if (WiiMoteEmu::NumDIDevices == -1)
|
|
||||||
OldNumDIDevices = InputCommon::SearchDIDevices();
|
|
||||||
else
|
|
||||||
// Search for connected devices and update dialog
|
|
||||||
OldNumDIDevices = WiiMoteEmu::NumDIDevices;
|
|
||||||
WiiMoteEmu::NumDIDevices = InputCommon::SearchDIDevices();
|
|
||||||
|
|
||||||
// Update if a pad has been connected/disconnected. Todo: Add a better check that also takes into consideration the pad id
|
|
||||||
// and other things to ensure nothing has changed
|
|
||||||
//DEBUG_LOG(WIIMOTE, "Found %i devices", WiiMoteEmu::NumDIDevices);
|
|
||||||
//DEBUG_LOG(WIIMOTE, "Update: %i %i", OldNumPads, WiiMoteEmu::NumPads);
|
|
||||||
if (OldNumDIDevices != WiiMoteEmu::NumDIDevices)
|
|
||||||
{
|
|
||||||
WiiMoteEmu::LocalSearchDevicesReset(WiiMoteEmu::joyinfo, WiiMoteEmu::NumPads);
|
|
||||||
WiimotePadConfigDialog::UpdateDeviceList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Populate the advanced tab
|
// Populate the advanced tab
|
||||||
void WiimotePadConfigDialog::UpdatePad(wxTimerEvent& WXUNUSED(event))
|
void WiimotePadConfigDialog::UpdatePad(wxTimerEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
if (!WiiMoteEmu::IsPolling()) return;
|
|
||||||
|
|
||||||
//DEBUG_LOG(WIIMOTE, "UpdatePad");
|
|
||||||
|
|
||||||
// Show the current status
|
// Show the current status
|
||||||
|
/*
|
||||||
#ifdef SHOW_PAD_STATUS
|
#ifdef SHOW_PAD_STATUS
|
||||||
m_pStatusBar->SetLabel(wxString::FromAscii(InputCommon::DoShowStatus(
|
m_pStatusBar->SetLabel(wxString::Format(
|
||||||
Page, m_Joyname[Page]->GetSelection(),
|
"%s", ShowStatus(notebookpage).c_str()
|
||||||
WiiMoteEmu::PadMapping, WiiMoteEmu::PadState, WiiMoteEmu::joyinfo
|
));
|
||||||
).c_str()));
|
#endif*/
|
||||||
#endif
|
|
||||||
|
|
||||||
//LogMsg("Abc%s\n", ShowStatus(notebookpage).c_str());
|
//LogMsg("Abc%s\n", ShowStatus(notebookpage).c_str());
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,6 @@ BEGIN_EVENT_TABLE(WiimotePadConfigDialog,wxDialog)
|
||||||
EVT_BUTTON(IDB_TRIGGER_L, WiimotePadConfigDialog::GetButtons)
|
EVT_BUTTON(IDB_TRIGGER_L, WiimotePadConfigDialog::GetButtons)
|
||||||
EVT_BUTTON(IDB_TRIGGER_R, WiimotePadConfigDialog::GetButtons)
|
EVT_BUTTON(IDB_TRIGGER_R, WiimotePadConfigDialog::GetButtons)
|
||||||
EVT_TIMER(IDTM_BUTTON, WiimotePadConfigDialog::OnButtonTimer)
|
EVT_TIMER(IDTM_BUTTON, WiimotePadConfigDialog::OnButtonTimer)
|
||||||
EVT_TIMER(IDTM_UPDATE, WiimotePadConfigDialog::Update)
|
|
||||||
EVT_TIMER(IDTM_UPDATE_PAD, WiimotePadConfigDialog::UpdatePad)
|
EVT_TIMER(IDTM_UPDATE_PAD, WiimotePadConfigDialog::UpdatePad)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
@ -108,18 +107,14 @@ WiimotePadConfigDialog::WiimotePadConfigDialog(wxWindow *parent, wxWindowID id,
|
||||||
{
|
{
|
||||||
#if wxUSE_TIMER
|
#if wxUSE_TIMER
|
||||||
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
|
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
|
||||||
m_Update = new wxTimer(this, IDTM_UPDATE);
|
|
||||||
m_UpdatePad = new wxTimer(this, IDTM_UPDATE_PAD);
|
m_UpdatePad = new wxTimer(this, IDTM_UPDATE_PAD);
|
||||||
|
|
||||||
// Reset values
|
// Reset values
|
||||||
GetButtonWaitingID = 0;
|
GetButtonWaitingID = 0;
|
||||||
GetButtonWaitingTimer = 0;
|
GetButtonWaitingTimer = 0;
|
||||||
|
|
||||||
// Start the slow timer
|
// Start the permanent timer
|
||||||
int TimesPerSecond = 2;
|
const int TimesPerSecond = 30;
|
||||||
m_Update->Start( floor((double)(1000 / TimesPerSecond)) );
|
|
||||||
// Start the fast timer
|
|
||||||
TimesPerSecond = 30;
|
|
||||||
m_UpdatePad->Start( floor((double)(1000 / TimesPerSecond)) );
|
m_UpdatePad->Start( floor((double)(1000 / TimesPerSecond)) );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -134,9 +129,6 @@ WiimotePadConfigDialog::WiimotePadConfigDialog(wxWindow *parent, wxWindowID id,
|
||||||
// Set control values
|
// Set control values
|
||||||
UpdateGUI();
|
UpdateGUI();
|
||||||
|
|
||||||
// Update device list
|
|
||||||
UpdateDeviceList();
|
|
||||||
|
|
||||||
wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, // Keyboard
|
wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, // Keyboard
|
||||||
wxKeyEventHandler(WiimotePadConfigDialog::OnKeyDown),
|
wxKeyEventHandler(WiimotePadConfigDialog::OnKeyDown),
|
||||||
(wxObject*)0, this);
|
(wxObject*)0, this);
|
||||||
|
@ -212,13 +204,9 @@ void WiimotePadConfigDialog::OnClose(wxCloseEvent& event)
|
||||||
{
|
{
|
||||||
g_FrameOpen = false;
|
g_FrameOpen = false;
|
||||||
SaveButtonMappingAll(Page);
|
SaveButtonMappingAll(Page);
|
||||||
// Stop timers
|
if(m_UpdatePad)
|
||||||
if(m_Update) m_Update->Stop();
|
m_UpdatePad->Stop();
|
||||||
if(m_UpdatePad) m_UpdatePad->Stop();
|
|
||||||
if(m_ButtonMappingTimer) m_ButtonMappingTimer->Stop();
|
|
||||||
INFO_LOG(WIIMOTE, "All timers stopped");
|
|
||||||
g_Config.Save();
|
g_Config.Save();
|
||||||
|
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,20 +228,18 @@ void WiimotePadConfigDialog::CloseClick(wxCommandEvent& event)
|
||||||
|
|
||||||
void WiimotePadConfigDialog::DoSave(bool ChangePad, int Slot)
|
void WiimotePadConfigDialog::DoSave(bool ChangePad, int Slot)
|
||||||
{
|
{
|
||||||
WARN_LOG(WIIMOTE, "DoSave - %i slot %i", ChangePad, Slot);
|
|
||||||
|
|
||||||
// Replace "" with "-1" before we are saving
|
// Replace "" with "-1" before we are saving
|
||||||
ToBlank(false);
|
ToBlank(false);
|
||||||
|
|
||||||
if(ChangePad)
|
if(ChangePad)
|
||||||
{
|
{
|
||||||
// Since we are selecting the pad to save to by the Id we can't update it when we change the pad
|
// Since we are selecting the pad to save to by the Id we can't update it when we change the pad
|
||||||
for(int i = 0; i < MAX_WIIMOTES; i++)
|
for(int i = 0; i < 4; i++)
|
||||||
SaveButtonMapping(i, true);
|
SaveButtonMapping(i, true);
|
||||||
// Save the settings for the current pad
|
// Save the settings for the current pad
|
||||||
g_Config.Save(Slot);
|
g_Config.Save(Slot);
|
||||||
// Now we can update the ID
|
// Now we can update the ID
|
||||||
UpdateID();
|
WiiMoteEmu::PadMapping[Page].ID = m_Joyname[Page]->GetSelection();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -265,14 +251,8 @@ void WiimotePadConfigDialog::DoSave(bool ChangePad, int Slot)
|
||||||
|
|
||||||
// Then change it back to ""
|
// Then change it back to ""
|
||||||
ToBlank();
|
ToBlank();
|
||||||
}
|
|
||||||
void WiimotePadConfigDialog::UpdateID()
|
DEBUG_LOG(WIIMOTE, "WiiMoteEmu::PadMapping[%i].ID = %i", Page, m_Joyname[Page]->GetSelection());
|
||||||
{
|
|
||||||
INFO_LOG(WIIMOTE, "PadMapping[%i].ID = %i from %i",
|
|
||||||
Page, WiiMoteEmu::joyinfo.at(m_Joyname[Page]->GetSelection()).ID, WiiMoteEmu::PadMapping[Page].ID);
|
|
||||||
WiiMoteEmu::PadMapping[Page].ID = WiiMoteEmu::joyinfo.at(m_Joyname[Page]->GetSelection()).ID;
|
|
||||||
WiiMoteEmu::PadMapping[Page].Name = m_Joyname[Page]->GetValue().mb_str();
|
|
||||||
WiiMoteEmu::PadState[Page].joy = WiiMoteEmu::joyinfo.at(m_Joyname[Page]->GetSelection()).joy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bitmap box and dot
|
// Bitmap box and dot
|
||||||
|
@ -345,40 +325,24 @@ wxBitmap WiimotePadConfigDialog::CreateBitmapClear()
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WiimotePadConfigDialog::UpdateDeviceList()
|
|
||||||
{
|
|
||||||
if (!ControlsCreated) return;
|
|
||||||
|
|
||||||
DEBUG_LOG(WIIMOTE, "UpdateDeviceList");
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_WIIMOTES; i++)
|
|
||||||
{
|
|
||||||
// Save current selection
|
|
||||||
//std::string CurrentSel = m_Joyname[i]->GetValue().mb_str();
|
|
||||||
m_Joyname[i]->Clear();
|
|
||||||
|
|
||||||
// Search for devices and add them to the device list
|
|
||||||
if (WiiMoteEmu::joyinfo.size() > 0)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < WiiMoteEmu::joyinfo.size(); j++)
|
|
||||||
m_Joyname[i]->Append(wxString::FromAscii(WiiMoteEmu::joyinfo.at(j).Name.c_str()));
|
|
||||||
// Set selection
|
|
||||||
for (int j = 0; j < WiiMoteEmu::joyinfo.size(); j++)
|
|
||||||
if (WiiMoteEmu::joyinfo.at(j).Name == WiiMoteEmu::PadMapping[i].Name) m_Joyname[i]->SetSelection(j);
|
|
||||||
if (m_Joyname[i]->GetSelection() == -1) m_Joyname[i]->SetSelection(0);
|
|
||||||
// Load settings
|
|
||||||
DoChangeJoystick();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_Joyname[i]->Append(wxString::FromAscii("<No Gamepad Detected>"));
|
|
||||||
m_Joyname[i]->SetSelection(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WiimotePadConfigDialog::CreatePadGUIControls()
|
void WiimotePadConfigDialog::CreatePadGUIControls()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
// Search for devices and add them to the device list
|
||||||
|
wxArrayString StrJoyname; // The string array
|
||||||
|
if (WiiMoteEmu::NumGoodPads > 0)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < (int)WiiMoteEmu::joyinfo.size(); x++)
|
||||||
|
StrJoyname.Add(wxString::FromAscii(WiiMoteEmu::joyinfo[x].Name.c_str()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StrJoyname.Add(wxString::FromAscii("<No Gamepad Detected>"));
|
||||||
|
}
|
||||||
|
|
||||||
// The tilt list
|
// The tilt list
|
||||||
wxArrayString StrTilt;
|
wxArrayString StrTilt;
|
||||||
StrTilt.Add(wxString::FromAscii("<Off>"));
|
StrTilt.Add(wxString::FromAscii("<Off>"));
|
||||||
|
@ -409,12 +373,8 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
|
||||||
StrCcTriggers.Add(wxString::FromAscii("Keyboard"));
|
StrCcTriggers.Add(wxString::FromAscii("Keyboard"));
|
||||||
StrCcTriggers.Add(wxString::FromAscii("Triggers"));
|
StrCcTriggers.Add(wxString::FromAscii("Triggers"));
|
||||||
|
|
||||||
#ifdef SHOW_PAD_STATUS
|
|
||||||
m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxSize(-1, 600));
|
|
||||||
m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(250, 250), wxDefaultSize);
|
|
||||||
#else
|
|
||||||
m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize);
|
m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize);
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_WIIMOTES; i++)
|
for (int i = 0; i < MAX_WIIMOTES; i++)
|
||||||
{
|
{
|
||||||
|
@ -427,8 +387,9 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
|
||||||
// Configuration controls sizes
|
// Configuration controls sizes
|
||||||
static const int TxtW = 50, TxtH = 19, BtW = 75, BtH = 20;
|
static const int TxtW = 50, TxtH = 19, BtW = 75, BtH = 20;
|
||||||
|
|
||||||
|
|
||||||
// Controller
|
// Controller
|
||||||
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(200, -1), 0, NULL, wxCB_READONLY);
|
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, StrJoyname[0], wxDefaultPosition, wxSize(200, -1), StrJoyname, wxCB_READONLY);
|
||||||
|
|
||||||
// Circle to square
|
// Circle to square
|
||||||
m_CheckC2S[i] = new wxCheckBox(m_Controller[i], IDC_LEFT_C2S, wxT("Circle To Square"));
|
m_CheckC2S[i] = new wxCheckBox(m_Controller[i], IDC_LEFT_C2S, wxT("Circle To Square"));
|
||||||
|
@ -985,6 +946,7 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_Apply = new wxButton(this, ID_APPLY, wxT("Apply"));
|
m_Apply = new wxButton(this, ID_APPLY, wxT("Apply"));
|
||||||
m_Close = new wxButton(this, ID_CLOSE, wxT("Close"));
|
m_Close = new wxButton(this, ID_CLOSE, wxT("Close"));
|
||||||
m_Close->SetToolTip(wxT("Apply and Close"));
|
m_Close->SetToolTip(wxT("Apply and Close"));
|
||||||
|
@ -1075,8 +1037,6 @@ void WiimotePadConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
|
||||||
|
|
||||||
void WiimotePadConfigDialog::UpdateGUI(int Slot)
|
void WiimotePadConfigDialog::UpdateGUI(int Slot)
|
||||||
{
|
{
|
||||||
DEBUG_LOG(WIIMOTE, "UpdateGUI");
|
|
||||||
|
|
||||||
UpdateGUIButtonMapping(Page);
|
UpdateGUIButtonMapping(Page);
|
||||||
DoChangeDeadZone(true); DoChangeDeadZone(false);
|
DoChangeDeadZone(true); DoChangeDeadZone(false);
|
||||||
|
|
||||||
|
@ -1084,7 +1044,7 @@ void WiimotePadConfigDialog::UpdateGUI(int Slot)
|
||||||
// Disable all pad items if no pads are detected
|
// Disable all pad items if no pads are detected
|
||||||
if(ControlsCreated)
|
if(ControlsCreated)
|
||||||
{
|
{
|
||||||
bool PadEnabled = WiiMoteEmu::NumPads != 0;
|
bool PadEnabled = WiiMoteEmu::NumGoodPads != 0;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
for(int i = IDB_ANALOG_LEFT_X; i <= IDB_TRIGGER_R; i++) m_Notebook->FindItem(i)->Enable(PadEnabled);
|
for(int i = IDB_ANALOG_LEFT_X; i <= IDB_TRIGGER_R; i++) m_Notebook->FindItem(i)->Enable(PadEnabled);
|
||||||
m_Notebook->FindItem(IDC_JOYNAME)->Enable(PadEnabled);
|
m_Notebook->FindItem(IDC_JOYNAME)->Enable(PadEnabled);
|
||||||
|
|
|
@ -59,12 +59,9 @@ class WiimotePadConfigDialog : public wxDialog
|
||||||
void Convert2Box(int &x);
|
void Convert2Box(int &x);
|
||||||
void ConvertToString();
|
void ConvertToString();
|
||||||
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
|
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
|
||||||
void Update(wxTimerEvent& WXUNUSED(event));
|
|
||||||
void UpdatePad(wxTimerEvent& WXUNUSED(event));
|
void UpdatePad(wxTimerEvent& WXUNUSED(event));
|
||||||
void UpdateDeviceList();
|
|
||||||
|
|
||||||
wxTimer *m_Update,
|
wxTimer *m_UpdatePad,
|
||||||
*m_UpdatePad,
|
|
||||||
*m_ButtonMappingTimer;
|
*m_ButtonMappingTimer;
|
||||||
|
|
||||||
wxStaticBitmap *m_bmpDotLeftIn[4],
|
wxStaticBitmap *m_bmpDotLeftIn[4],
|
||||||
|
@ -77,7 +74,6 @@ class WiimotePadConfigDialog : public wxDialog
|
||||||
DECLARE_EVENT_TABLE();
|
DECLARE_EVENT_TABLE();
|
||||||
|
|
||||||
bool ControlsCreated;
|
bool ControlsCreated;
|
||||||
bool LiveUpdates;
|
|
||||||
int Page, BoxW, BoxH, g_Pressed;
|
int Page, BoxW, BoxH, g_Pressed;
|
||||||
|
|
||||||
wxNotebook *m_Notebook;
|
wxNotebook *m_Notebook;
|
||||||
|
@ -146,9 +142,7 @@ class WiimotePadConfigDialog : public wxDialog
|
||||||
*m_Button_GH3[GH3_CONTROLS][4],
|
*m_Button_GH3[GH3_CONTROLS][4],
|
||||||
*m_bGH3_Analog[4];
|
*m_bGH3_Analog[4];
|
||||||
|
|
||||||
wxStaticText
|
wxStaticText *m_TextScreenWidth[4], *m_TextScreenHeight[4], *m_TextScreenLeft[4], *m_TextScreenTop[4], *m_TextAR[4],
|
||||||
*m_pStatusBar,
|
|
||||||
*m_TextScreenWidth[4], *m_TextScreenHeight[4], *m_TextScreenLeft[4], *m_TextScreenTop[4], *m_TextAR[4],
|
|
||||||
*m_tAnalogX[8], *m_tAnalogY[8], *m_TiltTextRoll[4], *m_TiltTextPitch[4],
|
*m_tAnalogX[8], *m_tAnalogY[8], *m_TiltTextRoll[4], *m_TiltTextPitch[4],
|
||||||
*m_CheckC2SLabel[4], *m_ComboDeadZoneLabel[4], *m_TStatusLeftIn[4], *m_TStatusLeftOut[4], *m_TStatusRightIn[4], *m_TStatusRightOut[4],
|
*m_CheckC2SLabel[4], *m_ComboDeadZoneLabel[4], *m_TStatusLeftIn[4], *m_TStatusLeftOut[4], *m_TStatusRightIn[4], *m_TStatusRightOut[4],
|
||||||
*m_TriggerStatusL[4], *m_TriggerStatusR[4], *m_TriggerStatusLx[4], *m_TriggerStatusRx[4],
|
*m_TriggerStatusL[4], *m_TriggerStatusR[4], *m_TriggerStatusLx[4], *m_TriggerStatusRx[4],
|
||||||
|
@ -184,12 +178,10 @@ class WiimotePadConfigDialog : public wxDialog
|
||||||
{
|
{
|
||||||
ID_CLOSE = 1000,
|
ID_CLOSE = 1000,
|
||||||
ID_APPLY,
|
ID_APPLY,
|
||||||
IDTM_EXIT, // Timer
|
IDTM_EXIT,
|
||||||
IDTM_BUTTON,
|
IDTM_BUTTON,
|
||||||
IDTM_UPDATE,
|
IDTM_UPDATE_PAD, // Timer
|
||||||
IDTM_UPDATE_PAD,
|
|
||||||
|
|
||||||
IDT_DEBUGGING,
|
|
||||||
ID_NOTEBOOK,
|
ID_NOTEBOOK,
|
||||||
ID_CONTROLLERPAGE1,
|
ID_CONTROLLERPAGE1,
|
||||||
ID_CONTROLLERPAGE2,
|
ID_CONTROLLERPAGE2,
|
||||||
|
@ -265,9 +257,8 @@ class WiimotePadConfigDialog : public wxDialog
|
||||||
void SaveKeyboardMapping(int Controller, int Id, int Key);
|
void SaveKeyboardMapping(int Controller, int Id, int Key);
|
||||||
void ToBlank(bool ToBlank = true);
|
void ToBlank(bool ToBlank = true);
|
||||||
void PadGetStatus();
|
void PadGetStatus();
|
||||||
void UpdateID();
|
|
||||||
void DoSave(bool ChangePad = false, int Slot = -1);
|
void DoSave(bool ChangePad = false, int Slot = -1);
|
||||||
void DoChangeJoystick(); void DoChangeDeadZone(bool Left);
|
void DoChangeJoystick(); void PadOpen(int Open); void PadClose(int Close); void DoChangeDeadZone(bool Left);
|
||||||
void OnButtonClick(wxCommandEvent& event);
|
void OnButtonClick(wxCommandEvent& event);
|
||||||
|
|
||||||
// Configure buttons
|
// Configure buttons
|
||||||
|
|
|
@ -57,14 +57,7 @@ wiimote_key g_ExtKey; // The extension encryption key
|
||||||
bool g_Encryption; // Encryption on or off
|
bool g_Encryption; // Encryption on or off
|
||||||
|
|
||||||
// Gamepad input
|
// Gamepad input
|
||||||
int NumPads = 0, NumDIDevices = -1; // Number of pads
|
int NumPads = 0, NumGoodPads = 0; // Number of goods pads
|
||||||
bool SDLPolling = true;
|
|
||||||
#ifdef _WIN32
|
|
||||||
bool LiveUpdates = false;
|
|
||||||
#else
|
|
||||||
bool LiveUpdates = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
|
std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
|
||||||
InputCommon::CONTROLLER_STATE_NEW PadState[4];
|
InputCommon::CONTROLLER_STATE_NEW PadState[4];
|
||||||
InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4];
|
InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4];
|
||||||
|
|
|
@ -182,9 +182,7 @@ static const u8 partially_id[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
// Gamepad input
|
// Gamepad input
|
||||||
extern int NumPads, NumDIDevices; // Number of pads
|
extern int NumPads, NumGoodPads; // Number of goods pads
|
||||||
extern bool SDLPolling; // Turn off polling
|
|
||||||
extern bool LiveUpdates;
|
|
||||||
extern std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
|
extern std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
|
||||||
extern InputCommon::CONTROLLER_STATE_NEW PadState[4];
|
extern InputCommon::CONTROLLER_STATE_NEW PadState[4];
|
||||||
extern InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4];
|
extern InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4];
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include "../../../Core/InputCommon/Src/XInput.h"
|
#include "../../../Core/InputCommon/Src/XInput.h"
|
||||||
|
|
||||||
#include "Common.h" // Common
|
#include "Common.h" // Common
|
||||||
#include "LogManager.h"
|
|
||||||
#include "MathUtil.h"
|
#include "MathUtil.h"
|
||||||
#include "StringUtil.h" // for ArrayToString()
|
#include "StringUtil.h" // for ArrayToString()
|
||||||
#include "IniFile.h"
|
#include "IniFile.h"
|
||||||
|
@ -60,8 +59,7 @@ void TiltTest(u8 x, u8 y, u8 z)
|
||||||
std::string To = StringFromFormat("%s\nTo: X:%i Y:%i Z:%i Roll:%s Pitch:%s", From.c_str(), x, y, z,
|
std::string To = StringFromFormat("%s\nTo: X:%i Y:%i Z:%i Roll:%s Pitch:%s", From.c_str(), x, y, z,
|
||||||
(_Roll >= 0) ? StringFromFormat(" %03i", (int)_Roll).c_str() : StringFromFormat("%04i", (int)_Roll).c_str(),
|
(_Roll >= 0) ? StringFromFormat(" %03i", (int)_Roll).c_str() : StringFromFormat("%04i", (int)_Roll).c_str(),
|
||||||
(_Pitch >= 0) ? StringFromFormat(" %03i", (int)_Pitch).c_str() : StringFromFormat("%04i", (int)_Pitch).c_str());
|
(_Pitch >= 0) ? StringFromFormat(" %03i", (int)_Pitch).c_str() : StringFromFormat("%04i", (int)_Pitch).c_str());
|
||||||
ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
|
DEBUG_LOG(WIIMOTE, "%s", To.c_str());
|
||||||
Console->CustomLog(StringFromFormat("\n%s", To.c_str()).c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,32 +99,17 @@ void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_
|
||||||
|
|
||||||
// In these cases we can use the simple and accurate formula
|
// In these cases we can use the simple and accurate formula
|
||||||
if(g_Config.Trigger.Range.Pitch == 0)
|
if(g_Config.Trigger.Range.Pitch == 0)
|
||||||
{
|
|
||||||
if (!g_Config.Trigger.Upright)
|
|
||||||
{
|
{
|
||||||
x = sin(_Roll);
|
x = sin(_Roll);
|
||||||
z = cos(_Roll);
|
z = cos(_Roll);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
z = sin(_Roll);
|
|
||||||
y = -cos(_Roll);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (g_Config.Trigger.Range.Roll == 0)
|
else if (g_Config.Trigger.Range.Roll == 0)
|
||||||
{
|
{
|
||||||
if (!g_Config.Trigger.Upright)
|
|
||||||
{
|
|
||||||
y = sin(_Pitch);
|
y = sin(_Pitch);
|
||||||
z = cos(_Pitch);
|
z = cos(_Pitch);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
x = -sin(_Pitch);
|
|
||||||
y = -cos(_Pitch);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// ====================================================
|
// ====================================================
|
||||||
/* This seems to always produce the exact same combination of x, y, z
|
/* This seems to always produce the exact same combination of x, y, z
|
||||||
|
@ -135,11 +118,10 @@ void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_
|
||||||
and Pitch. But if we select a Z from the smallest of the absolute
|
and Pitch. But if we select a Z from the smallest of the absolute
|
||||||
value of cos(Roll) and cos (Pitch) we get the right values. */
|
value of cos(Roll) and cos (Pitch) we get the right values. */
|
||||||
// ---------
|
// ---------
|
||||||
if (!g_Config.Trigger.Upright)
|
|
||||||
{
|
|
||||||
if (abs(cos(_Roll)) < abs(cos(_Pitch))) z = cos(_Roll); else z = cos(_Pitch);
|
if (abs(cos(_Roll)) < abs(cos(_Pitch))) z = cos(_Roll); else z = cos(_Pitch);
|
||||||
/* I got these from reversing the calculation in
|
/* I got these from reversing the calculation in
|
||||||
PitchAccelerometerToDegree() in a math program. */
|
PitchAccelerometerToDegree() in a math program I don't know if we
|
||||||
|
can derive these from some kind of matrix or something */
|
||||||
float x_num = 2 * tanf(0.5f * _Roll) * z;
|
float x_num = 2 * tanf(0.5f * _Roll) * z;
|
||||||
float x_den = pow2f(tanf(0.5f * _Roll)) - 1;
|
float x_den = pow2f(tanf(0.5f * _Roll)) - 1;
|
||||||
x = - (x_num / x_den);
|
x = - (x_num / x_den);
|
||||||
|
@ -147,17 +129,6 @@ void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_
|
||||||
float y_den = pow2f(tanf(0.5f * _Pitch)) - 1;
|
float y_den = pow2f(tanf(0.5f * _Pitch)) - 1;
|
||||||
y = - (y_num / y_den);
|
y = - (y_num / y_den);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (abs(-cos(_Roll)) < abs(-cos(_Pitch))) y = -cos(_Roll); else y = -cos(_Pitch);
|
|
||||||
float z_num = 2 * tanf(0.5f * _Roll) * y;
|
|
||||||
float z_den = pow2f(tanf(0.5f * _Roll)) - 1;
|
|
||||||
z = (z_num / z_den);
|
|
||||||
float x_num = 2 * tanf(0.5f * _Pitch) * y;
|
|
||||||
float x_den = pow2f(tanf(0.5f * _Pitch)) - 1;
|
|
||||||
x = - (x_num / x_den);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Multiply with the neutral of z and its g
|
// Multiply with the neutral of z and its g
|
||||||
float xg = g_wm.cal_g.x;
|
float xg = g_wm.cal_g.x;
|
||||||
|
@ -174,19 +145,10 @@ void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_
|
||||||
if (ix < 0) ix = 0; if (ix > 255) ix = 255;
|
if (ix < 0) ix = 0; if (ix > 255) ix = 255;
|
||||||
if (iy < 0) iy = 0; if (iy > 255) iy = 255;
|
if (iy < 0) iy = 0; if (iy > 255) iy = 255;
|
||||||
if (iz < 0) iz = 0; if (iz > 255) iz = 255;
|
if (iz < 0) iz = 0; if (iz > 255) iz = 255;
|
||||||
if (!g_Config.Trigger.Upright)
|
|
||||||
{
|
|
||||||
if(g_Config.Trigger.Range.Roll != 0) _x = ix;
|
if(g_Config.Trigger.Range.Roll != 0) _x = ix;
|
||||||
if(g_Config.Trigger.Range.Pitch != 0) _y = iy;
|
if(g_Config.Trigger.Range.Pitch != 0) _y = iy;
|
||||||
_z = iz;
|
_z = iz;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if(g_Config.Trigger.Range.Roll != 0) _z = iz;
|
|
||||||
if(g_Config.Trigger.Range.Pitch != 0) _x = ix;
|
|
||||||
_y = iy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Accelerometer to roll and pitch angles
|
// Accelerometer to roll and pitch angles
|
||||||
float AccelerometerToG(float Current, float Neutral, float G)
|
float AccelerometerToG(float Current, float Neutral, float G)
|
||||||
|
@ -205,8 +167,6 @@ void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, in
|
||||||
float y = AccelerometerToG((float)_y, (float)g_wm.cal_zero.y, (float)g_wm.cal_g.y);
|
float y = AccelerometerToG((float)_y, (float)g_wm.cal_zero.y, (float)g_wm.cal_g.y);
|
||||||
float z = AccelerometerToG((float)_z, (float)g_wm.cal_zero.z, (float)g_wm.cal_g.z);
|
float z = AccelerometerToG((float)_z, (float)g_wm.cal_zero.z, (float)g_wm.cal_g.z);
|
||||||
|
|
||||||
if (!g_Config.Trigger.Upright)
|
|
||||||
{
|
|
||||||
// If it is over 1g then it is probably accelerating and may not reliable
|
// If it is over 1g then it is probably accelerating and may not reliable
|
||||||
//if (abs(accel->x - ac->cal_zero.x) <= ac->cal_g.x)
|
//if (abs(accel->x - ac->cal_zero.x) <= ac->cal_g.x)
|
||||||
{
|
{
|
||||||
|
@ -219,21 +179,6 @@ void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, in
|
||||||
// Calculate the degree
|
// Calculate the degree
|
||||||
Pitch = InputCommon::Rad2Deg(atan2(y, z));
|
Pitch = InputCommon::Rad2Deg(atan2(y, z));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//if (abs(accel->z - ac->cal_zero.z) <= ac->cal_g.x)
|
|
||||||
{
|
|
||||||
// Calculate the degree
|
|
||||||
Roll = InputCommon::Rad2Deg(atan2(z, -y));
|
|
||||||
}
|
|
||||||
|
|
||||||
//if (abs(_x - g_wm.cal_zero.x) <= g_wm.cal_g.x)
|
|
||||||
{
|
|
||||||
// Calculate the degree
|
|
||||||
Pitch = InputCommon::Rad2Deg(atan2(-x, -y));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_Roll = (int)Roll;
|
_Roll = (int)Roll;
|
||||||
_Pitch = (int)Pitch;
|
_Pitch = (int)Pitch;
|
||||||
|
@ -242,16 +187,9 @@ void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, in
|
||||||
if (x < -1.0) x = -1.0; else if (x > 1.0) x = 1.0;
|
if (x < -1.0) x = -1.0; else if (x > 1.0) x = 1.0;
|
||||||
if (y < -1.0) y = -1.0; else if (y > 1.0) y = 1.0;
|
if (y < -1.0) y = -1.0; else if (y > 1.0) y = 1.0;
|
||||||
if (z < -1.0) z = -1.0; else if (z > 1.0) z = 1.0;
|
if (z < -1.0) z = -1.0; else if (z > 1.0) z = 1.0;
|
||||||
if (!g_Config.Trigger.Upright)
|
|
||||||
{
|
|
||||||
Roll = InputCommon::Rad2Deg(atan2(x, z));
|
Roll = InputCommon::Rad2Deg(atan2(x, z));
|
||||||
Pitch = InputCommon::Rad2Deg(atan2(y, z));
|
Pitch = InputCommon::Rad2Deg(atan2(y, z));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Roll = InputCommon::Rad2Deg(atan2(z, -y));
|
|
||||||
Pitch = InputCommon::Rad2Deg(atan2(-x, -y));
|
|
||||||
}
|
|
||||||
_RollAdj = (int)Roll;
|
_RollAdj = (int)Roll;
|
||||||
_PitchAdj = (int)Pitch;
|
_PitchAdj = (int)Pitch;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,11 +34,6 @@
|
||||||
#include "Encryption.h" // for extension encryption
|
#include "Encryption.h" // for extension encryption
|
||||||
#include "Config.h" // for g_Config
|
#include "Config.h" // for g_Config
|
||||||
|
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
|
||||||
#include "ConfigPadDlg.h"
|
|
||||||
extern WiimotePadConfigDialog *m_PadConfigFrame;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern SWiimoteInitialize g_WiimoteInitialize;
|
extern SWiimoteInitialize g_WiimoteInitialize;
|
||||||
|
|
||||||
namespace WiiMoteEmu
|
namespace WiiMoteEmu
|
||||||
|
@ -443,12 +438,10 @@ void Initialize()
|
||||||
/* Populate joyinfo for all attached devices and do g_Config.Load() if the
|
/* Populate joyinfo for all attached devices and do g_Config.Load() if the
|
||||||
configuration window is not already open, if it's already open we
|
configuration window is not already open, if it's already open we
|
||||||
continue with the settings we have */
|
continue with the settings we have */
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
if(!g_FrameOpen)
|
||||||
if (!m_PadConfigFrame)
|
|
||||||
{
|
{
|
||||||
LocalSearchDevices(joyinfo, NumPads);
|
Search_Devices(joyinfo, NumPads, NumGoodPads);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// Copy extension id and calibration to its register, g_Config.Load() is needed before this
|
// Copy extension id and calibration to its register, g_Config.Load() is needed before this
|
||||||
UpdateExtRegisterBlocks();
|
UpdateExtRegisterBlocks();
|
||||||
|
@ -493,6 +486,7 @@ void DoState(PointerWrap &p)
|
||||||
p.Do(g_Encryption);
|
p.Do(g_Encryption);
|
||||||
|
|
||||||
p.Do(NumPads);
|
p.Do(NumPads);
|
||||||
|
p.Do(NumGoodPads);
|
||||||
p.Do(joyinfo);
|
p.Do(joyinfo);
|
||||||
p.DoArray(PadState, 4);
|
p.DoArray(PadState, 4);
|
||||||
p.DoArray(PadMapping, 4);
|
p.DoArray(PadMapping, 4);
|
||||||
|
@ -515,16 +509,20 @@ void Shutdown(void)
|
||||||
for (int i = 0; i < 1; i++)
|
for (int i = 0; i < 1; i++)
|
||||||
{
|
{
|
||||||
if (PadMapping[i].enabled && joyinfo.size() > (u32)PadMapping[i].ID)
|
if (PadMapping[i].enabled && joyinfo.size() > (u32)PadMapping[i].ID)
|
||||||
|
if (joyinfo.at(PadMapping[i].ID).Good)
|
||||||
|
{
|
||||||
INFO_LOG(WIIMOTE, "ShutDown: %i", PadState[i].joy);
|
INFO_LOG(WIIMOTE, "ShutDown: %i", PadState[i].joy);
|
||||||
/* SDL_JoystickClose() crashes for some reason so I avoid this
|
/* SDL_JoystickClose() crashes for some reason so I avoid this
|
||||||
for now, SDL_Quit() should close the pads to I think */
|
for now, SDL_Quit() should close the pads to I think */
|
||||||
//if(SDL_JoystickOpened(PadMapping[i].ID)) SDL_JoystickClose(PadState[i].joy);
|
//if(SDL_JoystickOpened(PadMapping[i].ID)) SDL_JoystickClose(PadState[i].joy);
|
||||||
//PadState[i].joy = NULL;
|
//PadState[i].joy = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Clear the physical device info
|
// Clear the physical device info
|
||||||
joyinfo.clear();
|
joyinfo.clear();
|
||||||
NumPads = 0;
|
NumPads = 0;
|
||||||
|
NumGoodPads = 0;
|
||||||
|
|
||||||
// Finally close SDL
|
// Finally close SDL
|
||||||
if (SDL_WasInit(0)) SDL_Quit();
|
if (SDL_WasInit(0)) SDL_Quit();
|
||||||
|
@ -695,8 +693,21 @@ void ControlChannel(u16 _channelID, const void* _pData, u32 _Size)
|
||||||
of times per second. */
|
of times per second. */
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
|
readKeyboard();
|
||||||
|
//LOG(WIIMOTE, "Wiimote_Update");
|
||||||
//INFO_LOG(WIIMOTE, "Emu Update: %i", g_ReportingMode);
|
//INFO_LOG(WIIMOTE, "Emu Update: %i", g_ReportingMode);
|
||||||
|
|
||||||
|
// Check if the pad state should be updated
|
||||||
|
if ((g_Config.Trigger.Type == g_Config.Trigger.TRIGGER || g_Config.Trigger.Type == g_Config.Trigger.ANALOG1 || g_Config.Trigger.Type == g_Config.Trigger.ANALOG2
|
||||||
|
|| g_Config.Nunchuck.Type == g_Config.Nunchuck.ANALOG1 || g_Config.Nunchuck.Type == g_Config.Nunchuck.ANALOG2
|
||||||
|
|| g_Config.ClassicController.LType == g_Config.ClassicController.ANALOG1 || g_Config.ClassicController.LType == g_Config.ClassicController.ANALOG2
|
||||||
|
|| g_Config.ClassicController.RType == g_Config.ClassicController.ANALOG1 || g_Config.ClassicController.RType == g_Config.ClassicController.ANALOG2)
|
||||||
|
&& NumGoodPads > 0 && joyinfo.size() > (u32)PadMapping[0].ID)
|
||||||
|
{
|
||||||
|
const int Page = 0;
|
||||||
|
WiiMoteEmu::GetJoyState(PadState[Page], PadMapping[Page], Page, joyinfo[PadMapping[Page].ID].NumButtons);
|
||||||
|
}
|
||||||
|
|
||||||
switch(g_ReportingMode)
|
switch(g_ReportingMode)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -710,22 +721,9 @@ void Update()
|
||||||
|
|
||||||
// Potentially send a delayed acknowledgement to an InterruptChannel() Output
|
// Potentially send a delayed acknowledgement to an InterruptChannel() Output
|
||||||
CheckAckDelay();
|
CheckAckDelay();
|
||||||
|
|
||||||
ReadKeyboard();
|
|
||||||
|
|
||||||
// Check if the pad state should be updated
|
|
||||||
if ((g_Config.Trigger.Type == g_Config.Trigger.TRIGGER || g_Config.Trigger.Type == g_Config.Trigger.ANALOG1 || g_Config.Trigger.Type == g_Config.Trigger.ANALOG2
|
|
||||||
|| g_Config.Nunchuck.Type == g_Config.Nunchuck.ANALOG1 || g_Config.Nunchuck.Type == g_Config.Nunchuck.ANALOG2
|
|
||||||
|| g_Config.ClassicController.LType == g_Config.ClassicController.ANALOG1 || g_Config.ClassicController.LType == g_Config.ClassicController.ANALOG2
|
|
||||||
|| g_Config.ClassicController.RType == g_Config.ClassicController.ANALOG1 || g_Config.ClassicController.RType == g_Config.ClassicController.ANALOG2)
|
|
||||||
&& NumPads > 0 && joyinfo.size() > (u32)PadMapping[0].ID)
|
|
||||||
{
|
|
||||||
const int Page = 0;
|
|
||||||
WiiMoteEmu::GetJoyState(PadState[Page], PadMapping[Page], Page);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReadKeyboard()
|
void readKeyboard()
|
||||||
{
|
{
|
||||||
#if defined(HAVE_X11) && HAVE_X11
|
#if defined(HAVE_X11) && HAVE_X11
|
||||||
XEvent E;
|
XEvent E;
|
||||||
|
|
|
@ -41,7 +41,7 @@ void Shutdown(void);
|
||||||
void InterruptChannel(u16 _channelID, const void* _pData, u32 _Size);
|
void InterruptChannel(u16 _channelID, const void* _pData, u32 _Size);
|
||||||
void ControlChannel(u16 _channelID, const void* _pData, u32 _Size) ;
|
void ControlChannel(u16 _channelID, const void* _pData, u32 _Size) ;
|
||||||
void Update();
|
void Update();
|
||||||
void ReadKeyboard();
|
void readKeyboard();
|
||||||
|
|
||||||
// Recordings
|
// Recordings
|
||||||
void LoadRecordedMovements();
|
void LoadRecordedMovements();
|
||||||
|
@ -52,14 +52,8 @@ void UpdateEeprom();
|
||||||
void UpdateExtRegisterBlocks();
|
void UpdateExtRegisterBlocks();
|
||||||
|
|
||||||
// Gamepad
|
// Gamepad
|
||||||
bool LocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
|
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads);
|
||||||
bool LocalSearchDevicesReset(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
|
void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller, int NumButtons);
|
||||||
bool DoLocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
|
|
||||||
bool IsConnected(std::string Name);
|
|
||||||
bool IsPolling();
|
|
||||||
void EnablePolling(bool Enable);
|
|
||||||
std::string IDToName(int ID);
|
|
||||||
void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller);
|
|
||||||
void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr);
|
void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr);
|
||||||
|
|
||||||
// Accelerometer
|
// Accelerometer
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include "../../../Core/InputCommon/Src/XInput.h"
|
#include "../../../Core/InputCommon/Src/XInput.h"
|
||||||
|
|
||||||
#include "Common.h" // Common
|
#include "Common.h" // Common
|
||||||
#include "LogManager.h"
|
|
||||||
#include "StringUtil.h" // for ArrayToString()
|
#include "StringUtil.h" // for ArrayToString()
|
||||||
#include "IniFile.h"
|
#include "IniFile.h"
|
||||||
#include "pluginspecs_wiimote.h"
|
#include "pluginspecs_wiimote.h"
|
||||||
|
@ -36,125 +35,37 @@
|
||||||
#include "Encryption.h" // for extension encryption
|
#include "Encryption.h" // for extension encryption
|
||||||
#include "Config.h" // for g_Config
|
#include "Config.h" // for g_Config
|
||||||
|
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
|
||||||
#include "ConfigPadDlg.h"
|
|
||||||
extern WiimotePadConfigDialog *m_PadConfigFrame;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern SWiimoteInitialize g_WiimoteInitialize;
|
extern SWiimoteInitialize g_WiimoteInitialize;
|
||||||
|
|
||||||
namespace WiiMoteEmu
|
namespace WiiMoteEmu
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
bool LocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
|
||||||
{
|
|
||||||
//DEBUG_LOG(PAD, "LocalSearchDevices");
|
|
||||||
bool bSuccess = InputCommon::SearchDevices(_joyinfo, _NumPads);
|
|
||||||
|
|
||||||
DoLocalSearchDevices(_joyinfo, _NumPads);
|
|
||||||
|
|
||||||
return bSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool LocalSearchDevicesReset(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
|
||||||
{
|
|
||||||
DEBUG_LOG(CONSOLE, "LocalSearchDevicesReset");
|
|
||||||
|
|
||||||
// Turn off device polling while resetting
|
|
||||||
EnablePolling(false);
|
|
||||||
bool bSuccess = InputCommon::SearchDevicesReset(_joyinfo, _NumPads);
|
|
||||||
DoLocalSearchDevices(_joyinfo, _NumPads);
|
|
||||||
EnablePolling(true);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill joyinfo with the current connected devices
|
// Fill joyinfo with the current connected devices
|
||||||
bool DoLocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
|
||||||
{
|
{
|
||||||
//DEBUG_LOG(WIIMOTE, "LocalSearchDevices");
|
bool WasGotten = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
|
||||||
|
|
||||||
// Warn the user if no gamepads are detected
|
// Warn the user if no gamepads are detected
|
||||||
if (_NumPads == 0 && g_EmulatorRunning)
|
if (_NumGoodPads == 0 && g_EmulatorRunning)
|
||||||
{
|
{
|
||||||
//PanicAlert("Wiimote: No Gamepad Detected");
|
//PanicAlert("nJoy: No Gamepad Detected");
|
||||||
//return false;
|
//return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the first time
|
// Load PadMapping[] etc
|
||||||
if (!g_Config.Loaded) g_Config.Load();
|
g_Config.Load();
|
||||||
|
|
||||||
// Update the PadState[].joy handle
|
// Update the PadState[].joy handle
|
||||||
// If the saved ID matches, select this device for this slot
|
for (int i = 0; i < 1; i++)
|
||||||
bool Match = false;
|
|
||||||
for (int i = 0; i < MAX_WIIMOTES; i++)
|
|
||||||
{
|
{
|
||||||
for (int j = 0; j < joyinfo.size(); j++)
|
if (PadMapping[i].enabled && joyinfo.size() > (u32)PadMapping[i].ID)
|
||||||
{
|
if(joyinfo.at(PadMapping[i].ID).Good)
|
||||||
if (joyinfo.at(j).Name == PadMapping[i].Name)
|
PadState[i].joy = SDL_JoystickOpen(PadMapping[i].ID);
|
||||||
{
|
|
||||||
PadState[i].joy = joyinfo.at(j).joy;
|
|
||||||
Match = true;
|
|
||||||
//INFO_LOG(WIIMOTE, "Slot %i: '%s' %06i", i, joyinfo.at(j).Name.c_str(), PadState[i].joy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!Match) PadState[i].joy = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return WasGotten;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is the device connected?
|
|
||||||
// ----------------
|
|
||||||
bool IsConnected(std::string Name)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < joyinfo.size(); i++)
|
|
||||||
{
|
|
||||||
DEBUG_LOG(WIIMOTE, "Pad %i: IsConnected checking '%s' against '%s'", i, joyinfo.at(i).Name.c_str(), Name.c_str());
|
|
||||||
if (joyinfo.at(i).Name == Name)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// See description of the equivalent functions in nJoy.cpp...
|
|
||||||
// ----------------
|
|
||||||
bool IsPolling()
|
|
||||||
{
|
|
||||||
if (!SDLPolling || SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE)
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void EnablePolling(bool Enable)
|
|
||||||
{
|
|
||||||
if (Enable)
|
|
||||||
{
|
|
||||||
SDLPolling = true;
|
|
||||||
SDL_JoystickEventState(SDL_IGNORE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SDLPolling = false;
|
|
||||||
SDL_JoystickEventState(SDL_ENABLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ID to Name
|
|
||||||
// ----------------
|
|
||||||
std::string IDToName(int ID)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < joyinfo.size(); i++)
|
|
||||||
{
|
|
||||||
//DEBUG_LOG(WIIMOTE, "IDToName: ID %i id %i %s", ID, i, joyinfo.at(i).Name.c_str());
|
|
||||||
if (joyinfo.at(i).ID == ID)
|
|
||||||
return joyinfo.at(i).Name;
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Return adjusted input values
|
// Return adjusted input values
|
||||||
void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr)
|
void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr)
|
||||||
{
|
{
|
||||||
|
@ -208,19 +119,10 @@ void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr)
|
||||||
Function: Updates the PadState struct with the current pad status. The input
|
Function: Updates the PadState struct with the current pad status. The input
|
||||||
value "controller" is for a virtual controller 0 to 3. */
|
value "controller" is for a virtual controller 0 to 3. */
|
||||||
|
|
||||||
void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller)
|
void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller, int NumButtons)
|
||||||
{
|
{
|
||||||
//DEBUG_LOG(WIIMOTE, "GetJoyState: Polling:%i NumPads:%i", SDLPolling, NumPads);
|
|
||||||
|
|
||||||
// Return if polling is off
|
|
||||||
if (!IsPolling()) return;
|
|
||||||
// Update joyinfo handles. This is in case the Wiimote plugin has restarted SDL after a pad was conencted/disconnected
|
|
||||||
// so that the handles are updated. We don't need to run this this often. Once a second would be enough.
|
|
||||||
if (LiveUpdates) LocalSearchDevices(joyinfo, NumPads);
|
|
||||||
// Return if we have no pads
|
// Return if we have no pads
|
||||||
if (NumPads == 0) return;
|
if (NumGoodPads == 0) return;
|
||||||
// Read info
|
|
||||||
int NumButtons = SDL_JoystickNumButtons(_PadState.joy);
|
|
||||||
|
|
||||||
// Update the gamepad status
|
// Update the gamepad status
|
||||||
SDL_JoystickUpdate();
|
SDL_JoystickUpdate();
|
||||||
|
@ -251,11 +153,12 @@ void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Debugging
|
/* Debugging
|
||||||
ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
|
// Console::ClearScreen();
|
||||||
Console->ClearScreen();
|
DEBUG_LOG(CONSOLE,
|
||||||
Console->CustomLog(StringFromFormat(
|
"Controller and handle: %i %i\n"
|
||||||
"Controller: %i Handle: %i\n"
|
|
||||||
"Triggers:%i %i %i %i %i\n"
|
"Triggers:%i %i %i %i %i\n"
|
||||||
|
|
||||||
"Analog:%06i %06i \n",
|
"Analog:%06i %06i \n",
|
||||||
|
|
||||||
controller, (int)_PadState.joy,
|
controller, (int)_PadState.joy,
|
||||||
|
@ -265,8 +168,7 @@ void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONT
|
||||||
_PadState.Axis.Tl, _PadState.Axis.Tr,
|
_PadState.Axis.Tl, _PadState.Axis.Tr,
|
||||||
|
|
||||||
_PadState.Axis.Lx, _PadState.Axis.Ly
|
_PadState.Axis.Lx, _PadState.Axis.Ly
|
||||||
).c_str());
|
);*/
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "Common.h" // Common
|
#include "Common.h" // Common
|
||||||
#include "LogManager.h"
|
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "pluginspecs_wiimote.h"
|
#include "pluginspecs_wiimote.h"
|
||||||
#include "StringUtil.h" // For ArrayToString
|
#include "StringUtil.h" // For ArrayToString
|
||||||
|
@ -441,7 +440,7 @@ void SingleShake(u8 &_y, u8 &_z, int i)
|
||||||
void TiltWiimoteGamepad(float &Roll, float &Pitch)
|
void TiltWiimoteGamepad(float &Roll, float &Pitch)
|
||||||
{
|
{
|
||||||
// Return if we have no pads
|
// Return if we have no pads
|
||||||
if (NumPads == 0) return;
|
if (NumGoodPads == 0) return;
|
||||||
|
|
||||||
// This has to be changed if multiple Wiimotes are to be supported later
|
// This has to be changed if multiple Wiimotes are to be supported later
|
||||||
const int Page = 0;
|
const int Page = 0;
|
||||||
|
|
|
@ -420,13 +420,11 @@ bool IsFocus()
|
||||||
HWND Parent = GetParent(RenderingWindow);
|
HWND Parent = GetParent(RenderingWindow);
|
||||||
HWND TopLevel = GetParent(Parent);
|
HWND TopLevel = GetParent(Parent);
|
||||||
// Allow updates when the config window is in focus to
|
// Allow updates when the config window is in focus to
|
||||||
HWND Config = NULL, ConfigPad = NULL, ConfigRecording = NULL;
|
HWND Config = NULL;
|
||||||
if (m_BasicConfigFrame) Config = (HWND)m_BasicConfigFrame->GetHWND();
|
if (m_BasicConfigFrame)
|
||||||
if (m_PadConfigFrame) ConfigPad = (HWND)m_PadConfigFrame->GetHWND();
|
Config = (HWND)m_BasicConfigFrame->GetHWND();
|
||||||
if (m_RecordingConfigFrame) ConfigRecording = (HWND)m_RecordingConfigFrame->GetHWND();
|
|
||||||
// Support both rendering to main window and not
|
// Support both rendering to main window and not
|
||||||
if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow || GetForegroundWindow() == Config
|
if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow || GetForegroundWindow() == Config)
|
||||||
|| GetForegroundWindow() == ConfigPad || GetForegroundWindow() == ConfigRecording)
|
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
@ -759,14 +757,12 @@ void ReadDebugging(bool Emu, const void* _pData, int Size)
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
// Test the angles to x, y, z values formula by calculating the values back and forth
|
// Test the angles to x, y, z values formula by calculating the values back and forth
|
||||||
// -----------
|
// -----------
|
||||||
/**/
|
/* //Console::ClearScreen();
|
||||||
ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
|
|
||||||
Console->ClearScreen();
|
|
||||||
// Show a test of our calculations
|
// Show a test of our calculations
|
||||||
WiiMoteEmu::TiltTest(data[4], data[5], data[6]);
|
WiiMoteEmu::TiltTest(data[4], data[5], data[6]);
|
||||||
//u8 x, y, z;
|
u8 x, y, z;
|
||||||
//WiiMoteEmu::Tilt(x, y, z);
|
WiiMoteEmu::Tilt(x, y, z);
|
||||||
//WiiMoteEmu::TiltTest(x, y, z);
|
WiiMoteEmu::TiltTest(x, y, z);*/
|
||||||
// -------------------------
|
// -------------------------
|
||||||
|
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
|
|
|
@ -35,7 +35,7 @@ int GetUpdateRate();
|
||||||
void InterruptDebugging(bool Emu, const void* _pData);
|
void InterruptDebugging(bool Emu, const void* _pData);
|
||||||
void ReadDebugging(bool Emu, const void* _pData, int Size);
|
void ReadDebugging(bool Emu, const void* _pData, int Size);
|
||||||
bool IsFocus();
|
bool IsFocus();
|
||||||
#define MAX_WIIMOTES 1
|
|
||||||
|
|
||||||
// Movement recording
|
// Movement recording
|
||||||
#define RECORDING_ROWS 15
|
#define RECORDING_ROWS 15
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
namespace WiiMoteReal
|
namespace WiiMoteReal
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#define MAX_WIIMOTES 1
|
||||||
|
|
||||||
int Initialize();
|
int Initialize();
|
||||||
void DoState(PointerWrap &p);
|
void DoState(PointerWrap &p);
|
||||||
void Shutdown(void);
|
void Shutdown(void);
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib"
|
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib"
|
||||||
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)D.dll"
|
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)D.dll"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(ConfigurationName)";..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -149,7 +149,7 @@
|
||||||
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib"
|
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib"
|
||||||
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName)D.dll"
|
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName)D.dll"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\$(ConfigurationName)";..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -228,7 +228,7 @@
|
||||||
AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
|
AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
|
||||||
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName).dll"
|
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName).dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(ConfigurationName)";..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -309,7 +309,7 @@
|
||||||
AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
|
AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
|
||||||
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName).dll"
|
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName).dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\$(ConfigurationName)";..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -390,7 +390,7 @@
|
||||||
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
|
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
|
||||||
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)DF.dll"
|
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)DF.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories="..\..\..\Externals\SDL\VisualC\SDL\Debug;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
@ -471,7 +471,7 @@
|
||||||
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
|
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
|
||||||
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName)DF.dll"
|
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName)DF.dll"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories=""..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\Debug";..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
|
||||||
GenerateManifest="false"
|
GenerateManifest="false"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
|
||||||
|
|
|
@ -46,7 +46,6 @@ Config::Config()
|
||||||
{
|
{
|
||||||
// Clear the memory
|
// Clear the memory
|
||||||
//memset(this, 0, sizeof(Config));
|
//memset(this, 0, sizeof(Config));
|
||||||
Loaded = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,7 +95,7 @@ void DEBUG_QUIT()
|
||||||
void Config::Save(int Slot)
|
void Config::Save(int Slot)
|
||||||
{
|
{
|
||||||
// If there are no good pads don't save
|
// If there are no good pads don't save
|
||||||
if (NumPads == 0) return;
|
if (NumGoodPads == 0) return;
|
||||||
|
|
||||||
// Load ini file
|
// Load ini file
|
||||||
IniFile file;
|
IniFile file;
|
||||||
|
@ -128,27 +127,22 @@ void Config::Save(int Slot)
|
||||||
|
|
||||||
// Save the physical device ID
|
// Save the physical device ID
|
||||||
file.Set(SectionName.c_str(), "joy_id", PadMapping[i].ID);
|
file.Set(SectionName.c_str(), "joy_id", PadMapping[i].ID);
|
||||||
file.Set(SectionName.c_str(), "joy_name", PadMapping[i].Name);
|
|
||||||
// ===================
|
// ===================
|
||||||
|
|
||||||
// ==================================================================
|
// ==================================================================
|
||||||
// Joypad or slot specific settings
|
// Joypad or slot specific settings
|
||||||
// -----------------
|
// -----------------
|
||||||
// Current joypad device ID: PadMapping[i].ID
|
// Current joypad device ID: PadMapping[i].ID
|
||||||
// Current joypad name: IDToName(PadMapping[i].ID])
|
// Current joypad name: joyinfo[PadMapping[i].ID].Name
|
||||||
if(g_Config.bSaveByID)
|
if(g_Config.bSaveByID)
|
||||||
{
|
{
|
||||||
// Create a new section name after the joypad name
|
/* Save joypad specific settings. Check for "PadMapping[i].ID < SDL_NumJoysticks()" to
|
||||||
SectionName = IDToName(PadMapping[i].ID);
|
avoid reading a joyinfo that does't exist */
|
||||||
// Don't save a blank name
|
if((u32)PadMapping[i].ID >= joyinfo.size()) continue;
|
||||||
if (SectionName == "")
|
|
||||||
{
|
|
||||||
ERROR_LOG(PAD, "ID %i has no name, will not save", PadMapping[i].ID);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NOTICE_LOG(PAD, "Save settings for ID %i '%s' from PadMapping[%i]", PadMapping[i].ID, SectionName.c_str(), i);
|
// Create a new section name after the joypad name
|
||||||
|
SectionName = joyinfo[PadMapping[i].ID].Name;
|
||||||
|
}
|
||||||
|
|
||||||
file.Set(SectionName.c_str(), "l_shoulder", PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER]);
|
file.Set(SectionName.c_str(), "l_shoulder", PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER]);
|
||||||
file.Set(SectionName.c_str(), "r_shoulder", PadMapping[i].buttons[InputCommon::CTL_R_SHOULDER]);
|
file.Set(SectionName.c_str(), "r_shoulder", PadMapping[i].buttons[InputCommon::CTL_R_SHOULDER]);
|
||||||
|
@ -186,6 +180,8 @@ void Config::Save(int Slot)
|
||||||
file.Set(SectionName.c_str(), "SquareToCircleC", PadMapping[i].bSquareToCircleC);
|
file.Set(SectionName.c_str(), "SquareToCircleC", PadMapping[i].bSquareToCircleC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INFO_LOG(CONSOLE, "%i: Save: %i\n", 0, PadMapping[0].halfpress);
|
||||||
|
|
||||||
file.Save(FULL_CONFIG_DIR "nJoy.ini");
|
file.Save(FULL_CONFIG_DIR "nJoy.ini");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +189,8 @@ void Config::Save(int Slot)
|
||||||
// -----------------------
|
// -----------------------
|
||||||
void Config::Load(bool ChangePad, bool ChangeSaveByID)
|
void Config::Load(bool ChangePad, bool ChangeSaveByID)
|
||||||
{
|
{
|
||||||
Loaded = true;
|
// If there are no good pads don't load
|
||||||
|
if (NumGoodPads == 0) return;
|
||||||
|
|
||||||
// Load file
|
// Load file
|
||||||
IniFile file;
|
IniFile file;
|
||||||
|
@ -214,9 +211,6 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
|
||||||
}
|
}
|
||||||
// =============
|
// =============
|
||||||
|
|
||||||
// If there are no good pads don't load anymore
|
|
||||||
if (NumPads == 0) return;
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
std::string SectionName = StringFromFormat("PAD%i", i+1);
|
std::string SectionName = StringFromFormat("PAD%i", i+1);
|
||||||
|
@ -225,30 +219,21 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
|
||||||
if (!ChangePad)
|
if (!ChangePad)
|
||||||
{
|
{
|
||||||
file.Get(SectionName.c_str(), "joy_id", &PadMapping[i].ID, 0);
|
file.Get(SectionName.c_str(), "joy_id", &PadMapping[i].ID, 0);
|
||||||
file.Get(SectionName.c_str(), "joy_name", &PadMapping[i].Name, "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==================================================================
|
// ==================================================================
|
||||||
// Joypad or slot specific settings
|
// Joypad or slot specific settings
|
||||||
// -----------------
|
// -----------------
|
||||||
// Current joypad device ID: PadMapping[i].ID
|
// Current joypad device ID: PadMapping[i].ID
|
||||||
// Current joypad name: IDToName(PadMapping[i].ID)
|
// Current joypad name: joyinfo[PadMapping[i].ID].Name
|
||||||
if(g_Config.bSaveByID)
|
if(g_Config.bSaveByID)
|
||||||
{
|
{
|
||||||
|
// Prevent a crash from illegal access to joyinfo that will only have values for
|
||||||
|
// the current amount of connected pads
|
||||||
|
if((u32)PadMapping[i].ID >= joyinfo.size()) continue;
|
||||||
|
|
||||||
// Create a section name
|
// Create a section name
|
||||||
SectionName = PadMapping[i].Name;
|
SectionName = joyinfo[PadMapping[i].ID].Name;
|
||||||
// Don't load settings for a non-connected device
|
|
||||||
if (!IsConnected(SectionName))
|
|
||||||
{
|
|
||||||
ERROR_LOG(PAD, "Slot %i: The device '%s' is not connected, will not load settings", SectionName.c_str());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Don't load a blank ID
|
|
||||||
if (SectionName == "")
|
|
||||||
{
|
|
||||||
ERROR_LOG(PAD, "Slot %i has no device name, will not load settings", i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
file.Get(SectionName.c_str(), "l_shoulder", &PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER], 4);
|
file.Get(SectionName.c_str(), "l_shoulder", &PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER], 4);
|
||||||
|
@ -284,11 +269,8 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
|
||||||
file.Get(SectionName.c_str(), "RadiusOnOffC", &Tmp, false); PadMapping[i].bRadiusOnOffC = Tmp;
|
file.Get(SectionName.c_str(), "RadiusOnOffC", &Tmp, false); PadMapping[i].bRadiusOnOffC = Tmp;
|
||||||
file.Get(SectionName.c_str(), "DiagonalC", &PadMapping[i].SDiagonalC, "100%");
|
file.Get(SectionName.c_str(), "DiagonalC", &PadMapping[i].SDiagonalC, "100%");
|
||||||
file.Get(SectionName.c_str(), "SquareToCircleC", &Tmp, false); PadMapping[i].bSquareToCircleC = Tmp;
|
file.Get(SectionName.c_str(), "SquareToCircleC", &Tmp, false); PadMapping[i].bSquareToCircleC = Tmp;
|
||||||
|
|
||||||
NOTICE_LOG(PAD, "Slot %i: Load settings for ID %i '%s'", i, PadMapping[i].ID, SectionName.c_str());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//INFO_LOG(PAD, "%i: Load: %i\n", 0, PadMapping[0].halfpress);
|
INFO_LOG(CONSOLE, "%i: Load: %i\n", 0, PadMapping[0].halfpress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,9 @@ struct Config
|
||||||
Config();
|
Config();
|
||||||
void Load(bool ChangePad = false, bool ChangeSaveByID = false);
|
void Load(bool ChangePad = false, bool ChangeSaveByID = false);
|
||||||
void Save(int Slot = -1);
|
void Save(int Slot = -1);
|
||||||
bool Loaded;
|
|
||||||
int CheckForDuplicateJoypads(bool OK);
|
int CheckForDuplicateJoypads(bool OK);
|
||||||
|
|
||||||
// Settings
|
// General
|
||||||
bool bShowAdvanced; // Only allow one of these
|
bool bShowAdvanced; // Only allow one of these
|
||||||
bool bSaveByID;
|
bool bSaveByID;
|
||||||
bool bCheckFocus;
|
bool bCheckFocus;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
// Project description
|
// Project description
|
||||||
// -------------------
|
// -------------------
|
||||||
// Name: nJoy
|
// Name: nJoy
|
||||||
|
@ -31,14 +32,13 @@
|
||||||
// ---------
|
// ---------
|
||||||
#include "ConfigBox.h"
|
#include "ConfigBox.h"
|
||||||
#include "../nJoy.h"
|
#include "../nJoy.h"
|
||||||
#include "LogManager.h"
|
|
||||||
#include "Images/controller.xpm"
|
#include "Images/controller.xpm"
|
||||||
|
|
||||||
extern bool g_EmulatorRunning;
|
extern bool g_EmulatorRunning;
|
||||||
|
|
||||||
// Set PAD status
|
// Set PAD status
|
||||||
// --------------
|
// --------------
|
||||||
void PADConfigDialognJoy::PadShowStatus()
|
void PADConfigDialognJoy::PadGetStatus()
|
||||||
{
|
{
|
||||||
// Return if it's not detected. The ID should never be less than zero here, it can only be that
|
// Return if it's not detected. The ID should never be less than zero here, it can only be that
|
||||||
// because of a manual ini file change, but we make that check anway.
|
// because of a manual ini file change, but we make that check anway.
|
||||||
|
@ -51,7 +51,7 @@ void PADConfigDialognJoy::PadShowStatus()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get physical device status
|
// Get physical device status
|
||||||
int ID = PadMapping[notebookpage].ID;
|
int PhysicalDevice = PadMapping[notebookpage].ID;
|
||||||
int TriggerType = PadMapping[notebookpage].triggertype;
|
int TriggerType = PadMapping[notebookpage].triggertype;
|
||||||
|
|
||||||
// Get original values
|
// Get original values
|
||||||
|
@ -106,6 +106,7 @@ void PADConfigDialognJoy::PadShowStatus()
|
||||||
///////////////////// Analog stick
|
///////////////////// Analog stick
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Triggers
|
// Triggers
|
||||||
// -----------------
|
// -----------------
|
||||||
int TriggerValue = 255;
|
int TriggerValue = 255;
|
||||||
|
@ -142,12 +143,84 @@ void PADConfigDialognJoy::PadShowStatus()
|
||||||
///////////////////// Triggers
|
///////////////////// Triggers
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the advanced tab
|
// Show the current pad status
|
||||||
|
// -----------------
|
||||||
|
std::string ShowStatus(int VirtualController)
|
||||||
|
{
|
||||||
|
// Save the physical device
|
||||||
|
int PhysicalDevice = PadMapping[VirtualController].ID;
|
||||||
|
|
||||||
|
// Make local shortcut
|
||||||
|
SDL_Joystick *joy = PadState[VirtualController].joy;
|
||||||
|
|
||||||
|
// Make shortcuts for all pads
|
||||||
|
SDL_Joystick *joy0 = PadState[0].joy;
|
||||||
|
SDL_Joystick *joy1 = PadState[1].joy;
|
||||||
|
SDL_Joystick *joy2 = PadState[2].joy;
|
||||||
|
SDL_Joystick *joy3 = PadState[3].joy;
|
||||||
|
|
||||||
|
// Temporary storage
|
||||||
|
std::string StrAxes, StrHats, StrBut;
|
||||||
|
int value;
|
||||||
|
|
||||||
|
// Get status
|
||||||
|
int Axes = joyinfo[PhysicalDevice].NumAxes;
|
||||||
|
int Balls = joyinfo[PhysicalDevice].NumBalls;
|
||||||
|
int Hats = joyinfo[PhysicalDevice].NumHats;
|
||||||
|
int Buttons = joyinfo[PhysicalDevice].NumButtons;
|
||||||
|
|
||||||
|
// Update the internal values
|
||||||
|
SDL_JoystickUpdate();
|
||||||
|
|
||||||
|
// Go through all axes and read out their values
|
||||||
|
for(int i = 0; i < Axes; i++)
|
||||||
|
{
|
||||||
|
value = SDL_JoystickGetAxis(joy, i);
|
||||||
|
StrAxes += StringFromFormat(" %i:%06i", i, value);
|
||||||
|
}
|
||||||
|
for(int i = 0;i < Hats; i++)
|
||||||
|
{
|
||||||
|
value = SDL_JoystickGetHat(joy, i);
|
||||||
|
StrHats += StringFromFormat(" %i:%i", i, value);
|
||||||
|
}
|
||||||
|
for(int i = 0;i < Buttons; i++)
|
||||||
|
{
|
||||||
|
value = SDL_JoystickGetButton(joy, i);
|
||||||
|
StrBut += StringFromFormat(" %i:%i", i+1, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return StringFromFormat(
|
||||||
|
"All pads:\n"
|
||||||
|
"ID: %i %i %i %i\n"
|
||||||
|
"Controllertype: %i %i %i %i\n"
|
||||||
|
"SquareToCircle: %i %i %i %i\n\n"
|
||||||
|
#ifdef _WIN32
|
||||||
|
"Handles: %i %i %i %i\n"
|
||||||
|
"XInput: %i %i %i\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
"This pad:\n"
|
||||||
|
"Axes: %s\n"
|
||||||
|
"Hats: %s\n"
|
||||||
|
"But: %s\n"
|
||||||
|
"Device: Ax: %i Balls:%i Hats:%i But:%i",
|
||||||
|
PadMapping[0].ID, PadMapping[1].ID, PadMapping[2].ID, PadMapping[3].ID,
|
||||||
|
PadMapping[0].controllertype, PadMapping[1].controllertype, PadMapping[2].controllertype, PadMapping[3].controllertype,
|
||||||
|
PadMapping[0].bSquareToCircle, PadMapping[1].bSquareToCircle, PadMapping[2].bSquareToCircle, PadMapping[3].bSquareToCircle,
|
||||||
|
#ifdef _WIN32
|
||||||
|
joy0, joy1, joy2, joy3,
|
||||||
|
//PadState[PadMapping[0].ID].joy, PadState[PadMapping[1].ID].joy, PadState[PadMapping[2].ID].joy, PadState[PadMapping[3].ID].joy,
|
||||||
|
XInput::IsConnected(0), XInput::GetXI(0, InputCommon::XI_TRIGGER_L), XInput::GetXI(0, InputCommon::XI_TRIGGER_R),
|
||||||
|
#endif
|
||||||
|
StrAxes.c_str(), StrHats.c_str(), StrBut.c_str(),
|
||||||
|
Axes, Balls, Hats, Buttons
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate the advanced tab
|
||||||
// -----------------
|
// -----------------
|
||||||
void PADConfigDialognJoy::Update()
|
void PADConfigDialognJoy::Update()
|
||||||
{
|
{
|
||||||
if (!IsPolling()) return;
|
|
||||||
|
|
||||||
// Check that Dolphin is in focus, otherwise don't update the pad status
|
// Check that Dolphin is in focus, otherwise don't update the pad status
|
||||||
/* If the emulator is running and unpaused GetJoyState() is run a little more often than needed,
|
/* If the emulator is running and unpaused GetJoyState() is run a little more often than needed,
|
||||||
but I allow that since it can confuse the user if the input status in the configuration window
|
but I allow that since it can confuse the user if the input status in the configuration window
|
||||||
|
@ -155,46 +228,17 @@ void PADConfigDialognJoy::Update()
|
||||||
if (g_Config.bCheckFocus || IsFocus()) // && !g_EmulatorRunning)
|
if (g_Config.bCheckFocus || IsFocus()) // && !g_EmulatorRunning)
|
||||||
{
|
{
|
||||||
for (int i = 0; (u32)i < joyinfo.size(); i++)
|
for (int i = 0; (u32)i < joyinfo.size(); i++)
|
||||||
InputCommon::GetJoyState(PadState[notebookpage], PadMapping[notebookpage]);
|
InputCommon::GetJoyState(PadState[i], PadMapping[i], i, joyinfo[PadMapping[i].ID].NumButtons);
|
||||||
PadShowStatus();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show the current status in a window in the wxPanel
|
// Show the current status in a window in the wxPanel
|
||||||
#ifdef SHOW_PAD_STATUS
|
#ifdef SHOW_PAD_STATUS
|
||||||
m_pStatusBar->SetLabel(wxString::FromAscii(InputCommon::ShowStatus(
|
m_pStatusBar->SetLabel(wxString::Format(
|
||||||
notebookpage, m_Joyname[notebookpage]->GetSelection(),
|
"%s", ShowStatus(notebookpage).c_str()
|
||||||
PadMapping, PadState, joyinfo
|
));
|
||||||
).c_str()));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search for devices
|
|
||||||
void PADConfigDialognJoy::UpdateSlow()
|
|
||||||
{
|
|
||||||
if (!LiveUpdates) return;
|
|
||||||
|
|
||||||
// Don't run this the first time
|
|
||||||
int OldNumDIDevices;
|
|
||||||
if (NumDIDevices == -1)
|
|
||||||
OldNumDIDevices = InputCommon::SearchDIDevices();
|
|
||||||
else
|
|
||||||
// Search for connected devices and update dialog
|
|
||||||
OldNumDIDevices = NumDIDevices;
|
|
||||||
NumDIDevices = InputCommon::SearchDIDevices();
|
|
||||||
|
|
||||||
// Update if a pad has been connected/disconnected. Todo: Add a better check that also takes into consideration the pad id
|
|
||||||
// and other things to better ensure that nothing has changed
|
|
||||||
//DEBUG_LOG(PAD, "Found %i devices", NumDIDevices);
|
|
||||||
//DEBUG_LOG(PAD, "UpdateSlow: %i %i", OldNumPads, NumPads);
|
|
||||||
if (OldNumDIDevices != NumDIDevices)
|
|
||||||
{
|
|
||||||
WARN_LOG(PAD, "\n---- %s ----", (NumDIDevices > OldNumDIDevices) ? "Pad connected" : "Pad disconnected");
|
|
||||||
LocalSearchDevicesReset(joyinfo, NumPads);
|
|
||||||
UpdateDeviceList();
|
|
||||||
// Enable controls again, if disabled
|
|
||||||
UpdateGUIAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Populate the advanced tab
|
// Populate the advanced tab
|
||||||
// -----------------
|
// -----------------
|
||||||
|
@ -324,5 +368,6 @@ wxBitmap PADConfigDialognJoy::CreateBitmapArea(int Max, int Diagonal)
|
||||||
Points[7].x = (int)(-Diagonal * Adj + iAdj); Points[7].y = (int)(Diagonal * Adj + iAdj);
|
Points[7].x = (int)(-Diagonal * Adj + iAdj); Points[7].y = (int)(Diagonal * Adj + iAdj);
|
||||||
// Draw polygon
|
// Draw polygon
|
||||||
dc.DrawPolygon(8, Points);
|
dc.DrawPolygon(8, Points);
|
||||||
|
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
|
@ -103,7 +103,6 @@ BEGIN_EVENT_TABLE(PADConfigDialognJoy,wxDialog)
|
||||||
EVT_BUTTON(IDB_ANALOG_SUB_Y, PADConfigDialognJoy::GetButtons)
|
EVT_BUTTON(IDB_ANALOG_SUB_Y, PADConfigDialognJoy::GetButtons)
|
||||||
|
|
||||||
#if wxUSE_TIMER
|
#if wxUSE_TIMER
|
||||||
EVT_TIMER(IDTM_SLOW, PADConfigDialognJoy::OnSlowTimer)
|
|
||||||
EVT_TIMER(IDTM_CONSTANT, PADConfigDialognJoy::OnTimer)
|
EVT_TIMER(IDTM_CONSTANT, PADConfigDialognJoy::OnTimer)
|
||||||
EVT_TIMER(IDTM_BUTTON, PADConfigDialognJoy::OnButtonTimer)
|
EVT_TIMER(IDTM_BUTTON, PADConfigDialognJoy::OnButtonTimer)
|
||||||
#endif
|
#endif
|
||||||
|
@ -113,34 +112,26 @@ PADConfigDialognJoy::PADConfigDialognJoy(wxWindow *parent, wxWindowID id, const
|
||||||
const wxPoint &position, const wxSize& size, long style)
|
const wxPoint &position, const wxSize& size, long style)
|
||||||
: wxDialog(parent, id, title, position, size, style)
|
: wxDialog(parent, id, title, position, size, style)
|
||||||
{
|
{
|
||||||
// Initialize values
|
// Define values
|
||||||
notebookpage = 0;
|
notebookpage = 0;
|
||||||
g_Pressed = 0;
|
g_Pressed = 0;
|
||||||
|
Debugging = false;
|
||||||
m_TCDebugging = NULL;
|
m_TCDebugging = NULL;
|
||||||
ControlsCreated = false;
|
ControlsCreated = false;
|
||||||
|
|
||||||
// Settings
|
|
||||||
Debugging = false;
|
|
||||||
|
|
||||||
// Create controls
|
// Create controls
|
||||||
CreateGUIControls();
|
CreateGUIControls();
|
||||||
|
|
||||||
// Update GUI
|
|
||||||
UpdateGUIAll();
|
|
||||||
|
|
||||||
// Update device list
|
|
||||||
UpdateDeviceList();
|
|
||||||
|
|
||||||
#if wxUSE_TIMER
|
#if wxUSE_TIMER
|
||||||
m_SlowTimer = new wxTimer(this, IDTM_SLOW);
|
|
||||||
m_ConstantTimer = new wxTimer(this, IDTM_CONSTANT);
|
m_ConstantTimer = new wxTimer(this, IDTM_CONSTANT);
|
||||||
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
|
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
|
||||||
|
|
||||||
// Reset values
|
// Reset values
|
||||||
GetButtonWaitingID = 0; GetButtonWaitingTimer = 0;
|
GetButtonWaitingID = 0; GetButtonWaitingTimer = 0;
|
||||||
|
|
||||||
// Start timers
|
// Start the constant timer
|
||||||
StartTimer();
|
int TimesPerSecond = 30;
|
||||||
|
m_ConstantTimer->Start( floor((double)(1000 / TimesPerSecond)) );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// wxEVT_KEY_DOWN is blocked for enter, tab and the directional keys
|
// wxEVT_KEY_DOWN is blocked for enter, tab and the directional keys
|
||||||
|
@ -157,24 +148,6 @@ PADConfigDialognJoy::~PADConfigDialognJoy()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void PADConfigDialognJoy::DoShow()
|
|
||||||
{
|
|
||||||
// Start timers
|
|
||||||
StartTimer();
|
|
||||||
// Show
|
|
||||||
ShowModal();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PADConfigDialognJoy::StartTimer()
|
|
||||||
{
|
|
||||||
// Start the slow timer
|
|
||||||
double TimesPerSecond = 2;
|
|
||||||
m_SlowTimer->Start( floor((double)(1000.0 / TimesPerSecond)) );
|
|
||||||
// Start the constant timer
|
|
||||||
TimesPerSecond = 30;
|
|
||||||
m_ConstantTimer->Start( floor((double)(1000 / TimesPerSecond)) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void PADConfigDialognJoy::OnKeyDown(wxKeyEvent& event)
|
void PADConfigDialognJoy::OnKeyDown(wxKeyEvent& event)
|
||||||
{
|
{
|
||||||
g_Pressed = event.GetKeyCode();
|
g_Pressed = event.GetKeyCode();
|
||||||
|
@ -187,9 +160,7 @@ void PADConfigDialognJoy::OnClose(wxCloseEvent& event)
|
||||||
event.Skip();
|
event.Skip();
|
||||||
|
|
||||||
// Stop the timer
|
// Stop the timer
|
||||||
m_SlowTimer->Stop();
|
|
||||||
m_ConstantTimer->Stop();
|
m_ConstantTimer->Stop();
|
||||||
m_ButtonMappingTimer->Stop();
|
|
||||||
|
|
||||||
// Close pads, unless we are running a game
|
// Close pads, unless we are running a game
|
||||||
if (!g_EmulatorRunning) Shutdown();
|
if (!g_EmulatorRunning) Shutdown();
|
||||||
|
@ -285,7 +256,7 @@ void PADConfigDialognJoy::DoSave(bool ChangePad, int Slot)
|
||||||
|
|
||||||
g_Config.Save(Slot);
|
g_Config.Save(Slot);
|
||||||
// Now we can update the ID
|
// Now we can update the ID
|
||||||
UpdateID();
|
PadMapping[notebookpage].ID = m_Joyname[notebookpage]->GetSelection();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -297,21 +268,6 @@ void PADConfigDialognJoy::DoSave(bool ChangePad, int Slot)
|
||||||
// Then change it back to ""
|
// Then change it back to ""
|
||||||
ToBlank();
|
ToBlank();
|
||||||
}
|
}
|
||||||
void PADConfigDialognJoy::UpdateID()
|
|
||||||
{
|
|
||||||
INFO_LOG(PAD, "Slot %i: Changed PadMapping ID from %i to %i", notebookpage, PadMapping[notebookpage].ID, m_Joyname[notebookpage]->GetSelection());
|
|
||||||
PadMapping[notebookpage].ID = joyinfo.at(m_Joyname[notebookpage]->GetSelection()).ID;
|
|
||||||
PadMapping[notebookpage].Name = joyinfo.at(m_Joyname[notebookpage]->GetSelection()).Name;
|
|
||||||
// Update all handles
|
|
||||||
for(int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
if (PadMapping[i].Name == PadMapping[notebookpage].Name)
|
|
||||||
{
|
|
||||||
if (m_Joyname[i]->GetSelection() >= 0 && joyinfo.size() > m_Joyname[i]->GetSelection())
|
|
||||||
PadState[i].joy = joyinfo.at(m_Joyname[i]->GetSelection()).joy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// On changing the SaveById option we update all pages
|
// On changing the SaveById option we update all pages
|
||||||
void PADConfigDialognJoy::OnSaveById()
|
void PADConfigDialognJoy::OnSaveById()
|
||||||
|
@ -334,52 +290,11 @@ void PADConfigDialognJoy::OnSaveById()
|
||||||
void PADConfigDialognJoy::DoChangeJoystick()
|
void PADConfigDialognJoy::DoChangeJoystick()
|
||||||
{
|
{
|
||||||
// Before changing the pad we save potential changes to the current pad (to support SaveByID)
|
// Before changing the pad we save potential changes to the current pad (to support SaveByID)
|
||||||
WARN_LOG(PAD, "\n--- DoChangeJoystick ----");
|
|
||||||
WARN_LOG(PAD, "DoSave");
|
|
||||||
DoSave(true);
|
DoSave(true);
|
||||||
|
|
||||||
// Load the settings for the new ID
|
// Load the settings for the new Id
|
||||||
WARN_LOG(PAD, "Load");
|
|
||||||
g_Config.Load(true);
|
g_Config.Load(true);
|
||||||
// Update the GUI
|
UpdateGUI(notebookpage); // Update the GUI
|
||||||
WARN_LOG(PAD, "UpdateGUI");
|
|
||||||
UpdateGUI(notebookpage);
|
|
||||||
WARN_LOG(PAD, "");
|
|
||||||
}
|
|
||||||
// Pads have been connected/disconnected
|
|
||||||
void PADConfigDialognJoy::UpdateDeviceList()
|
|
||||||
{
|
|
||||||
if (!ControlsCreated) return;
|
|
||||||
|
|
||||||
DEBUG_LOG(PAD, "UpdateDeviceList");
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
// Save current selection
|
|
||||||
//std::string CurrentSel = m_Joyname[i]->GetValue().mb_str();
|
|
||||||
m_Joyname[i]->Clear();
|
|
||||||
|
|
||||||
// Search for devices and add them to the device list
|
|
||||||
if (joyinfo.size() > 0)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < joyinfo.size(); j++)
|
|
||||||
m_Joyname[i]->Append(wxString::FromAscii(joyinfo.at(j).Name.c_str()));
|
|
||||||
// Set selection
|
|
||||||
//PanicAlert("%s", PadMapping[i].Name.c_str());
|
|
||||||
for (int j = 0; j < joyinfo.size(); j++)
|
|
||||||
{
|
|
||||||
if (joyinfo.at(j).Name == PadMapping[i].Name) m_Joyname[i]->SetSelection(j);
|
|
||||||
}
|
|
||||||
if (m_Joyname[i]->GetSelection() == -1) m_Joyname[i]->SetSelection(0);
|
|
||||||
// Load settings
|
|
||||||
DoChangeJoystick();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_Joyname[i]->Append(wxString::FromAscii("<No Gamepad Detected>"));
|
|
||||||
m_Joyname[i]->SetSelection(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notebook page changed
|
// Notebook page changed
|
||||||
|
@ -420,28 +335,28 @@ void PADConfigDialognJoy::ToBlank(bool ToBlank)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Change settings for all slots that have this pad selected
|
// Change settings
|
||||||
// -----------------------
|
|
||||||
void PADConfigDialognJoy::SetButtonTextAll(int id, const char *text)
|
void PADConfigDialognJoy::SetButtonTextAll(int id, const char *text)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if (IDToName(PadMapping[i].ID) == IDToName(PadMapping[notebookpage].ID))
|
// Safety check to avoid crash
|
||||||
{
|
if (joyinfo.size() > (u32)PadMapping[i].ID)
|
||||||
|
if (joyinfo[PadMapping[i].ID].Name == joyinfo[PadMapping[notebookpage].ID].Name)
|
||||||
SetButtonText(id, text, i);
|
SetButtonText(id, text, i);
|
||||||
DEBUG_LOG(PAD, "Updated button text for slot %i", i);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void PADConfigDialognJoy::SaveButtonMappingAll(int Slot)
|
void PADConfigDialognJoy::SaveButtonMappingAll(int Slot)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if (PadMapping[i].Name.length() > 0 && PadMapping[i].Name == PadMapping[Slot].Name)
|
// This can occur when no gamepad is detected
|
||||||
|
if (joyinfo.size() > (u32)PadMapping[i].ID)
|
||||||
|
if (joyinfo[PadMapping[i].ID].Name == joyinfo[PadMapping[Slot].ID].Name)
|
||||||
SaveButtonMapping(i, false, Slot);
|
SaveButtonMapping(i, false, Slot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// -----------------------
|
|
||||||
|
|
||||||
void PADConfigDialognJoy::UpdateGUIAll(int Slot)
|
void PADConfigDialognJoy::UpdateGUIAll(int Slot)
|
||||||
{
|
{
|
||||||
|
@ -453,7 +368,9 @@ void PADConfigDialognJoy::UpdateGUIAll(int Slot)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if (IDToName(PadMapping[i].ID) == IDToName(PadMapping[Slot].ID))
|
// Safety check to avoid crash
|
||||||
|
if (joyinfo.size() > (u32)PadMapping[i].ID)
|
||||||
|
if (joyinfo[PadMapping[i].ID].Name == joyinfo[PadMapping[Slot].ID].Name)
|
||||||
UpdateGUI(i);
|
UpdateGUI(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -521,10 +438,8 @@ void PADConfigDialognJoy::ChangeSettings( wxCommandEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update all slots that use this device
|
// Update all slots that use this device
|
||||||
//if(g_Config.bSaveByID)
|
if(g_Config.bSaveByID) SaveButtonMappingAll(notebookpage);
|
||||||
SaveButtonMappingAll(notebookpage);
|
if(g_Config.bSaveByID) UpdateGUIAll(notebookpage);
|
||||||
//if(g_Config.bSaveByID)
|
|
||||||
UpdateGUIAll(notebookpage);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -532,18 +447,12 @@ void PADConfigDialognJoy::ChangeSettings( wxCommandEvent& event )
|
||||||
// Called from: CreateGUIControls(), ChangeControllertype()
|
// Called from: CreateGUIControls(), ChangeControllertype()
|
||||||
void PADConfigDialognJoy::UpdateGUI(int _notebookpage)
|
void PADConfigDialognJoy::UpdateGUI(int _notebookpage)
|
||||||
{
|
{
|
||||||
DEBUG_LOG(PAD, "UpdateGUI for slot %i, %i pads connected", _notebookpage, NumPads);
|
|
||||||
|
|
||||||
// If there are no good pads disable the entire notebook
|
// If there are no good pads disable the entire notebook
|
||||||
if (NumPads == 0)
|
if (NumGoodPads == 0)
|
||||||
{
|
{
|
||||||
m_Notebook->Enable(false);
|
m_Notebook->Enable(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
m_Notebook->Enable(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the GUI from PadMapping[]
|
// Update the GUI from PadMapping[]
|
||||||
UpdateGUIButtonMapping(_notebookpage);
|
UpdateGUIButtonMapping(_notebookpage);
|
||||||
|
@ -596,8 +505,6 @@ void PADConfigDialognJoy::UpdateGUI(int _notebookpage)
|
||||||
else m_CoBRadiusC[_notebookpage]->Enable(false);
|
else m_CoBRadiusC[_notebookpage]->Enable(false);
|
||||||
if (PadMapping[_notebookpage].bSquareToCircleC) m_CoBDiagonalC[_notebookpage]->Enable(true);
|
if (PadMapping[_notebookpage].bSquareToCircleC) m_CoBDiagonalC[_notebookpage]->Enable(true);
|
||||||
else m_CoBDiagonalC[_notebookpage]->Enable(false);
|
else m_CoBDiagonalC[_notebookpage]->Enable(false);
|
||||||
|
|
||||||
DEBUG_LOG(PAD, "Main radius %s", PadMapping[_notebookpage].bRadiusOnOff ? "enabled" : "disabled");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Repaint the background
|
// Repaint the background
|
||||||
|
@ -658,9 +565,24 @@ void PADConfigDialognJoy::CreateGUIControls()
|
||||||
m_Controller[3] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE4, wxDefaultPosition, wxDefaultSize);
|
m_Controller[3] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE4, wxDefaultPosition, wxDefaultSize);
|
||||||
m_Notebook->AddPage(m_Controller[3], wxT("Controller 4"));
|
m_Notebook->AddPage(m_Controller[3], wxT("Controller 4"));
|
||||||
|
|
||||||
|
|
||||||
// Define bitmap for EVT_PAINT
|
// Define bitmap for EVT_PAINT
|
||||||
WxStaticBitmap1_BITMAP = wxBitmap(ConfigBox_WxStaticBitmap1_XPM);
|
WxStaticBitmap1_BITMAP = wxBitmap(ConfigBox_WxStaticBitmap1_XPM);
|
||||||
|
|
||||||
|
// Search for devices and add them to the device list
|
||||||
|
wxArrayString arrayStringFor_Joyname; // The string array
|
||||||
|
if (NumGoodPads > 0)
|
||||||
|
{
|
||||||
|
for(int x = 0; (u32)x < joyinfo.size(); x++)
|
||||||
|
{
|
||||||
|
arrayStringFor_Joyname.Add(wxString::FromAscii(joyinfo[x].Name.c_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arrayStringFor_Joyname.Add(wxString::FromAscii("<No Gamepad Detected>"));
|
||||||
|
}
|
||||||
|
|
||||||
// Populate the DPad type and Trigger type list
|
// Populate the DPad type and Trigger type list
|
||||||
wxArrayString wxAS_DPadType;
|
wxArrayString wxAS_DPadType;
|
||||||
wxAS_DPadType.Add(wxString::FromAscii(DPadType[InputCommon::CTL_DPAD_HAT]));
|
wxAS_DPadType.Add(wxString::FromAscii(DPadType[InputCommon::CTL_DPAD_HAT]));
|
||||||
|
@ -799,9 +721,9 @@ void PADConfigDialognJoy::CreateGUIControls()
|
||||||
// Populate Controller sizer
|
// Populate Controller sizer
|
||||||
// Groups
|
// Groups
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(476, 21), 0, NULL, wxCB_READONLY);
|
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, arrayStringFor_Joyname[0], wxDefaultPosition, wxSize(476, 21), arrayStringFor_Joyname, wxCB_READONLY);
|
||||||
#else
|
#else
|
||||||
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(450, 25), 0, NULL, wxCB_READONLY);
|
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, arrayStringFor_Joyname[0], wxDefaultPosition, wxSize(450, 25), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_gJoyname[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Controller"));
|
m_gJoyname[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Controller"));
|
||||||
|
@ -1032,6 +954,9 @@ void PADConfigDialognJoy::CreateGUIControls()
|
||||||
|
|
||||||
// Show or hide it. We have to do this after we add it to its sizer
|
// Show or hide it. We have to do this after we add it to its sizer
|
||||||
m_sMainRight[i]->Show(g_Config.bShowAdvanced);
|
m_sMainRight[i]->Show(g_Config.bShowAdvanced);
|
||||||
|
|
||||||
|
// Update GUI
|
||||||
|
UpdateGUI(i);
|
||||||
} // end of loop
|
} // end of loop
|
||||||
|
|
||||||
// Populate buttons sizer.
|
// Populate buttons sizer.
|
||||||
|
@ -1050,7 +975,7 @@ void PADConfigDialognJoy::CreateGUIControls()
|
||||||
|
|
||||||
// Debugging
|
// Debugging
|
||||||
#ifdef SHOW_PAD_STATUS
|
#ifdef SHOW_PAD_STATUS
|
||||||
m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(135, 100), wxSize(200, -1));
|
m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(135, 100), wxDefaultSize);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Set window size
|
// Set window size
|
||||||
|
|
|
@ -62,17 +62,12 @@ class PADConfigDialognJoy : public wxDialog
|
||||||
long style = wxDEFAULT_DIALOG_STYLE);
|
long style = wxDEFAULT_DIALOG_STYLE);
|
||||||
virtual ~PADConfigDialognJoy();
|
virtual ~PADConfigDialognJoy();
|
||||||
|
|
||||||
// Timers
|
|
||||||
#if wxUSE_TIMER
|
#if wxUSE_TIMER
|
||||||
void OnSlowTimer(wxTimerEvent& WXUNUSED(event)) { UpdateSlow(); }
|
|
||||||
void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); }
|
void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); }
|
||||||
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
|
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
|
||||||
wxTimer *m_SlowTimer, *m_ConstantTimer, *m_ButtonMappingTimer;
|
wxTimer *m_ConstantTimer, *m_ButtonMappingTimer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Functions
|
|
||||||
void DoShow();
|
|
||||||
|
|
||||||
// Debugging
|
// Debugging
|
||||||
wxStaticText* m_pStatusBar, * m_pStatusBar2;
|
wxStaticText* m_pStatusBar, * m_pStatusBar2;
|
||||||
wxTextCtrl* m_TCDebugging;
|
wxTextCtrl* m_TCDebugging;
|
||||||
|
@ -200,10 +195,7 @@ class PADConfigDialognJoy : public wxDialog
|
||||||
*m_bmpSquare[4], *m_bmpDot[4], *m_bmpSquareOut[4], *m_bmpDotOut[4], *m_bmpAreaOut[4],
|
*m_bmpSquare[4], *m_bmpDot[4], *m_bmpSquareOut[4], *m_bmpDotOut[4], *m_bmpAreaOut[4],
|
||||||
*m_bmpSquareC[4], *m_bmpDotC[4], *m_bmpSquareOutC[4], *m_bmpDotOutC[4], *m_bmpAreaOutC[4];
|
*m_bmpSquareC[4], *m_bmpDotC[4], *m_bmpSquareOutC[4], *m_bmpDotOutC[4], *m_bmpAreaOutC[4];
|
||||||
|
|
||||||
// Settings
|
int notebookpage; bool ControlsCreated;
|
||||||
int notebookpage;
|
|
||||||
bool ControlsCreated;
|
|
||||||
bool LiveUpdates;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum
|
enum
|
||||||
|
@ -241,7 +233,7 @@ class PADConfigDialognJoy : public wxDialog
|
||||||
IDT_TRIGGERS, IDCB_CHECKFOCUS, IDCB_FILTER_SETTINGS,
|
IDT_TRIGGERS, IDCB_CHECKFOCUS, IDCB_FILTER_SETTINGS,
|
||||||
|
|
||||||
// Timers
|
// Timers
|
||||||
IDTM_SLOW, IDTM_CONSTANT, IDTM_BUTTON,
|
IDTM_CONSTANT, IDTM_BUTTON,
|
||||||
|
|
||||||
|
|
||||||
// ==============================================
|
// ==============================================
|
||||||
|
@ -324,8 +316,6 @@ class PADConfigDialognJoy : public wxDialog
|
||||||
void OKClick(wxCommandEvent& event);
|
void OKClick(wxCommandEvent& event);
|
||||||
void CancelClick(wxCommandEvent& event);
|
void CancelClick(wxCommandEvent& event);
|
||||||
void DoSave(bool ChangePad = false, int Slot = -1);
|
void DoSave(bool ChangePad = false, int Slot = -1);
|
||||||
void UpdateID();
|
|
||||||
void StartTimer();
|
|
||||||
|
|
||||||
void DoChangeJoystick();
|
void DoChangeJoystick();
|
||||||
|
|
||||||
|
@ -335,20 +325,18 @@ class PADConfigDialognJoy : public wxDialog
|
||||||
void ComboChange(wxCommandEvent& event);
|
void ComboChange(wxCommandEvent& event);
|
||||||
|
|
||||||
void OnClose(wxCloseEvent& event);
|
void OnClose(wxCloseEvent& event);
|
||||||
void UpdateDeviceList();
|
|
||||||
void CreateGUIControls();
|
void CreateGUIControls();
|
||||||
void CreateAdvancedControls(int i);
|
void CreateAdvancedControls(int i);
|
||||||
wxBitmap CreateBitmap();
|
wxBitmap CreateBitmap();
|
||||||
wxBitmap CreateBitmapDot();
|
wxBitmap CreateBitmapDot();
|
||||||
wxBitmap CreateBitmapArea(int,int);
|
wxBitmap CreateBitmapArea(int,int);
|
||||||
void PadShowStatus();
|
void PadGetStatus();
|
||||||
void UpdateSlow();
|
|
||||||
void Update();
|
void Update();
|
||||||
|
|
||||||
void UpdateGUIButtonMapping(int controller);
|
void UpdateGUIButtonMapping(int controller);
|
||||||
void SaveButtonMapping(int controller, bool DontChangeId = false, int FromSlot = -1);
|
void SaveButtonMapping(int controller, bool DontChangeId = false, int FromSlot = -1);
|
||||||
void SaveButtonMappingAll(int Slot);
|
void SaveButtonMappingAll(int Slot);
|
||||||
void UpdateGUIAll(int Slot = -1);
|
void UpdateGUIAll(int Slot);
|
||||||
void ToBlank(bool ToBlank = true);
|
void ToBlank(bool ToBlank = true);
|
||||||
void OnSaveById();
|
void OnSaveById();
|
||||||
|
|
||||||
|
|
|
@ -50,11 +50,8 @@ void PADConfigDialognJoy::UpdateGUIButtonMapping(int controller)
|
||||||
// http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString
|
// http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString
|
||||||
wxString tmp;
|
wxString tmp;
|
||||||
|
|
||||||
// Assert
|
|
||||||
//if (!ControlsCreated[i]) return;
|
|
||||||
|
|
||||||
// Update selected gamepad
|
// Update selected gamepad
|
||||||
m_Joyname[controller]->SetValue(wxString::FromAscii(PadMapping[controller].Name.c_str()));
|
m_Joyname[controller]->SetSelection(PadMapping[controller].ID);
|
||||||
|
|
||||||
tmp << PadMapping[controller].buttons[InputCommon::CTL_L_SHOULDER]; m_JoyShoulderL[controller]->SetValue(tmp); tmp.clear();
|
tmp << PadMapping[controller].buttons[InputCommon::CTL_L_SHOULDER]; m_JoyShoulderL[controller]->SetValue(tmp); tmp.clear();
|
||||||
tmp << PadMapping[controller].buttons[InputCommon::CTL_R_SHOULDER]; m_JoyShoulderR[controller]->SetValue(tmp); tmp.clear();
|
tmp << PadMapping[controller].buttons[InputCommon::CTL_R_SHOULDER]; m_JoyShoulderR[controller]->SetValue(tmp); tmp.clear();
|
||||||
|
@ -103,7 +100,6 @@ void PADConfigDialognJoy::UpdateGUIButtonMapping(int controller)
|
||||||
tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_RIGHT]; m_JoyDpadRight[controller]->SetValue(tmp); tmp.clear();
|
tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_RIGHT]; m_JoyDpadRight[controller]->SetValue(tmp); tmp.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
NOTICE_LOG(PAD, "Loaded from PadMapping[%i] to slot %i", controller, controller);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Populate the PadMapping array with the dialog items settings (for example
|
/* Populate the PadMapping array with the dialog items settings (for example
|
||||||
|
@ -121,21 +117,7 @@ void PADConfigDialognJoy::SaveButtonMapping(int controller, bool DontChangeId, i
|
||||||
ToBlank(false);
|
ToBlank(false);
|
||||||
|
|
||||||
// Set other settings
|
// Set other settings
|
||||||
if(!DontChangeId)
|
if(!DontChangeId) PadMapping[controller].ID = m_Joyname[FromSlot]->GetSelection();
|
||||||
{
|
|
||||||
if (joyinfo.size() > m_Joyname[FromSlot]->GetSelection())
|
|
||||||
{
|
|
||||||
INFO_LOG(PAD, "%i: Changed PadMapping ID from %i to %i", controller, PadMapping[controller].ID, joyinfo.at(m_Joyname[FromSlot]->GetSelection()).ID);
|
|
||||||
PadMapping[controller].ID = joyinfo.at(m_Joyname[FromSlot]->GetSelection()).ID;
|
|
||||||
}
|
|
||||||
//else
|
|
||||||
// Assert
|
|
||||||
PadMapping[controller].Name = m_Joyname[FromSlot]->GetValue().mb_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
NOTICE_LOG(PAD, "Saved PadMapping[%i] from slot %i", controller, FromSlot);
|
|
||||||
|
|
||||||
// Settings
|
|
||||||
PadMapping[controller].controllertype = m_ControlType[FromSlot]->GetSelection();
|
PadMapping[controller].controllertype = m_ControlType[FromSlot]->GetSelection();
|
||||||
PadMapping[controller].triggertype = m_TriggerType[FromSlot]->GetSelection();
|
PadMapping[controller].triggertype = m_TriggerType[FromSlot]->GetSelection();
|
||||||
PadMapping[controller].deadzone = m_Deadzone[FromSlot]->GetSelection();
|
PadMapping[controller].deadzone = m_Deadzone[FromSlot]->GetSelection();
|
||||||
|
@ -282,13 +264,6 @@ void PADConfigDialognJoy::GetButtons(wxCommandEvent& event)
|
||||||
|
|
||||||
void PADConfigDialognJoy::DoGetButtons(int GetId)
|
void PADConfigDialognJoy::DoGetButtons(int GetId)
|
||||||
{
|
{
|
||||||
//INFO_LOG(PAD, "DoGetButtons: %i", GetId);
|
|
||||||
|
|
||||||
if (!SDLPolling || SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE) return;
|
|
||||||
|
|
||||||
// Turn off live updates because the change the joy handles
|
|
||||||
LiveUpdates = false;
|
|
||||||
|
|
||||||
// =============================================
|
// =============================================
|
||||||
// Collect the starting values
|
// Collect the starting values
|
||||||
// ----------------
|
// ----------------
|
||||||
|
@ -305,7 +280,7 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
|
||||||
int Axes = SDL_JoystickNumAxes(joy);
|
int Axes = SDL_JoystickNumAxes(joy);
|
||||||
int Hats = SDL_JoystickNumHats(joy);
|
int Hats = SDL_JoystickNumHats(joy);
|
||||||
|
|
||||||
//NOTICE_LOG(PAD, "PadID: %i Axes: %i Handle: %i\n", PadID, joyinfo[PadID].NumAxes, joyinfo[PadID].joy);
|
INFO_LOG(CONSOLE, "PadID: %i Axes: %i\n", PadID, joyinfo[PadID].NumAxes, joyinfo[PadID].joy);
|
||||||
|
|
||||||
// Get the controller and trigger type
|
// Get the controller and trigger type
|
||||||
int ControllerType = PadMapping[Controller].controllertype;
|
int ControllerType = PadMapping[Controller].controllertype;
|
||||||
|
@ -368,8 +343,6 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
|
||||||
#if wxUSE_TIMER
|
#if wxUSE_TIMER
|
||||||
m_ButtonMappingTimer->Start( floor((double)(1000 / TimesPerSecond)) );
|
m_ButtonMappingTimer->Start( floor((double)(1000 / TimesPerSecond)) );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//INFO_LOG(PAD, "Timer started");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===============================================
|
// ===============================================
|
||||||
|
@ -380,7 +353,7 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
InputCommon::GetButton(
|
InputCommon::GetButton(
|
||||||
joy, PadID,
|
joy, PadID, Buttons, Axes, Hats,
|
||||||
g_Pressed, value, type, pressed, Succeed, Stop,
|
g_Pressed, value, type, pressed, Succeed, Stop,
|
||||||
LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter);
|
LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter);
|
||||||
}
|
}
|
||||||
|
@ -416,8 +389,6 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
|
||||||
// If we got a button
|
// If we got a button
|
||||||
if(Succeed)
|
if(Succeed)
|
||||||
{
|
{
|
||||||
//INFO_LOG(PAD, "Button mapping succeeded: %i", pressed);
|
|
||||||
|
|
||||||
Stop = true;
|
Stop = true;
|
||||||
// Write the number of the pressed button to the text box
|
// Write the number of the pressed button to the text box
|
||||||
sprintf(format, "%d", pressed);
|
sprintf(format, "%d", pressed);
|
||||||
|
@ -429,8 +400,6 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
|
||||||
{
|
{
|
||||||
m_ButtonMappingTimer->Stop();
|
m_ButtonMappingTimer->Stop();
|
||||||
GetButtonWaitingTimer = 0;
|
GetButtonWaitingTimer = 0;
|
||||||
LiveUpdates = true;
|
|
||||||
//INFO_LOG(PAD, "Timer stopped");
|
|
||||||
|
|
||||||
/* Update the button mapping for all slots that use this device. (It doesn't make sense to have several slots
|
/* Update the button mapping for all slots that use this device. (It doesn't make sense to have several slots
|
||||||
controlled by the same device, but several DirectInput instances of different but identical devices may possible
|
controlled by the same device, but several DirectInput instances of different but identical devices may possible
|
||||||
|
|
|
@ -48,13 +48,7 @@ std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
|
||||||
InputCommon::CONTROLLER_STATE PadState[4];
|
InputCommon::CONTROLLER_STATE PadState[4];
|
||||||
InputCommon::CONTROLLER_MAPPING PadMapping[4];
|
InputCommon::CONTROLLER_MAPPING PadMapping[4];
|
||||||
bool g_EmulatorRunning = false;
|
bool g_EmulatorRunning = false;
|
||||||
bool SDLPolling = true;
|
int NumPads = 0, NumGoodPads = 0, LastPad = 0;
|
||||||
#ifdef _WIN32
|
|
||||||
bool LiveUpdates = false;
|
|
||||||
#else
|
|
||||||
bool LiveUpdates = false;
|
|
||||||
#endif
|
|
||||||
int NumPads = 0, NumDIDevices = -1, LastPad = 0;
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
HWND m_hWnd = NULL, m_hConsole = NULL; // Handle to window
|
HWND m_hWnd = NULL, m_hConsole = NULL; // Handle to window
|
||||||
#endif
|
#endif
|
||||||
|
@ -160,9 +154,11 @@ void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals)
|
||||||
// ------------------
|
// ------------------
|
||||||
void DllConfig(HWND _hParent)
|
void DllConfig(HWND _hParent)
|
||||||
{
|
{
|
||||||
|
// Init Joystick + Haptic (force feedback) subsystem on SDL 1.3
|
||||||
// Populate joyinfo for all attached devices
|
// Populate joyinfo for all attached devices
|
||||||
LocalSearchDevices(joyinfo, NumPads);
|
Search_Devices(joyinfo, NumPads, NumGoodPads);
|
||||||
//g_Config.Load(); // load settings
|
|
||||||
|
g_Config.Load(); // load settings
|
||||||
|
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
if (!m_ConfigFrame)
|
if (!m_ConfigFrame)
|
||||||
|
@ -172,7 +168,7 @@ void DllConfig(HWND _hParent)
|
||||||
|
|
||||||
// Only allow one open at a time
|
// Only allow one open at a time
|
||||||
if (!m_ConfigFrame->IsShown())
|
if (!m_ConfigFrame->IsShown())
|
||||||
m_ConfigFrame->DoShow();
|
m_ConfigFrame->ShowModal();
|
||||||
else
|
else
|
||||||
m_ConfigFrame->Hide();
|
m_ConfigFrame->Hide();
|
||||||
#endif
|
#endif
|
||||||
|
@ -198,7 +194,7 @@ void Initialize(void *init)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Populate joyinfo for all attached devices
|
// Populate joyinfo for all attached devices
|
||||||
LocalSearchDevices(joyinfo, NumPads);
|
Search_Devices(joyinfo, NumPads, NumGoodPads);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shutdown PAD (stop emulation)
|
// Shutdown PAD (stop emulation)
|
||||||
|
@ -225,6 +221,7 @@ void Shutdown()
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if (joyinfo.size() > (u32)PadMapping[i].ID)
|
if (joyinfo.size() > (u32)PadMapping[i].ID)
|
||||||
|
if (joyinfo.at(PadMapping[i].ID).Good)
|
||||||
if(SDL_JoystickOpened(PadMapping[i].ID))
|
if(SDL_JoystickOpened(PadMapping[i].ID))
|
||||||
{
|
{
|
||||||
SDL_JoystickClose(PadState[i].joy);
|
SDL_JoystickClose(PadState[i].joy);
|
||||||
|
@ -235,6 +232,7 @@ void Shutdown()
|
||||||
// Clear the physical device info
|
// Clear the physical device info
|
||||||
joyinfo.clear();
|
joyinfo.clear();
|
||||||
NumPads = 0;
|
NumPads = 0;
|
||||||
|
NumGoodPads = 0;
|
||||||
|
|
||||||
// Finally close SDL
|
// Finally close SDL
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
@ -285,12 +283,6 @@ void DoState(unsigned char **ptr, int mode)
|
||||||
// Function: Gives the current pad status to the Core
|
// Function: Gives the current pad status to the Core
|
||||||
void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||||
{
|
{
|
||||||
if (!IsPolling()) return;
|
|
||||||
|
|
||||||
// Update joyinfo handles. This is in case the Wiimote plugin has restarted SDL after a pad was conencted/disconnected
|
|
||||||
// so that the handles are updated.
|
|
||||||
if (LiveUpdates) LocalSearchDevices(joyinfo, NumPads);
|
|
||||||
|
|
||||||
// Check if the pad is avaliable, currently we don't disable pads just because they are
|
// Check if the pad is avaliable, currently we don't disable pads just because they are
|
||||||
// disconnected
|
// disconnected
|
||||||
if (!PadState[_numPAD].joy) return;
|
if (!PadState[_numPAD].joy) return;
|
||||||
|
@ -300,7 +292,7 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||||
|
|
||||||
// Check that Dolphin is in focus, otherwise don't update the pad status
|
// Check that Dolphin is in focus, otherwise don't update the pad status
|
||||||
if (g_Config.bCheckFocus || IsFocus())
|
if (g_Config.bCheckFocus || IsFocus())
|
||||||
GetJoyState(PadState[_numPAD], PadMapping[_numPAD]);
|
GetJoyState(PadState[_numPAD], PadMapping[_numPAD], _numPAD, joyinfo[PadMapping[_numPAD].ID].NumButtons);
|
||||||
|
|
||||||
// Get type
|
// Get type
|
||||||
int TriggerType = PadMapping[_numPAD].triggertype;
|
int TriggerType = PadMapping[_numPAD].triggertype;
|
||||||
|
@ -447,127 +439,29 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||||
|
|
||||||
// Search for SDL devices
|
// Search for SDL devices
|
||||||
// ----------------
|
// ----------------
|
||||||
|
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
|
||||||
bool LocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
|
||||||
{
|
{
|
||||||
//DEBUG_LOG(PAD, "LocalSearchDevices");
|
bool Success = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
|
||||||
bool Success = InputCommon::SearchDevices(_joyinfo, _NumPads);
|
|
||||||
|
|
||||||
DoLocalSearchDevices(_joyinfo, _NumPads);
|
// Warn the user if no gamepads are detected
|
||||||
|
if (_NumGoodPads == 0 && g_EmulatorRunning)
|
||||||
return Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LocalSearchDevicesReset(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
|
||||||
{
|
{
|
||||||
//DEBUG_LOG(PAD, "LocalSearchDevicesUpdate: %i", IsPolling());
|
PanicAlert("nJoy: No Gamepad Detected");
|
||||||
// Turn off device polling while resetting
|
|
||||||
EnablePolling(false);
|
|
||||||
bool Success = InputCommon::SearchDevicesReset(_joyinfo, _NumPads);
|
|
||||||
DoLocalSearchDevices(_joyinfo, _NumPads);
|
|
||||||
EnablePolling(true);
|
|
||||||
|
|
||||||
return Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool DoLocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
|
|
||||||
{
|
|
||||||
// Don't warn the user if no gamepads are detected. If the pad doesn't respond he will open the configuration and fix it.
|
|
||||||
// Also, if he's using a Wii game he may not care that the gamepad is turned off.
|
|
||||||
if (_NumPads == 0 && g_EmulatorRunning)
|
|
||||||
{
|
|
||||||
//PanicAlert("nJoy: No Gamepad Detected");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the first time
|
// Load PadMapping[] etc
|
||||||
if (!g_Config.Loaded) g_Config.Load();
|
g_Config.Load();
|
||||||
|
|
||||||
// Update the PadState[].joy handle
|
// Update the PadState[].joy handle
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < joyinfo.size(); j++)
|
if (joyinfo.size() > (u32)PadMapping[i].ID)
|
||||||
{
|
if(joyinfo.at(PadMapping[i].ID).Good)
|
||||||
if (joyinfo.at(j).Name == PadMapping[i].Name)
|
PadState[i].joy = SDL_JoystickOpen(PadMapping[i].ID);
|
||||||
{
|
|
||||||
PadState[i].joy = joyinfo.at(j).joy;
|
|
||||||
//DEBUG_LOG(PAD, "Slot %i: %s", i, joyinfo.at(j).Name.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return Success;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Is the device connected?
|
|
||||||
// ----------------
|
|
||||||
bool IsConnected(std::string Name)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < joyinfo.size(); i++)
|
|
||||||
{
|
|
||||||
//DEBUG_LOG(PAD, "IDToName: ID %i id %i %s", ID, i, joyinfo.at(i).Name.c_str());
|
|
||||||
if (joyinfo.at(i).Name == Name)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// It could be possible to crash SDL.dll if SDL functions are called during SDL_Quit/SDL_Init. Therefore these functions.
|
|
||||||
// ----------------
|
|
||||||
bool IsPolling()
|
|
||||||
{
|
|
||||||
if (!SDLPolling || SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE)
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
void EnablePolling(bool Enable)
|
|
||||||
{
|
|
||||||
if (Enable)
|
|
||||||
{
|
|
||||||
SDLPolling = true;
|
|
||||||
SDL_JoystickEventState(SDL_IGNORE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SDLPolling = false;
|
|
||||||
SDL_JoystickEventState(SDL_ENABLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ID to Name
|
|
||||||
// ----------------
|
|
||||||
std::string IDToName(int ID)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < joyinfo.size(); i++)
|
|
||||||
{
|
|
||||||
//DEBUG_LOG(PAD, "IDToName: ID %i id %i %s", ID, i, joyinfo.at(i).Name.c_str());
|
|
||||||
if (joyinfo.at(i).ID == ID)
|
|
||||||
return joyinfo.at(i).Name;
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// ID to id - Get the gamepad id from a device ID (the ids will be all or some of the IDs)
|
|
||||||
// ----------------
|
|
||||||
int IDToid(int ID)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < joyinfo.size(); i++)
|
|
||||||
{
|
|
||||||
if (joyinfo.at(i).ID == ID)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
if (joyinfo.size() > 0)
|
|
||||||
{
|
|
||||||
ERROR_LOG(PAD, "IDToid error");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PanicAlert("Error in IDToid. The plugin may crash.");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -95,24 +95,13 @@
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
extern HWND m_hWnd, m_hConsole; // Handle to window
|
extern HWND m_hWnd, m_hConsole; // Handle to window
|
||||||
#endif
|
#endif
|
||||||
extern int NumPads, NumDIDevices, LastPad; // Number of pads
|
extern int NumPads, NumGoodPads, LastPad; // Number of goods pads
|
||||||
extern bool SDLPolling;
|
|
||||||
extern bool LiveUpdates;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Custom Functions
|
// Custom Functions
|
||||||
// ----------------
|
// ----------------
|
||||||
bool LocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
|
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads);
|
||||||
bool LocalSearchDevicesReset(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
|
|
||||||
bool DoLocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
|
|
||||||
int SearchDIDevices();
|
|
||||||
bool IsConnected(std::string Name);
|
|
||||||
bool IsPolling();
|
|
||||||
void EnablePolling(bool Enable);
|
|
||||||
std::string IDToName(int ID);
|
|
||||||
bool IsConnected(std::string Name);
|
|
||||||
int IDToid(int ID);
|
|
||||||
void DEBUG_INIT();
|
void DEBUG_INIT();
|
||||||
void DEBUG_QUIT();
|
void DEBUG_QUIT();
|
||||||
bool IsFocus();
|
bool IsFocus();
|
||||||
|
|
Loading…
Reference in New Issue