Fully functional dw_gui

This commit is contained in:
korenkonder
2023-06-26 17:31:53 +03:00
parent a752d99df1
commit ea2f0ab36e
12 changed files with 1576 additions and 332 deletions
+13 -16
View File
@@ -15,8 +15,7 @@
#include "../../CRE/sprite.hpp"
#include "../../CRE/stage.hpp"
#include "../../CRE/task_effect.hpp"
#include "../input.hpp"
#include "../task_window.hpp"
#include "../input_state.hpp"
extern int32_t width;
extern int32_t height;
@@ -267,11 +266,11 @@ void DtmAet::Disp() {
print_work.color = color_red;
print_work.printf_align_left("%s\n", i.first.c_str());
/*if (input_state_get(0)->sub_14018D480(64)) {
if (input_state_get(0)->CheckDown(64)) {
print_work.color = color_white;
print_work.printf_align_left("p(%.2f,%.2f)\n", pos.x, pos.y);
print_work.printf_align_left("o(%f)\n", i.second.opacity);
}*/
}
}
}
@@ -368,8 +367,6 @@ DtwAet::DtwAet() {
data_struct* aft_data = &data_list[DATA_AFT];
aet_database* aft_aet_db = &aft_data->data_ft.aet_db;
rect = { 0.0f, 0.0f, 220.0f, 380.0f };
dw::Widget::SetText("2DAUTH TEST");
(new dw::Label(this))->SetText("SET");
@@ -385,14 +382,14 @@ DtwAet::DtwAet() {
set->SetMaxItems(20);
set->SetItemIndex(dtm_aet->curr_set_index);
set->list->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::SetCallback));
set->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::SetCallback));
(new dw::Label(this))->SetText("ID");
id = new dw::ListBox(this);
id->SetMaxItems(20);
id->list->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::IdCallback));
id->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::IdCallback));
(new dw::Label(this))->SetText("LAYER");
@@ -400,7 +397,7 @@ DtwAet::DtwAet() {
layer->AddItem("ROOT");
layer->SetMaxItems(20);
layer->list->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::LayerCallback));
layer->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::LayerCallback));
(new dw::Label(this))->SetText("MARKER");
@@ -408,24 +405,24 @@ DtwAet::DtwAet() {
marker->AddItem("NOMARKER");
marker->SetMaxItems(20);
marker->list->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::MarkerCallback));
marker->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::MarkerCallback));
marker_frame = new dw::Label(this);
marker_frame->SetText("0");
(new dw::Label(this))->SetText("TYPE");
type = new dw::ListBox(this);
type = new dw::ListBox(this, dw::MULTISELECT);
type->AddItem("DRAW");
type->AddItem("LAYOUT");
type->list->SetItemIndex(dtm_aet->type);
type->SetItemIndex(dtm_aet->type);
type->list->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::TypeCallback));
type->AddSelectionListener(new dw::SelectionListenerOnHook(DtwAet::TypeCallback));
(new dw::Label(this))->SetText("FRAME");
frame = dw::Slider::make(this);
frame = dw::Slider::Create(this);
frame->SetText("FRAME");
frame->format = "%4.0f";
@@ -447,7 +444,7 @@ DtwAet::DtwAet() {
centering->SetText("CENTERING");
centering->callback = DtwAet::CenteringCallback;
//GetSetSize();
UpdateLayout();
}
DtwAet::~DtwAet() {
@@ -523,7 +520,7 @@ void dtm_aet_load() {
app::TaskWork::AddTask(dtm_aet, "DATA_TEST_AET_MANAGER");
if (!dtw_aet) {
dtw_aet = new DtwAet();
dtw_aet = new DtwAet;
dtw_aet->sub_1402F38B0();
}
else
+17 -16
View File
@@ -13,6 +13,7 @@
#include "../../CRE/pv_db.hpp"
#include "../../CRE/resolution_mode.hpp"
#include "../../CRE/stage.hpp"
#include "../input_state.hpp"
#include "auth_3d_test.hpp"
#include "equip_test.hpp"
#include "stage_test.hpp"
@@ -246,7 +247,7 @@ bool DataTestMot::Ctrl() {
dtm_mot_array[0].SetLoop(true);
dtm_mot_array[1].SetLoop(true);
bool play = false;//input_state_get(0)->sub_14018D540(84) != 0;
bool play = input_state_get(0)->CheckIntervalTapped(84);
dtm_mot_array[0].SetPlay(play);
dtm_mot_array[1].SetPlay(play);
} break;
@@ -1245,7 +1246,7 @@ DataTestFaceMotDw::DataTestFaceMotDw(int32_t chara_id) {
face = InitAddMottblMapMotions(motion_group, 0);
face_frame = dw::Slider::make(motion_group);
face_frame = dw::Slider::Create(motion_group);
face_frame->SetText("Frame ");
face_frame->format = "%4.0f";
face_frame->SetParams(0.0f, 0.0f, 100.0f, 10.0f, 1.0f, 10.0f);
@@ -1255,7 +1256,7 @@ DataTestFaceMotDw::DataTestFaceMotDw(int32_t chara_id) {
face_cl = new dw::Label(motion_group);
face_cl->SetText("");
face_cl_frame = dw::Slider::make(motion_group);
face_cl_frame = dw::Slider::Create(motion_group);
face_cl_frame->SetText("Frame");
face_cl_frame->format = "%4.0f";
face_cl_frame->SetParams(0.0f, 0.0f, 100.0f, 10.0f, 1.0f, 10.0f);
@@ -1264,7 +1265,7 @@ DataTestFaceMotDw::DataTestFaceMotDw(int32_t chara_id) {
eyes = InitAddMottblMapMotions(motion_group, 1);
eyes_frame = dw::Slider::make(motion_group);
eyes_frame = dw::Slider::Create(motion_group);
eyes_frame->SetText("Frame");
eyes_frame->format = "%4.0f";
eyes_frame->SetParams(0.0f, 0.0f, 100.0f, 10.0f, 1.0f, 10.0f);
@@ -1273,12 +1274,12 @@ DataTestFaceMotDw::DataTestFaceMotDw(int32_t chara_id) {
mouth = InitAddMottblMapMotions(motion_group, 2);
mouth_frame = dw::Slider::make(motion_group);
mouth_frame = dw::Slider::Create(motion_group);
mouth_frame->SetText("Frame");
mouth_frame->format = "%4.0f";
mouth_frame->SetParams(0.0f, 0.0f, 100.0f, 10.0f, 1.0f, 10.0f);
GetSetSize();
UpdateLayout();
}
DataTestFaceMotDw::~DataTestFaceMotDw() {
@@ -1720,14 +1721,14 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) {
set_list_box_proc.list_box->AddSelectionListener(&id_list_box_proc);
set_list_box_proc.list_box->SetFont(dw::p_font_type_6x12);
id_list_box_proc.slider = dw::Slider::make(this);
id_list_box_proc.slider = dw::Slider::Create(this);
id_list_box_proc.slider->SetText("Y ROT");
id_list_box_proc.slider->format = "%3.0f";
id_list_box_proc.slider->SetParams(test_mot_data->rot_y[chara_id], -180.0f, 180.0f, 36.0f, 1.0f, 10.0f);
id_list_box_proc.slider->callback_data.i32 = chara_id;
id_list_box_proc.slider->AddSelectionListener(&rotate_slider_proc);
rotate_slider_proc.slider = dw::Slider::make(this);
rotate_slider_proc.slider = dw::Slider::Create(this);
rotate_slider_proc.slider->dw::Widget::SetText("X POS");
rotate_slider_proc.slider->format = "%3.2f";
rotate_slider_proc.slider->SetParams(test_mot_data->trans_x[chara_id], -2.0f, 2.0f, 0.4f, 0.01f, 0.1f);
@@ -1739,7 +1740,7 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) {
frame_group->SetFont(dw::p_font_type_6x12);
for (int32_t i = 3; i < 4; i++) {
step_slider = dw::Slider::make(frame_group);
step_slider = dw::Slider::Create(frame_group);
char buf[0x10];
sprintf_s(buf, sizeof(buf), "STEP %02d", i);
step_slider->SetText(buf);
@@ -1764,14 +1765,14 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) {
frame_count = new dw::Label(frame_comp, dw::FLAG_4000);
frame_count->SetText("00000.0000");
current = dw::Slider::make(frame_group);
current = dw::Slider::Create(frame_group);
current->SetText("Current");
current->format = "%4.0f";
current->SetParams(0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
current->callback_data.i32 = chara_id;
current->AddSelectionListener(&frame_slider_proc);
frame_slider_proc.slider = dw::Slider::make(frame_group);
frame_slider_proc.slider = dw::Slider::Create(frame_group);
frame_slider_proc.slider->SetText("Start ");
frame_slider_proc.slider->format = "%4.0f";
frame_slider_proc.slider->SetParams(0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
@@ -1875,7 +1876,7 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) {
save_only_start_frame_button->callback_data.i32 = chara_id;
save_only_start_frame_button->SetFont(dw::p_font_type_6x12);
GetSetSize();
UpdateLayout();
}
DataTestMotDw::~DataTestMotDw() {
@@ -1975,7 +1976,7 @@ void DataTestMotDw::ResetFrame() {
}
void DataTestMotDw::ResetIDListBoxIndex() {
GetSetSize();
UpdateLayout();
set_list_box_proc.list_box->SetItemIndex(0);
}
@@ -2069,7 +2070,7 @@ void DataTestMotA3dDw::PvListBoxProc::Callback(dw::SelectionListener::CallbackDa
if (list_box)
data_test_mot_a3d_dw->SetPvId(atoi(list_box->GetSelectedItemStr().c_str()));
data_test_mot_a3d_dw->GetSetSize();
data_test_mot_a3d_dw->UpdateLayout();
}
DataTestMotA3dDw::A3dListBoxProc::A3dListBoxProc() {
@@ -2187,7 +2188,7 @@ DataTestMotA3dDw::DataTestMotA3dDw() {
sync_1p_frame->callback = DataTestMotA3dDw::Sync1pFrameCallback;
sync_1p_frame->SetFont(dw::p_font_type_6x12);
GetSetSize();
UpdateLayout();
rect.pos.x = (float_t)res_window_get()->width * 0.3f - rect.size.x * 0.3f;
@@ -2292,7 +2293,7 @@ DataTestMotCtrlDw::DataTestMotCtrlDw() {
stage->SetText("STAGE");
stage->callback = DataTestMotCtrlDw::StageCallback;
GetSetSize();
UpdateLayout();
rect.pos.x = (float_t)res_window_get()->width - rect.size.x;
+2 -2
View File
@@ -160,7 +160,7 @@ DtwStg::DtwStg() : Shell(0) {
effect_display->SetText(L"Effects display");
effect_display->SetValue(true);
GetSetSize();
UpdateLayout();
}
DtwStg::~DtwStg() {
@@ -185,7 +185,7 @@ void DtwStg::PvIdCallback(dw::Widget* data) {
if (elem != dtw_stg->pv_stage.end()) {
for (std::string& i : elem->second)
pv_list_box->AddItem(i);
dtw_stg->GetSetSize();
dtw_stg->UpdateLayout();
}
}
}
+802 -241
View File
File diff suppressed because it is too large Load Diff
+22 -12
View File
@@ -86,7 +86,7 @@ namespace dw {
int64_t field_0;
int32_t field_8;
int8_t field_C;
vec2 field_10;
vec2 mouse_pos;
int32_t field_18;
Widget* widget;
@@ -135,21 +135,20 @@ namespace dw {
typedef void(*Callback)(Widget* widget);
struct KeyCallbackData {
Widget* field_0;
int32_t field_8;
Widget* widget;
int32_t modifier;
int8_t field_C;
int8_t field_D;
int32_t field_10;
int32_t field_14;
int32_t input[2];
KeyCallbackData();
};
struct MouseCallbackData {
Widget* field_0;
Widget* widget;
vec2 pos;
int32_t field_10;
int32_t field_14;
int32_t input;
int32_t modifier;
MouseCallbackData();
};
@@ -233,7 +232,7 @@ namespace dw {
virtual int32_t MouseCallback(Widget::MouseCallbackData data) override;
virtual vec2 GetPos() override;
virtual void GetSetSize();
virtual void UpdateLayout();
virtual vec2 GetSize();
virtual bool Field_58();
virtual bool Field_60();
@@ -290,7 +289,7 @@ namespace dw {
virtual int32_t MouseCallback(Widget::MouseCallbackData data) override;
virtual void SetSize(vec2 size) override;
virtual void GetSetSize() override;
virtual void UpdateLayout() override;
virtual vec2 GetSize() override;
virtual bool Field_58() override;
virtual bool Field_60() override;
@@ -750,6 +749,9 @@ namespace dw {
virtual ~ShellCloseButton() override;
virtual void Draw() override;
virtual vec2 GetPos() override;
virtual vec2 GetSize() override;
static void Callback(Widget* data);
};
@@ -765,11 +767,19 @@ namespace dw {
virtual void Draw() override;
virtual void Reset() override;
virtual int32_t KeyCallback(Widget::KeyCallbackData data) override;
virtual int32_t MouseCallback(Widget::MouseCallbackData data) override;
virtual void SetSize(vec2 value) override;
void AddSelectionListener(SelectionListener* value);
virtual void UpdateLayout() override;
virtual vec2 GetSize() override;
static Slider* make(Composite* parent = 0,
void AddSelectionListener(SelectionListener* value);
vec2 GetTextSize();
static Slider* Create(Composite* parent, Flags flags, const char* text,
const char* format, float_t width = 128.f);
static Slider* Create(Composite* parent = 0,
Flags flags = (Flags)(FLAG_800 | HORIZONTAL),
float_t pos_x = 0.0f, float_t pos_y = 0.0f,
float_t width = 128.0f, float_t height = 20.0f, const char* text = "slider");
+2
View File
@@ -54,10 +54,12 @@ namespace Input {
static bool is_key_mod(int32_t key);
static bool is_key_numpad(int32_t key);
static void KeyboardCallback(GLFWwindow* window,
int32_t key, int32_t scancode, int32_t action, int32_t mods);
static void MouseButtonCallback(GLFWwindow* window,
int32_t button, int32_t action, int32_t mods);
static Key* vector_Key_find(std::vector<Key>& keys, int32_t key);
static MouseButton* vector_MouseButton_find(
std::vector<MouseButton>& mouse_buttons, int32_t button);
+18 -15
View File
@@ -9,19 +9,22 @@
#include <GLFW/glfw3.h>
namespace Input {
bool IsKeyDown(int32_t key, int32_t mods = 0);
bool IsKeyUp(int32_t key, int32_t mods = 0);
bool IsKeyTapped(int32_t key, int32_t mods = 0);
bool IsKeyReleased(int32_t key, int32_t mods = 0);
bool IsMouseButtonDown(int32_t button, int32_t mods = 0);
bool IsMouseButtonUp(int32_t button, int32_t mods = 0);
bool IsMouseButtonTapped(int32_t button, int32_t mods = 0);
bool IsMouseButtonReleased(int32_t button, int32_t mods = 0);
bool WasKeyDown(int32_t key, int32_t mods = 0);
bool WasKeyUp(int32_t key, int32_t mods = 0);
bool WasMouseButtonDown(int32_t button, int32_t mods = 0);
bool WasMouseButtonUp(int32_t button, int32_t mods = 0);
void EndFrame();
void NewFrame();
void SetInputs(GLFWwindow* window);
extern POINT pos;
extern POINT pos_prev;
extern bool IsKeyDown(int32_t key, int32_t mods = 0);
extern bool IsKeyUp(int32_t key, int32_t mods = 0);
extern bool IsKeyTapped(int32_t key, int32_t mods = 0);
extern bool IsKeyReleased(int32_t key, int32_t mods = 0);
extern bool IsMouseButtonDown(int32_t button, int32_t mods = 0);
extern bool IsMouseButtonUp(int32_t button, int32_t mods = 0);
extern bool IsMouseButtonTapped(int32_t button, int32_t mods = 0);
extern bool IsMouseButtonReleased(int32_t button, int32_t mods = 0);
extern bool WasKeyDown(int32_t key, int32_t mods = 0);
extern bool WasKeyUp(int32_t key, int32_t mods = 0);
extern bool WasMouseButtonDown(int32_t button, int32_t mods = 0);
extern bool WasMouseButtonUp(int32_t button, int32_t mods = 0);
extern void EndFrame();
extern void NewFrame();
extern void SetInputs(GLFWwindow* window);
};
+575
View File
@@ -0,0 +1,575 @@
/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#include "input_state.hpp"
#include "../CRE/render_context.hpp"
#include "input.hpp"
/*
Bit / Name
0 JVS_TEST
1 JVS_SERVICE
2 JVS_START
7 JVS_TRIANGLE
8 JVS_SQUARE
9 JVS_CROSS
10 JVS_CIRCLE
11 JVS_L (also triggered by pressing L on Slider Panel)
12 JVS_R (also triggered by pressing R on Slider Panel)
18 JVS_SW1
19 JVS_SW2
29 VK_SPACE
39 'A'
40 'B'
...
64 'Z'
80 VK_RETURN
81 VK_SHIFT
82 VK_CONTROL
83 VK_MENU
91 VK_UP
92 VK_LEFT (guessed, unsure)
93 VK_DOWN
94 VK_RIGHT (guessed, unsure)
96 VK_LBUTTON
97 VK_MBUTTON
98 VK_RBUTTON
99 MOUSE_SCROLL_UP
100 MOUSE_SCROLL_DOWN*/
struct struc_794 {
ButtonState tapped;
ButtonState released;
ButtonState down;
int32_t field_30[18];
int32_t field_78;
int64_t field_80;
struc_794();
~struc_794();
void Reset();
};
static void input_state_ctrl(InputState* input_state);
static int32_t input_state_get_delta_frame();
static bool sub_140190A30(struc_794* a1, int32_t index);
InputState* input_state;
extern render_context* rctx_ptr;
InputState::DoubleTap::DoubleTap() : hold_frame(), frame(), state() {
}
bool InputState::DoubleTap::Ctrl(int32_t delta_frame, bool down, bool up) {
if (hold_frame <= 0)
return 0;
switch (state) {
case 0:
default:
if (up) {
state = 1;
frame = 0;
}
return false;
case 1:
frame += delta_frame;
if (frame > hold_frame) {
state = 0;
return false;
}
if (down) {
state = 0;
return true;
}
return false;
}
}
void InputState::DoubleTap::Set(int32_t hold_frame) {
this->hold_frame = hold_frame;
}
InputState::HoldTap::HoldTap() : hold_frame(), frame() {
}
bool InputState::HoldTap::Ctrl(int32_t delta_frame, bool down, bool up) {
if (hold_frame <= 0)
return 0;
if (down)
frame += delta_frame;
else if (!up)
frame = 0;
return frame >= hold_frame;
}
void InputState::HoldTap::Set(int32_t hold_frame) {
this->hold_frame = hold_frame;
}
InputState::IntervalTap::IntervalTap() : hold_frame(), cycle_frame(), frame(), state() {
}
bool InputState::IntervalTap::Ctrl(int32_t delta_frame, bool down) {
if (hold_frame <= 0)
return false;
if (!down) {
state = 0;
return false;
}
switch (state) {
case 0:
default:
state = 1;
frame = 0;
return true;
case 1:
frame += delta_frame;
if (frame >= cycle_frame) {
state = 2;
frame = 0;
return true;
}
return false;
case 2:
frame += delta_frame;
if (frame >= hold_frame) {
frame = 0;
return true;
}
return false;
}
}
void InputState::IntervalTap::Set(int32_t hold_frame, int32_t cycle_frame) {
this->hold_frame = hold_frame;
this->cycle_frame = cycle_frame;
}
InputState::InputState() : field_80(), field_C8(), updated(), field_D1(), field_D2(), key() {
for (DoubleTap& i : DoubleTapData)
i.Set(15);
for (HoldTap& i : HoldTapData)
i.Set(12);
for (IntervalTap& i : IntervalTapData)
i.Set(3, 40);
}
InputState::~InputState() {
}
bool InputState::CheckDown(int32_t index) {
if (index >= 0 && index < 111)
return !!Down[index];
return false;
}
bool InputState::CheckDoubleTapped(int32_t index) {
if (index >= 0 && index < 111)
return !!DoubleTapped[index];
return false;
}
bool InputState::CheckHold(int32_t index) {
if (index >= 0 && index < 111)
return !!Hold[index];
return false;
}
bool InputState::CheckIntervalTapped(int32_t index) {
if (index >= 0 && index < 111)
return !!IntervalTapped[index];
return false;
}
bool InputState::CheckReleased(int32_t index) {
if (index >= 0 && index < 111)
return !!Released[index];
return false;
}
bool InputState::CheckTapped(int32_t index) {
if (index >= 0 && index < 111)
return !!Tapped[index];
return false;
}
bool InputState::GetKey() {
return key;
}
void InputState::Update(int32_t index, int32_t delta_frame) {
DownPrev = Down;
Tapped.reset();
Released.reset();
Down.reset();
struc_794 v78;
updated = sub_140190A30(&v78, index);
Tapped |= v78.tapped;
Released |= v78.released;
Down |= v78.down;
if (updated) {
field_80[0] = v78.field_30[0];
field_80[1] = v78.field_30[1];
field_80[2] = v78.field_30[2];
field_80[3] = v78.field_30[3];
field_80[4] = v78.field_30[4];
field_80[5] = v78.field_30[5];
field_80[6] = v78.field_30[6];
field_80[7] = v78.field_30[7];
//Added
field_80[8] = v78.field_30[8];
field_80[9] = v78.field_30[9];
field_80[10] = v78.field_30[10];
field_80[11] = v78.field_30[11];
}
/*if (task_slider_control_get()->sub_140618C60(36))
v78.tapped[11] = true;
else
v78.tapped[11] = false;
if (task_slider_control_get()->sub_140618C40(36))
v78.released[11] = true;
else
v78.released[11] = false;
if (task_slider_control_get()->sub_140618C20(36))
v78.down[11] = true;
else
v78.down[11] = false;
if (task_slider_control_get()->sub_140618C60(37))
v78.tapped[12] = true;
else
v78.tapped[12] = false;
if (task_slider_control_get()->sub_140618C40(37))
v78.released[12] = true;
else
v78.released[12] = false;
if (task_slider_control_get()->sub_140618C20(37))
v78.down[12] = true;
else
v78.down[12] = false;*/
Tapped |= v78.tapped;
Released |= v78.released;
Down |= v78.down;
Released &= ~Down;
if (!Down[11] && !Down[12]) {
if (Tapped[2])
Tapped[110] = true;
if (Tapped[7])
Tapped[110] = true;
if (Tapped[8])
Tapped[110] = true;
if (Tapped[9])
Tapped[110] = true;
if (Tapped[10])
Tapped[110] = true;
if (Released[2])
Released[110] = true;
if (Released[7])
Released[110] = true;
if (Released[8])
Released[110] = true;
if (Released[9])
Released[110] = true;
if (Released[10])
Released[110] = true;
if (Down[2])
Down[110] = true;
if (Down[7])
Down[110] = true;
if (Down[8])
Down[110] = true;
if (Down[9])
Down[110] = true;
if (Down[10])
Down[110] = true;
}
field_70 ^= Down;
ButtonState Down = this->Down;
ButtonState Up = ~this->Down;
ButtonState DoubleTapped;
for (int32_t i = 0; i < INPUT_BUTTON_COUNT; i++)
if (DoubleTapData[i].Ctrl(delta_frame, Down[i], Up[i]))
DoubleTapped[i] = true;
else
DoubleTapped[i] = false;
this->DoubleTapped = DoubleTapped;
ButtonState Hold;
for (int32_t i = 0; i < INPUT_BUTTON_COUNT; i++)
if (HoldTapData[i].Ctrl(delta_frame, Down[i], Up[i]))
Hold[i] = true;
else
Hold[i] = false;
this->Hold = Hold;
ButtonState IntervalTapped;
for (int32_t i = 0; i < INPUT_BUTTON_COUNT; i++)
if (IntervalTapData[i].Ctrl(delta_frame, Down[i]))
IntervalTapped[i] = true;
else
IntervalTapped[i] = false;
this->IntervalTapped = IntervalTapped;
}
int32_t InputState::sub_14018CCC0(int32_t index) {
if (index >= 0 && index < 18)
return field_80[index];
return 0;
}
void input_state_init() {
if (!input_state)
input_state = new InputState[2];
}
void input_state_ctrl() {
if (input_state)
input_state_ctrl(input_state);
}
InputState* input_state_get(int32_t index) {
if (input_state && index >= 0 && index < 2)
return &input_state[index];
return 0;
}
void input_state_free() {
if (input_state) {
delete[] input_state;
input_state = 0;
}
}
struc_794::struc_794() : field_30(), field_78(), field_80() {
Reset();
}
struc_794::~struc_794() {
}
void struc_794::Reset() {
tapped.reset();
released.reset();
down.reset();
field_78 = 0;
memset(field_30, 0, sizeof(field_30));
field_30[2] = 0x80000000;
field_30[3] = 0x80000000;
field_80 = 0;
}
static void input_state_ctrl(InputState* input_state) {
int32_t delta_frame = input_state_get_delta_frame();
for (int32_t i = 0; i < 2; i++)
input_state[i].Update(i, delta_frame);
}
static int32_t input_state_get_delta_frame() {
return 1;
}
// Own stuff
static bool sub_140190A30(struc_794* a1, int32_t index) {
if (!a1 || index < 0 || index >= 2)
return false;
struct key_map {
int32_t index;
int32_t keys[3];
inline key_map() : index(), keys() {
for (int32_t& i : keys)
i = -1;
}
inline key_map(int32_t index, int32_t key) : key_map() {
this->index = index;
this->keys[0] = key;
}
inline key_map(int32_t index, int32_t key1, int32_t key2) : key_map() {
this->index = index;
this->keys[0] = key1;
this->keys[1] = key2;
}
inline key_map(int32_t index, int32_t key1, int32_t key2, int32_t key3) : key_map() {
this->index = index;
this->keys[0] = key1;
this->keys[1] = key2;
this->keys[2] = key3;
}
};
static const key_map key_map_array[] = {
{ 0, GLFW_KEY_F1, /*JVS_TEST,*/ },
{ 1, GLFW_KEY_F2, /*JVS_SERVICE,*/ },
{ 2, GLFW_KEY_ENTER, /*JVS_START,*/ },
{ 7, GLFW_KEY_W, GLFW_KEY_I, /*JVS_TRIANGLE,*/ },
{ 8, GLFW_KEY_A, GLFW_KEY_J, /*JVS_SQUARE,*/ },
{ 9, GLFW_KEY_S, GLFW_KEY_K, /*JVS_CROSS,*/ },
{ 10, GLFW_KEY_D, GLFW_KEY_L, /*JVS_CIRCLE,*/ },
{ 11, GLFW_KEY_Q, GLFW_KEY_U, /*JVS_L,*/ },
{ 12, GLFW_KEY_E, GLFW_KEY_O, /*JVS_R,*/ },
{ 18, GLFW_KEY_F11, /*JVS_SW1,*/ },
{ 19, GLFW_KEY_F12, /*JVS_SW2,*/ },
{ 20, GLFW_KEY_C, /*JVS_COIN,*/ },
{ 29, GLFW_KEY_SPACE, },
{ 39, GLFW_KEY_A, },
{ 40, GLFW_KEY_B, },
{ 41, GLFW_KEY_C, },
{ 42, GLFW_KEY_D, },
{ 43, GLFW_KEY_E, },
{ 44, GLFW_KEY_F, },
{ 45, GLFW_KEY_G, },
{ 46, GLFW_KEY_H, },
{ 47, GLFW_KEY_I, },
{ 48, GLFW_KEY_J, },
{ 49, GLFW_KEY_K, },
{ 50, GLFW_KEY_L, },
{ 51, GLFW_KEY_M, },
{ 52, GLFW_KEY_N, },
{ 53, GLFW_KEY_O, },
{ 54, GLFW_KEY_P, },
{ 55, GLFW_KEY_Q, },
{ 56, GLFW_KEY_R, },
{ 57, GLFW_KEY_S, },
{ 58, GLFW_KEY_T, },
{ 59, GLFW_KEY_U, },
{ 60, GLFW_KEY_V, },
{ 61, GLFW_KEY_W, },
{ 62, GLFW_KEY_X, },
{ 63, GLFW_KEY_Y, },
{ 64, GLFW_KEY_Z, },
{ 80, GLFW_KEY_ENTER, },
{ 81, GLFW_KEY_LEFT_SHIFT, GLFW_KEY_RIGHT_SHIFT, },
{ 82, GLFW_KEY_LEFT_CONTROL, GLFW_KEY_LEFT_CONTROL, },
{ 83, GLFW_KEY_RIGHT_ALT, GLFW_KEY_RIGHT_ALT, },
{ 91, GLFW_KEY_UP, },
{ 92, GLFW_KEY_LEFT, },
{ 93, GLFW_KEY_DOWN, },
{ 94, GLFW_KEY_RIGHT, },
};
static const key_map mouse_button_array[] = {
{ 96, GLFW_MOUSE_BUTTON_LEFT, },
{ 97, GLFW_MOUSE_BUTTON_MIDDLE, },
{ 98, GLFW_MOUSE_BUTTON_RIGHT, },
};
for (const key_map& i : key_map_array) {
bool tapped = false;
bool released = false;
bool down = false;
for (const int32_t& j : i.keys) {
if (j == -1)
break;
if (!tapped)
if (Input::IsKeyTapped(j, -1))
tapped = true;
if (!released)
if (Input::IsKeyReleased(j, -1))
released = true;
if (!down)
if (Input::IsKeyDown(j, -1))
down = true;
}
a1->tapped[i.index] = tapped;
a1->released[i.index] = released;
a1->down[i.index] = down;
}
for (const key_map& i : mouse_button_array) {
bool tapped = false;
bool released = false;
bool down = false;
for (const int32_t& j : i.keys) {
if (j == -1)
break;
if (!tapped)
if (Input::IsMouseButtonTapped(j))
tapped = true;
if (!released)
if (Input::IsMouseButtonReleased(j))
released = true;
if (!down)
if (Input::IsMouseButtonDown(j))
down = true;
}
a1->tapped[i.index] = tapped;
a1->released[i.index] = released;
a1->down[i.index] = down;
}
int32_t x_offset = rctx_ptr->post_process.screen_x_offset;
int32_t y_offset = rctx_ptr->post_process.screen_y_offset;
float_t x_scale = 1280.0f / (float_t)rctx_ptr->post_process.sprite_width;
float_t y_scale = 720.0f / (float_t)rctx_ptr->post_process.sprite_height;
a1->field_30[8] = (int32_t)((float_t)(Input::pos.x - x_offset) * x_scale);
a1->field_30[9] = (int32_t)((float_t)(Input::pos.y - y_offset) * y_scale);
a1->field_30[10] = (int32_t)((float_t)(Input::pos_prev.x - Input::pos.x - x_offset) * x_scale);
a1->field_30[11] = (int32_t)((float_t)(Input::pos_prev.y - Input::pos.y - y_offset) * y_scale);
return true;
}
+86
View File
@@ -0,0 +1,86 @@
/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#pragma once
#include "../KKdLib/default.hpp"
#include <bitset>
#define INPUT_BUTTON_COUNT 111
typedef std::bitset<INPUT_BUTTON_COUNT> ButtonState;
struct InputState {
struct DoubleTap {
int32_t hold_frame;
int32_t frame;
int32_t state;
DoubleTap();
bool Ctrl(int32_t delta_frame, bool down, bool up);
void Set(int32_t hold_frame);
};
struct HoldTap {
int32_t hold_frame;
int32_t frame;
HoldTap();
bool Ctrl(int32_t delta_frame, bool down, bool up);
void Set(int32_t hold_frame);
};
struct IntervalTap {
int32_t hold_frame;
int32_t cycle_frame;
int32_t frame;
int32_t state;
IntervalTap();
bool Ctrl(int32_t delta_frame, bool down);
void Set(int32_t hold_frame, int32_t cycle_frame);
};
ButtonState Tapped;
ButtonState Released;
ButtonState Down;
ButtonState DownPrev;
ButtonState DoubleTapped;
ButtonState Hold;
ButtonState IntervalTapped;
ButtonState field_70;
int32_t field_80[18];
std::bitset<22> field_C8;
bool updated;
bool field_D1;
bool field_D2;
bool key;
DoubleTap DoubleTapData[INPUT_BUTTON_COUNT];
HoldTap HoldTapData[INPUT_BUTTON_COUNT];
IntervalTap IntervalTapData[INPUT_BUTTON_COUNT];
InputState();
~InputState();
bool CheckDown(int32_t index);
bool CheckDoubleTapped(int32_t index);
bool CheckHold(int32_t index);
bool CheckIntervalTapped(int32_t index);
bool CheckReleased(int32_t index);
bool CheckTapped(int32_t index);
void Ctrl();
bool GetKey();
void Update(int32_t index, int32_t delta_frame);
int32_t sub_14018CCC0(int32_t index);
};
extern void input_state_init();
extern void input_state_ctrl();
extern InputState* input_state_get(int32_t index);
extern void input_state_free();
+30 -29
View File
@@ -213,15 +213,15 @@ void PrintWork::DrawTextMesh(app::text_flags flags, sprite_text_mesh& mesh) {
void PrintWork::FillRectangle(rectangle rect) {
if (clip) {
float_t v8a;
PrintWork::sub_140196110(rect.pos.x, rect.pos.x + rect.size.y,
clip_data.pos.x, clip_data.pos.x + clip_data.size.x, rect.pos.x, v8a);
rect.size.x = v8a - rect.pos.x;
float_t clip_max_pos_x;
PrintWork::ClampPosToClipBox(rect.pos.x, rect.pos.x + rect.size.x,
clip_data.pos.x, clip_data.pos.x + clip_data.size.x, rect.pos.x, clip_max_pos_x);
rect.size.x = clip_max_pos_x - rect.pos.x;
float_t v8b;
PrintWork::sub_140196110(rect.pos.y, rect.pos.y + rect.size.y,
clip_data.pos.y, clip_data.pos.y + clip_data.size.y, rect.pos.y, v8b);
rect.size.y = v8b - rect.pos.y;
float_t clip_max_pos_y;
PrintWork::ClampPosToClipBox(rect.pos.y, rect.pos.y + rect.size.y,
clip_data.pos.y, clip_data.pos.y + clip_data.size.y, rect.pos.y, clip_max_pos_y);
rect.size.y = clip_max_pos_y - rect.pos.y;
}
spr::put_sprite_rect(rect, resolution_mode, prio, fill_color, layer);
@@ -459,17 +459,18 @@ void PrintWork::vwprintf(app::text_flags flags, const wchar_t* fmt, va_list args
PrintText(flags, buf, buf + vswprintf_s(buf, sizeof(buf) / sizeof(wchar_t), fmt, args));
}
void PrintWork::sub_140196110(float_t a1, float_t a2, float_t a3, float_t a4, float_t& a5, float_t& a6) {
float_t v8 = max_def(a1, a3);
float_t v10 = max_def(a2, a4);
void PrintWork::ClampPosToClipBox(float_t pos_min, float_t pos_max,
float_t clip_box_min, float_t clip_box_max, float_t& clip_pos_min, float_t& clip_pos_max) {
float_t v8 = max_def(pos_min, clip_box_min);
float_t v10 = min_def(pos_max, clip_box_max);
if (v8 >= v10) {
a5 = a1;
a6 = a1;
if (v8 < v10) {
clip_pos_min = v8;
clip_pos_max = v10;
}
else {
a5 = v8;
a6 = v10;
clip_pos_min = pos_min;
clip_pos_max = pos_min;
}
}
@@ -509,25 +510,25 @@ int32_t PrintWork::sub_140197D60(rectangle clip_box, rectangle& pos, rectangle&
vec2 uv_pos = uv.pos;
vec2 uv_size = uv.size;
vec2 v29;
vec2 v25;
PrintWork::sub_140196110(pos_pos.x, pos_pos.x + pos_size.x,
clip_box.pos.x, clip_box.pos.x + clip_box.size.x, v25.x, v29.x);
PrintWork::sub_140196110(pos_pos.y, pos_pos.y + pos_size.y,
clip_box.pos.y, clip_box.pos.y + clip_box.size.y, v25.y, v29.y);
vec2 clip_max_pos;
vec2 clip_min_pos;
PrintWork::ClampPosToClipBox(pos_pos.x, pos_pos.x + pos_size.x,
clip_box.pos.x, clip_box.pos.x + clip_box.size.x, clip_min_pos.x, clip_max_pos.x);
PrintWork::ClampPosToClipBox(pos_pos.y, pos_pos.y + pos_size.y,
clip_box.pos.y, clip_box.pos.y + clip_box.size.y, clip_min_pos.y, clip_max_pos.y);
vec2 v27 = v29 - v25;
vec2 clip_size = clip_max_pos - clip_min_pos;
if (v27.x == pos_size.x && v27.y == pos_size.y)
if (clip_size.x == pos_size.x && clip_size.y == pos_size.y)
return 2;
else if (v27.x <= 0.0f || v27.y <= 0.0f)
else if (clip_size.x <= 0.0f || clip_size.y <= 0.0f)
return 0;
vec2 uv_scale = uv_size / pos_size;
pos.pos = v25;
pos.size = v27;
uv.pos = (v25 - pos_pos) * uv_scale + uv_pos;
uv.size = v27 * uv_scale;
pos.pos = clip_min_pos;
pos.size = clip_size;
uv.pos = (clip_min_pos - pos_pos) * uv_scale + uv_pos;
uv.size = clip_size * uv_scale;
return 1;
}
+4 -1
View File
@@ -95,7 +95,10 @@ public:
void vprintf(app::text_flags flags, const char* fmt, va_list args);
void vwprintf(app::text_flags flags, const wchar_t* fmt, va_list args);
static void sub_140196110(float_t a1, float_t a2, float_t a3, float_t a4, float_t& a5, float_t& a6);
static void ClampPosToClipBox(float_t pos_min, float_t pos_max,
float_t clip_box_min, float_t clip_box_max, float_t& clip_pos_min, float_t& clip_pos_max);
vec2 sub_140197B80(app::text_flags flags, vec2 size);
static int32_t sub_140197D60(rectangle clip_box, rectangle& pos, rectangle& uv);
};
+5
View File
@@ -57,6 +57,7 @@
#include "font_info.hpp"
#include "imgui_helper.hpp"
#include "input.hpp"
#include "input_state.hpp"
#include "task_window.hpp"
#include "x_pv_game.hpp"
#include <glad/glad.h>
@@ -553,6 +554,7 @@ static render_context* render_context_load() {
skin_param_data_load();
input_state_init();
fontmap_data_init();
font_info_default_init();
sound_init();
@@ -1063,12 +1065,14 @@ static void render_context_ctrl(render_context* rctx) {
classes_process_ctrl(classes, classes_count);
rctx_ptr = rctx;
input_state_ctrl();
game_state_ctrl();
rctx->ctrl();
if (fast_loader_speed > 1 && game_state_get_game_state() == GAME_STATE_STARTUP)
for (int32_t i = 1; i < fast_loader_speed; i++) {
rctx_ptr = rctx;
input_state_ctrl();
game_state_ctrl();
rctx->ctrl();
}
@@ -1242,6 +1246,7 @@ static void render_context_dispose(render_context* rctx) {
sound_free();
font_info_default_free();
fontmap_data_free();
input_state_free();
skin_param_data_free();
mothead_storage_free();