Skip to content

Commit

Permalink
Added Geometry ToElement function (#776)
Browse files Browse the repository at this point in the history
Signed-off-by: Nate Koenig <[email protected]>

Co-authored-by: Nate Koenig <[email protected]>
Co-authored-by: Louise Poubel <[email protected]>
  • Loading branch information
3 people authored Dec 8, 2021
1 parent 8de1eb6 commit b28967c
Show file tree
Hide file tree
Showing 3 changed files with 252 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/sdf/Geometry.hh
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,11 @@ namespace sdf
/// not been called.
public: sdf::ElementPtr Element() const;

/// \brief Create and return an SDF element filled with data from this
/// geometry.
/// \return SDF element pointer with updated geometry values.
public: sdf::ElementPtr ToElement() const;

/// \brief Private data pointer.
IGN_UTILS_IMPL_PTR(dataPtr)
};
Expand Down
42 changes: 42 additions & 0 deletions src/Geometry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "sdf/Ellipsoid.hh"
#include "sdf/Heightmap.hh"
#include "sdf/Mesh.hh"
#include "sdf/parser.hh"
#include "sdf/Plane.hh"
#include "sdf/Sphere.hh"

Expand Down Expand Up @@ -270,3 +271,44 @@ sdf::ElementPtr Geometry::Element() const
{
return this->dataPtr->sdf;
}

/////////////////////////////////////////////////
sdf::ElementPtr Geometry::ToElement() const
{
sdf::ElementPtr elem(new sdf::Element);
sdf::initFile("geometry.sdf", elem);

switch (this->dataPtr->type)
{
case GeometryType::BOX:
elem->InsertElement(this->dataPtr->box->ToElement());
break;
case GeometryType::CYLINDER:
elem->InsertElement(this->dataPtr->cylinder->ToElement());
break;
case GeometryType::PLANE:
elem->InsertElement(this->dataPtr->plane->ToElement());
break;
case GeometryType::SPHERE:
elem->InsertElement(this->dataPtr->sphere->ToElement());
break;
case GeometryType::MESH:
elem->InsertElement(this->dataPtr->mesh->ToElement());
break;
case GeometryType::HEIGHTMAP:
elem->InsertElement(this->dataPtr->heightmap->ToElement());
break;
case GeometryType::CAPSULE:
elem->InsertElement(this->dataPtr->capsule->ToElement());
break;
case GeometryType::ELLIPSOID:
elem->InsertElement(this->dataPtr->ellipsoid->ToElement());
break;
case GeometryType::EMPTY:
default:
elem->AddElement("empty");
break;
}

return elem;
}
205 changes: 205 additions & 0 deletions src/Geometry_TEST.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "sdf/Cylinder.hh"
#include "sdf/Ellipsoid.hh"
#include "sdf/Geometry.hh"
#include "sdf/Heightmap.hh"
#include "sdf/Mesh.hh"
#include "sdf/Plane.hh"
#include "sdf/Sphere.hh"
Expand Down Expand Up @@ -259,3 +260,207 @@ TEST(DOMGeometry, Plane)
EXPECT_EQ(ignition::math::Vector3d::UnitX, geom.PlaneShape()->Normal());
EXPECT_EQ(ignition::math::Vector2d(9, 8), geom.PlaneShape()->Size());
}

