$search
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 // Initialization stuff 00061 mRenderOp.indexData = 0; 00062 mRenderOp.vertexData->vertexCount = mPoints.size(); 00063 mRenderOp.vertexData->vertexStart = 0; 00064 mRenderOp.operationType = RenderOperation::OT_LINE_STRIP; // OT_LINE_LIST, 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 // Drawing stuff 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 //return mRadius; 00128 } 00129 /* 00130 void Line3D::getWorldTransforms(Matrix4 *xform) const 00131 { 00132 // return identity matrix to prevent parent transforms 00133 *xform = Matrix4::IDENTITY; 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 }