Replace union with std::variant
This commit is contained in:
@@ -151,7 +151,8 @@ void PathFindingDemo::HandleActions(const std::vector<UserAction> &actions) {
|
|||||||
LOG_INFO("Exit requested");
|
LOG_INFO("Exit requested");
|
||||||
m_ExitRequested = true;
|
m_ExitRequested = true;
|
||||||
} else if (action.type == UserAction::Type::SET_MOVE_TARGET) {
|
} else if (action.type == UserAction::Type::SET_MOVE_TARGET) {
|
||||||
WorldPos target_pos = m_Camera.WindowToWorld(action.Argument.position);
|
WorldPos target_pos =
|
||||||
|
m_Camera.WindowToWorld(std::get<WindowPos>(action.Argument));
|
||||||
for (auto &selected_entity : m_SelectedEntities) {
|
for (auto &selected_entity : m_SelectedEntities) {
|
||||||
LOG_INFO("Calculating path to target: ", target_pos);
|
LOG_INFO("Calculating path to target: ", target_pos);
|
||||||
if (auto sp = selected_entity.lock()) {
|
if (auto sp = selected_entity.lock()) {
|
||||||
@@ -166,23 +167,24 @@ void PathFindingDemo::HandleActions(const std::vector<UserAction> &actions) {
|
|||||||
}
|
}
|
||||||
} else if (action.type == UserAction::Type::SELECT_PATHFINDER) {
|
} else if (action.type == UserAction::Type::SELECT_PATHFINDER) {
|
||||||
using namespace pathfinder;
|
using namespace pathfinder;
|
||||||
PathFinderType type = static_cast<PathFinderType>(action.Argument.number);
|
PathFinderType type =
|
||||||
|
static_cast<PathFinderType>(std::get<int32_t>(action.Argument));
|
||||||
m_PathFinder = pathfinder::utils::create(type, (const Map *)&m_Map);
|
m_PathFinder = pathfinder::utils::create(type, (const Map *)&m_Map);
|
||||||
LOG_INFO("Switched to path finding method: ", m_PathFinder->GetName());
|
LOG_INFO("Switched to path finding method: ", m_PathFinder->GetName());
|
||||||
} else if (action.type == UserAction::Type::CAMERA_PAN) {
|
} else if (action.type == UserAction::Type::CAMERA_PAN) {
|
||||||
const auto &window_pan = action.Argument.position;
|
const auto &window_pan = std::get<WindowPos>(action.Argument);
|
||||||
WorldPos world_pan{window_pan.x(), window_pan.y()};
|
WorldPos world_pan{window_pan.x(), window_pan.y()};
|
||||||
m_Camera.Pan(world_pan);
|
m_Camera.Pan(world_pan);
|
||||||
LOG_INFO("Camera pan delta: ", world_pan);
|
LOG_INFO("Camera pan delta: ", world_pan);
|
||||||
} else if (action.type == UserAction::Type::CAMERA_ZOOM) {
|
} else if (action.type == UserAction::Type::CAMERA_ZOOM) {
|
||||||
m_Camera.Zoom(action.Argument.float_number);
|
m_Camera.Zoom(std::get<float>(action.Argument));
|
||||||
LOG_INFO("Camera zoom: ", action.Argument.float_number);
|
LOG_INFO("Camera zoom: ", std::get<float>(action.Argument));
|
||||||
} else if (action.type == UserAction::Type::SELECTION_START) {
|
} else if (action.type == UserAction::Type::SELECTION_START) {
|
||||||
m_SelectionBox.active = true;
|
m_SelectionBox.active = true;
|
||||||
m_SelectionBox.start = action.Argument.position;
|
m_SelectionBox.start = std::get<WindowPos>(action.Argument);
|
||||||
m_SelectionBox.end = action.Argument.position;
|
m_SelectionBox.end = std::get<WindowPos>(action.Argument);
|
||||||
} else if (action.type == UserAction::Type::SELECTION_END) {
|
} else if (action.type == UserAction::Type::SELECTION_END) {
|
||||||
m_SelectionBox.end = action.Argument.position;
|
m_SelectionBox.end = std::get<WindowPos>(action.Argument);
|
||||||
m_SelectionBox.active = false;
|
m_SelectionBox.active = false;
|
||||||
auto diff = m_SelectionBox.end - m_SelectionBox.start;
|
auto diff = m_SelectionBox.end - m_SelectionBox.start;
|
||||||
// here we explicitly change the vector type from WindowPos to WindowSize
|
// here we explicitly change the vector type from WindowPos to WindowSize
|
||||||
@@ -191,7 +193,7 @@ void PathFindingDemo::HandleActions(const std::vector<UserAction> &actions) {
|
|||||||
WorldPos end = m_Camera.WindowToWorld(m_SelectionBox.end);
|
WorldPos end = m_Camera.WindowToWorld(m_SelectionBox.end);
|
||||||
SelectEntitiesInRectangle(start, end);
|
SelectEntitiesInRectangle(start, end);
|
||||||
} else if (action.type == UserAction::Type::SELECTION_CHANGE) {
|
} else if (action.type == UserAction::Type::SELECTION_CHANGE) {
|
||||||
m_SelectionBox.end = action.Argument.position;
|
m_SelectionBox.end = std::get<WindowPos>(action.Argument);
|
||||||
auto diff = m_SelectionBox.end - m_SelectionBox.start;
|
auto diff = m_SelectionBox.end - m_SelectionBox.start;
|
||||||
m_SelectionBox.size = diff.ChangeTag<WindowSizeTag>();
|
m_SelectionBox.size = diff.ChangeTag<WindowSizeTag>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,25 +24,17 @@ public:
|
|||||||
SELECTION_END
|
SELECTION_END
|
||||||
};
|
};
|
||||||
|
|
||||||
UserAction() : type(Type::NONE), Argument{.number = 0} {}
|
UserAction() : type(Type::NONE), Argument{0} {}
|
||||||
UserAction(Type t) : type(t), Argument{.number = 0} {}
|
UserAction(Type t) : type(t), Argument{0} {}
|
||||||
UserAction(Type t, char key) : type(t), Argument{.key = key} {}
|
UserAction(Type t, char key) : type(t), Argument{key} {}
|
||||||
UserAction(Type t, WindowPos v) : type(t), Argument{.position = v} {}
|
UserAction(Type t, WindowPos v) : type(t), Argument{v} {}
|
||||||
UserAction(Type t, int32_t arg) : type(t), Argument{.number = arg} {}
|
UserAction(Type t, int32_t arg) : type(t), Argument{arg} {}
|
||||||
UserAction(Type t, float arg) : type(t), Argument{.float_number = arg} {}
|
UserAction(Type t, float arg) : type(t), Argument{arg} {}
|
||||||
~UserAction() = default;
|
~UserAction() = default;
|
||||||
|
|
||||||
Type type;
|
Type type;
|
||||||
|
|
||||||
union {
|
std::variant<WindowPos, char, int32_t, float> Argument;
|
||||||
WindowPos position;
|
|
||||||
char key;
|
|
||||||
int32_t number;
|
|
||||||
float float_number;
|
|
||||||
} Argument;
|
|
||||||
|
|
||||||
// TODO use std::variant
|
|
||||||
// std::variant<WindowPos, char, int> Argument;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class UserInput {
|
class UserInput {
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ std::expected<void, std::string> Window::Init() {
|
|||||||
// Set renderer to the Sprite class
|
// Set renderer to the Sprite class
|
||||||
Sprite::SetRenderer(m_Renderer);
|
Sprite::SetRenderer(m_Renderer);
|
||||||
|
|
||||||
// TODO this needs to be tied to map size
|
|
||||||
SDL_SetRenderScale(m_Renderer.get(), 1.0f, 1.0f);
|
SDL_SetRenderScale(m_Renderer.get(), 1.0f, 1.0f);
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
@@ -105,7 +104,6 @@ void Window::ClearWindow() {
|
|||||||
|
|
||||||
void Window::Flush() { SDL_RenderPresent(m_Renderer.get()); }
|
void Window::Flush() { SDL_RenderPresent(m_Renderer.get()); }
|
||||||
|
|
||||||
// TODO use some struct for color
|
|
||||||
void Window::DrawCircle(const WindowPos &position, float radius, uint8_t R,
|
void Window::DrawCircle(const WindowPos &position, float radius, uint8_t R,
|
||||||
uint8_t G, uint8_t B) {
|
uint8_t G, uint8_t B) {
|
||||||
int cx = static_cast<int>(position.x());
|
int cx = static_cast<int>(position.x());
|
||||||
|
|||||||
Reference in New Issue
Block a user