~ubuntu-branches/debian/sid/ember/sid

« back to all changes in this revision

Viewing changes to src/components/ogre/ogreopcode/src/OgreOpcodeDebugObject.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Michael Koch
  • Date: 2009-07-23 07:46:40 UTC
  • Revision ID: james.westby@ubuntu.com-20090723074640-wh0ukzis0kda36qv
Tags: upstream-0.5.6
ImportĀ upstreamĀ versionĀ 0.5.6

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
///////////////////////////////////////////////////////////////////////////////
 
2
///  @file OgreOpcodeDebugObject.cpp
 
3
///  @brief <TODO: insert file description here>
 
4
///  @remarks  Based directly on code from OgreNewt, by Walaber.
 
5
///  @author The OgreOpcode Team
 
6
///////////////////////////////////////////////////////////////////////////////
 
7
///  
 
8
///  This file is part of OgreOpcode.
 
9
///  
 
10
///  A lot of the code is based on the Nebula Opcode Collision module, see docs/Nebula_license.txt
 
11
///  
 
12
///  OgreOpcode is free software; you can redistribute it and/or
 
13
///  modify it under the terms of the GNU Lesser General Public
 
14
///  License as published by the Free Software Foundation; either
 
15
///  version 2.1 of the License, or (at your option) any later version.
 
16
///  
 
17
///  OgreOpcode is distributed in the hope that it will be useful,
 
18
///  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
19
///  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
20
///  Lesser General Public License for more details.
 
21
///  
 
22
///  You should have received a copy of the GNU Lesser General Public
 
23
///  License along with OgreOpcode; if not, write to the Free Software
 
24
///  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
25
///  
 
26
///////////////////////////////////////////////////////////////////////////////
 
27
#include "OgreOpcodeDebugObject.h"
 
28
 
 
29
using namespace Ogre;
 
30
namespace OgreOpcode
 
