Go to the documentation of this file.00001 #include "Line3D.h"
00002
00003 #define MAX(a,b) ((a > b) ? a : b)
00004
00005 Line3D::Line3D(void)
00006 {
00007 mRenderOp.vertexData = new VertexData();
00008 mDrawn = false;
00009
00010 this->setMaterial("BaseWhiteNoLighting");
00011 }
00012
00013 Line3D::~Line3D(void)
00014 {
00015 delete mRenderOp.vertexData;
00016 }
00017
00018 void Line3D::addPoint(const Vector3 &p)
00019 {
00020 mPoints.push_back(p);
00021 }
00022
00023 const Vector3 &Line3D::getPoint(unsigned short index) const
00024 {
00025 assert(index < mPoints.size());
00026
00027 return mPoints[index];
00028 }
00029
00030 unsigned short Line3D::getNumPoints(void) const
00031 {
00032 return (unsigned short)mPoints.size();
00033 }
00034
00035 void Line3D::updatePoint(unsigned short index, const Vector3 &value)
00036 {
00037 assert(index < mPoints.size() && "Point index is out of bounds!!");
00038
00039 mPoints[index] = value;
00040 }
00041
00042 void Line3D::drawLine(Vector3 &start, Vector3 &end)
00043 {
00044 if(mPoints.size())
00045 mPoints.clear();
00046
00047 mPoints.push_back(start);
00048 mPoints.push_back(end);
00049
00050 drawLines();
00051 }
00052
00053 void Line3D::drawLines(void)
00054 {
00055 if(mDrawn)
00056 return;
00057 else
00058 mDrawn = true;
00059
00060
00061 mRenderOp.indexData = 0;
00062 mRenderOp.vertexData->vertexCount = mPoints.size();
00063 mRenderOp.vertexData->vertexStart = 0;
00064 mRenderOp.operationType = RenderOperation::OT_LINE_STRIP;
00065 mRenderOp.useIndexes = false;
00066
00067 VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration;
00068 VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding;
00069
00070 decl->addElement(POSITION_BINDING, 0, VET_FLOAT3, VES_POSITION);
00071
00072 HardwareVertexBufferSharedPtr vbuf =
00073 HardwareBufferManager::getSingleton().createVertexBuffer(
00074 decl->getVertexSize(POSITION_BINDING),
00075 mRenderOp.vertexData->vertexCount,
00076 HardwareBuffer::HBU_STATIC_WRITE_ONLY);
00077
00078 bind->setBinding(POSITION_BINDING, vbuf);
00079
00080
00081 int size = mPoints.size();
00082 Vector3 vaabMin = mPoints[0];
00083 Vector3 vaabMax = mPoints[0];
00084
00085 Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
00086
00087 for(int i = 0; i < size; i++)
00088 {
00089 *prPos++ = mPoints[i].x;
00090 *prPos++ = mPoints[i].y;
00091 *prPos++ = mPoints[i].z;
00092
00093 if(mPoints[i].x < vaabMin.x)
00094 vaabMin.x = mPoints[i].x;
00095 if(mPoints[i].y < vaabMin.y)
00096 vaabMin.y = mPoints[i].y;
00097 if(mPoints[i].z < vaabMin.z)
00098 vaabMin.z = mPoints[i].z;
00099
00100 if(mPoints[i].x > vaabMax.x)
00101 vaabMax.x = mPoints[i].x;
00102 if(mPoints[i].y > vaabMax.y)
00103 vaabMax.y = mPoints[i].y;
00104 if(mPoints[i].z > vaabMax.z)
00105 vaabMax.z = mPoints[i].z;
00106 }
00107
00108 vbuf->unlock();
00109
00110 mBox.setExtents(vaabMin, vaabMax);
00111 }
00112
00113 Real Line3D::getSquaredViewDepth(const Camera *cam) const
00114 {
00115 Vector3 vMin, vMax, vMid, vDist;
00116 vMin = mBox.getMinimum();
00117 vMax = mBox.getMaximum();
00118 vMid = ((vMin - vMax) * 0.5) + vMin;
00119 vDist = cam->getDerivedPosition() - vMid;
00120
00121 return vDist.squaredLength();
00122 }
00123
00124 Real Line3D::getBoundingRadius(void) const
00125 {
00126 return Math::Sqrt(MAX(mBox.getMaximum().squaredLength(), mBox.getMinimum().squaredLength()));
00127
00128 }
00129
00130
00131
00132
00133
00134
00135
00136 const Quaternion &Line3D::getWorldOrientation(void) const
00137 {
00138 return Quaternion::IDENTITY;
00139 }
00140
00141 const Vector3 &Line3D::getWorldPosition(void) const
00142 {
00143 return Vector3::ZERO;
00144 }