Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/ogrebullet/Collisions/Shapes/OgreBulletCollisionsTrimeshShape.cpp @ 1985

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

Split up OgreBullet into Collisions and Dynamics as it was intended by the developers.

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1/***************************************************************************
2
3This source file is part of OGREBULLET
4(Object-oriented Graphics Rendering Engine Bullet Wrapper)
5For the latest info, see http://www.ogre3d.org/phpBB2addons/viewforum.php?f=10
6
7Copyright (c) 2007 tuan.kuranes@gmail.com (Use it Freely, even Statically, but have to contribute any changes)
8
9
10
11This program is free software; you can redistribute it and/or modify it under
12the terms of the GPL General Public License with runtime exception as published by the Free Software
13Foundation; either version 2 of the License, or (at your option) any later
14version.
15
16This program is distributed in the hope that it will be useful, but WITHOUT
17ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18FOR A PARTICULAR PURPOSE. See the GPL General Public License with runtime exception for more details.
19
20You should have received a copy of the GPL General Public License with runtime exception along with
21this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22Place - Suite 330, Boston, MA 02111-1307, USA, or go to
23http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
24-----------------------------------------------------------------------------
25*/
26
27#include "OgreBulletCollisions.h"
28
29#include "Shapes/OgreBulletCollisionsTrimeshShape.h"
30#include "Debug/OgreBulletCollisionsDebugLines.h"
31#include "Utils/OgreBulletConverter.h"
32
33using namespace Ogre;
34using namespace OgreBulletCollisions;
35
36namespace OgreBulletCollisions
37{
38    // -------------------------------------------------------------------------
39    TriangleMeshCollisionShape::TriangleMeshCollisionShape(
40        Vector3        *vertices, 
41        unsigned int vertexCount, 
42        unsigned int *indices, 
43        unsigned int indexCount,
44                bool use32bitsIndices) :       
45        CollisionShape(),
46        mTriMesh(0)
47    {
48                unsigned int numFaces = indexCount / 3;
49
50                mTriMesh = new btTriangleMesh(use32bitsIndices);
51
52        btVector3    vertexPos[3];
53        for (unsigned int n = 0; n < numFaces; ++n)
54        {
55                        {
56                                const Vector3 &vec = vertices[*indices];
57                                vertexPos[0][0] = vec.x;
58                                vertexPos[0][1] = vec.y;
59                                vertexPos[0][2] = vec.z;
60                        }
61                        {
62                                const Vector3 &vec = vertices[*(indices + 1)];
63                                vertexPos[1][0] = vec.x;
64                                vertexPos[1][1] = vec.y;
65                                vertexPos[1][2] = vec.z;
66                        }
67                        {
68                                const Vector3 &vec = vertices[*(indices + 2)];
69                                vertexPos[2][0] = vec.x;
70                                vertexPos[2][1] = vec.y;
71                                vertexPos[2][2] = vec.z;
72                        }
73
74                        indices += 3;
75
76            mTriMesh->addTriangle(vertexPos[0], vertexPos[1], vertexPos[2]);
77        }
78
79                const bool useQuantizedAABB = true;
80        mShape = new btBvhTriangleMeshShape(mTriMesh, useQuantizedAABB);
81
82    }
83    // -------------------------------------------------------------------------
84    TriangleMeshCollisionShape::~TriangleMeshCollisionShape()
85    {
86    }
87    // -------------------------------------------------------------------------
88        bool TriangleMeshCollisionShape::drawWireFrame(DebugLines *wire, 
89                const Ogre::Vector3 &pos, 
90                const Ogre::Quaternion &quat) const
91    {
92        const int numTris = mTriMesh->getNumTriangles ();
93        if (numTris > 0)
94        {
95
96                        const int numSubParts = mTriMesh->getNumSubParts ();
97                        for (int currSubPart = 0; currSubPart < numSubParts; currSubPart++)
98                        {
99                                const unsigned char* vertexBase = NULL;
100                                int numVerts;
101                                PHY_ScalarType vertexType;
102                                int vertexStride;
103                                const unsigned char* indexBase = NULL;
104                                int indexStride;
105                                int numFaces;
106                                PHY_ScalarType indexType;
107
108                                mTriMesh->getLockedReadOnlyVertexIndexBase (&vertexBase, numVerts, 
109                                        vertexType, vertexStride, 
110                                        &indexBase, indexStride, numFaces, indexType, currSubPart);
111
112                                float* p;
113                                btVector3 vert0;
114                                btVector3 vert1;
115                                btVector3 vert2;
116                                for (int t = 0; t < numFaces; t++)
117                                {
118#define setVector(A, B) {A.setX(B[0]);A.setY(B[1]);A.setZ(B[2]);};
119
120                                        if (indexType == PHY_SHORT)
121                                        {
122                                                short int* index = (short int*)(indexBase + t*indexStride);
123
124                                                p = (float*)(vertexBase + index[0]*vertexStride);
125                                                setVector(vert0, p);                                           
126                                                p = (float*)(vertexBase + index[1]*vertexStride);
127                                                setVector(vert1, p);                   
128                                                p = (float*)(vertexBase + index[2]*vertexStride);
129                                                setVector(vert2, p);           
130                                        } 
131                                        else
132                                        {
133                                                int* index = (int*)(indexBase + t*indexStride);
134
135                                                p = (float*)(vertexBase + index[0]*vertexStride);
136                                                setVector(vert0, p);                                           
137                                                p = (float*)(vertexBase + index[1]*vertexStride);
138                                                setVector(vert1, p);                   
139                                                p = (float*)(vertexBase + index[2]*vertexStride);
140                                                setVector(vert2, p);           
141                                        }
142#undef setVector
143
144                                        wire->addLine (BtOgreConverter::to(vert0), BtOgreConverter::to(vert1));
145                                        wire->addLine (BtOgreConverter::to(vert1), BtOgreConverter::to(vert2));
146                                        wire->addLine (BtOgreConverter::to(vert2), BtOgreConverter::to(vert0));
147                                }
148                        }
149            return true;
150        }
151        return false;
152    }
153}
154
Note: See TracBrowser for help on using the repository browser.