Program Listing for File CubicSDFCollisionDetection.h

Return to documentation for file (Simulation/CubicSDFCollisionDetection.h)

#ifndef _CubicSDFCollisionDetection_H
#define _CubicSDFCollisionDetection_H

#include "Common/Common.h"
#include "Simulation/DistanceFieldCollisionDetection.h"
#include <memory>

#include "Discregrid/All"

namespace PBD
{
    class CubicSDFCollisionDetection : public DistanceFieldCollisionDetection
    {
    public:
        using Grid = Discregrid::CubicLagrangeDiscreteGrid;
        using GridPtr = std::shared_ptr<Discregrid::CubicLagrangeDiscreteGrid>;

        struct CubicSDFCollisionObject : public DistanceFieldCollisionDetection::DistanceFieldCollisionObject
        {
            std::string m_sdfFile;
            Vector3r m_scale;
            GridPtr m_sdf;
            static int TYPE_ID;

            CubicSDFCollisionObject();
            virtual ~CubicSDFCollisionObject();
            virtual int &getTypeId() const { return TYPE_ID; }
            virtual bool collisionTest(const Vector3r &x, const Real tolerance, Vector3r &cp, Vector3r &n, Real &dist, const Real maxDist = 0.0);
            virtual double distance(const Eigen::Vector3d &x, const Real tolerance);
        };

    public:
        CubicSDFCollisionDetection();
        virtual ~CubicSDFCollisionDetection();

        virtual bool isDistanceFieldCollisionObject(CollisionObject *co) const;

        void addCubicSDFCollisionObject(const unsigned int bodyIndex, const unsigned int bodyType, const Vector3r *vertices, const unsigned int numVertices, const std::string &sdfFile, const Vector3r &scale, const bool testMesh = true, const bool invertSDF = false);
        void addCubicSDFCollisionObject(const unsigned int bodyIndex, const unsigned int bodyType, const Vector3r *vertices, const unsigned int numVertices, GridPtr sdf, const Vector3r &scale, const bool testMesh = true, const bool invertSDF = false);
    };
}

#endif