1
///////////////////////////////////////////////////////////////////////////////
2
/// @file OgreBoxCollisionShape.cpp
3
/// @brief <TODO: insert file description here>
5
/// @author The OgreOpcode Team @date 28-05-2005
7
///////////////////////////////////////////////////////////////////////////////
9
/// This file is part of OgreOpcode.
11
/// A lot of the code is based on the Nebula Opcode Collision module, see docs/Nebula_license.txt
13
/// OgreOpcode is free software; you can redistribute it and/or
14
/// modify it under the terms of the GNU Lesser General Public
15
/// License as published by the Free Software Foundation; either
16
/// version 2.1 of the License, or (at your option) any later version.
18
/// OgreOpcode is distributed in the hope that it will be useful,
19
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
20
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
/// Lesser General Public License for more details.
23
/// You should have received a copy of the GNU Lesser General Public
24
/// License along with OgreOpcode; if not, write to the Free Software
25
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27
///////////////////////////////////////////////////////////////////////////////
28
#include "OgreOpcodeExports.h"
29
#include "OgreBoxCollisionShape.h"
30
#include "OgreCollisionReporter.h"
31
#include "OgreCollisionManager.h"
32
#include "OgreOpcodeMath.h"
33
#include "OgreOpcodeUtils.h"
38
//------------------------------------------------------------------------
39
BoxCollisionShape::BoxCollisionShape(const Ogre::String& name)
40
: ICollisionShape(name)
44
//------------------------------------------------------------------------
45
BoxCollisionShape::~BoxCollisionShape()
51
//------------------------------------------------------------------------
52
void BoxCollisionShape::_prepareOpcodeCreateParams(Opcode::OPCODECREATE& opcc)
54
opcc.mIMesh = &opcMeshAccess;
55
//opcc.mSettings.mRules = Opcode::SPLIT_BEST_AXIS;//Opcode::SPLIT_SPLATTER_POINTS; // split by splattering primitive centers (???)
56
opcc.mSettings.mRules = Opcode::SPLIT_GEOM_CENTER | Opcode::SPLIT_SPLATTER_POINTS; // Recommended by Opcode manual
57
opcc.mSettings.mLimit = 1; // build a complete tree, 1 primitive/node
58
opcc.mNoLeaf = true; // false;
59
opcc.mQuantized = false; // true;
61
//------------------------------------------------------------------------
62
/// <TODO: insert function description here>
63
/// @param [in, out] ent Entity * <TODO: insert parameter description here>
64
/// @return bool <TODO: insert return value description here>
65
bool BoxCollisionShape::load(SceneNode* scnNode, int height, int width, int depth)
67
assert(!mVertexBuf && !mFaceBuf);
69
mParentNode = scnNode;
71
// Set up the 8 corners of the cube
73
float bottom = -height;
81
mVertexBuf = new float[numVertices*3];
82
mFaceBuf = new size_t[numFaces*3];
85
mVertexBuf[1] = bottom;
86
mVertexBuf[2] = front;
87
mVertexBuf[3] = right;
88
mVertexBuf[4] = bottom;
89
mVertexBuf[5] = front;
92
mVertexBuf[8] = front;
93
mVertexBuf[9] = right;
95
mVertexBuf[11] = front;
96
mVertexBuf[12] = left;
97
mVertexBuf[13] = bottom;
98
mVertexBuf[14] = back;
99
mVertexBuf[15] = right;
100
mVertexBuf[16] = bottom;
101
mVertexBuf[17] = back;
102
mVertexBuf[18] = left;
103
mVertexBuf[19] = top;
104
mVertexBuf[20] = back;
105
mVertexBuf[21] = right;
106
mVertexBuf[22] = top;
107
mVertexBuf[23] = back;
109
int leftbottomfront = 1;
110
int rightbottomfront = 0;
111
int lefttopfront = 3;
112
int righttopfront = 2;
113
int leftbottomback = 5;
114
int rightbottomback = 4;
116
int righttopback = 6;
117
//int leftbottomfront = 0;
118
//int rightbottomfront = 1;
119
//int lefttopfront = 2;
120
//int righttopfront = 3;
121
//int leftbottomback = 4;
122
//int rightbottomback = 5;
123
//int lefttopback = 6;
124
//int righttopback = 7;
127
mFaceBuf[0] = lefttopfront;
128
mFaceBuf[1] = lefttopback;
129
mFaceBuf[2] = leftbottomback;
130
mFaceBuf[3] = leftbottomback;
131
mFaceBuf[4] = leftbottomfront;
132
mFaceBuf[5] = lefttopfront;
134
mFaceBuf[6] = lefttopfront;
135
mFaceBuf[7] = leftbottomfront;
136
mFaceBuf[8] = rightbottomfront;
137
mFaceBuf[9] = rightbottomfront;
138
mFaceBuf[10] = righttopfront;
139
mFaceBuf[11] = lefttopfront;
141
mFaceBuf[12] = righttopback;
142
mFaceBuf[13] = righttopfront;
143
mFaceBuf[14] = rightbottomfront;
144
mFaceBuf[15] = rightbottomfront;
145
mFaceBuf[16] = rightbottomback;
146
mFaceBuf[17] = righttopback;
148
mFaceBuf[18] = leftbottomback;
149
mFaceBuf[19] = lefttopback;
150
mFaceBuf[20] = righttopback;
151
mFaceBuf[21] = righttopback;
152
mFaceBuf[22] = rightbottomback;
153
mFaceBuf[23] = leftbottomback;
155
mFaceBuf[24] = righttopfront;
156
mFaceBuf[25] = righttopback;
157
mFaceBuf[26] = lefttopback;
158
mFaceBuf[27] = lefttopback;
159
mFaceBuf[28] = lefttopfront;
160
mFaceBuf[29] = righttopfront;
162
mFaceBuf[30] = leftbottomfront;
163
mFaceBuf[31] = leftbottomback;
164
mFaceBuf[32] = rightbottomback;
165
mFaceBuf[33] = rightbottomback;
166
mFaceBuf[34] = rightbottomfront;
167
mFaceBuf[35] = leftbottomfront;
171
//mVertexBuf = new float[numVertices*3];
172
//mFaceBuf = new int[numFaces*3];
174
//mVertexBuf[0] = -size;
176
//mVertexBuf[2] = -size;
177
//mVertexBuf[3] = -size;
179
//mVertexBuf[5] = size;
180
//mVertexBuf[6] = size;
182
//mVertexBuf[8] = size;
183
//mVertexBuf[9] = size;
184
//mVertexBuf[10] = 0;
185
//mVertexBuf[11] = -size;
194
opcMeshAccess.SetNbTriangles(numFaces);
195
opcMeshAccess.SetNbVertices(numVertices);
196
opcMeshAccess.SetPointers((IceMaths::IndexedTriangle*)mFaceBuf, (IceMaths::Point*)mVertexBuf);
197
//opcMeshAccess.SetStrides(sizeof(int) * 3, sizeof(float) * 3);
199
assert(mVertexBuf && mFaceBuf);
201
Opcode::OPCODECREATE opcc;
202
_prepareOpcodeCreateParams(opcc);
203
opcModel.Build(opcc);
207
mParentNode->getWorldTransforms(&mFullTransform);
208
//mFullTransform = mParentNode->_getFullTransform();
213
//------------------------------------------------------------------------
214
/// <TODO: insert function description here>
215
/// @return bool <TODO: insert return value description here>
216
//bool BoxCollisionShape::rebuild()
218
// opcMeshAccess.SetNbTriangles(numFaces);
219
// opcMeshAccess.SetNbVertices(numVertices);
220
// opcMeshAccess.SetPointers((IceMaths::IndexedTriangle*)mFaceBuf, (IceMaths::Point*)mVertexBuf);
221
// opcMeshAccess.SetStrides(sizeof(int) * 3, sizeof(float) * 3);
223
// return _rebuildFromCachedData();
227
//------------------------------------------------------------------------
228
/// <TODO: insert function description here>
229
/// @return bool <TODO: insert return value description here>
230
//bool BoxCollisionShape::_rebuildFromCachedData()
232
// assert(mVertexBuf && mFaceBuf);
234
// Opcode::OPCODECREATE opcc;
235
// _prepareOpcodeCreateParams(opcc);
236
// opcModel.Build(opcc);
248
//------------------------------------------------------------------------