Skip to content

Commit

Permalink
Feature: add plugin module/feature (#5)
Browse files Browse the repository at this point in the history
* plugin: add plugin feature

1. plugin base
2. add gamepad-base plugin and it's extend -- gamepad base - fighting

* plugin: add Keyboard Base Plugin

add keyboard base plugin

Signed-off-by: Sunrisepeak <speakshen@163.com>

* plugin: linux platform verify

linux platform verify and adjust

Signed-off-by: SPeak <speakshen@163.com>

---------

Signed-off-by: Sunrisepeak <speakshen@163.com>
Signed-off-by: SPeak <speakshen@163.com>
  • Loading branch information
Sunrisepeak authored Aug 1, 2023
1 parent 81ab779 commit bd9c878
Show file tree
Hide file tree
Showing 11 changed files with 490 additions and 184 deletions.
34 changes: 34 additions & 0 deletions include/KPlugin.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#ifndef __KPLUGIN_H__KHISTORY
#define __KPLUGIN_H__KHISTORY

#include <dstruct.hpp>
#include <dsvisual.hpp>

namespace khistory {

class KPluginInterface {
public: // interface
virtual void gameKeyLayoutVisualImpl() = 0;
virtual void updateKeyStatus(const dstruct::Vector<int> &keyVec /* key's press-info */) = 0;
public: // optional interface
virtual void gameKeyNameTableInit() { }
virtual void gameKeyColorTableInit() { }
public:
std::string getPluginName() const { return _mPluginNmae; }
protected:
std::string _mPluginNmae;
};

} // namespace khistory end


#define KPLUGIN_REGISTER(PLUGIN_TYPE) \
static khistory::PLUGIN_TYPE __gPlugin##PLUGIN_TYPE; \
auto __gUnused##PLUGIN_TYPE = khistory::KeyHistory::_registerPlugin(&__gPlugin##PLUGIN_TYPE);

#include "GamepadBasePlugin.kplugin.hpp"
#include "KeyboardBasePlugin.kplugin.hpp"

#include "GamepadBasePlugin-Fighting.kplugin.hpp"

#endif
12 changes: 7 additions & 5 deletions include/KeyHistory.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// dsvisual
#include <dsvisual.hpp>

#include "KPlugin.h"

namespace khistory {

class KeyHistory : public dsvisual::Widget {
Expand All @@ -20,9 +22,8 @@ class KeyHistory : public dsvisual::Widget {
KeyHistory();
public:
void setTransparency(int transparency = 50);
private:
void __gameKeyVisualImpl();
void __updateGameKeyHighlightVec(const __KeyData &);
// Note: if you haven't use KPLUGIN_REGISTER, then plugin's lifetime need greater than KeyHistory-Obj
static int _registerPlugin(KPluginInterface *plugin);
protected: // interface impl
void _drawBasicInfoImpl() override;
void _drawVisualImpl() override;
Expand All @@ -33,8 +34,9 @@ class KeyHistory : public dsvisual::Widget {
int _mKeyDetectFPS;
int _mTransparency;
dstruct::Deque<__KeyData> _mKeyHistoryQueue;
dstruct::Vector<ImVec4>_mGameKeyHighlightTable;
static dstruct::Vector<ImVec4>_mKeyColorMapTable;
static dstruct::Vector<ImVec4> _mKeyColorMapTable;
int _mCurrentPluginIndex;
static dstruct::Vector<KPluginInterface *> _mPluginVec;
};

}
Expand Down
38 changes: 19 additions & 19 deletions include/PAL.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,34 @@

namespace khistory {

#define KEY_NUMBERS (256 + 0x20)
#define KEYBOARD_KEY_NUMBERS 256
#define GAMEPAD_KEY_NUMBERS 0x20
#define KEY_NUMBERS (KEYBOARD_KEY_NUMBERS + GAMEPAD_KEY_NUMBERS)

class PAL {
public: // type
enum GamepadKey : int {
BASE_OFFSET = 256, // keyboard key-numbers
DPAD_LEFT = 0x0001,
DPAD_DOWN = 0x0004,
DPAD_UP = 0x0007,
DPAD_RIGHT = 0x0010,

DPAD_LEFT = BASE_OFFSET + 0x0001,
DPAD_DOWN = BASE_OFFSET + 0x0004,
DPAD_UP = BASE_OFFSET + 0x0007,
DPAD_RIGHT = BASE_OFFSET + 0x0010,
A = 0x0002,
B = 0x0005,
X = 0x0008,
Y = 0x000A,

A = BASE_OFFSET + 0x0002,
B = BASE_OFFSET + 0x0005,
X = BASE_OFFSET + 0x0008,
Y = BASE_OFFSET + 0x000A,
LEFT_BUMPER = 0x0003,
RIGHT_BUMPER = 0x0006,
LEFT_TRIGGER = 0x0009,
RIGHT_TRIGGER = 0x000B,

LEFT_BUMPER = BASE_OFFSET + 0x0003,
RIGHT_BUMPER = BASE_OFFSET + 0x0006,
LEFT_TRIGGER = BASE_OFFSET + 0x0009,
RIGHT_TRIGGER = BASE_OFFSET + 0x000B,

START = BASE_OFFSET + 0x0011,
BACK = BASE_OFFSET + 0x0012,
START = 0x0011,
BACK = 0x0012,

// thumb
LEFT_THUMB = BASE_OFFSET + 0x0013,
RIGHT_THUMB = BASE_OFFSET + 0x0014,
LEFT_THUMB = 0x0013,
RIGHT_THUMB = 0x0014,
};

struct KeyData {
Expand Down
27 changes: 27 additions & 0 deletions kplugin/GamepadBasePlugin-Fighting.kplugin.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#ifndef __GAMEPAD_BASE_PLUGIN_FIGHTING_HPP__KHISTORY
#define __GAMEPAD_BASE_PLUGIN_FIGHTING_HPP__KHISTORY

#include "GamepadBasePlugin.kplugin.hpp"

namespace khistory {

class GamepadBasePluginFighting : public GamepadBasePlugin {
public:
GamepadBasePluginFighting() : GamepadBasePlugin() {
_mPluginNmae = "Gamepad Base - Fighting";
}

public:
void gameKeyNameTableInit() override {
GamepadBasePlugin::gameKeyNameTableInit(); // default init

_mkeyNameTable[PAL::GamepadKey::DPAD_UP] = "8";
_mkeyNameTable[PAL::GamepadKey::DPAD_DOWN] = "2";
_mkeyNameTable[PAL::GamepadKey::DPAD_LEFT] = "4";
_mkeyNameTable[PAL::GamepadKey::DPAD_RIGHT] = "6";
}
};

}

#endif
158 changes: 158 additions & 0 deletions kplugin/GamepadBasePlugin.kplugin.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
#ifndef __GAMEPAD_BASE_PLUGIN_HPP__KHISTORY
#define __GAMEPAD_BASE_PLUGIN_HPP__KHISTORY

#include "KPlugin.h"
#include "PAL.h"

namespace khistory {

class GamepadBasePlugin : public KPluginInterface {

public:
GamepadBasePlugin() {
KPluginInterface::_mPluginNmae = "Gamepad Base";
for (auto &kStatus : __mkeyStatusTable) kStatus = false;
}

public: // interface impl
virtual void gameKeyNameTableInit() override {
_mkeyNameTable[PAL::GamepadKey::DPAD_UP] = "^";
_mkeyNameTable[PAL::GamepadKey::DPAD_DOWN] = "v";
_mkeyNameTable[PAL::GamepadKey::DPAD_LEFT] = "<";
_mkeyNameTable[PAL::GamepadKey::DPAD_RIGHT] = ">";
_mkeyNameTable[PAL::GamepadKey::START] = "START";
_mkeyNameTable[PAL::GamepadKey::BACK] = "BACK";
_mkeyNameTable[PAL::GamepadKey::A] = "A";
_mkeyNameTable[PAL::GamepadKey::B] = "B";
_mkeyNameTable[PAL::GamepadKey::X] = "X";
_mkeyNameTable[PAL::GamepadKey::Y] = "Y";

// L/R trigger/Bumper
_mkeyNameTable[PAL::GamepadKey::LEFT_BUMPER] = "LB";
_mkeyNameTable[PAL::GamepadKey::RIGHT_BUMPER] = "RB";
_mkeyNameTable[PAL::GamepadKey::LEFT_TRIGGER] = "LT";
_mkeyNameTable[PAL::GamepadKey::RIGHT_TRIGGER] = "RT";
}

virtual void gameKeyColorTableInit() override {
// gamepad key-color init
_mGameKeyColorTable[PAL::GamepadKey::DPAD_UP] = ImVec4(229 / 255.0f, 153 / 255.0f, 1.0f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::DPAD_DOWN] = ImVec4(229 / 255.0f, 153 / 255.0f, 1.0f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::DPAD_LEFT] = ImVec4(229 / 255.0f, 153 / 255.0f, 1.0f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::DPAD_RIGHT] = ImVec4(229 / 255.0f, 153 / 255.0f, 1.0f, 0.5f);

_mGameKeyColorTable[PAL::GamepadKey::START] = ImVec4(0.6f, 0.7f, 0.8f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::BACK] = ImVec4(0.8f, 0.7f, 0.6f, 0.5f);

_mGameKeyColorTable[PAL::GamepadKey::A] = ImVec4(178 / 255.0f, 1.0f, 102 / 255.0f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::B] = ImVec4(255 / 255.0f, 102 / 255.0f, 102 / 255.0f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::X] = ImVec4(0.0f, 1.0f, 1.0f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::Y] = ImVec4(1.0f, 1.0f, 0.0f, 0.5f);

_mGameKeyColorTable[PAL::GamepadKey::LEFT_BUMPER] = ImVec4(128 / 255.0f, 0.0f, 128 / 255.0f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::RIGHT_BUMPER] = ImVec4(128 / 255.0f, 0.0f, 128 / 255.0f, 0.5f);
_mGameKeyColorTable[PAL::GamepadKey::LEFT_TRIGGER] = ImVec4(0.3f, 0.3f, 0.3f, 0.8f);
_mGameKeyColorTable[PAL::GamepadKey::RIGHT_TRIGGER] = ImVec4(0.3f, 0.3f, 0.3f, 0.8f);
}

/*
[ LT ] [ RT ]
[ LB ] [ RB ]
+-----------------------------+
| ^ | | Y |
| < > |back start| X B |
| v | | A |
+-----------------------------+
*/
void gameKeyLayoutVisualImpl() override {
ImGuiStyle& style = ImGui::GetStyle();
const float spacing = 2.0f;
auto oldSpacing = style.ItemSpacing;

style.ItemSpacing = ImVec2(spacing, spacing);

float areaHeight = ImGui::GetWindowHeight() / 3;
float areaWidth = ImGui::GetWindowWidth() / 3;

__mButtonWidth = __mButtonHeight = areaWidth / 4;

{
float oldFontSize = ImGui::GetFont()->Scale;
if (__mButtonHeight < 50) ImGui::GetFont()->Scale /= 1.5;
ImGui::PushFont(ImGui::GetFont());
{ // LT/RT
__drawKeyButton(PAL::GamepadKey::LEFT_TRIGGER, __mButtonWidth, 2 * __mButtonWidth, __mButtonHeight / 2); ImGui::SameLine();
__drawKeyButton(PAL::GamepadKey::RIGHT_TRIGGER, 2 * areaWidth + __mButtonWidth, 2 * __mButtonWidth, __mButtonHeight / 2);
}
{ // LB/RB
__drawKeyButton(PAL::GamepadKey::LEFT_BUMPER,__mButtonWidth, 2 * __mButtonWidth, __mButtonHeight / 2); ImGui::SameLine();
__drawKeyButton(PAL::GamepadKey::RIGHT_BUMPER, 2 * areaWidth + __mButtonHeight, 2 * __mButtonWidth, __mButtonHeight / 2);
}
ImGui::GetFont()->Scale = oldFontSize;
ImGui::PopFont();
}

{
int firstLineAreaStart = areaWidth / 2 - __mButtonWidth / 2;
__drawKeyButton(PAL::GamepadKey::DPAD_UP, firstLineAreaStart); ImGui::SameLine();
__drawKeyButton(PAL::GamepadKey::Y, 2 * areaWidth + firstLineAreaStart);
}
{
int secondLineAreaStart = __mButtonWidth / 2;
{
__drawKeyButton(PAL::GamepadKey::DPAD_LEFT, secondLineAreaStart); ImGui::SameLine();
__drawKeyButton(PAL::GamepadKey::DPAD_RIGHT, secondLineAreaStart + __mButtonWidth * 2); ImGui::SameLine();
}
{ // back / start
float oldFontSize = ImGui::GetFont()->Scale;
ImGui::GetFont()->Scale /= 1.5;
if (__mButtonHeight < 50) ImGui::GetFont()->Scale /= 1.6;
ImGui::PushFont(ImGui::GetFont());
__drawKeyButton(PAL::GamepadKey::BACK, areaWidth + secondLineAreaStart, __mButtonWidth, __mButtonHeight / 2); ImGui::SameLine();
__drawKeyButton(PAL::GamepadKey::START, areaWidth + secondLineAreaStart + __mButtonWidth * 2, __mButtonWidth, __mButtonHeight / 2); ImGui::SameLine();
ImGui::GetFont()->Scale = oldFontSize;
ImGui::PopFont();
}
{
__drawKeyButton(PAL::GamepadKey::X, 2 * areaWidth + secondLineAreaStart); ImGui::SameLine();
__drawKeyButton(PAL::GamepadKey::B, 2 * areaWidth + secondLineAreaStart + __mButtonWidth * 2);
}
}
{
int thirdLineAreaStart = areaWidth / 2 - __mButtonWidth / 2;
__drawKeyButton(PAL::GamepadKey::DPAD_DOWN, thirdLineAreaStart); ImGui::SameLine();
__drawKeyButton(PAL::GamepadKey::A, 2 * areaWidth + thirdLineAreaStart);
}

style.ItemSpacing = oldSpacing;
}

void updateKeyStatus(const dstruct::Vector<int> &keyVec) override {
for (auto &kStatus : __mkeyStatusTable) kStatus = false;
for (auto keycode : keyVec) {
int gamepadKeycode = keycode - KEYBOARD_KEY_NUMBERS;
if (gamepadKeycode < __mkeyStatusTable.size() && gamepadKeycode >= 0) {
__mkeyStatusTable[gamepadKeycode] = true;
}
}
}

protected:
dstruct::Array<ImVec4, GAMEPAD_KEY_NUMBERS> _mGameKeyColorTable;
dstruct::Array<std::string, GAMEPAD_KEY_NUMBERS> _mkeyNameTable;

private:
float __mButtonWidth, __mButtonHeight;
dstruct::Array<bool, GAMEPAD_KEY_NUMBERS> __mkeyStatusTable;

void __drawKeyButton(int keycode, float cursorPosX = 0, float width = 0, float height = 0) {
ImGui::SetCursorPosX(cursorPosX);
ImGui::PushStyleColor(ImGuiCol_Button, __mkeyStatusTable[keycode] ? _mGameKeyColorTable[keycode] : ImVec4(0, 0, 0, 0.25));
ImGui::Button(_mkeyNameTable[keycode].c_str(), {width ? width : __mButtonWidth, height ? height : __mButtonHeight});
ImGui::PopStyleColor(1);
}
};

}

#endif
Loading

0 comments on commit bd9c878

Please sign in to comment.