cinder / Cinder

Cinder is a community-developed, free and open source library for professional-quality creative coding in C++.
http://libcinder.org
Other
5.28k stars 939 forks source link

Additional Geometric Primitives #2290

Open morphogencc opened 2 years ago

morphogencc commented 2 years ago

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

3D Shapes