#ifndef __LINE3D_H__
#define __LINE3D_H__
#include "Ogre.h"
#include <vector>
using namespace Ogre;
using namespace std;
#define POSITION_BINDING 0
#define TEXCOORD_BINDING 1
class Line3D:public SimpleRenderable
{
public:
Line3D(void);
~Line3D(void);
void draw(void);
Real getSquaredViewDepth(const Camera *cam) const;
Real getBoundingRadius(void) const;
protected:
//void getWorldTransforms(Matrix4 *xform) const;
const Quaternion &getWorldOrientation(void) const;
const Vector3 &getWorldPosition(void) const;
bool mDrawn;
};
#endif /* __LINE3D_H__ */
//-------------------------------------------------------------------------------------------------------------------------
CPP文件:
#include "Line3D.h"
Line3D::Line3D(void)
{
mRenderOp.vertexData = new VertexData();
mRenderOp.indexData = new IndexData();
mDrawn = false;
this->setMaterial("Examples/10PointBlock");
}
Line3D::~Line3D(void)
{
delete mRenderOp.vertexData;
delete mRenderOp.indexData;
}
void Line3D::draw(void)
{
if(mDrawn)
return;
else
mDrawn = true;
// Initialization stuff
//mRenderOp.indexData = 0;
mRenderOp.vertexData->vertexCount = 4;//mPoints.size();
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.indexData->indexCount = 6;
mRenderOp.indexData->indexStart = 0;
mRenderOp.operationType = RenderOperation::OT_TRIANGLE_STRIP; // OT_LINE_LIST, OT_LINE_STRIP
mRenderOp.useIndexes = true;
VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration;
VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding;
decl->addElement(POSITION_BINDING, 0, VET_FLOAT3, VES_POSITION);
decl->addElement(TEXCOORD_BINDING, 0, VET_FLOAT2, VES_TEXTURE_COORDINATES);
HardwareVertexBufferSharedPtr vbuf =
HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(POSITION_BINDING),
mRenderOp.vertexData->vertexCount,
HardwareBuffer::HBU_STATIC_WRITE_ONLY);
bind->setBinding(POSITION_BINDING, vbuf);
HardwareVertexBufferSharedPtr vbufUV =
HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(TEXCOORD_BINDING),
mRenderOp.vertexData->vertexCount,
HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY);
bind->setBinding(TEXCOORD_BINDING, vbufUV);
// Drawing stuff
Vector3 vaabMin = Ogre::Vector3(0,0,0);
Vector3 vaabMax = Ogre::Vector3(160,0,160);
Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
Real *prUV = static_cast<Real*>(vbufUV->lock(HardwareBuffer::HBL_DISCARD));
*prPos++ = 0;
*prPos++ = 0;
*prPos++ = 0;
*prPos++ = 160;
*prPos++ = 0;
*prPos++ = 0;
*prPos++ = 160;
*prPos++ = 0;
*prPos++ = 160;
*prPos++ = 0;
*prPos++ = 0;
*prPos++ = 160;
*prUV++ = 0;
*prUV++ = 0;
*prUV++ = 1;
*prUV++ = 0;
*prUV++ = 1;
*prUV++ = 1;
*prUV++ = 0;
*prUV++ = 1;
vbuf->unlock();
vbufUV->unlock();
mRenderOp.indexData->indexBuffer =
HardwareBufferManager::getSingleton().createIndexBuffer(
HardwareIndexBuffer::IT_16BIT ,
mRenderOp.indexData->indexCount,
HardwareBuffer::HBU_STATIC_WRITE_ONLY);
unsigned short* pIdx = static_cast<ushort*>(mRenderOp.indexData->indexBuffer->lock(HardwareBuffer::HBL_DISCARD) );
*pIdx++ = 0;
*pIdx++ = 1;
*pIdx++ = 2;
*pIdx++ = 0;
*pIdx++ = 2;
*pIdx++ = 3;
mRenderOp.indexData->indexBuffer->unlock();
mBox.setExtents(vaabMin, vaabMax);
}
Real Line3D::getSquaredViewDepth(const Camera *cam) const
{
Vector3 vMin, vMax, vMid, vDist;
vMin = mBox.getMinimum();
vMax = mBox.getMaximum();
vMid = ((vMin - vMax) * 0.5) + vMin;
vDist = cam->getDerivedPosition() - vMid;
return vDist.squaredLength();
}
Real Line3D::getBoundingRadius(void) const
{
return Math::Sqrt(max(mBox.getMaximum().squaredLength(), mBox.getMinimum().squaredLength()));
//return mRadius;
}
/*
void Line3D::getWorldTransforms(Matrix4 *xform) const
{
// return identity matrix to prevent parent transforms
*xform = Matrix4::IDENTITY;
}
*/
const Quaternion &Line3D::getWorldOrientation(void) const
{
return Quaternion::IDENTITY;
}
const Vector3 &Line3D::getWorldPosition(void) const
{
return Vector3::ZERO;
}
实现代码:
Line3D *myLine = new Line3D();
myLine->draw();
SceneNode *myNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
myNode->attachObject(myLine);
//--------------------------------------------------------------------------------------------
由于是修改的别人代码,所以类的名字还是Line3D,这个类实现的是画一个平面,我固定了四个点(0,0,0) (160,0,0) (160,0,160) (0,0,160)