Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/bullet/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuVoronoiSimplexSolver.h @ 1966

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

Let's go for multithreaded physics!

  • Property svn:eol-style set to native
File size: 4.2 KB
Line 
1
2/*
3Bullet Continuous Collision Detection and Physics Library
4Copyright (c) 2003-2006 Erwin Coumans  http://continuousphysics.com/Bullet/
5
6This software is provided 'as-is', without any express or implied warranty.
7In no event will the authors be held liable for any damages arising from the use of this software.
8Permission is granted to anyone to use this software for any purpose,
9including commercial applications, and to alter it and redistribute it freely,
10subject to the following restrictions:
11
121. 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.
132. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
143. This notice may not be removed or altered from any source distribution.
15*/
16
17
18
19#ifndef SPUVoronoiSimplexSolver_H
20#define SPUVoronoiSimplexSolver_H
21
22#include <LinearMath/btTransform.h>
23#include <LinearMath/btPoint3.h>
24
25#define VORONOI_SIMPLEX_MAX_VERTS 5
26
27struct SpuUsageBitfield{
28        SpuUsageBitfield()
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  SpuSubSimplexClosestResult
52{
53        btVector3       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        SpuUsageBitfield        m_usedVertices;
58        float   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] >= float(0.)) &&
70                        (m_barycentricCoords[1] >= float(0.)) &&
71                        (m_barycentricCoords[2] >= float(0.)) &&
72                        (m_barycentricCoords[3] >= float(0.));
73
74
75                return valid;
76        }
77        void    setBarycentricCoordinates(float a=float(0.),float b=float(0.),float c=float(0.),float d=float(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/// SpuVoronoiSimplexSolver 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.
89class SpuVoronoiSimplexSolver
90{
91public:
92
93        int     m_numVertices;
94
95        btVector3       m_simplexVectorW[VORONOI_SIMPLEX_MAX_VERTS];
96        btVector3       m_simplexPointsP[VORONOI_SIMPLEX_MAX_VERTS];
97        btVector3       m_simplexPointsQ[VORONOI_SIMPLEX_MAX_VERTS];
98
99        int m_VertexIndexA[VORONOI_SIMPLEX_MAX_VERTS];
100        int m_VertexIndexB[VORONOI_SIMPLEX_MAX_VERTS];
101
102        btVector3       m_cachedP1;
103        btVector3       m_cachedP2;
104        btVector3       m_cachedV;
105        btVector3       m_lastW;
106        bool            m_cachedValidClosest;
107
108        SpuSubSimplexClosestResult m_cachedBC;
109
110        bool    m_needsUpdate;
111
112        void    removeVertex(int index);
113        void    reduceVertices (const SpuUsageBitfield& usedVerts);
114        bool    updateClosestVectorAndPoints();
115
116        bool    closestPtPointTetrahedron(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d, SpuSubSimplexClosestResult& finalResult);
117        int             pointOutsideOfPlane(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d);
118        bool    closestPtPointTriangle(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c,SpuSubSimplexClosestResult& result);
119
120        int RemoveDegenerateIndices (const int *inArray, int numIndices, int *outArray) const;
121
122public:
123
124        void reset();
125
126        void addVertex(const btVector3& w, const btPoint3& p, const btPoint3& q);
127
128
129        bool closest(btVector3& v);
130
131        btScalar maxVertex();
132
133        bool fullSimplex() const
134        {
135                return (m_numVertices == 4);
136        }
137
138        int getSimplex(btVector3 *pBuf, btVector3 *qBuf, btVector3 *yBuf) const;
139
140        bool inSimplex(const btVector3& w);
141
142        void backup_closest(btVector3& v) ;
143
144        bool emptySimplex() const ;
145
146        void compute_points(btVector3& p1, btVector3& p2) ;
147
148        int numVertices() const 
149        {
150                return m_numVertices;
151        }
152};
153
154
155
156#endif //SpuVoronoiSimplexSolver
Note: See TracBrowser for help on using the repository browser.