31
{
 
32
        namespace Details
 
33
        {
 
34
                OgreOpcodeDebugger::OgreOpcodeDebugger(const Ogre::String& name, SceneManager* sceneMgr)
 
35
                        : mSceneMgr(sceneMgr),
 
36
                        mName(name),
 
37
                        mRadiiDebugNode(0),
 
38
                        mContactsDebugNode(0),
 
39
                        mContactNormalsDebugNode(0),
 
40
                        mBBsDebugNode(0),
 
41
                        mShapesDebugNode(0),
 
42
                        mAABBsDebugNode(0),
 
43
                        mRadiiDebugObject(0),
 
44
                        mContactsDebugObject(0),
 
45
                        mContactNormalsDebugObject(0),
 
46
                        mBBsDebugObject(0),
 
47
                        mShapesDebugObject(0),
 
48
                        mAABBsDebugObject(0)
 
49
                {
 
50
                        mRadiiDebugNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("__OgreOpcode__RadiiDebugger__" + mName);
 
51
                        mContactsDebugNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("__OgreOpcode__ContactsDebugger__" + mName);
 
52
                        mContactNormalsDebugNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("__OgreOpcode__ContactNormalsDebugger__" + mName);
 
53
                        mBBsDebugNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("__OgreOpcode__BBsDebugger__" + mName);
 
54
                        mShapesDebugNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("__OgreOpcode__ShapesDebugger__" + mName);
 
55
                        mAABBsDebugNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("__OgreOpcode__AABBsDebugger__" + mName);
 
56
 
 
57
#ifdef BUILD_AGAINST_AZATHOTH
 
58
                        mRadiiDebugObject = new DebugLines();
 
59
                        mContactsDebugObject =  new DebugLines();
 
60
                        mContactNormalsDebugObject =  new DebugLines();
 
61
                        mBBsDebugObject = new DebugLines();
 
62
                        mShapesDebugObject = new DebugLines();
 
63
                        mAABBsDebugObject = new DebugLines();
 
64
#else
 
65
                        mRadiiDebugObject = new ManualObject("__OgreOpcode__RadiiDebugger__" + mName);
 
66
                        mContactsDebugObject = new ManualObject("__OgreOpcode__ContactsDebugger__" + mName);
 
67
                        mContactNormalsDebugObject = new ManualObject("__OgreOpcode__ContactNormalsDebugger__" + mName);
 
68
                        mBBsDebugObject = new ManualObject("__OgreOpcode__BBsDebugger__" + mName);
 
69
                        mShapesDebugObject = new ManualObject("__OgreOpcode__ShapesDebugger__" + mName);
 
70
                        mAABBsDebugObject = new ManualObject("__OgreOpcode__AABBsDebugger__" + mName);
 
71
#endif
 
72
 
 
73
                }
 
74
 
 
75
                OgreOpcodeDebugger::~OgreOpcodeDebugger()
 
76
                {
 
77
                        delete mRadiiDebugObject;
 
78
                        delete mContactsDebugObject;
 
79
                        delete mContactNormalsDebugObject;
 
80
                        delete mBBsDebugObject;
 
81
                        delete mShapesDebugObject;
 
82
                        delete mAABBsDebugObject;
 
83
                        
 
84
                        mRadiiDebugNode->getParentSceneNode()->removeChild(mRadiiDebugNode);
 
85
                        mSceneMgr->destroySceneNode(mRadiiDebugNode->getName());
 
86
                        mRadiiDebugNode = 0;
 
87
                        mContactsDebugNode->getParentSceneNode()->removeChild(mContactsDebugNode);
 
88
                        mSceneMgr->destroySceneNode(mContactsDebugNode->getName());
 
89
                        mContactsDebugNode = 0;
 
90
                        mContactNormalsDebugNode->getParentSceneNode()->removeChild(mContactNormalsDebugNode);
 
91
                        mSceneMgr->destroySceneNode(mContactNormalsDebugNode->getName());
 
92
                        mContactNormalsDebugNode = 0;
 
93
                        mBBsDebugNode->getParentSceneNode()->removeChild(mBBsDebugNode);
 
94
                        mSceneMgr->destroySceneNode(mBBsDebugNode->getName());
 
95
                        mBBsDebugNode = 0;
 
96
                        mShapesDebugNode->getParentSceneNode()->removeChild(mShapesDebugNode);
 
97
                        mSceneMgr->destroySceneNode(mShapesDebugNode->getName());
 
98
                        mShapesDebugNode = 0;
 
99
                        mAABBsDebugNode->getParentSceneNode()->removeChild(mAABBsDebugNode);
 
100
                        mSceneMgr->destroySceneNode(mAABBsDebugNode->getName());
 
101
                        mAABBsDebugNode = 0;
 
102
                }
 
103
 
 
104
                void OgreOpcodeDebugger::addRadiiLine(Real lx1, Real ly1, Real lz1, Real lx2, Real ly2, Real lz2)
 
105
                {
 
106
#ifdef BUILD_AGAINST_AZATHOTH
 
107
                        mRadiiDebugObject->addLine(lx1, ly1, lz1, lx2, ly2, lz2);
 
108
#else
 
109
                        mRadiiDebugObject->position(lx1, ly1, lz1);
 
110
                        mRadiiDebugObject->position(lx2, ly2, lz2);
 
111
#endif
 
112
                }
 
113
                
 
114
                void OgreOpcodeDebugger::addContactLine(Real lx1, Real ly1, Real lz1, Real lx2, Real ly2, Real lz2)
 
115
                {
 
116
#ifdef BUILD_AGAINST_AZATHOTH
 
117
                        mContactsDebugObject->addLine(lx1, ly1, lz1, lx2, ly2, lz2);
 
118
#else
 
119
                        mContactsDebugObject->position(lx1, ly1, lz1);
 
120
                        mContactsDebugObject->position(lx2, ly2, lz2);
 
121
#endif
 
122
                }
 
123
                
 
124
                void OgreOpcodeDebugger::addContactNormalsLine(Real lx1, Real ly1, Real lz1, Real lx2, Real ly2, Real lz2)
 
125
                {
 
126
#ifdef BUILD_AGAINST_AZATHOTH
 
127
                        mContactNormalsDebugObject->addLine(lx1, ly1, lz1, lx2, ly2, lz2);
 
128
#else
 
129
                        mContactNormalsDebugObject->position(lx1, ly1, lz1);
 
130
                        mContactNormalsDebugObject->position(lx2, ly2, lz2);
 
131
#endif
 
132
                }
 
133
 
 
134
                void OgreOpcodeDebugger::addBBLine(Real lx1, Real ly1, Real lz1, Real lx2, Real ly2, Real lz2)
 
135
                {
 
136
#ifdef BUILD_AGAINST_AZATHOTH
 
137
                        mBBsDebugObject->addLine(lx1, ly1, lz1, lx2, ly2, lz2);
 
138
#else
 
139
                        mBBsDebugObject->position(lx1, ly1, lz1);
 
140
                        mBBsDebugObject->position(lx2, ly2, lz2);
 
141
#endif
 
142
                }
 
143
                
 
144
                void OgreOpcodeDebugger::addShapeLine(Real lx1, Real ly1, Real lz1, Real lx2, Real ly2, Real lz2)
 
145
                {
 
146
#ifdef BUILD_AGAINST_AZATHOTH
 
147
                        mShapesDebugObject->addLine(lx1, ly1, lz1, lx2, ly2, lz2);
 
148
#else
 
149
                        mShapesDebugObject->position(lx1, ly1, lz1);
 
150
                        mShapesDebugObject->position(lx2, ly2, lz2);
 
151
#endif
 
152
                }
 
153
                
 
154
                void OgreOpcodeDebugger::addAABBLine(Real lx1, Real ly1, Real lz1, Real lx2, Real ly2, Real lz2)
 
155
                {
 
156
#ifdef BUILD_AGAINST_AZATHOTH
 
157
                        mAABBsDebugObject->addLine(lx1, ly1, lz1, lx2, ly2, lz2);
 
158
#else
 
159
                        mAABBsDebugObject->position(lx1, ly1, lz1);
 
160
                        mAABBsDebugObject->position(lx2, ly2, lz2);
 
161
#endif
 
162
                }
 
163
 
 
164
                void OgreOpcodeDebugger::clearRadii()
 
165
                {
 
166
                        mRadiiDebugNode->detachAllObjects();
 
167
                        mRadiiDebugObject->clear();
 
168
                }
 
169
 
 
170
                void OgreOpcodeDebugger::beginRadii()
 
171
                {
 
172
#ifdef BUILD_AGAINST_AZATHOTH
 
173
                        mRadiiDebugObject->setMaterial("OgreOpcodeDebug/Radii");
 
174
#else
 
175
                        mRadiiDebugObject->begin("OgreOpcodeDebug/Radii", Ogre::RenderOperation::OT_LINE_LIST);
 
176
#endif
 
177
                }
 
178
                
 
179
                void OgreOpcodeDebugger::endRadii()
 
180
                {
 
181
#ifdef BUILD_AGAINST_AZATHOTH
 
182
                        mRadiiDebugObject->draw();
 
183
#else
 
184
                        mRadiiDebugObject->end();
 
185
#endif
 
186
                        mRadiiDebugNode->attachObject(mRadiiDebugObject); 
 
187
                }
 
188
                
 
189
                void OgreOpcodeDebugger::clearContacts()
 
190
                {
 
191
                        mContactsDebugNode->detachAllObjects();
 
192
                        mContactsDebugObject->clear();
 
193
                }
 
194
                
 
195
                void OgreOpcodeDebugger::beginContacts()
 
196
                {
 
197
#ifdef BUILD_AGAINST_AZATHOTH
 
198
                        mContactsDebugObject->setMaterial("OgreOpcodeDebug/Contacts");
 
199
#else
 
200
                        mContactsDebugObject->begin("OgreOpcodeDebug/Contacts", Ogre::RenderOperation::OT_LINE_LIST);
 
201
#endif
 
202
                }
 
203
                
 
204
                void OgreOpcodeDebugger::endContacts()
 
205
                {
 
206
#ifdef BUILD_AGAINST_AZATHOTH
 
207
                        mContactsDebugObject->draw();
 
208
#else
 
209
                        mContactsDebugObject->end();
 
210
#endif
 
211
                        if(mContactsDebugNode->numAttachedObjects() < 1)
 
212
                                mContactsDebugNode->attachObject(mContactsDebugObject); 
 
213
                }
 
214
                
 
215
                void OgreOpcodeDebugger::clearContactNormals()
 
216
                {
 
217
                        mContactNormalsDebugNode->detachAllObjects();
 
218
                        mContactNormalsDebugObject->clear();
 
219
                }
 
220
 
 
221
                void OgreOpcodeDebugger::beginContactNormals()
 
222
                {
 
223
#ifdef BUILD_AGAINST_AZATHOTH
 
224
                        mContactNormalsDebugObject->setMaterial("OgreOpcodeDebug/ContactNormals");
 
225
#else
 
226
                        mContactNormalsDebugObject->begin("OgreOpcodeDebug/ContactNormals", Ogre::RenderOperation::OT_LINE_LIST);
 
227
#endif
 
228
                }
 
229
 
 
230
                void OgreOpcodeDebugger::endContactNormals()
 
231
                {
 
232
#ifdef BUILD_AGAINST_AZATHOTH
 
233
                        mContactNormalsDebugObject->draw();
 
234
#else
 
235
                        mContactNormalsDebugObject->end();
 
236
#endif
 
237
                        if(mContactNormalsDebugNode->numAttachedObjects() < 1)
 
238
                                mContactNormalsDebugNode->attachObject(mContactNormalsDebugObject); 
 
239
                }
 
240
 
 
241
                void OgreOpcodeDebugger::clearBBs()
 
242
                {
 
243
                        mBBsDebugNode->detachAllObjects();
 
244
                        mBBsDebugObject->clear();
 
245
                }
 
246
 
 
247
                void OgreOpcodeDebugger::beginBBs()
 
248
                {
 
249
#ifdef BUILD_AGAINST_AZATHOTH
 
250
                        mBBsDebugObject->setMaterial("OgreOpcodeDebug/BBs");
 
251
#else
 
252
                        mBBsDebugObject->begin("OgreOpcodeDebug/BBs", Ogre::RenderOperation::OT_LINE_LIST);
 
253
#endif
 
254
                }
 
255
                
 
256
                void OgreOpcodeDebugger::endBBs()
 
257
                {
 
258
#ifdef BUILD_AGAINST_AZATHOTH
 
259
                        mBBsDebugObject->draw();
 
260
#else
 
261
                        mBBsDebugObject->end();
 
262
#endif
 
263
                        mBBsDebugNode->attachObject(mBBsDebugObject); 
 
264
                }
 
265
                
 
266
                void OgreOpcodeDebugger::clearShapes()
 
267
                {
 
268
                        mShapesDebugNode->detachAllObjects();
 
269
                        mShapesDebugObject->clear();
 
270
                }
 
271
                
 
272
                void OgreOpcodeDebugger::beginShapes()
 
273
                {
 
274
#ifdef BUILD_AGAINST_AZATHOTH
 
275
                        mShapesDebugObject->setMaterial("OgreOpcodeDebug/Shapes");
 
276
#else
 
277
                        mShapesDebugObject->begin("OgreOpcodeDebug/Shapes", Ogre::RenderOperation::OT_LINE_LIST);
 
278
#endif
 
279
                }
 
280
 
 
281
                void OgreOpcodeDebugger::endShapes()
 
282
                {
 
283
#ifdef BUILD_AGAINST_AZATHOTH
 
284
                        mShapesDebugObject->draw();
 
285
#else
 
286
                        mShapesDebugObject->end();
 
287
#endif
 
288
                        mShapesDebugNode->attachObject(mShapesDebugObject); 
 
289
                }
 
290
                
 
291
                void OgreOpcodeDebugger::clearAABBs()
 
292
                {
 
293
                        mAABBsDebugNode->detachAllObjects();
 
294
                        mAABBsDebugObject->clear();
 
295
                }
 
296
 
 
297
                void OgreOpcodeDebugger::beginAABBs()
 
298
                {
 
299
#ifdef BUILD_AGAINST_AZATHOTH
 
300
                        mAABBsDebugObject->setMaterial("OgreOpcodeDebug/AABBs");
 
301
#else
 
302
                        mAABBsDebugObject->begin("OgreOpcodeDebug/AABBs", Ogre::RenderOperation::OT_LINE_LIST);
 
303
#endif
 
304
                }
 
305
                
 
306
                void OgreOpcodeDebugger::endAABBs()
 
307
                {
 
308
#ifdef BUILD_AGAINST_AZATHOTH
 
309
                        mAABBsDebugObject->draw();
 
310
#else
 
311
                        mAABBsDebugObject->end();
 
312
#endif
 
313
                        mAABBsDebugNode->attachObject(mAABBsDebugObject); 
 
314
                }
 
315
 
 
316
                void OgreOpcodeDebugger::clearAll()
 
317
                {
 
318
                        clearRadii();
 
319
                        clearContacts();
 
320
                        clearContactNormals();
 
321
                        clearShapes();
 
322
                        clearBBs();
 
323
                        clearAABBs();
 
324
                }
 
325
 
 
326
#ifdef BUILD_AGAINST_AZATHOTH
 
327
                DebugLines::DebugLines()
 
328
                {
 
329
                        mRenderOp.vertexData = new VertexData();
 
330
                        _drawn = false;
 
331
                }
 
332
 
 
333
                void DebugLines::clear()
 
334
                {
 
335
                        if(_drawn)
 
336
                        {
 
337
                                _drawn = false;
 
338
                                _points.clear();
 
339
                                delete mRenderOp.vertexData;
 
340
 
 
341
                                mRenderOp.vertexData = new VertexData();
 
342
                        }
 
343
                }
 
344
 
 
345
                DebugLines::~DebugLines(void)
 
346
                {
 
347
                        clear();
 
348
 
 
349
                        delete mRenderOp.vertexData;
 
350
                }
 
351
 
 
352
                void DebugLines::draw()
 
353
                {
 
354
                        if(_drawn) return;
 
355
                        else _drawn = true;
 
356
 
 
357
                        // Initialization stuff
 
358
                        mRenderOp.indexData = 0;
 
359
                        mRenderOp.vertexData->vertexCount = _points.size();
 
360
                        mRenderOp.vertexData->vertexStart = 0;
 
361
                        mRenderOp.operationType = RenderOperation::OT_LINE_LIST;
 
362
                        mRenderOp.useIndexes = false;
 
363
 
 
364
                        VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration;
 
365
                        VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding;
 
366
 
 
367
                        decl->addElement(0, 0, VET_FLOAT3, VES_POSITION);
 
368
 
 
369
                        HardwareVertexBufferSharedPtr vbuf =
 
370
                                HardwareBufferManager::getSingleton().createVertexBuffer(
 
371
                                decl->getVertexSize(0),
 
372
                                mRenderOp.vertexData->vertexCount,
 
373
                                HardwareBuffer::HBU_STATIC_WRITE_ONLY);
 
374
 
 
375
                        bind->setBinding(0, vbuf);
 
376
 
 
377
                        // Drawing stuff
 
378
                        size_t size = _points.size();
 
379
                        Vector3 vaabMin = _points[0];
 
380
                        Vector3 vaabMax = _points[0];
 
381
 
 
382
                        Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
 
383
 
 
384
                        for(size_t i = 0; i < size; i++)
 
385
                        {
 
386
                                *prPos++ = _points[i].x;
 
387
                                *prPos++ = _points[i].y;
 
388
                                *prPos++ = _points[i].z;
 
389
 
 
390
                                if(_points[i].x < vaabMin.x)
 
391
                                        vaabMin.x = _points[i].x;
 
392
                                if(_points[i].y < vaabMin.y)
 
393
                                        vaabMin.y = _points[i].y;
 
394
                                if(_points[i].z < vaabMin.z)
 
395
                                        vaabMin.z = _points[i].z;
 
396
 
 
397
                                if(_points[i].x > vaabMax.x)
 
398
                                        vaabMax.x = _points[i].x;
 
399
                                if(_points[i].y > vaabMax.y)
 
400
                                        vaabMax.y = _points[i].y;
 
401
                                if(_points[i].z > vaabMax.z)
 
402
                                        vaabMax.z = _points[i].z;
 
403
                        }
 
404
 
 
405
                        vbuf->unlock();
 
406
 
 
407
                        mBox.setExtents(vaabMin, vaabMax);
 
408
                }
 
409
 
 
410
                Real DebugLines::getSquaredViewDepth(const Camera *cam) const
 
411
                {
 
412
                        Vector3 vMin, vMax, vMid, vDist;
 
413
                        vMin = mBox.getMinimum();
 
414
                        vMax = mBox.getMaximum();
 
415
                        vMid = ((vMin - vMax) * 0.5) + vMin;
 
416
                        vDist = cam->getDerivedPosition() - vMid;
 
417
 
 
418
                        return vDist.squaredLength();
 
419
                }
 
420
 
 
421
                Real DebugLines::getBoundingRadius() const
 
422
                {
 
423
                        return Math::Sqrt(std::max(mBox.getMaximum().squaredLength(), mBox.getMinimum().squaredLength()));
 
424
                }
 
425
#endif
 
426
        } // namespace Details
 
427
 
 
428
} // namespace OgreOpcode