Program Listing for File PDJE_Judge_Init.cpp
↰ Return to documentation for file (include\judge\Init\PDJE_Judge_Init.cpp)
#include "PDJE_Judge_Init.hpp"
#include "PDJE_Input_Device_Data.hpp"
#include "PDJE_Note_OBJ.hpp"
#include "PDJE_Rule.hpp"
#include <cstdint>
template <class T, class U>
concept DecaysTo = std::same_as<std::decay_t<T>, U>;
namespace PDJE_JUDGE {
void
Judge_Init::SetCoreLine(const PDJE_CORE_DATA_LINE &_coreline)
{
if (_coreline.maxCursor != nullptr && _coreline.nowCursor != nullptr &&
_coreline.preRenderedData != nullptr && _coreline.syncD != nullptr) {
coreline = _coreline;
}
}
void
Judge_Init::SetCustomEvents(const Custom_Events &events)
{
lambdas = events;
}
void
Judge_Init::SetInputLine(const PDJE_INPUT_DATA_LINE &_inputline)
{
if (_inputline.input_arena != nullptr) {
inputline = _inputline;
}
}
void
Judge_Init::SetRail(const std::string &midi_port_name,
const uint64_t MatchRail,
const uint8_t type,
const uint8_t ch,
const uint8_t pos,
const int64_t offset_microsecond)
{
RAIL_KEY::MIDI key;
key.port_name = midi_port_name;
if (key.port_name.size() > 255) {
key.port_name = std::string(key.port_name, 255);
}
key.ch = ch;
key.pos = pos;
key.type = type;
raildb.Add(key, MatchRail, offset_microsecond);
}
void
Judge_Init::SetRail(const libremidi::input_port &midi_port,
const uint64_t MatchRail,
const uint8_t type,
const uint8_t ch,
const uint8_t pos,
const int64_t offset_microsecond)
{
SetRail(midi_port.port_name, MatchRail, type, ch, pos, offset_microsecond);
}
void
Judge_Init::SetRail(const DeviceData &devData,
const BITMASK DeviceKey,
const int64_t offset_microsecond,
const uint64_t MatchRail)
{
if (devData.Type == PDJE_Dev_Type::UNKNOWN) {
return;
}
RAIL_KEY::KB_MOUSE key;
key.Device_Name = devData.Name;
if (key.Device_Name.size() > 255) {
key.Device_Name = std::string(key.Device_Name, 255);
}
key.DeviceKey = DeviceKey;
raildb.Add(key, devData.Type, MatchRail, offset_microsecond);
}
void
Judge_Init::SetEventRule(const EVENT_RULE &event_rule)
{
ev_rule = event_rule;
}
void
Judge_Init::DefaultFill(NOTE &obj,
const uint64_t railid,
const LOCAL_TIME axis1,
const LOCAL_TIME axis2)
{
note_objects->Fill<BUFFER_MAIN>(obj, railid);
if (axis2 != 0 && axis2 > axis1) {
obj.isDown = false;
obj.microsecond = axis2;
note_objects->Fill<BUFFER_SUB>(obj, railid);
}
}
void
Judge_Init::NoteObjectCollector(const std::string noteType,
const uint16_t noteDetail,
const std::string firstArg,
const std::string secondArg,
const std::string thirdArg,
const unsigned long long Y_Axis,
const unsigned long long Y_Axis_2,
const uint64_t railID)
{
if (raildb.Empty()) {
return;
}
if (!note_objects.has_value()) {
note_objects.emplace();
}
auto tempobj = NOTE{ .type = noteType,
.detail = noteDetail,
.first = firstArg,
.second = secondArg,
.third = thirdArg,
.microsecond = 0,
.used = false,
.isDown = true };
LOCAL_TIME micro_Y1 = Convert_Frame_Into_MicroSecond(Y_Axis);
LOCAL_TIME micro_Y2 = Convert_Frame_Into_MicroSecond(Y_Axis_2);
tempobj.microsecond = micro_Y1;
auto res = raildb.GetMETA(railID);
if (!res) {
return; // if railid is not exists, discard note.
}
if (tempobj.type == "AXIS") {
tempobj.isDown = false;
note_objects->Fill<BUFFER_SUB>(
tempobj,
railID); // thid logic will be replaced after implemented AxisModel.
} else {
DefaultFill(tempobj, railID, micro_Y1, micro_Y2);
}
}
}; // namespace PDJE_JUDGE