Skip to content

Commit

Permalink
Support removing the actor, light, or model from the root
Browse files Browse the repository at this point in the history
Signed-off-by: Nate Koenig <natekoenig@gmail.com>
  • Loading branch information
nkoenig committed Oct 11, 2024
1 parent fe071fa commit a280a2d
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/sdf/Root.hh
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,11 @@ namespace sdf
public: sdf::ElementPtr ToElement(
const OutputConfig &_config = OutputConfig::GlobalConfig()) const;

/// \brief Remove the actor, light, or model if one of them exists.
/// The SDF Root object can only hold one, or none, from the set
/// [Actor, Light, Model].
public: void ClearActorLightModel();

/// \brief Private data pointer
GZ_UTILS_IMPL_PTR(dataPtr)
};
Expand Down
4 changes: 4 additions & 0 deletions python/src/sdf/pyRoot.cc
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ void defineRoot(pybind11::object module)
.def("set_light", &sdf::Root::SetLight,
"Set the light object. This will override any existing model, "
"actor, and light object.")
.def("clear_actor_light_model", &sdf::Root::ClearActorLightModel,
"Remove the actor, light, or model if one of them exists."
"The SDF Root object can only hold one, or none, from the set"
"[Actor, Light, Model].")
.def("add_world", [](Root &self, const World &_world)
{
ThrowIfErrors(self.AddWorld(_world));
Expand Down
27 changes: 27 additions & 0 deletions python/test/pyRoot_TEST.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,33 @@ def test_element_to_light(self):
# ASSERT_EQ(None, root2.Actor())
self.assertEqual(0, root2.world_count())

def test_clear_actor_light_model(self):
root = Root()

# \TODO(anyone) Wrap the Actor class.
# self.assertEqual(None, root.actor())
# actor1 = Actor()
# actor1.set_name("actor1")
# root.set_actor(actor1)
# self.assertNotEqual(None, root.actor())
# root.clear_actor_light_model()
# self.assertEqual(None, root.actor())

self.assertEqual(None, root.light())
light1 = Light()
light1.set_name("light1")
root.set_light(light1)
self.assertNotEqual(None, root.light())
root.clear_actor_light_model()
self.assertEqual(None, root.light())

self.assertEqual(None, root.model())
model1 = Model()
model1.set_name("model1")
root.set_model(model1)
self.assertNotEqual(None, root.model())
root.clear_actor_light_model()
self.assertEqual(None, root.model())

if __name__ == '__main__':
unittest.main()
6 changes: 6 additions & 0 deletions src/Root.cc
Original file line number Diff line number Diff line change
Expand Up @@ -616,3 +616,9 @@ sdf::ElementPtr Root::ToElement(const OutputConfig &_config) const

return elem;
}

/////////////////////////////////////////////////
void Root::ClearActorLightModel()
{
this->dataPtr->modelLightOrActor = std::monostate{};
}
30 changes: 30 additions & 0 deletions src/Root_TEST.cc
Original file line number Diff line number Diff line change
Expand Up @@ -630,3 +630,33 @@ TEST(DOMRoot, WorldByName)
ASSERT_TRUE(root.WorldNameExists("world2"));
EXPECT_EQ("world2", root.WorldByName("world2")->Name());
}

/////////////////////////////////////////////////
TEST(DOMRoot, ClearActorLightModel)
{
sdf::Root root;
EXPECT_EQ(nullptr, root.Actor());
EXPECT_EQ(nullptr, root.Light());
EXPECT_EQ(nullptr, root.Model());

sdf::Actor actor1;
actor1.SetName("actor1");
root.SetActor(actor1);
EXPECT_NE(nullptr, root.Actor());
root.ClearActorLightModel();
EXPECT_EQ(nullptr, root.Actor());

sdf::Light light1;
light1.SetName("light1");
root.SetLight(light1);
EXPECT_NE(nullptr, root.Light());
root.ClearActorLightModel();
EXPECT_EQ(nullptr, root.Light());

sdf::Model model1;
model1.SetName("model1");
root.SetModel(model1);
EXPECT_NE(nullptr, root.Model());
root.ClearActorLightModel();
EXPECT_EQ(nullptr, root.Model());
}

0 comments on commit a280a2d

Please sign in to comment.