Skip to content

Commit 5183f70

Browse files
Radient: validate entity flags and relax child pagination
1 parent be268f5 commit 5183f70

5 files changed

Lines changed: 38 additions & 3 deletions

File tree

Radient/interface/RadientScene.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ DILIGENT_TYPED_ENUM(RADIENT_ENTITY_FLAGS, Uint32)
4646
/// Entity's own visibility flag. Effective visibility also depends on parent entities.
4747
RADIENT_ENTITY_FLAG_VISIBLE = 1u << 0u,
4848

49-
RADIENT_ENTITY_FLAG_LAST = RADIENT_ENTITY_FLAG_VISIBLE
49+
RADIENT_ENTITY_FLAG_LAST = RADIENT_ENTITY_FLAG_VISIBLE,
50+
51+
/// All currently defined entity flags.
52+
RADIENT_ENTITY_FLAGS_ALL = (RADIENT_ENTITY_FLAG_LAST << 1u) - 1u
5053
};
5154
DEFINE_FLAG_ENUM_OPERATORS(RADIENT_ENTITY_FLAGS)
5255

Radient/src/RadientSceneState.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ bool IsBuiltInComponentType(const RadientComponentTypeID ComponentType)
4949
ComponentType == RADIENT_COMPONENT_TYPE_LIGHT);
5050
}
5151

52+
bool IsValidEntityFlags(RADIENT_ENTITY_FLAGS Flags)
53+
{
54+
return (Flags & ~RADIENT_ENTITY_FLAGS_ALL) == RADIENT_ENTITY_FLAG_NONE;
55+
}
56+
5257
} // namespace
5358

