| 228 | } |
| 229 | |
| 230 | std::shared_ptr<FeatureObject> primitiveToObject( const Primitives::Variant& primitive, float infiniteExtent ) |
| 231 | { |
| 232 | return std::visit( overloaded{ |
| 233 | []( const Primitives::Sphere& sphere ) -> std::shared_ptr<FeatureObject> |
| 234 | { |
| 235 | if ( sphere.radius == 0 ) |
| 236 | { |
| 237 | auto newPoint = std::make_shared<PointObject>(); |
| 238 | newPoint->setLocalPoint( sphere.center ); |
| 239 | return newPoint; |
| 240 | } |
| 241 | else |
| 242 | { |
| 243 | auto newSphere = std::make_shared<SphereObject>(); |
| 244 | newSphere->setCenter( sphere.center ); |
| 245 | newSphere->setRadius( sphere.radius ); |
| 246 | return newSphere; |
| 247 | } |
| 248 | }, |
| 249 | [infiniteExtent]( const Primitives::Plane& plane ) -> std::shared_ptr<FeatureObject> |
| 250 | { |
| 251 | auto newPlane = std::make_shared<PlaneObject>(); |
| 252 | newPlane->setCenter( plane.center ); |
| 253 | newPlane->setNormal( plane.normal ); |
| 254 | newPlane->setSize( infiniteExtent ); |
| 255 | return newPlane; |
| 256 | }, |
| 257 | [infiniteExtent]( const Primitives::ConeSegment& cone ) -> std::shared_ptr<FeatureObject> |
| 258 | { |
| 259 | if ( cone.isCircle() ) |
| 260 | { |
| 261 | if ( cone.isZeroRadius() ) |
| 262 | return primitiveToObject( cone.basePoint( false ), infiniteExtent ); // This isn't really valid, but let's support it. |
| 263 | |
| 264 | auto newCircle = std::make_shared<CircleObject>(); |
| 265 | newCircle->setCenter( cone.basePoint( false ).center ); |
| 266 | newCircle->setNormal( cone.dir ); |
| 267 | newCircle->setRadius( cone.positiveSideRadius ); |
| 268 | return newCircle; |
| 269 | } |
| 270 | |
| 271 | bool posFinite = std::isfinite( cone.positiveLength ); |
| 272 | bool negFinite = std::isfinite( cone.negativeLength ); |
| 273 | |
| 274 | if ( cone.isZeroRadius() ) |
| 275 | { |
| 276 | auto newLine = std::make_shared<LineObject>(); |
| 277 | newLine->setDirection( cone.dir ); |
| 278 | |
| 279 | if ( posFinite == negFinite ) |
| 280 | { |
| 281 | // Finite or fully infinite. |
| 282 | newLine->setCenter( cone.centerPoint().center ); |
| 283 | newLine->setLength( posFinite ? cone.length() : infiniteExtent ); |
| 284 | } |
| 285 | else |
| 286 | { |
| 287 | // Half-infinite. |
no test coverage detected