mirror of https://github.com/AxioDL/metaforce.git
Restructure event handling
This commit is contained in:
parent
4bfe4026f2
commit
5229f95fb7
|
@ -12,7 +12,9 @@ class CIOWin;
|
||||||
enum class EArchMsgTarget
|
enum class EArchMsgTarget
|
||||||
{
|
{
|
||||||
IOWinManager = 0,
|
IOWinManager = 0,
|
||||||
Game = 1
|
Game = 1,
|
||||||
|
/* PathShagged targets, we start at 255 */
|
||||||
|
ArchitectureSupport = 255,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class EArchMsgType
|
enum class EArchMsgType
|
||||||
|
@ -28,6 +30,8 @@ enum class EArchMsgType
|
||||||
QuitGameplay = 8,
|
QuitGameplay = 8,
|
||||||
UpdateBegin = 10,
|
UpdateBegin = 10,
|
||||||
FrameBegin = 11,
|
FrameBegin = 11,
|
||||||
|
/* PathShagged messages, we start at 255 */
|
||||||
|
ApplicationExit = 255,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct IArchMsgParm
|
struct IArchMsgParm
|
||||||
|
@ -143,6 +147,11 @@ public:
|
||||||
{
|
{
|
||||||
return *msg.GetParm<CArchMsgParmVoidPtr>();
|
return *msg.GetParm<CArchMsgParmVoidPtr>();
|
||||||
}
|
}
|
||||||
|
/* PathShagged Messages */
|
||||||
|
static CArchitectureMessage CreateApplicationExit(EArchMsgTarget target)
|
||||||
|
{
|
||||||
|
return CArchitectureMessage(target, EArchMsgType::ApplicationExit, new CArchMsgParmNull());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace pshag
|
||||||
void CInputGenerator::Update(float dt, CArchitectureQueue& queue)
|
void CInputGenerator::Update(float dt, CArchitectureQueue& queue)
|
||||||
{
|
{
|
||||||
/* Keyboard/Mouse first */
|
/* Keyboard/Mouse first */
|
||||||
CFinalInput kbInput = m_windowCb.getFinalInput(0, dt);
|
CFinalInput kbInput = getFinalInput(0, dt);
|
||||||
bool kbUsed = false;
|
bool kbUsed = false;
|
||||||
|
|
||||||
/* Dolphin controllers next */
|
/* Dolphin controllers next */
|
||||||
|
|
|
@ -24,6 +24,7 @@ class CInputGenerator : public boo::DeviceFinder
|
||||||
* the logical state */
|
* the logical state */
|
||||||
float m_leftDiv;
|
float m_leftDiv;
|
||||||
float m_rightDiv;
|
float m_rightDiv;
|
||||||
|
CKeyboardMouseControllerData m_data;
|
||||||
public:
|
public:
|
||||||
CInputGenerator(float leftDiv, float rightDiv)
|
CInputGenerator(float leftDiv, float rightDiv)
|
||||||
: boo::DeviceFinder({typeid(boo::DolphinSmashAdapter)}),
|
: boo::DeviceFinder({typeid(boo::DolphinSmashAdapter)}),
|
||||||
|
@ -35,70 +36,66 @@ public:
|
||||||
* for buffering events in its own way, then boo flushes the buffer
|
* for buffering events in its own way, then boo flushes the buffer
|
||||||
* at the start of each frame, invoking these methods. No atomic locking
|
* at the start of each frame, invoking these methods. No atomic locking
|
||||||
* is necessary, only absolute state tracking. */
|
* is necessary, only absolute state tracking. */
|
||||||
struct WindowCallback : boo::IWindowCallback
|
|
||||||
|
void mouseDown(const boo::SWindowCoord&, boo::EMouseButton button, boo::EModifierKey)
|
||||||
{
|
{
|
||||||
CKeyboardMouseControllerData m_data;
|
m_data.m_mouseButtons[int(button)] = true;
|
||||||
|
}
|
||||||
|
void mouseUp(const boo::SWindowCoord&, boo::EMouseButton button, boo::EModifierKey)
|
||||||
|
{
|
||||||
|
m_data.m_mouseButtons[int(button)] = false;
|
||||||
|
}
|
||||||
|
void mouseMove(const boo::SWindowCoord& coord)
|
||||||
|
{
|
||||||
|
m_data.m_mouseCoord = coord;
|
||||||
|
}
|
||||||
|
void scroll(const boo::SWindowCoord&, const boo::SScrollDelta& scroll)
|
||||||
|
{
|
||||||
|
m_data.m_accumScroll += scroll;
|
||||||
|
}
|
||||||
|
|
||||||
void mouseDown(const boo::SWindowCoord&, boo::EMouseButton button, boo::EModifierKey)
|
void charKeyDown(unsigned long charCode, boo::EModifierKey, bool)
|
||||||
{
|
{
|
||||||
m_data.m_mouseButtons[int(button)] = true;
|
charCode = tolower(charCode);
|
||||||
}
|
if (charCode > 255)
|
||||||
void mouseUp(const boo::SWindowCoord&, boo::EMouseButton button, boo::EModifierKey)
|
return;
|
||||||
{
|
m_data.m_charKeys[charCode] = true;
|
||||||
m_data.m_mouseButtons[int(button)] = false;
|
}
|
||||||
}
|
void charKeyUp(unsigned long charCode, boo::EModifierKey mods)
|
||||||
void mouseMove(const boo::SWindowCoord& coord)
|
{
|
||||||
{
|
charCode = tolower(charCode);
|
||||||
m_data.m_mouseCoord = coord;
|
if (charCode > 255)
|
||||||
}
|
return;
|
||||||
void scroll(const boo::SWindowCoord&, const boo::SScrollDelta& scroll)
|
m_data.m_charKeys[charCode] = false;
|
||||||
{
|
}
|
||||||
m_data.m_accumScroll += scroll;
|
void specialKeyDown(boo::ESpecialKey key, boo::EModifierKey, bool)
|
||||||
}
|
{
|
||||||
|
m_data.m_specialKeys[int(key)] = true;
|
||||||
|
}
|
||||||
|
void specialKeyUp(boo::ESpecialKey key, boo::EModifierKey)
|
||||||
|
{
|
||||||
|
m_data.m_specialKeys[int(key)] = false;
|
||||||
|
}
|
||||||
|
void modKeyDown(boo::EModifierKey mod, bool)
|
||||||
|
{
|
||||||
|
m_data.m_modMask = m_data.m_modMask | mod;
|
||||||
|
}
|
||||||
|
void modKeyUp(boo::EModifierKey mod)
|
||||||
|
{
|
||||||
|
m_data.m_modMask = m_data.m_modMask & ~mod;
|
||||||
|
}
|
||||||
|
|
||||||
void charKeyDown(unsigned long charCode, boo::EModifierKey, bool)
|
void reset()
|
||||||
{
|
{
|
||||||
charCode = tolower(charCode);
|
m_data.m_accumScroll.zeroOut();
|
||||||
if (charCode > 255)
|
}
|
||||||
return;
|
|
||||||
m_data.m_charKeys[charCode] = true;
|
|
||||||
}
|
|
||||||
void charKeyUp(unsigned long charCode, boo::EModifierKey mods)
|
|
||||||
{
|
|
||||||
charCode = tolower(charCode);
|
|
||||||
if (charCode > 255)
|
|
||||||
return;
|
|
||||||
m_data.m_charKeys[charCode] = false;
|
|
||||||
}
|
|
||||||
void specialKeyDown(boo::ESpecialKey key, boo::EModifierKey, bool)
|
|
||||||
{
|
|
||||||
m_data.m_specialKeys[int(key)] = true;
|
|
||||||
}
|
|
||||||
void specialKeyUp(boo::ESpecialKey key, boo::EModifierKey)
|
|
||||||
{
|
|
||||||
m_data.m_specialKeys[int(key)] = false;
|
|
||||||
}
|
|
||||||
void modKeyDown(boo::EModifierKey mod, bool)
|
|
||||||
{
|
|
||||||
m_data.m_modMask = m_data.m_modMask | mod;
|
|
||||||
}
|
|
||||||
void modKeyUp(boo::EModifierKey mod)
|
|
||||||
{
|
|
||||||
m_data.m_modMask = m_data.m_modMask & ~mod;
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset()
|
CFinalInput m_lastUpdate;
|
||||||
{
|
const CFinalInput& getFinalInput(unsigned idx, float dt)
|
||||||
m_data.m_accumScroll.zeroOut();
|
{
|
||||||
}
|
m_lastUpdate = CFinalInput(idx, dt, m_data, m_lastUpdate);
|
||||||
|
return m_lastUpdate;
|
||||||
CFinalInput m_lastUpdate;
|
}
|
||||||
const CFinalInput& getFinalInput(unsigned idx, float dt)
|
|
||||||
{
|
|
||||||
m_lastUpdate = CFinalInput(idx, dt, m_data, m_lastUpdate);
|
|
||||||
return m_lastUpdate;
|
|
||||||
}
|
|
||||||
} m_windowCb;
|
|
||||||
|
|
||||||
/* Input via the smash adapter is received asynchronously on a USB
|
/* Input via the smash adapter is received asynchronously on a USB
|
||||||
* report thread. This class atomically exchanges that data to the
|
* report thread. This class atomically exchanges that data to the
|
||||||
|
|
|
@ -98,7 +98,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CGameArchitectureSupport
|
class CGameArchitectureSupport : public boo::IWindowCallback
|
||||||
{
|
{
|
||||||
CArchitectureQueue m_archQueue;
|
CArchitectureQueue m_archQueue;
|
||||||
CAudioSys m_audioSys;
|
CAudioSys m_audioSys;
|
||||||
|
@ -109,6 +109,30 @@ class CGameArchitectureSupport
|
||||||
CMainFlow m_mainFlow;
|
CMainFlow m_mainFlow;
|
||||||
CConsoleOutputWindow m_consoleWindow;
|
CConsoleOutputWindow m_consoleWindow;
|
||||||
CAudioStateWin m_audioStateWin;
|
CAudioStateWin m_audioStateWin;
|
||||||
|
|
||||||
|
void mouseDown(const boo::SWindowCoord &coord, boo::EMouseButton button, boo::EModifierKey mods)
|
||||||
|
{ m_inputGenerator.mouseDown(coord, button, mods); }
|
||||||
|
void mouseUp(const boo::SWindowCoord &coord, boo::EMouseButton button, boo::EModifierKey mods)
|
||||||
|
{ m_inputGenerator.mouseUp(coord, button, mods); }
|
||||||
|
void mouseMove(const boo::SWindowCoord &coord)
|
||||||
|
{ m_inputGenerator.mouseMove(coord); }
|
||||||
|
void scroll(const boo::SWindowCoord &coord, const boo::SScrollDelta &scroll)
|
||||||
|
{ m_inputGenerator.scroll(coord, scroll); }
|
||||||
|
void charKeyDown(unsigned long charCode, boo::EModifierKey mods, bool isRepeat)
|
||||||
|
{ m_inputGenerator.charKeyDown(charCode, mods, isRepeat); }
|
||||||
|
void charKeyUp(unsigned long charCode, boo::EModifierKey mods)
|
||||||
|
{ m_inputGenerator.charKeyUp(charCode, mods); }
|
||||||
|
void specialKeyDown(boo::ESpecialKey key, boo::EModifierKey mods, bool isRepeat)
|
||||||
|
{ m_inputGenerator.specialKeyDown(key, mods, isRepeat); }
|
||||||
|
void specialKeyUp(boo::ESpecialKey key, boo::EModifierKey mods)
|
||||||
|
{ m_inputGenerator.specialKeyUp(key, mods); }
|
||||||
|
void modKeyDown(boo::EModifierKey mod, bool isRepeat)
|
||||||
|
{ m_inputGenerator.modKeyDown(mod, isRepeat);}
|
||||||
|
void modKeyUp(boo::EModifierKey mod)
|
||||||
|
{ m_inputGenerator.modKeyUp(mod); }
|
||||||
|
|
||||||
|
void destroyed() { m_archQueue.Push(std::move(MakeMsg::CreateApplicationExit(EArchMsgTarget::ArchitectureSupport))); }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CGameArchitectureSupport()
|
CGameArchitectureSupport()
|
||||||
: m_audioSys(0,0,0,0,0),
|
: m_audioSys(0,0,0,0,0),
|
||||||
|
@ -120,6 +144,24 @@ public:
|
||||||
bool Update()
|
bool Update()
|
||||||
{
|
{
|
||||||
bool finished = false;
|
bool finished = false;
|
||||||
|
m_inputGenerator.Update(1.0 / 60.0, m_archQueue);
|
||||||
|
|
||||||
|
while(m_archQueue)
|
||||||
|
{
|
||||||
|
CArchitectureMessage msg = m_archQueue.Pop();
|
||||||
|
if (msg.GetTarget() == EArchMsgTarget::ArchitectureSupport)
|
||||||
|
{
|
||||||
|
if (msg.GetType() == EArchMsgType::ApplicationExit)
|
||||||
|
finished = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.GetTarget() == EArchMsgTarget::Game && msg.GetType() == EArchMsgType::UserInput)
|
||||||
|
{
|
||||||
|
const CArchMsgParmUserInput* input = msg.GetParm<CArchMsgParmUserInput>();
|
||||||
|
if (input->x4_parm.DStart())
|
||||||
|
m_archQueue.Push(std::move(MakeMsg::CreateApplicationExit(EArchMsgTarget::ArchitectureSupport)));
|
||||||
|
}
|
||||||
|
}
|
||||||
return finished;
|
return finished;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -177,6 +219,7 @@ int CMain::appMain(boo::IApplication* app)
|
||||||
g_TweakManager->ReadFromMemoryCard("AudioTweaks");
|
g_TweakManager->ReadFromMemoryCard("AudioTweaks");
|
||||||
FillInAssetIDs();
|
FillInAssetIDs();
|
||||||
TOneStatic<CGameArchitectureSupport> archSupport;
|
TOneStatic<CGameArchitectureSupport> archSupport;
|
||||||
|
mainWindow->setCallback(archSupport.GetAllocSpace());
|
||||||
|
|
||||||
boo::IGraphicsCommandQueue* gfxQ = mainWindow->getCommandQueue();
|
boo::IGraphicsCommandQueue* gfxQ = mainWindow->getCommandQueue();
|
||||||
float rgba[4] = { 0.2f, 0.2f, 0.2f, 1.0f};
|
float rgba[4] = { 0.2f, 0.2f, 0.2f, 1.0f};
|
||||||
|
|
Loading…
Reference in New Issue