Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h @ 1972

Last change on this file since 1972 was 1963, checked in by rgrieder, 16 years ago

Added Bullet physics engine.

  • Property svn:eol-style set to native
File size: 4.2 KB
Line 
1/*
2Bullet Continuous Collision Detection and Physics Library
3Copyright (c) 2003-2006 Erwin Coumans  http://continuousphysics.com/Bullet/
4
5This software is provided 'as-is', without any express or implied warranty.
6In no event will the authors be held liable for any damages arising from the use of this software.
7Permission is granted to anyone to use this software for any purpose,
8including commercial applications, and to alter it and redistribute it freely,
9subject to the following restrictions:
10
111. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
122. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
133. This notice may not be removed or altered from any source distribution.
14*/
15
16
17
18#ifndef btVoronoiSimplexSolver_H
19#define btVoronoiSimplexSolver_H
20
21#include "btSimplexSolverInterface.h"
22
23
24
25#define VORONOI_SIMPLEX_MAX_VERTS 5
26
27struct btUsageBitfield{
28        btUsageBitfield()
29        {
30                reset();
31        }
32
33        void reset()
34        {
35                usedVertexA = false;
36                usedVertexB = false;
37                usedVertexC = false;
38                usedVertexD = false;
39        }
40        unsigned short usedVertexA      : 1;
41        unsigned short usedVertexB      : 1;
42        unsigned short usedVertexC      : 1;
43        unsigned short usedVertexD      : 1;
44        unsigned short unused1          : 1;
45        unsigned short unused2          : 1;
46        unsigned short unused3          : 1;
47        unsigned short unused4          : 1;
48};
49
50
51struct  btSubSimplexClosestResult
52{
53        btPoint3        m_closestPointOnSimplex;
54        //MASK for m_usedVertices
55        //stores the simplex vertex-usage, using the MASK,
56        // if m_usedVertices & MASK then the related vertex is used
57        btUsageBitfield m_usedVertices;
58        btScalar        m_barycentricCoords[4];
59        bool m_degenerate;
60
61        void    reset()
62        {
63                m_degenerate = false;
64                setBarycentricCoordinates();
65                m_usedVertices.reset();
66        }
67        bool    isValid()
68        {
69                bool valid = (m_barycentricCoords[0] >= btScalar(0.)) &&
70                        (m_barycentricCoords[1] >= btScalar(0.)) &&
71                        (m_barycentricCoords[2] >= btScalar(0.)) &&
72                        (m_barycentricCoords[3] >= btScalar(0.));
73
74
75                return valid;
76        }
77        void    setBarycentricCoordinates(btScalar a=btScalar(0.),btScalar b=btScalar(0.),btScalar c=btScalar(0.),btScalar d=btScalar(0.))
78        {
79                m_barycentricCoords[0] = a;
80                m_barycentricCoords[1] = b;
81                m_barycentricCoords[2] = c;
82                m_barycentricCoords[3] = d;
83        }
84
85};
86
87/// btVoronoiSimplexSolver is an implementation of the closest point distance algorithm from a 1-4 points simplex to the origin.
88/// Can be used with GJK, as an alternative to Johnson distance algorithm.
89#ifdef NO_VIRTUAL_INTERFACE
90class btVoronoiSimplexSolver
91#else
92class btVoronoiSimplexSolver : public btSimplexSolverInterface
93#endif
94{
95public:
96
97        int     m_numVertices;
98
99        btVector3       m_simplexVectorW[VORONOI_SIMPLEX_MAX_VERTS];
100        btPoint3        m_simplexPointsP[VORONOI_SIMPLEX_MAX_VERTS];
101        btPoint3        m_simplexPointsQ[VORONOI_SIMPLEX_MAX_VERTS];
102
103       
104
105        btPoint3        m_cachedP1;
106        btPoint3        m_cachedP2;
107        btVector3       m_cachedV;
108        btVector3       m_lastW;
109        bool            m_cachedValidClosest;
110
111        btSubSimplexClosestResult m_cachedBC;
112
113        bool    m_needsUpdate;
114       
115        void    removeVertex(int index);
116        void    reduceVertices (const btUsageBitfield& usedVerts);
117        bool    updateClosestVectorAndPoints();
118
119        bool    closestPtPointTetrahedron(const btPoint3& p, const btPoint3& a, const btPoint3& b, const btPoint3& c, const btPoint3& d, btSubSimplexClosestResult& finalResult);
120        int             pointOutsideOfPlane(const btPoint3& p, const btPoint3& a, const btPoint3& b, const btPoint3& c, const btPoint3& d);
121        bool    closestPtPointTriangle(const btPoint3& p, const btPoint3& a, const btPoint3& b, const btPoint3& c,btSubSimplexClosestResult& result);
122
123public:
124
125         void reset();
126
127         void addVertex(const btVector3& w, const btPoint3& p, const btPoint3& q);
128
129
130         bool closest(btVector3& v);
131
132         btScalar maxVertex();
133
134         bool fullSimplex() const
135         {
136                 return (m_numVertices == 4);
137         }
138
139         int getSimplex(btPoint3 *pBuf, btPoint3 *qBuf, btVector3 *yBuf) const;
140
141         bool inSimplex(const btVector3& w);
142       
143         void backup_closest(btVector3& v) ;
144
145         bool emptySimplex() const ;
146
147         void compute_points(btPoint3& p1, btPoint3& p2) ;
148
149         int numVertices() const 
150         {
151                 return m_numVertices;
152         }
153
154
155};
156
157#endif //VoronoiSimplexSolver
Note: See TracBrowser for help on using the repository browser.