Program Listing for File TetModel.h

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

#ifndef __TETMODEL_H__
#define __TETMODEL_H__

#include "Common/Common.h"
#include "Utils/IndexedFaceMesh.h"
#include "Utils/IndexedTetMesh.h"
#include "Simulation/ParticleData.h"
#include <vector>

namespace PBD
{
    class TetModel
    {
        public:
            TetModel();
            virtual ~TetModel();

            typedef Utilities::IndexedFaceMesh SurfaceMesh;
            typedef Utilities::IndexedTetMesh ParticleMesh;

            struct Attachment
            {
                unsigned int m_index;
                unsigned int m_triIndex;
                Real m_bary[3];
                Real m_dist;
                Real m_minError;
            };

            Vector3r& getInitialX() { return m_initialX; }
            void setInitialX(const Vector3r &val) { m_initialX = val; }
            Matrix3r& getInitialR() { return m_initialR; }
            void setInitialR(const Matrix3r &val) { m_initialR = val; }
            Vector3r& getInitialScale() { return m_initialScale; }
            void setInitialScale(const Vector3r &val) { m_initialScale = val; }

    protected:
            unsigned int m_indexOffset;
            ParticleMesh m_particleMesh;
            SurfaceMesh m_surfaceMesh;
            VertexData m_visVertices;
            SurfaceMesh m_visMesh;
            Real m_restitutionCoeff;
            Real m_frictionCoeff;
            std::vector<Attachment> m_attachments;
            Vector3r m_initialX;
            Matrix3r m_initialR;
            Vector3r m_initialScale;

            void createSurfaceMesh();
            void solveQuadraticForZero(const Vector3r& F, const Vector3r& Fu,
                const Vector3r& Fv, const Vector3r& Fuu,
                const Vector3r&Fuv, const Vector3r& Fvv,
                Real& u, Real& v);
            bool pointInTriangle(const Vector3r& p0, const Vector3r& p1, const Vector3r& p2,
                const Vector3r& p, Vector3r& inter, Vector3r &bary);


        public:
            SurfaceMesh &getSurfaceMesh();
            VertexData &getVisVertices();
            SurfaceMesh &getVisMesh();
            ParticleMesh& getParticleMesh() { return m_particleMesh; }
            const ParticleMesh& getParticleMesh() const { return m_particleMesh; }
            void cleanupModel();

            unsigned int getIndexOffset() const;

            void initMesh(const unsigned int nPoints, const unsigned int nTets, const unsigned int indexOffset, unsigned int* indices);
            void updateMeshNormals(const ParticleData &pd);

            void attachVisMesh(const ParticleData &pd);

            void updateVisMesh(const ParticleData &pd);

            FORCE_INLINE Real getRestitutionCoeff() const
            {
                return m_restitutionCoeff;
            }

            FORCE_INLINE void setRestitutionCoeff(Real val)
            {
                m_restitutionCoeff = val;
            }

            FORCE_INLINE Real getFrictionCoeff() const
            {
                return m_frictionCoeff;
            }

            FORCE_INLINE void setFrictionCoeff(Real val)
            {
                m_frictionCoeff = val;
            }

    };
}

#endif