Fix parting Input Settings if they have invalid data
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "Engine/Scripting/ScriptingType.h"
|
||||
#include "Engine/Scripting/BinaryModule.h"
|
||||
#include "Engine/Profiler/ProfilerCPU.h"
|
||||
#include "Engine/Serialization/JsonTools.h"
|
||||
|
||||
struct AxisEvaluation
|
||||
{
|
||||
@@ -105,6 +106,69 @@ void InputSettings::Apply()
|
||||
Input::AxisMappings = AxisMappings;
|
||||
}
|
||||
|
||||
void InputSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier)
|
||||
{
|
||||
const auto actionMappings = stream.FindMember("ActionMappings");
|
||||
if (actionMappings != stream.MemberEnd())
|
||||
{
|
||||
auto& actionMappingsArray = actionMappings->value;
|
||||
if (actionMappingsArray.IsArray())
|
||||
{
|
||||
ActionMappings.Resize(actionMappingsArray.Size(), false);
|
||||
for (uint32 i = 0; i < actionMappingsArray.Size(); i++)
|
||||
{
|
||||
auto& v = actionMappingsArray[i];
|
||||
if (!v.IsObject())
|
||||
continue;
|
||||
|
||||
ActionConfig& config = ActionMappings[i];
|
||||
config.Name = JsonTools::GetString(v, "Name");
|
||||
config.Mode = JsonTools::GetEnum(v, "Mode", InputActionMode::Pressing);
|
||||
config.Key = JsonTools::GetEnum(v, "Key", KeyboardKeys::None);
|
||||
config.MouseButton = JsonTools::GetEnum(v, "MouseButton", MouseButton::None);
|
||||
config.GamepadButton = JsonTools::GetEnum(v, "GamepadButton", GamepadButton::None);
|
||||
config.Gamepad = JsonTools::GetEnum(v, "Gamepad", InputGamepadIndex::All);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ActionMappings.Resize(0, false);
|
||||
}
|
||||
}
|
||||
|
||||
const auto axisMappings = stream.FindMember("AxisMappings");
|
||||
if (axisMappings != stream.MemberEnd())
|
||||
{
|
||||
auto& axisMappingsArray = axisMappings->value;
|
||||
if (axisMappingsArray.IsArray())
|
||||
{
|
||||
AxisMappings.Resize(axisMappingsArray.Size(), false);
|
||||
for (uint32 i = 0; i < axisMappingsArray.Size(); i++)
|
||||
{
|
||||
auto& v = axisMappingsArray[i];
|
||||
if (!v.IsObject())
|
||||
continue;
|
||||
|
||||
AxisConfig& config = AxisMappings[i];
|
||||
config.Name = JsonTools::GetString(v, "Name");
|
||||
config.Axis = JsonTools::GetEnum(v, "Axis", InputAxisType::MouseX);
|
||||
config.Gamepad = JsonTools::GetEnum(v, "Gamepad", InputGamepadIndex::All);
|
||||
config.PositiveButton = JsonTools::GetEnum(v, "PositiveButton", KeyboardKeys::None);
|
||||
config.NegativeButton = JsonTools::GetEnum(v, "NegativeButton", KeyboardKeys::None);
|
||||
config.DeadZone = JsonTools::GetFloat(v, "DeadZone", 0.1f);
|
||||
config.Sensitivity = JsonTools::GetFloat(v, "Sensitivity", 0.4f);
|
||||
config.Gravity = JsonTools::GetFloat(v, "Gravity", 1.0f);
|
||||
config.Scale = JsonTools::GetFloat(v, "Scale", 1.0f);
|
||||
config.Snap = JsonTools::GetBool(v, "Snap", false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AxisMappings.Resize(0, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Mouse::OnMouseMoved(const Vector2& newPosition)
|
||||
{
|
||||
_prevState.MousePosition = newPosition;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "Engine/Core/Config/Settings.h"
|
||||
#include "Engine/Serialization/JsonTools.h"
|
||||
#include "VirtualInput.h"
|
||||
#include "Engine/Core/Collections/Array.h"
|
||||
|
||||
@@ -34,59 +33,5 @@ public:
|
||||
|
||||
// [SettingsBase]
|
||||
void Apply() override;
|
||||
|
||||
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override
|
||||
{
|
||||
const auto actionMappings = stream.FindMember("ActionMappings");
|
||||
if (actionMappings != stream.MemberEnd())
|
||||
{
|
||||
auto& actionMappingsArray = actionMappings->value;
|
||||
ASSERT(actionMappingsArray.IsArray());
|
||||
ActionMappings.Resize(actionMappingsArray.Size(), false);
|
||||
|
||||
for (uint32 i = 0; i < actionMappingsArray.Size(); i++)
|
||||
{
|
||||
auto& v = actionMappingsArray[i];
|
||||
if (!v.IsObject())
|
||||
continue;
|
||||
|
||||
ActionConfig& config = ActionMappings[i];
|
||||
|
||||
config.Name = JsonTools::GetString(v, "Name");
|
||||
config.Mode = JsonTools::GetEnum(v, "Mode", InputActionMode::Pressing);
|
||||
config.Key = JsonTools::GetEnum(v, "Key", KeyboardKeys::None);
|
||||
config.MouseButton = JsonTools::GetEnum(v, "MouseButton", MouseButton::None);
|
||||
config.GamepadButton = JsonTools::GetEnum(v, "GamepadButton", GamepadButton::None);
|
||||
config.Gamepad = JsonTools::GetEnum(v, "Gamepad", InputGamepadIndex::All);
|
||||
}
|
||||
}
|
||||
|
||||
const auto axisMappings = stream.FindMember("AxisMappings");
|
||||
if (axisMappings != stream.MemberEnd())
|
||||
{
|
||||
auto& axisMappingsArray = axisMappings->value;
|
||||
ASSERT(axisMappingsArray.IsArray());
|
||||
AxisMappings.Resize(axisMappingsArray.Size(), false);
|
||||
|
||||
for (uint32 i = 0; i < axisMappingsArray.Size(); i++)
|
||||
{
|
||||
auto& v = axisMappingsArray[i];
|
||||
if (!v.IsObject())
|
||||
continue;
|
||||
|
||||
AxisConfig& config = AxisMappings[i];
|
||||
|
||||
config.Name = JsonTools::GetString(v, "Name");
|
||||
config.Axis = JsonTools::GetEnum(v, "Axis", InputAxisType::MouseX);
|
||||
config.Gamepad = JsonTools::GetEnum(v, "Gamepad", InputGamepadIndex::All);
|
||||
config.PositiveButton = JsonTools::GetEnum(v, "PositiveButton", KeyboardKeys::None);
|
||||
config.NegativeButton = JsonTools::GetEnum(v, "NegativeButton", KeyboardKeys::None);
|
||||
config.DeadZone = JsonTools::GetFloat(v, "DeadZone", 0.1f);
|
||||
config.Sensitivity = JsonTools::GetFloat(v, "Sensitivity", 0.4f);
|
||||
config.Gravity = JsonTools::GetFloat(v, "Gravity", 1.0f);
|
||||
config.Scale = JsonTools::GetFloat(v, "Scale", 1.0f);
|
||||
config.Snap = JsonTools::GetBool(v, "Snap", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user