cinder / Cinder

Cinder is a community-developed, free and open source library for professional-quality creative coding in C++.

Home Page:http://libcinder.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Additional Geometric Primitives

morphogencc opened this issue · comments

The geom:: namespace seems to have a pretty complete listing of GPU representations of shapes, but there's very few of the corresponding classes in the ci:: namespace. There's ci::Rect<T>, ci::Sphere, and ci::AxisAlignedBox, and I'm not sure there's much else...

For 2D Shapes it'd be great if they had a similar interface to Rect:

        void		transform( const Mat3T &matrix );
        RectT	transformed( const Mat3T &matrix ) const;
        bool	contains( const glm::tvec2<Y, glm::defaultp> &pt ) const
        bool	contains( const Vec2T &pt ) const	
        bool	intersects( const RectT &rect ) const;
        T		distance( const Vec2T &pt ) const;
        T		distanceSquared( const Vec2T &pt ) const;

and for 3D Shapes if they followed the Sphere interface:

	bool	intersects( const AxisAlignedBox &box ) const;
	bool	intersects( const Ray &ray ) const;
	int		intersect( const Ray &ray, float *intersection ) const;
	int		intersect( const Ray &ray, float *min, float *max ) const;
	vec3	closestPoint( const Ray &ray ) const;
	Sphere	transformed( const mat4 &transform ) const;

I'm imagining that these would be useful for hit-testing in various applications, where perhaps you don't want an entire physics system just to figure out if objects overlap / intersect / contain a point.

Based off of some threads I've read here, it seems that other primitives are missing mostly because they haven't been a priority / need for anyone yet, not because anyone is against them existing -- if this is correct, then I may go ahead and build a few for a current project and add them.

It'd be great to collate thoughts on what the consistent interface might be across multiples of these objects (and if perhaps they should inherit from a parent class that defines this interface?).

A preliminary list of ideas:

2D Shapes

  • ci::Circle
  • ci::RotatedRect
  • ci::Triangle

3D Shapes

  • ci::Box
  • ci::Capsule
  • ci::Cylinder