5459
const RadientSceneDesc& RadientSceneState::GetDesc() const
@@ -155,7 +160,7 @@ RADIENT_STATUS RadientSceneState::GetChildren(RadientEntityID Entity, Uint32 Sta
155160

156161
const std::vector<entt::entity>& Children = m_Registry.get<HierarchyComponent>(E).Children;
157162
if (StartChild >= Children.size())
158-
return RADIENT_STATUS_INVALID_ARGUMENT;
163+
return RADIENT_STATUS_OK;
159164

160165
NumChildrenWritten = std::min(ChildCount, static_cast<Uint32>(Children.size() - StartChild));
161166
for (Uint32 ChildIndex = 0; ChildIndex < NumChildrenWritten; ++ChildIndex)
@@ -256,6 +261,9 @@ RADIENT_STATUS RadientSceneState::CreateEntity(const RadientEntityDesc& Desc, Ra
256261
{
257262
Entity = InvalidRadientEntityID;
258263

264+
if (!IsValidEntityFlags(Desc.Flags))
265+
return RADIENT_STATUS_INVALID_ARGUMENT;
266+
259267
entt::entity Parent = entt::null;
260268
if (Desc.Parent != InvalidRadientEntityID)
261269
{
@@ -306,6 +314,9 @@ RADIENT_STATUS RadientSceneState::SetEntityFlags(RadientEntityID Entity, RADIENT
306314
if (E == entt::null)
307315
return RADIENT_STATUS_NOT_FOUND;
308316

317+
if (!IsValidEntityFlags(Flags))
318+
return RADIENT_STATUS_INVALID_ARGUMENT;
319+
309320
EntityStateComponent& State = m_Registry.get<EntityStateComponent>(E);
310321
if (State.Flags == Flags)
311322
return RADIENT_STATUS_NO_CHANGE;

Tests/IncludeTest/Radient/RadientSceneH_test.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ void RadientScene_C_TestMacros(IRadientScene* pScene)
9797
RadientCustomComponentData CustomComponent = {0};
9898
RADIENT_STATUS Status = RADIENT_STATUS_OK;
9999

100+
EntityFlags = RADIENT_ENTITY_FLAGS_ALL;
101+
100102
IRadientScene_GetDesc(pScene);
101103
Status = IRadientScene_IsEntityAlive(pScene, Entity);
102104
Status = IRadientScene_GetEntityFlags(pScene, Entity, &EntityFlags);

Tests/IncludeTest/Radient/RadientSceneH_test.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ namespace
3333

3434
using namespace Diligent;
3535

36+
static_assert(static_cast<Uint32>(RADIENT_ENTITY_FLAG_LAST) == static_cast<Uint32>(RADIENT_ENTITY_FLAG_VISIBLE), "Unexpected RADIENT_ENTITY_FLAGS_ALL value");
37+
3638
static_assert(sizeof(RADIENT_CAMERA_PROJECTION) == sizeof(Uint8), "Unexpected RADIENT_CAMERA_PROJECTION size");
3739
static_assert(static_cast<Uint8>(RADIENT_CAMERA_PROJECTION_PERSPECTIVE) == 0, "Unexpected RADIENT_CAMERA_PROJECTION_PERSPECTIVE value");
3840
static_assert(static_cast<Uint8>(RADIENT_CAMERA_PROJECTION_ORTHOGRAPHIC) == 1, "Unexpected RADIENT_CAMERA_PROJECTION_ORTHOGRAPHIC value");

Tests/RadientTest/src/RadientSceneStateTest.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,29 @@ TEST(RadientSceneStateTest, GetEntityFlags)
8787
{
8888
RadientSceneState State;
8989

90+
const RADIENT_ENTITY_FLAGS InvalidEntityFlags =
91+
static_cast<RADIENT_ENTITY_FLAGS>(static_cast<Uint32>(RADIENT_ENTITY_FLAGS_ALL) << 1u);
92+
9093
RADIENT_ENTITY_FLAGS Flags = RADIENT_ENTITY_FLAG_VISIBLE;
9194
EXPECT_EQ(State.GetEntityFlags(1, Flags), RADIENT_STATUS_NOT_FOUND);
9295
EXPECT_EQ(Flags, RADIENT_ENTITY_FLAG_NONE);
9396

97+
RadientEntityDesc InvalidEntityDesc;
98+
InvalidEntityDesc.Flags = InvalidEntityFlags;
99+
100+
RadientEntityID InvalidEntity = 123;
101+
EXPECT_EQ(State.CreateEntity(InvalidEntityDesc, InvalidEntity), RADIENT_STATUS_INVALID_ARGUMENT);
102+
EXPECT_EQ(InvalidEntity, InvalidRadientEntityID);
103+
94104
RadientEntityID DefaultEntity = InvalidRadientEntityID;
95105
EXPECT_EQ(State.CreateEntity({}, DefaultEntity), RADIENT_STATUS_OK);
96106
EXPECT_EQ(State.GetEntityFlags(DefaultEntity, Flags), RADIENT_STATUS_OK);
97107
EXPECT_EQ(Flags, RADIENT_ENTITY_FLAG_VISIBLE);
98108

109+
EXPECT_EQ(State.SetEntityFlags(DefaultEntity, InvalidEntityFlags), RADIENT_STATUS_INVALID_ARGUMENT);
110+
EXPECT_EQ(State.GetEntityFlags(DefaultEntity, Flags), RADIENT_STATUS_OK);
111+
EXPECT_EQ(Flags, RADIENT_ENTITY_FLAG_VISIBLE);
112+
99113
RadientEntityDesc HiddenEntityDesc;
100114
HiddenEntityDesc.Flags = RADIENT_ENTITY_FLAG_NONE;
101115

@@ -342,7 +356,10 @@ TEST(RadientSceneStateTest, GetChildCountAndChildren)
342356
EXPECT_EQ(Children[0], Child1);
343357
EXPECT_EQ(Children[1], Child2);
344358

345-
EXPECT_EQ(State.GetChildren(Root, 3, 1, Children, NumChildrenWritten), RADIENT_STATUS_INVALID_ARGUMENT);
359+
EXPECT_EQ(State.GetChildren(Root, 3, 1, Children, NumChildrenWritten), RADIENT_STATUS_OK);
360+
EXPECT_EQ(NumChildrenWritten, 0u);
361+
362+
EXPECT_EQ(State.GetChildren(Root, 4, 1, Children, NumChildrenWritten), RADIENT_STATUS_OK);
346363
EXPECT_EQ(NumChildrenWritten, 0u);
347364

348365
EXPECT_EQ(State.SetParent(Child1, InvalidRadientEntityID, True), RADIENT_STATUS_OK);

0 commit comments

Comments
 (0)