Merge branch 'main' into LYN-2461
This commit is contained in:
@@ -133,7 +133,15 @@ namespace AZ
|
||||
if (!id.m_guid.IsNull())
|
||||
{
|
||||
*instance = AssetManager::Instance().FindOrCreateAsset(id, instance->GetType(), instance->GetAutoLoadBehavior());
|
||||
|
||||
if (!instance->GetId().IsValid())
|
||||
{
|
||||
// If the asset failed to be created, FindOrCreateAsset returns an asset instance with a null
|
||||
// id. To preserve the asset id in the source json, reset the asset to an empty one, but with
|
||||
// the right id.
|
||||
const auto loadBehavior = instance->GetAutoLoadBehavior();
|
||||
*instance = Asset<AssetData>(id, instance->GetType());
|
||||
instance->SetAutoLoadBehavior(loadBehavior);
|
||||
}
|
||||
|
||||
result.Combine(context.Report(result, "Successfully created Asset<T> with id."));
|
||||
}
|
||||
|
||||
@@ -86,4 +86,94 @@ namespace AZ
|
||||
Normal,
|
||||
UniformReal
|
||||
};
|
||||
|
||||
//! Halton sequences are deterministic, quasi-random sequences with low discrepancy. They
|
||||
//! are useful for generating evenly distributed points.
|
||||
//! See https://en.wikipedia.org/wiki/Halton_sequence for more information.
|
||||
|
||||
//! Returns a single halton number.
|
||||
//! @param index The index of the number. Indices start at 1. Using index 0 will return 0.
|
||||
//! @param base The numerical base of the halton number.
|
||||
inline float GetHaltonNumber(uint32_t index, uint32_t base)
|
||||
{
|
||||
float fraction = 1.0f;
|
||||
float result = 0.0f;
|
||||
|
||||
while (index > 0)
|
||||
{
|
||||
fraction = fraction / base;
|
||||
result += fraction * (index % base);
|
||||
index = aznumeric_cast<uint32_t>(index / base);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//! A helper class for generating arrays of Halton sequences in n dimensions.
|
||||
//! The class holds the state of which bases to use, the starting offset
|
||||
//! of each dimension and how much to increment between each index for each
|
||||
//! dimension.
|
||||
template <uint8_t Dimensions>
|
||||
class HaltonSequence
|
||||
{
|
||||
public:
|
||||
|
||||
//! Initializes a Halton sequence with some bases. By default there is no
|
||||
//! offset and the index increments by 1 between each number.
|
||||
HaltonSequence(AZStd::array<uint32_t, Dimensions> bases)
|
||||
: m_bases(bases)
|
||||
{
|
||||
m_offsets.fill(1); // Halton sequences start at index 1.
|
||||
m_increments.fill(1); // By default increment by 1 between each number.
|
||||
}
|
||||
|
||||
//! Returns a Halton sequence in an array of N length
|
||||
template<uint32_t N>
|
||||
AZStd::array<AZStd::array<float, Dimensions>, N> GetHaltonSequence()
|
||||
{
|
||||
AZStd::array<AZStd::array<float, Dimensions>, N> result;
|
||||
|
||||
AZStd::array<uint32_t, Dimensions> indices = m_offsets;
|
||||
|
||||
// Generator that returns the Halton number for all bases for a single entry.
|
||||
auto f = [&] ()
|
||||
{
|
||||
AZStd::array<float, Dimensions> item;
|
||||
for (auto d = 0; d < Dimensions; ++d)
|
||||
{
|
||||
item[d] = GetHaltonNumber(indices[d], m_bases[d]);
|
||||
indices[d] += m_increments[d];
|
||||
}
|
||||
return item;
|
||||
};
|
||||
|
||||
AZStd::generate(result.begin(), result.end(), f);
|
||||
return result;
|
||||
}
|
||||
|
||||
//! Sets the offsets per dimension to start generating a sequence from.
|
||||
//! By default, there is no offset (offset of 0 corresponds to starting at index 1)
|
||||
void SetOffsets(AZStd::array<uint32_t, Dimensions> offsets)
|
||||
{
|
||||
m_offsets = offsets;
|
||||
|
||||
// Halton sequences start at index 1, so increment all the indices.
|
||||
AZStd::for_each(m_offsets.begin(), m_offsets.end(), [](uint32_t &n){ n++; });
|
||||
}
|
||||
|
||||
//! Sets the increment between numbers in the halton sequence per dimension
|
||||
//! By default this is 1, meaning that no numbers are skipped. Can be negative
|
||||
//! to generate numbers in reverse order.
|
||||
void SetIncrements(AZStd::array<int32_t, Dimensions> increments)
|
||||
{
|
||||
m_increments = increments;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
AZStd::array<uint32_t, Dimensions> m_bases;
|
||||
AZStd::array<uint32_t, Dimensions> m_offsets;
|
||||
AZStd::array<int32_t, Dimensions> m_increments;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <cerrno>
|
||||
#include <AzCore/Casting/numeric_cast.h>
|
||||
#include <AzCore/JSON/error/en.h>
|
||||
#include <AzCore/NativeUI//NativeUIRequests.h>
|
||||
#include <AzCore/Serialization/Json/JsonSerialization.h>
|
||||
#include <AzCore/Serialization/Json/StackedString.h>
|
||||
#include <AzCore/Settings/SettingsRegistryImpl.h>
|
||||
@@ -880,6 +881,13 @@ namespace AZ
|
||||
const Specializations& specializations, const rapidjson::Pointer& historyPointer, AZStd::string_view folderPath)
|
||||
{
|
||||
using namespace rapidjson;
|
||||
|
||||
if (&lhs == &rhs)
|
||||
{
|
||||
// Early return to avoid setting the collisionFound reference to true
|
||||
// std::sort is allowed to pass in the same memory address for the left and right elements
|
||||
return false;
|
||||
}
|
||||
|
||||
AZ_Assert(!lhs.m_tags.empty(), "Comparing a settings file without at least a name tag.");
|
||||
AZ_Assert(!rhs.m_tags.empty(), "Comparing a settings file without at least a name tag.");
|
||||
@@ -1054,15 +1062,23 @@ namespace AZ
|
||||
jsonPatch.ParseInsitu<flags>(scratchBuffer.data());
|
||||
if (jsonPatch.HasParseError())
|
||||
{
|
||||
auto nativeUI = AZ::Interface<NativeUI::NativeUIRequests>::Get();
|
||||
if (jsonPatch.GetParseError() == rapidjson::kParseErrorDocumentEmpty)
|
||||
{
|
||||
AZ_Warning("Settings Registry", false, R"(Unable to parse registry file "%s" due to json error "%s" at offset %llu.)",
|
||||
AZ_Warning("Settings Registry", false, R"(Unable to parse registry file "%s" due to json error "%s" at offset %zu.)",
|
||||
path, GetParseError_En(jsonPatch.GetParseError()), jsonPatch.GetErrorOffset());
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Error("Settings Registry", false, R"(Unable to parse registry file "%s" due to json error "%s" at offset %llu.)", path,
|
||||
using ErrorString = AZStd::fixed_string<4096>;
|
||||
auto jsonError = ErrorString::format(R"(Unable to parse registry file "%s" due to json error "%s" at offset %zu.)", path,
|
||||
GetParseError_En(jsonPatch.GetParseError()), jsonPatch.GetErrorOffset());
|
||||
AZ_Error("Settings Registry", false, "%s", jsonError.c_str());
|
||||
|
||||
if (nativeUI)
|
||||
{
|
||||
nativeUI->DisplayOkDialog("Setreg(Patch) Merge Issue", AZStd::string_view(jsonError), false);
|
||||
}
|
||||
}
|
||||
|
||||
pointer.Create(m_settings, m_settings.GetAllocator()).SetObject()
|
||||
|
||||
Reference in New Issue
Block a user