~ubuntu-branches/ubuntu/saucy/emscripten/saucy-proposed

« back to all changes in this revision

Viewing changes to tests/bullet/src/BulletCollision/CollisionShapes/btShapeHull.cpp

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
Bullet Continuous Collision Detection and Physics Library
 
3
Copyright (c) 2003-2009 Erwin Coumans  http://bulletphysics.org
 
4
 
 
5
This software is provided 'as-is', without any express or implied warranty.
 
6
In no event will the authors be held liable for any damages arising from the use of this software.
 
7
Permission is granted to anyone to use this software for any purpose, 
 
8
including commercial applications, and to alter it and redistribute it freely, 
 
9
subject to the following restrictions:
 
10
 
 
11
1. 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.
 
12
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
 
13
3. This notice may not be removed or altered from any source distribution.
 
14
*/
 
15
 
 
16
//btShapeHull was implemented by John McCutchan.
 
17
 
 
18
 
 
19
#include "btShapeHull.h"
 
20
#include "LinearMath/btConvexHull.h"
 
21
 
 
22
#define NUM_UNITSPHERE_POINTS 42
 
23
 
 
24
btShapeHull::btShapeHull (const btConvexShape* shape)
 
25
{
 
26
        m_shape = shape;
 
27
        m_vertices.clear ();
 
28
        m_indices.clear();
 
29
        m_numIndices = 0;
 
30
}
 
31
 
 
32
btShapeHull::~btShapeHull ()
 
33
{
 
34
        m_indices.clear();      
 
35
        m_vertices.clear ();
 
36
}
 
37
 
 
38
bool
 
39
btShapeHull::buildHull (btScalar /*margin*/)
 
40
{
 
41
        int numSampleDirections = NUM_UNITSPHERE_POINTS;
 
42
        {
 
43
                int numPDA = m_shape->getNumPreferredPenetrationDirections();
 
44
                if (numPDA)
 
45
                {
 
46
                        for (int i=0;i<numPDA;i++)
 
47
                        {
 
48
                                btVector3 norm;
 
49
                                m_shape->getPreferredPenetrationDirection(i,norm);
 
50
                                getUnitSpherePoints()[numSampleDirections] = norm;
 
51
                                numSampleDirections++;
 
52
                        }
 
53
                }
 
54
        }
 
55
 
 
56
        btVector3 supportPoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
 
57
        int i;
 
58
        for (i = 0; i < numSampleDirections; i++)
 
59
        {
 
60
                supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints()[i]);
 
61
        }
 
62
 
 
63
        HullDesc hd;
 
64
        hd.mFlags = QF_TRIANGLES;
 
65
        hd.mVcount = static_cast<unsigned int>(numSampleDirections);
 
66
 
 
67
#ifdef BT_USE_DOUBLE_PRECISION
 
68
        hd.mVertices = &supportPoints[0];
 
69
        hd.mVertexStride = sizeof(btVector3);
 
70
#else
 
71
        hd.mVertices = &supportPoints[0];
 
72
        hd.mVertexStride = sizeof (btVector3);
 
73
#endif
 
74
 
 
75
        HullLibrary hl;
 
76
        HullResult hr;
 
77
        if (hl.CreateConvexHull (hd, hr) == QE_FAIL)
 
78
        {
 
79
                return false;
 
80
        }
 
81
 
 
82
        m_vertices.resize (static_cast<int>(hr.mNumOutputVertices));
 
83
 
 
84
 
 
85
        for (i = 0; i < static_cast<int>(hr.mNumOutputVertices); i++)
 
86
        {
 
87
                m_vertices[i] = hr.m_OutputVertices[i];
 
88
        }
 
89
        m_numIndices = hr.mNumIndices;
 
90
        m_indices.resize(static_cast<int>(m_numIndices));
 
91
        for (i = 0; i < static_cast<int>(m_numIndices); i++)
 
92
        {
 
93
                m_indices[i] = hr.m_Indices[i];
 
94
        }
 
95
 
 
96
        // free temporary hull result that we just copied
 
97
        hl.ReleaseResult (hr);
 
98
 
 
99
        return true;
 
100
}
 
101
 
 
102
int
 
103
btShapeHull::numTriangles () const
 
104
{
 
105
        return static_cast<int>(m_numIndices / 3);
 
106
}
 
107
 
 
108
int
 
109
btShapeHull::numVertices () const
 
110
{
 
111
        return m_vertices.size ();
 
112
}
 
113
 
 
114
int
 
115
btShapeHull::numIndices () const
 
116
{
 
117
        return static_cast<int>(m_numIndices);
 
118
}
 
119
 
 
120
 
 
121
btVector3* btShapeHull::getUnitSpherePoints()
 
122
{
 
123
        static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] = 
 
124
        {
 
125
                btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
 
126
                btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
 
127
                btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
 
128
                btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
 
129
                btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
 
130
                btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
 
131
                btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
 
132
                btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
 
133
                btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
 
134
                btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
 
135
                btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
 
136
                btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
 
137
                btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
 
138
                btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
 
139
                btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
 
140
                btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
 
141
                btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
 
142
                btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
 
143
                btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
 
144
                btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
 
145
                btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
 
146
                btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
 
147
                btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
 
148
                btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
 
149
                btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
 
150
                btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
 
151
                btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
 
152
                btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
 
153
                btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
 
154
                btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
 
155
                btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
 
156
                btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
 
157
                btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
 
158
                btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
 
159
                btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
 
160
                btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
 
161
                btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
 
162
                btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
 
163
                btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
 
164
                btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
 
165
                btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
 
166
                btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
 
167
        };
 
168
        return sUnitSpherePoints;
 
169
}
 
170