/////////////////////////////////////////////////
TEST(DOMGeometry, ToElement)
{
// Box
{
sdf::Geometry geom;

geom.SetType(sdf::GeometryType::BOX);
sdf::Box box;
geom.SetBoxShape(box);

sdf::ElementPtr elem = geom.ToElement();
ASSERT_NE(nullptr, elem);

sdf::Geometry geom2;
geom2.Load(elem);

EXPECT_EQ(geom.Type(), geom2.Type());
EXPECT_NE(nullptr, geom2.BoxShape());
EXPECT_EQ(nullptr, geom2.CapsuleShape());
EXPECT_EQ(nullptr, geom2.CylinderShape());
EXPECT_EQ(nullptr, geom2.EllipsoidShape());
EXPECT_EQ(nullptr, geom2.SphereShape());
EXPECT_EQ(nullptr, geom2.PlaneShape());
EXPECT_EQ(nullptr, geom2.MeshShape());
EXPECT_EQ(nullptr, geom2.HeightmapShape());
}

// Capsule
{
sdf::Geometry geom;

geom.SetType(sdf::GeometryType::CAPSULE);
sdf::Capsule capsule;
geom.SetCapsuleShape(capsule);

sdf::ElementPtr elem = geom.ToElement();
ASSERT_NE(nullptr, elem);

sdf::Geometry geom2;
geom2.Load(elem);

EXPECT_EQ(geom.Type(), geom2.Type());
EXPECT_EQ(nullptr, geom2.BoxShape());
EXPECT_NE(nullptr, geom2.CapsuleShape());
EXPECT_EQ(nullptr, geom2.CylinderShape());
EXPECT_EQ(nullptr, geom2.EllipsoidShape());
EXPECT_EQ(nullptr, geom2.SphereShape());
EXPECT_EQ(nullptr, geom2.PlaneShape());
EXPECT_EQ(nullptr, geom2.MeshShape());
EXPECT_EQ(nullptr, geom2.HeightmapShape());
}

// Cylinder
{
sdf::Geometry geom;

geom.SetType(sdf::GeometryType::CYLINDER);
sdf::Cylinder cylinder;
geom.SetCylinderShape(cylinder);

sdf::ElementPtr elem = geom.ToElement();
ASSERT_NE(nullptr, elem);

sdf::Geometry geom2;
geom2.Load(elem);

EXPECT_EQ(geom.Type(), geom2.Type());
EXPECT_EQ(nullptr, geom2.BoxShape());
EXPECT_EQ(nullptr, geom2.CapsuleShape());
EXPECT_NE(nullptr, geom2.CylinderShape());
EXPECT_EQ(nullptr, geom2.EllipsoidShape());
EXPECT_EQ(nullptr, geom2.SphereShape());
EXPECT_EQ(nullptr, geom2.PlaneShape());
EXPECT_EQ(nullptr, geom2.MeshShape());
EXPECT_EQ(nullptr, geom2.HeightmapShape());
}

// Ellipsoid
{
sdf::Geometry geom;

geom.SetType(sdf::GeometryType::ELLIPSOID);
sdf::Ellipsoid ellipsoid;
geom.SetEllipsoidShape(ellipsoid);

sdf::ElementPtr elem = geom.ToElement();
ASSERT_NE(nullptr, elem);

sdf::Geometry geom2;
geom2.Load(elem);

EXPECT_EQ(geom.Type(), geom2.Type());
EXPECT_EQ(nullptr, geom2.BoxShape());
EXPECT_EQ(nullptr, geom2.CapsuleShape());
EXPECT_EQ(nullptr, geom2.CylinderShape());
EXPECT_NE(nullptr, geom2.EllipsoidShape());
EXPECT_EQ(nullptr, geom2.SphereShape());
EXPECT_EQ(nullptr, geom2.PlaneShape());
EXPECT_EQ(nullptr, geom2.MeshShape());
EXPECT_EQ(nullptr, geom2.HeightmapShape());
}

// Sphere
{
sdf::Geometry geom;

geom.SetType(sdf::GeometryType::SPHERE);
sdf::Sphere sphere;
geom.SetSphereShape(sphere);

sdf::ElementPtr elem = geom.ToElement();
ASSERT_NE(nullptr, elem);

sdf::Geometry geom2;
geom2.Load(elem);

EXPECT_EQ(geom.Type(), geom2.Type());
EXPECT_EQ(nullptr, geom2.BoxShape());
EXPECT_EQ(nullptr, geom2.CapsuleShape());
EXPECT_EQ(nullptr, geom2.CylinderShape());
EXPECT_EQ(nullptr, geom2.EllipsoidShape());
EXPECT_NE(nullptr, geom2.SphereShape());
EXPECT_EQ(nullptr, geom2.PlaneShape());
EXPECT_EQ(nullptr, geom2.MeshShape());
EXPECT_EQ(nullptr, geom2.HeightmapShape());
}

// Plane
{
sdf::Geometry geom;

geom.SetType(sdf::GeometryType::PLANE);
sdf::Plane plane;
geom.SetPlaneShape(plane);

sdf::ElementPtr elem = geom.ToElement();
ASSERT_NE(nullptr, elem);

sdf::Geometry geom2;
geom2.Load(elem);

EXPECT_EQ(geom.Type(), geom2.Type());
EXPECT_EQ(nullptr, geom2.BoxShape());
EXPECT_EQ(nullptr, geom2.CapsuleShape());
EXPECT_EQ(nullptr, geom2.CylinderShape());
EXPECT_EQ(nullptr, geom2.EllipsoidShape());
EXPECT_EQ(nullptr, geom2.SphereShape());
EXPECT_NE(nullptr, geom2.PlaneShape());
EXPECT_EQ(nullptr, geom2.MeshShape());
EXPECT_EQ(nullptr, geom2.HeightmapShape());
}

// Mesh
{
sdf::Geometry geom;

geom.SetType(sdf::GeometryType::MESH);
sdf::Mesh mesh;
geom.SetMeshShape(mesh);

sdf::ElementPtr elem = geom.ToElement();
ASSERT_NE(nullptr, elem);

sdf::Geometry geom2;
geom2.Load(elem);

EXPECT_EQ(geom.Type(), geom2.Type());
EXPECT_EQ(nullptr, geom2.BoxShape());
EXPECT_EQ(nullptr, geom2.CapsuleShape());
EXPECT_EQ(nullptr, geom2.CylinderShape());
EXPECT_EQ(nullptr, geom2.EllipsoidShape());
EXPECT_EQ(nullptr, geom2.SphereShape());
EXPECT_EQ(nullptr, geom2.PlaneShape());
EXPECT_NE(nullptr, geom2.MeshShape());
EXPECT_EQ(nullptr, geom2.HeightmapShape());
}

// Heightmap
{
sdf::Geometry geom;

geom.SetType(sdf::GeometryType::HEIGHTMAP);
sdf::Heightmap heightmap;
geom.SetHeightmapShape(heightmap);

sdf::ElementPtr elem = geom.ToElement();
ASSERT_NE(nullptr, elem);

sdf::Geometry geom2;
geom2.Load(elem);

EXPECT_EQ(geom.Type(), geom2.Type());
EXPECT_EQ(nullptr, geom2.BoxShape());
EXPECT_EQ(nullptr, geom2.CapsuleShape());
EXPECT_EQ(nullptr, geom2.CylinderShape());
EXPECT_EQ(nullptr, geom2.EllipsoidShape());
EXPECT_EQ(nullptr, geom2.SphereShape());
EXPECT_EQ(nullptr, geom2.PlaneShape());
EXPECT_EQ(nullptr, geom2.MeshShape());
EXPECT_NE(nullptr, geom2.HeightmapShape());
}
}

0 comments on commit b28967c

Please sign in to comment.