Skip to content

Commit 25ac11f

Browse files
committed
feat: misc runtime update
1 parent 4510cca commit 25ac11f

File tree

22 files changed

+797
-248
lines changed

22 files changed

+797
-248
lines changed

Engine/Source/Launch/Src/GameViewport.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//
44

55
#include <Launch/GameViewport.h>
6+
#include <Runtime/Engine.h>
67

78
namespace Launch::Internal {
89
static void* GetGlfwPlatformWindow(GLFWwindow* inWindow)

Engine/Source/Mirror/Include/Mirror/Mirror.h

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ namespace Mirror {
7373
};
7474

7575
MIRROR_API bool PointerConvertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType);
76-
MIRROR_API bool PolymorphismConvertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType);
77-
MIRROR_API bool Convertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType);
76+
MIRROR_API bool PolymorphismConvertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType, bool allowDynamicDownCastNoCheck);
77+
MIRROR_API bool Convertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType, bool allowDynamicDownCastNoCheck);
7878

7979
enum class AnyPolicy : uint8_t {
8080
memoryHolder,
@@ -238,15 +238,13 @@ namespace Mirror {
238238
const Any& MoveAssign(const Any& inOther) const noexcept;
239239
const Any& MoveAssign(Any&& inOther) const noexcept;
240240

241-
template <typename T> bool Convertible();
242-
template <typename T> bool Convertible() const;
241+
template <typename T> bool Convertible(bool allowDynamicDownCastNoCheck = false);
242+
template <typename T> bool Convertible(bool allowDynamicDownCastNoCheck = false) const;
243243

244-
template <typename T> T As();
245-
template <typename T> T As() const;
246-
template <Common::CppNotRef T> T* TryAs();
247-
template <Common::CppNotRef T> T* TryAs() const;
248-
template <typename B, typename T> T PolyAs();
249-
template <typename B, typename T> T PolyAs() const;
244+
template <typename T> T As(bool allowDynamicDownCastNoCheck = false);
245+
template <typename T> T As(bool allowDynamicDownCastNoCheck = false) const;
246+
template <Common::CppNotRef T> T* TryAs(bool allowDynamicDownCastNoCheck = false);
247+
template <Common::CppNotRef T> T* TryAs(bool allowDynamicDownCastNoCheck = false) const;
250248

251249
template <ValidTemplateView V> bool CanAsTemplateView() const;
252250
TemplateViewRttiPtr GetTemplateViewRtti() const;
@@ -365,7 +363,8 @@ namespace Mirror {
365363
Argument& operator=(const Any& inAny);
366364
Argument& operator=(Any&& inAny);
367365

368-
template <typename T> T As() const;
366+
template <typename T> T As(bool allowDynamicDownCastNoCheck = false) const;
367+
template <Common::CppNotRef T> T* TryAs(bool allowDynamicDownCastNoCheck = false) const;
369368

370369
template <ValidTemplateView V> bool CanAsTemplateView() const;
371370
TemplateViewRttiPtr GetTemplateViewRtti() const;
@@ -822,12 +821,12 @@ namespace Mirror {
822821
const MemberFunction& GetMemberFunction(const Id& inId) const;
823822
Any GetDefaultObject() const;
824823
bool IsTransient() const;
825-
826824
Any ConstructDyn(const ArgumentList& arguments) const;
827825
Any NewDyn(const ArgumentList& arguments) const;
828826
Any InplaceNewDyn(void* ptr, const ArgumentList& arguments) const;
829827
void DestructDyn(const Argument& argument) const;
830828
void DeleteDyn(const Argument& argument) const;
829+
Any Cast(const Argument& objPtrOrRef) const;
831830

832831
private:
833832
static std::unordered_map<TypeId, Id> typeToIdMap;
@@ -837,14 +836,17 @@ namespace Mirror {
837836

838837
using BaseClassGetter = std::function<const Class*()>;
839838
using InplaceGetter = std::function<Any(void*)>;
839+
using DefaultObjectCreator = std::function<Any()>;
840+
using Caster = std::function<Any(const Mirror::Argument&)>;
840841

841842
struct ConstructParams {
842843
Id id;
843844
const TypeInfo* typeInfo;
844845
size_t memorySize;
845846
BaseClassGetter baseClassGetter;
846847
InplaceGetter inplaceGetter;
847-
std::function<Any()> defaultObjectCreator;
848+
Caster caster;
849+
DefaultObjectCreator defaultObjectCreator;
848850
std::optional<Destructor::ConstructParams> destructorParams;
849851
std::optional<Constructor::ConstructParams> defaultConstructorParams;
850852
std::optional<Constructor::ConstructParams> moveConstructorParams;
@@ -853,7 +855,7 @@ namespace Mirror {
853855

854856
explicit Class(ConstructParams&& params);
855857

856-
void CreateDefaultObject(const std::function<Any()>& inCreator);
858+
void CreateDefaultObject(const DefaultObjectCreator& inCreator);
857859
Destructor& EmplaceDestructor(Destructor::ConstructParams&& inParams);
858860
Constructor& EmplaceConstructor(const Id& inId, Constructor::ConstructParams&& inParams);
859861
Variable& EmplaceStaticVariable(const Id& inId, Variable::ConstructParams&& inParams);
@@ -865,6 +867,7 @@ namespace Mirror {
865867
size_t memorySize;
866868
BaseClassGetter baseClassGetter;
867869
InplaceGetter inplaceGetter;
870+
Caster caster;
868871
Any defaultObject;
869872
std::optional<Destructor> destructor;
870873
std::unordered_map<Id, Constructor, IdHashProvider> constructors;
@@ -3025,71 +3028,61 @@ namespace Mirror {
30253028
}
30263029

30273030
template <typename T>
3028-
bool Any::Convertible()
3031+
bool Any::Convertible(bool allowDynamicDownCastNoCheck)
30293032
{
30303033
Assert(!IsArray());
30313034
return Mirror::Convertible(
30323035
{ Type(), RemoveRefType(), RemovePointerType() },
3033-
{ GetTypeInfo<T>(), GetTypeInfo<std::remove_reference_t<T>>(), GetTypeInfo<std::remove_pointer_t<T>>() });
3036+
{ GetTypeInfo<T>(), GetTypeInfo<std::remove_reference_t<T>>(), GetTypeInfo<std::remove_pointer_t<T>>() },
3037+
allowDynamicDownCastNoCheck);
30343038
}
30353039

30363040
template <typename T>
3037-
bool Any::Convertible() const
3041+
bool Any::Convertible(bool allowDynamicDownCastNoCheck) const
30383042
{
30393043
Assert(!IsArray());
30403044
return Mirror::Convertible(
30413045
{ Type(), RemoveRefType(), RemovePointerType() },
3042-
{ GetTypeInfo<T>(), GetTypeInfo<std::remove_reference_t<T>>(), GetTypeInfo<std::remove_pointer_t<T>>() });
3046+
{ GetTypeInfo<T>(), GetTypeInfo<std::remove_reference_t<T>>(), GetTypeInfo<std::remove_pointer_t<T>>() },
3047+
allowDynamicDownCastNoCheck);
30433048
}
30443049

30453050
template <typename T>
3046-
T Any::As()
3051+
T Any::As(bool allowDynamicDownCastNoCheck)
30473052
{
3048-
Assert(Convertible<T>());
3053+
Assert(Convertible<T>(allowDynamicDownCastNoCheck));
30493054
return static_cast<T>(*static_cast<std::remove_cvref_t<T>*>(Data()));
30503055
}
30513056

30523057
template <typename T>
3053-
T Any::As() const
3058+
T Any::As(bool allowDynamicDownCastNoCheck) const
30543059
{
3055-
Assert(Convertible<T>());
3060+
Assert(Convertible<T>(allowDynamicDownCastNoCheck));
30563061
return static_cast<T>(*static_cast<std::remove_cvref_t<T>*>(Data()));
30573062
}
30583063

30593064
template <Common::CppNotRef T>
3060-
T* Any::TryAs()
3065+
T* Any::TryAs(bool allowDynamicDownCastNoCheck)
30613066
{
30623067
Assert(!IsArray());
30633068
const bool convertible = Mirror::Convertible(
30643069
{ AddPointerType(), AddPointerType(), RemoveRefType() },
3065-
{ GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() });
3070+
{ GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() },
3071+
allowDynamicDownCastNoCheck);
30663072
return convertible ? static_cast<std::remove_cvref_t<T>*>(Data()) : nullptr;
30673073
}
30683074

30693075
template <Common::CppNotRef T>
3070-
T* Any::TryAs() const
3076+
T* Any::TryAs(bool allowDynamicDownCastNoCheck) const
30713077
{
30723078
Assert(!IsArray());
30733079
const bool convertible = Mirror::Convertible(
30743080
{ AddPointerType(), AddPointerType(), RemoveRefType() },
3075-
{ GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() });
3081+
{ GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() },
3082+
allowDynamicDownCastNoCheck);
30763083
return convertible ? static_cast<std::remove_cvref_t<T>*>(Data()) : nullptr;
30773084
}
30783085

3079-
template <typename B, typename T>
3080-
T Any::PolyAs()
3081-
{
3082-
Assert(!IsArray());
3083-
return dynamic_cast<T>(As<B>());
3084-
}
3085-
3086-
template <typename B, typename T>
3087-
T Any::PolyAs() const
3088-
{
3089-
Assert(!IsArray());
3090-
return dynamic_cast<T>(As<B>());
3091-
}
3092-
30933086
template <ValidTemplateView V>
30943087
bool Any::CanAsTemplateView() const
30953088
{
@@ -3160,10 +3153,18 @@ namespace Mirror {
31603153
}
31613154

31623155
template <typename T>
3163-
T Argument::As() const // NOLINT
3156+
T Argument::As(bool allowDynamicDownCastNoCheck) const // NOLINT
31643157
{
3165-
return Delegate([](auto&& value) -> decltype(auto) {
3166-
return value.template As<T>();
3158+
return Delegate([&](auto&& value) -> decltype(auto) {
3159+
return value.template As<T>(allowDynamicDownCastNoCheck);
3160+
});
3161+
}
3162+
3163+
template <Common::CppNotRef T>
3164+
T* Argument::TryAs(bool allowDynamicDownCastNoCheck) const
3165+
{
3166+
return Delegate([&](auto&& value) -> decltype(auto) {
3167+
return value.template TryAs<T>(allowDynamicDownCastNoCheck);
31673168
});
31683169
}
31693170

Engine/Source/Mirror/Include/Mirror/Registry.h

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ namespace Mirror {
5555
public:
5656
~ClassRegistry() override;
5757

58-
template <typename... Args, FieldAccess Access = FieldAccess::faPublic> ClassRegistry& Constructor(const Id& inId);
58+
template <typename... Args> ClassRegistry& Constructor(const Id& inId);
59+
template <FieldAccess Access, typename... Args> ClassRegistry& Constructor(const Id& inId);
5960
template <auto Ptr, FieldAccess Access = FieldAccess::faPublic> ClassRegistry& StaticVariable(const Id& inId);
6061
template <auto Ptr, FieldAccess Access = FieldAccess::faPublic> ClassRegistry& StaticFunction(const Id& inId);
6162
template <auto Ptr, FieldAccess Access = FieldAccess::faPublic> ClassRegistry& MemberVariable(const Id& inId);
@@ -238,7 +239,14 @@ namespace Mirror {
238239
ClassRegistry<C>::~ClassRegistry() = default;
239240

240241
template <typename C>
241-
template <typename... Args, FieldAccess Access>
242+
template <typename ... Args>
243+
ClassRegistry<C>& ClassRegistry<C>::Constructor(const Id& inId)
244+
{
245+
return Constructor<FieldAccess::faPublic, Args...>(inId);
246+
}
247+
248+
template <typename C>
249+
template <FieldAccess Access, typename... Args>
242250
ClassRegistry<C>& ClassRegistry<C>::Constructor(const Id& inId)
243251
{
244252
using ArgsTupleType = std::tuple<Args...>;
@@ -256,7 +264,7 @@ namespace Mirror {
256264
params.argRemoveRefTypeInfos = { GetTypeInfo<std::remove_reference_t<Args>>()... };
257265
params.argRemovePointerTypeInfos = { GetTypeInfo<std::remove_pointer_t<Args>>()... };
258266
params.stackConstructor = [](const ArgumentList& args) -> Any {
259-
if constexpr (std::is_copy_constructible_v<C> || std::is_move_constructible_v<C>) {
267+
if constexpr (!std::is_abstract_v<C> && (std::is_copy_constructible_v<C> || std::is_move_constructible_v<C>)) {
260268
Assert(argsTupleSize == args.size());
261269
return ForwardAsAny(Internal::InvokeConstructorStack<C, ArgsTupleType>(args, std::make_index_sequence<argsTupleSize> {}));
262270
} else {
@@ -265,12 +273,22 @@ namespace Mirror {
265273
}
266274
};
267275
params.heapConstructor = [](const ArgumentList& args) -> Any {
268-
Assert(argsTupleSize == args.size());
269-
return ForwardAsAny(Internal::InvokeConstructorNew<C, ArgsTupleType>(args, std::make_index_sequence<argsTupleSize> {}));
276+
if constexpr (!std::is_abstract_v<C>) {
277+
Assert(argsTupleSize == args.size());
278+
return ForwardAsAny(Internal::InvokeConstructorNew<C, ArgsTupleType>(args, std::make_index_sequence<argsTupleSize> {}));
279+
} else {
280+
QuickFail();
281+
return {};
282+
}
270283
};
271284
params.inplaceConstructor = [](void* ptr, const ArgumentList& args) -> Any {
272-
Assert(argsTupleSize == args.size());
273-
return ForwardAsAny(std::ref(Internal::InvokeConstructorInplace<C, ArgsTupleType>(ptr, args, std::make_index_sequence<argsTupleSize> {})));
285+
if constexpr (!std::is_abstract_v<C>) {
286+
Assert(argsTupleSize == args.size());
287+
return ForwardAsAny(std::ref(Internal::InvokeConstructorInplace<C, ArgsTupleType>(ptr, args, std::make_index_sequence<argsTupleSize> {})));
288+
} else {
289+
QuickFail();
290+
return {};
291+
}
274292
};
275293

276294
return MetaDataRegistry<ClassRegistry>::SetContext(&clazz.EmplaceConstructor(inId, std::move(params)));
@@ -514,6 +532,16 @@ namespace Mirror {
514532
params.inplaceGetter = [](void* ptr) -> Any {
515533
return { std::ref(*static_cast<C*>(ptr)) };
516534
};
535+
params.caster = [](const Argument& argument) -> Any {
536+
if (argument.Type()->isPointer) {
537+
return argument.Type()->isConstPointer ? argument.As<const C*>(true) : argument.As<C*>(true);
538+
}
539+
if (argument.IsRef()) {
540+
return std::ref(argument.IsConstRef() ? argument.As<const C&>(true) : argument.As<C&>(true));
541+
}
542+
QuickFail();
543+
return {};
544+
};
517545
if constexpr (std::is_default_constructible_v<C>) {
518546
params.defaultObjectCreator = []() -> Any {
519547
return { C() };

Engine/Source/Mirror/Src/Mirror.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace Mirror {
2727
return !srcRemovePointer->isConst || dstRemovePointer->isConst;
2828
}
2929

30-
bool PolymorphismConvertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType)
30+
bool PolymorphismConvertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType, bool allowDynamicDownCastNoCheck)
3131
{
3232
const auto [srcRaw, srcRemoveRef, srcRemovePointer] = inSrcType;
3333
const auto [dstRaw, dstRemoveRef, dstRemovePointer] = inDstType;
@@ -53,13 +53,20 @@ namespace Mirror {
5353
const auto* srcClass = Class::Find(srcRemoveRefOrPtr->id); // NOLINT
5454
const auto* dstClass = Class::Find(dstRemoveRefOrPtr->id); // NOLINT
5555

56-
if (srcClass == nullptr || dstClass == nullptr || !dstClass->IsBaseOf(srcClass)) {
56+
const bool allClassValid = srcClass != nullptr && dstClass != nullptr;
57+
if (!allClassValid) {
58+
return false;
59+
}
60+
61+
const bool upDynamicCast = dstClass->IsBaseOf(srcClass); // NOLINT
62+
const bool downDynamicCast = allowDynamicDownCastNoCheck && srcClass->IsBaseOf(dstClass); // NOLINT
63+
if (!upDynamicCast && !downDynamicCast) {
5764
return false;
5865
}
5966
return !srcRemoveRefOrPtr->isConst || dstRaw->isRValueReference || dstRemoveRefOrPtr->isConst;
6067
}
6168

62-
bool Convertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType)
69+
bool Convertible(const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType, bool allowDynamicDownCastNoCheck)
6370
{
6471
const auto [srcRaw, srcRemoveRef, srcRemovePointer] = inSrcType;
6572
const auto [dstRaw, dstRemoveRef, dstRemovePointer] = inDstType;
@@ -70,7 +77,7 @@ namespace Mirror {
7077
}
7178
return !srcRemoveRef->isConst || dstRaw->isRValueReference || dstRemoveRef->isConst;
7279
}
73-
return PointerConvertible(inSrcType, inDstType) || PolymorphismConvertible(inSrcType, inDstType);
80+
return PointerConvertible(inSrcType, inDstType) || PolymorphismConvertible(inSrcType, inDstType, allowDynamicDownCastNoCheck);
7481
}
7582

7683
Any::Any()
@@ -1400,6 +1407,7 @@ namespace Mirror {
14001407
, memorySize(params.memorySize)
14011408
, baseClassGetter(std::move(params.baseClassGetter))
14021409
, inplaceGetter(std::move(params.inplaceGetter))
1410+
, caster(std::move(params.caster))
14031411
{
14041412
CreateDefaultObject(params.defaultObjectCreator);
14051413
if (params.destructorParams.has_value()) {
@@ -1672,7 +1680,7 @@ namespace Mirror {
16721680
for (auto i = 0; i < arguments.size(); i++) {
16731681
const TypeInfoCompact srcType { arguments[i].Type(), arguments[i].RemoveRefType(), arguments[i].RemovePointerType() }; // NOLINT
16741682
const TypeInfoCompact dstType { argTypeInfos[i], argRemoveRefTypeInfos[i], argRemovePointerTypeInfos[i] }; // NOLINT
1675-
if (Convertible(srcType, dstType)) {
1683+
if (Convertible(srcType, dstType, false)) {
16761684
rate += dstType.raw->isRValueReference ? 2 : 1;
16771685
continue;
16781686
}
@@ -1720,6 +1728,11 @@ namespace Mirror {
17201728
GetDestructor().DeleteDyn(argument);
17211729
}
17221730

1731+
Any Class::Cast(const Argument& objPtrOrRef) const
1732+
{
1733+
return caster(objPtrOrRef);
1734+
}
1735+
17231736
const Constructor* Class::FindConstructor(const Id& inId) const
17241737
{
17251738
const auto iter = constructors.find(inId);

Engine/Source/Mirror/Test/AnyTest.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -662,13 +662,13 @@ TEST(AnyTest, PolyAsTest)
662662
const Common::UniquePtr<AnyBaseClassTest2> v0 = new AnyDerivedClassTest2(1, 2.0f, "3");
663663

664664
Any a0 = std::ref(*v0);
665-
const auto& r0 = a0.PolyAs<AnyBaseClassTest2&, AnyDerivedClassTest2&>();
665+
const auto& r0 = a0.As<AnyDerivedClassTest2&>(true);
666666
ASSERT_EQ(r0.a, 1);
667667
ASSERT_EQ(r0.b, 2.0f);
668668
ASSERT_EQ(r0.c, "3");
669669

670670
Any a1 = v0.Get();
671-
const auto* p0 = a1.PolyAs<AnyBaseClassTest2*, AnyDerivedClassTest2*>();
671+
const auto* p0 = a1.As<AnyDerivedClassTest2*>(true);
672672
ASSERT_EQ(p0->a, 1);
673673
ASSERT_EQ(p0->b, 2.0f);
674674
ASSERT_EQ(p0->c, "3");
@@ -679,13 +679,13 @@ TEST(AnyTest, ConstPolyAsTest)
679679
const Common::UniquePtr<AnyBaseClassTest2> v0 = new AnyDerivedClassTest2(1, 2.0f, "3");
680680

681681
const Any a0 = std::ref(*v0);
682-
const auto& r0 = a0.PolyAs<AnyBaseClassTest2&, AnyDerivedClassTest2&>();
682+
const auto& r0 = a0.As<AnyDerivedClassTest2&>(true);
683683
ASSERT_EQ(r0.a, 1);
684684
ASSERT_EQ(r0.b, 2.0f);
685685
ASSERT_EQ(r0.c, "3");
686686

687687
const Any a1 = v0.Get();
688-
const auto* p0 = a1.PolyAs<AnyBaseClassTest2*, AnyDerivedClassTest2*>();
688+
const auto* p0 = a1.As<AnyDerivedClassTest2*>(true);
689689
ASSERT_EQ(p0->a, 1);
690690
ASSERT_EQ(p0->b, 2.0f);
691691
ASSERT_EQ(p0->c, "3");

Engine/Source/RHI/Include/RHI/RHI.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,7 @@
2424
#include <RHI/BindGroup.h>
2525
#include <RHI/BindGroupLayout.h>
2626
#include <RHI/Synchronous.h>
27+
28+
#if PLATFORM_WINDOWS
29+
#undef CreateSemaphore
30+
#endif

0 commit comments

Comments
 (0)