Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/ogrebullet/Collisions/Debug/OgreBulletCollisionsDebugLines.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: 5.7 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 "Debug/OgreBulletCollisionsDebugLines.h"
30#include "Utils/OgreBulletConverter.h"
31
32using namespace OgreBulletCollisions;
33using namespace Ogre;
34
35//------------------------------------------------------------------------------------------------
36bool DebugLines::_materials_created = false;
37//------------------------------------------------------------------------------------------------
38DebugLines::DebugLines() : SimpleRenderable()
39{
40    mRenderOp.vertexData = new Ogre::VertexData();
41    _drawn = false;
42
43    if (!_materials_created)
44    {
45        MaterialPtr red = MaterialManager::getSingleton().create("OgreBulletCollisionsDebugLines/Disabled","OgreBulletCollisions");
46        MaterialPtr green = MaterialManager::getSingleton().create("OgreBulletCollisionsDebugLines/Enabled","OgreBulletCollisions");
47        MaterialPtr blue = MaterialManager::getSingleton().create("OgreBulletCollisionsDebugLines/Static","OgreBulletCollisions");
48
49        red->setReceiveShadows(false);
50        red->getTechnique(0)->setLightingEnabled(true);
51        red->getTechnique(0)->getPass(0)->setSelfIllumination(1,0,0);
52
53        green->setReceiveShadows(false);
54        green->getTechnique(0)->setLightingEnabled(true);
55        green->getTechnique(0)->getPass(0)->setSelfIllumination(0,1,0);
56
57        blue->setReceiveShadows(false);
58        blue->getTechnique(0)->setLightingEnabled(true);
59        blue->getTechnique(0)->getPass(0)->setSelfIllumination(0,0,1);
60
61        _materials_created = true;
62    }
63    setCastShadows (false);
64    this->setMaterial("OgreBulletCollisionsDebugLines/Enabled");
65}
66
67
68//------------------------------------------------------------------------------------------------
69void DebugLines::clear()
70{
71    if (_drawn)
72    {
73        _drawn = false;
74        _points.clear();
75        delete mRenderOp.vertexData;
76
77        mRenderOp.vertexData = new Ogre::VertexData();
78    }
79}
80//------------------------------------------------------------------------------------------------
81DebugLines::~DebugLines(void)
82{
83    clear();
84
85    delete mRenderOp.vertexData;
86}
87//------------------------------------------------------------------------------------------------
88void DebugLines::draw()
89{
90    if (_drawn || _points.empty()) 
91        return;
92    else 
93        _drawn = true;
94
95    // Initialization stuff
96    mRenderOp.indexData = 0;
97    mRenderOp.vertexData->vertexCount = _points.size();
98    mRenderOp.vertexData->vertexStart = 0;
99    mRenderOp.operationType = RenderOperation::OT_LINE_LIST;
100    mRenderOp.useIndexes = false;
101
102    Ogre::VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration;
103    Ogre::VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding;
104
105    decl->addElement(0, 0, VET_FLOAT3, VES_POSITION);
106
107    HardwareVertexBufferSharedPtr vbuf =
108        HardwareBufferManager::getSingleton().createVertexBuffer(
109        decl->getVertexSize(0),
110        mRenderOp.vertexData->vertexCount,
111        HardwareBuffer::HBU_STATIC_WRITE_ONLY);
112
113    bind->setBinding(0, vbuf);
114
115    // Drawing stuff
116    unsigned int size = (unsigned int)_points.size();
117    Ogre::Vector3 vaabMin = _points[0];
118    Ogre::Vector3 vaabMax = _points[0];
119
120    float *prPos = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
121
122    for(unsigned int i = 0; i < size; i++)
123    {
124        *prPos++ = _points[i].x;
125        *prPos++ = _points[i].y;
126        *prPos++ = _points[i].z;
127
128        if (_points[i].x < vaabMin.x)
129            vaabMin.x = _points[i].x;
130        if (_points[i].y < vaabMin.y)
131            vaabMin.y = _points[i].y;
132        if (_points[i].z < vaabMin.z)
133            vaabMin.z = _points[i].z;
134
135        if (_points[i].x > vaabMax.x)
136            vaabMax.x = _points[i].x;
137        if (_points[i].y > vaabMax.y)
138            vaabMax.y = _points[i].y;
139        if (_points[i].z > vaabMax.z)
140            vaabMax.z = _points[i].z;
141    }
142
143    vbuf->unlock();
144
145    mBox.setExtents(vaabMin, vaabMax);
146}
147//------------------------------------------------------------------------------------------------
148Real DebugLines::getSquaredViewDepth(const Camera *cam) const
149{
150    Vector3 vMin, vMax, vMid, vDist;
151    vMin = mBox.getMinimum();
152    vMax = mBox.getMaximum();
153    vMid = ((vMin - vMax) * 0.5) + vMin;
154    vDist = cam->getDerivedPosition() - vMid;
155
156    return vDist.squaredLength();
157}
158//------------------------------------------------------------------------------------------------
159Real DebugLines::getBoundingRadius() const
160{
161    return Math::Sqrt(std::max(mBox.getMaximum().squaredLength(), mBox.getMinimum().squaredLength()));
162}
Note: See TracBrowser for help on using the repository browser.