现在的位置: 首页 > 综合 > 正文

简单的继承SimpleRenderable,实现画一个平面

2018年01月16日 ⁄ 综合 ⁄ 共 3888字 ⁄ 字号 评论关闭

#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)

抱歉!评论已关闭.