本文整理汇总了C++中ogre::VertexBufferBinding::setBinding方法的典型用法代码示例。如果您正苦于以下问题:C++ VertexBufferBinding::setBinding方法的具体用法?C++ VertexBufferBinding::setBinding怎么用?C++ VertexBufferBinding::setBinding使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ogre::VertexBufferBinding
的用法示例。
在下文中一共展示了VertexBufferBinding::setBinding方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: queries
Selection2D::Selection2D(bool includeTextureCoords)
{
// use identity projection and view matrices
mUseIdentityProjection = true;
mUseIdentityView = true;
mRenderOp.vertexData = OGRE_NEW Ogre::VertexData();
mRenderOp.indexData = 0;
mRenderOp.vertexData->vertexCount = 5;
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.operationType = Ogre::RenderOperation::OT_LINE_STRIP;
mRenderOp.useIndexes = false;
Ogre::VertexDeclaration* decl = mRenderOp.vertexData->vertexDeclaration;
Ogre::VertexBufferBinding* bind = mRenderOp.vertexData->vertexBufferBinding;
decl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
Ogre::HardwareVertexBufferSharedPtr vbuf = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(0), mRenderOp.vertexData->vertexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
// Bind buffer
bind->setBinding(0, vbuf);
this->setCastShadows(false);
this->setQueryFlags(0); // set a query flag to exlude from queries (if necessary).
// set basic white material
this->setMaterial("BaseWhiteNoLighting");
}
示例2: memcpy
/// @author https://bitbucket.org/ChaosCreator/imgui-ogre2.1-binding/src/8f1a01db510f543a987c3c16859d0a33400d9097/ImguiRenderable.cpp?at=master&fileviewer=file-view-default
/// Commentary on OGRE forums: http://www.ogre3d.org/forums/viewtopic.php?f=5&t=89081#p531059
void OgreImGui::ImGUIRenderable::updateVertexData(const ImDrawVert* vtxBuf, const ImDrawIdx* idxBuf, unsigned int vtxCount, unsigned int idxCount)
{
Ogre::VertexBufferBinding* bind = mRenderOp.vertexData->vertexBufferBinding;
if (bind->getBindings().empty() || mVertexBufferSize != vtxCount)
{
mVertexBufferSize = vtxCount;
bind->setBinding(0, Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(sizeof(ImDrawVert), mVertexBufferSize, Ogre::HardwareBuffer::HBU_WRITE_ONLY));
}
if (mRenderOp.indexData->indexBuffer.isNull() || mIndexBufferSize != idxCount)
{
mIndexBufferSize = idxCount;
mRenderOp.indexData->indexBuffer =
Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16BIT, mIndexBufferSize, Ogre::HardwareBuffer::HBU_WRITE_ONLY);
}
// Copy all vertices
ImDrawVert* vtxDst = (ImDrawVert*)(bind->getBuffer(0)->lock(Ogre::HardwareBuffer::HBL_DISCARD));
ImDrawIdx* idxDst = (ImDrawIdx*)(mRenderOp.indexData->indexBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD));
memcpy(vtxDst, vtxBuf, mVertexBufferSize * sizeof(ImDrawVert));
memcpy(idxDst, idxBuf, mIndexBufferSize * sizeof(ImDrawIdx));
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.vertexData->vertexCount = vtxCount;
mRenderOp.indexData->indexStart = 0;
mRenderOp.indexData->indexCount = idxCount;
bind->getBuffer(0)->unlock();
mRenderOp.indexData->indexBuffer->unlock();
}
示例3: memcpy
void OgreImGui::ImGUIRenderable::updateVertexData(ImDrawData* draw_data,unsigned int cmdIndex)
{
Ogre::VertexBufferBinding* bind = mRenderOp.vertexData->vertexBufferBinding;
const ImDrawList* cmd_list = draw_data->CmdLists[cmdIndex];
if (bind->getBindings().empty() || mVertexBufferSize != cmd_list->VtxBuffer.size())
{
mVertexBufferSize = cmd_list->VtxBuffer.size();
bind->setBinding(0,Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(sizeof(ImDrawVert),mVertexBufferSize,Ogre::HardwareBuffer::HBU_WRITE_ONLY));
}
if (mRenderOp.indexData->indexBuffer.isNull() || mIndexBufferSize != cmd_list->IdxBuffer.size())
{
mIndexBufferSize = cmd_list->IdxBuffer.size();
mRenderOp.indexData->indexBuffer=
Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16BIT,mIndexBufferSize,Ogre::HardwareBuffer::HBU_WRITE_ONLY);
}
// Copy all vertices
ImDrawVert* vtx_dst = (ImDrawVert*)(bind->getBuffer(0)->lock(Ogre::HardwareBuffer::HBL_DISCARD));
ImDrawIdx* idx_dst = (ImDrawIdx*)(mRenderOp.indexData->indexBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD));
memcpy(vtx_dst, &cmd_list->VtxBuffer[0], mVertexBufferSize * sizeof(ImDrawVert));
memcpy(idx_dst, &cmd_list->IdxBuffer[0], mIndexBufferSize * sizeof(ImDrawIdx));
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.vertexData->vertexCount = cmd_list->VtxBuffer.size();
mRenderOp.indexData->indexStart = 0;
mRenderOp.indexData->indexCount = cmd_list->IdxBuffer.size();
bind->getBuffer(0)->unlock();
mRenderOp.indexData->indexBuffer->unlock();
}
示例4: queries
PortalOutlineRenderable::PortalOutlineRenderable(Ogre::String matname, Ogre::ColourValue colour)
{
mRenderOp.vertexData = OGRE_NEW Ogre::VertexData();
mRenderOp.indexData = 0;
mRenderOp.vertexData->vertexCount = 10;//8
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.operationType = Ogre::RenderOperation::OT_LINE_LIST;
mRenderOp.useIndexes = false;
Ogre::VertexDeclaration* decl = mRenderOp.vertexData->vertexDeclaration;
Ogre::VertexBufferBinding* bind = mRenderOp.vertexData->vertexBufferBinding;
decl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
Ogre::HardwareVertexBufferSharedPtr vbuf = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(0), mRenderOp.vertexData->vertexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
// Bind buffer
bind->setBinding(0, vbuf);
// setup material
createPortalMaterials();
//Ogre::ResourceManager::ResourceCreateOrRetrieveResult result = Ogre::MaterialManager::getSingleton().createOrRetrieve(matname, "General");
//if(result.second)
//{
// Ogre::MaterialPtr matptrOBBoxManualMaterial = result.first;
// matptrOBBoxManualMaterial->setReceiveShadows(false);
// matptrOBBoxManualMaterial->getTechnique(0)->setLightingEnabled(true);
// matptrOBBoxManualMaterial->getTechnique(0)->getPass(0)->setDiffuse(colour);
// matptrOBBoxManualMaterial->getTechnique(0)->getPass(0)->setAmbient(colour);
// matptrOBBoxManualMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(colour);
//}
this->setCastShadows(false);
this->setQueryFlags(0); // set a query flag to exlude from queries (if necessary).
this->setMaterial("PortalOutlineMaterial");
}
示例5:
Line3D::Line3D()
{
mRenderOp.vertexData = new Ogre::VertexData();
this->SelfNode = Entresol::GetSingletonPtr()->GetSceneManager()->GetGraphicsWorldPointer()->getRootSceneNode()->createChildSceneNode();
// Initialization stuff
mRenderOp.indexData = 0;
mRenderOp.vertexData->vertexCount = 1024;
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.operationType = Ogre::RenderOperation::OT_LINE_LIST;
mRenderOp.useIndexes = false;
Ogre::VertexDeclaration* VDecl = mRenderOp.vertexData->vertexDeclaration;
Ogre::VertexBufferBinding* VBind = mRenderOp.vertexData->vertexBufferBinding;
size_t Offset = 0;
// Position.
VDecl->addElement(0,0,Ogre::VET_FLOAT3,Ogre::VES_POSITION);
Offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
// Colour
VDecl->addElement(0,Offset,Ogre::VET_FLOAT4,Ogre::VES_DIFFUSE);
Offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT4);
this->VertexBuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
VDecl->getVertexSize(0),
mRenderOp.vertexData->vertexCount,
Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE,
false);
VBind->setBinding(0,this->VertexBuffer);
this->setMaterial("BaseWhiteNoLighting");
}
示例6: createPureColourMaterial
AxisRenderable::AxisRenderable(int lineCount,Ogre::Camera* camera,Ogre::Viewport* viewport)
{
// Disable cast shadows by default
mCastShadows = false;
mPrevAxisGizmoSelAxis = -1;
mCamera = camera;
mViewport = viewport;
m_max_line_count = m_line_count = lineCount;
m_line_count = 0;
mLength = 200;
mProjectDistance = mCamera->getFarClipDistance();
m_local = false;
m_locked_data = 0;
//m_locked_buffer = 0;
mRenderOp.vertexData = new Ogre::VertexData();
m_radius = 0;
mRenderOp.indexData = 0;
mRenderOp.vertexData->vertexCount = m_line_count*2;
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.operationType = Ogre::RenderOperation::OT_LINE_LIST;
mRenderOp.useIndexes = false;
Ogre::VertexDeclaration* decl = mRenderOp.vertexData->vertexDeclaration;
Ogre::VertexBufferBinding* bind = mRenderOp.vertexData->vertexBufferBinding;
decl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
decl->addElement(0, 3*sizeof(Ogre::Real), Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);
Ogre::HardwareVertexBufferSharedPtr vbuf =
Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(0),
2*m_max_line_count,
Ogre::HardwareBuffer::HBU_WRITE_ONLY);
bind->setBinding(0, vbuf);
// Obtain the pure colour material
Ogre::MaterialPtr pureColourMaterial = createPureColourMaterial(Ogre::ColourValue(1,1,0));
Ogre::String realName = pureColourMaterial->getName() + "_NoDepthBuffer";
Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().getByName(realName);
if (material.isNull())
{
// Clone to avoid confuse somewhere else that using the same material
material = pureColourMaterial->clone(realName);
material->setDepthCheckEnabled(false);
material->setDepthWriteEnabled(false);
}
setMaterial(material->getName());
mBox.setExtents(-10,-10,-10,10,10,10);
setQueryFlags(0);
}
示例7: resizeBuffers
void Canvas::resizeBuffers()
{
if(bufferSize < quadList.size())
{
bufferSize = quadList.size() * 2;
destroyBuffers();
}
if(!vertexData)
{
vertexData = new Ogre::VertexData();
vertexData->vertexStart = 0;
vertexData->vertexCount = bufferSize * 4;
Ogre::VertexDeclaration* decl = vertexData->vertexDeclaration;
Ogre::VertexBufferBinding* binding = vertexData->vertexBufferBinding;
size_t offset = 0;
decl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
decl->addElement(0, offset, Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR);
decl->addElement(0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES, 0);
buffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(0), vertexData->vertexCount, Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
binding->setBinding(0, buffer);
}
if(!indexData)
{
indexData = new Ogre::IndexData();
indexData->indexStart = 0;
indexData->indexCount = bufferSize * 6;
indexData->indexBuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(
Ogre::HardwareIndexBuffer::IT_16BIT, indexData->indexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
unsigned short* indexBuffer = (unsigned short*)indexData->indexBuffer->lock(0, indexData->indexBuffer->getSizeInBytes(), Ogre::HardwareBuffer::HBL_DISCARD);
// Indexes are generated here because we know that we will only be rendering quads
// This means that we only have to handle updating the vertex buffer in Canvas::updateGeometry
for(size_t indexIdx, vertexIdx, quadIdx = 0; quadIdx < bufferSize; quadIdx++)
{
indexIdx = quadIdx * 6;
vertexIdx = quadIdx * 4;
indexBuffer[indexIdx++] = (unsigned short)(vertexIdx + 0);
indexBuffer[indexIdx++] = (unsigned short)(vertexIdx + 2);
indexBuffer[indexIdx++] = (unsigned short)(vertexIdx + 1);
indexBuffer[indexIdx++] = (unsigned short)(vertexIdx + 1);
indexBuffer[indexIdx++] = (unsigned short)(vertexIdx + 2);
indexBuffer[indexIdx++] = (unsigned short)(vertexIdx + 3);
}
indexData->indexBuffer->unlock();
}
}
示例8: draw
void DebugLines::draw()
{
if(_drawn) return;
else _drawn = true;
// Initialization stuff
mRenderOp.indexData = 0;
mRenderOp.vertexData->vertexCount = _points.size();
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.operationType = RenderOperation::OT_LINE_LIST;
mRenderOp.useIndexes = false;
Ogre::VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration;
Ogre::VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding;
decl->addElement(0, 0, VET_FLOAT3, VES_POSITION);
HardwareVertexBufferSharedPtr vbuf =
HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(0),
mRenderOp.vertexData->vertexCount,
HardwareBuffer::HBU_STATIC_WRITE_ONLY);
bind->setBinding(0, vbuf);
// Drawing stuff
size_t size = _points.size();
Vector3 vaabMin = _points[0];
Vector3 vaabMax = _points[0];
Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
for(size_t i = 0; i < size; i++)
{
*prPos++ = _points[i].x;
*prPos++ = _points[i].y;
*prPos++ = _points[i].z;
if(_points[i].x < vaabMin.x)
vaabMin.x = _points[i].x;
if(_points[i].y < vaabMin.y)
vaabMin.y = _points[i].y;
if(_points[i].z < vaabMin.z)
vaabMin.z = _points[i].z;
if(_points[i].x > vaabMax.x)
vaabMax.x = _points[i].x;
if(_points[i].y > vaabMax.y)
vaabMax.y = _points[i].y;
if(_points[i].z > vaabMax.z)
vaabMax.z = _points[i].z;
}
vbuf->unlock();
mBox.setExtents(vaabMin, vaabMax);
}
示例9: createFakeEntity
void ESKOgre::createFakeEntity(Ogre::SceneManager *mSceneMgr) {
Ogre::MeshPtr msh = Ogre::MeshManager::getSingleton().createManual(name + "_skeleton", XENOVIEWER_RESOURCE_GROUP);
msh->setSkeletonName(name);
Ogre::SubMesh* sub = msh->createSubMesh();
const size_t nVertices = 3;
const size_t nVertCount = 3;
const size_t vbufCount = nVertCount*nVertices;
float *vertices = (float *)malloc(sizeof(float)*vbufCount);
for (size_t i = 0; i < nVertices; i++) {
vertices[i*nVertCount] = 0.0;
vertices[i*nVertCount + 1] = 0.0;
vertices[i*nVertCount + 2] = 0.0;
}
const size_t ibufCount = 3;
unsigned short *faces = (unsigned short *)malloc(sizeof(unsigned short) * ibufCount);
for (size_t i = 0; i < ibufCount; i++) {
faces[i] = i;
}
msh->sharedVertexData = new Ogre::VertexData();
msh->sharedVertexData->vertexCount = nVertices;
Ogre::VertexDeclaration* decl = msh->sharedVertexData->vertexDeclaration;
size_t offset = 0;
decl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
Ogre::HardwareVertexBufferSharedPtr vbuf = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(offset, msh->sharedVertexData->vertexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
vbuf->writeData(0, vbuf->getSizeInBytes(), vertices, true);
Ogre::VertexBufferBinding* bind = msh->sharedVertexData->vertexBufferBinding;
bind->setBinding(0, vbuf);
Ogre::HardwareIndexBufferSharedPtr ibuf = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16BIT, ibufCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
ibuf->writeData(0, ibuf->getSizeInBytes(), faces, true);
sub->useSharedVertices = true;
sub->indexData->indexBuffer = ibuf;
sub->indexData->indexCount = ibufCount;
sub->indexData->indexStart = 0;
msh->_setBounds(Ogre::AxisAlignedBox(-100, -100, -100, 100, 100, 100));
msh->_setBoundingSphereRadius(100);
msh->load();
free(faces);
free(vertices);
skeleton_entity = mSceneMgr->createEntity(name + "_skeleton");
skeleton_node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
skeleton_node->attachObject(skeleton_entity);
skeleton_node->setVisible(false);
}
示例10: vertex_size
BufferType*
ManualObject::createBuffer( const BufferBinding binding
,Ogre::VertexElementType type
,Ogre::VertexElementSemantic semantic )
{
Ogre::VertexDeclaration* decl = m_section->vertexData->vertexDeclaration;
Ogre::VertexBufferBinding* bind = m_section->vertexData->vertexBufferBinding;
decl->addElement( binding, 0, type, semantic );
size_t vertex_size( decl->getVertexSize( binding ) );
VertexBuffer buffer = Ogre::HardwareBufferManager::getSingleton()
.createVertexBuffer( vertex_size
,m_section->vertexData->vertexCount
,Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
bind->setBinding( binding, buffer );
m_vertex_buffers[binding] = buffer;
return static_cast<BufferType*>( buffer->lock( Ogre::HardwareBuffer::HBL_DISCARD ) );
}
示例11: lock
void
TerrainGridRenderable::initTerrainGrid(int vertexCount)
{
m_locked_data = 0;
mRenderOp.vertexData = new Ogre::VertexData();
mRenderOp.indexData = 0;
mRenderOp.vertexData->vertexCount = mVertexCount;
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.operationType = Ogre::RenderOperation::OT_LINE_LIST;
mRenderOp.useIndexes = false;
Ogre::VertexDeclaration* decl = mRenderOp.vertexData->vertexDeclaration;
Ogre::VertexBufferBinding* bind = mRenderOp.vertexData->vertexBufferBinding;
decl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
decl->addElement(0, 3*sizeof(Ogre::Real), Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);
Ogre::HardwareVertexBufferSharedPtr vbuf =
Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(0),
vertexCount,
Ogre::HardwareBuffer::HBU_WRITE_ONLY);
bind->setBinding(0, vbuf);
// set basic white material
this->setMaterial("BaseWhiteNoLighting");
mBox.setExtents(-10,-10,-10,10,10,10);
lock();
drawGridLines();
unlock();
// getMaterial()->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
setQueryFlags(0);
}
示例12: _createGeometry
void MeshManager::_createGeometry()
{
int numVertices = mSteps * mCircles + 1;
int numEle = 6 * mSteps * (mCircles - 1) + 3 * mSteps;
// Vertex buffers
mSubMesh->vertexData = new Ogre::VertexData();
mSubMesh->vertexData->vertexStart = 0;
mSubMesh->vertexData->vertexCount = numVertices;
Ogre::VertexDeclaration* vdecl = mSubMesh->vertexData->vertexDeclaration;
Ogre::VertexBufferBinding* vbind = mSubMesh->vertexData->vertexBufferBinding;
size_t offset = 0;
vdecl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
vdecl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_TEXTURE_COORDINATES, 0);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
vdecl->addElement(0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES, 1);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT2);
vdecl->addElement(0, offset, Ogre::VET_FLOAT1, Ogre::VES_TEXTURE_COORDINATES, 2);
mVertexBuffer = Ogre::HardwareBufferManager::getSingleton().
createVertexBuffer(sizeof(POS_UV_VERTEX),
numVertices,
Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY);
vbind->setBinding(0, mVertexBuffer);
unsigned int *indexbuffer = new unsigned int[numEle];
for(int k = 0; k < mSteps; k++)
{
indexbuffer[k * 3] = 0;
indexbuffer[k * 3 + 1] = k + 1;
if(k != mSteps - 1)
{
indexbuffer[k * 3 + 2] = k + 2;
}
else
{
indexbuffer[k * 3 + 2] = 1;
}
}
for(int y = 0; y < mCircles - 1; y++)
{
for(int x = 0; x < mSteps; x++)
{
unsigned int *twoface = indexbuffer + (y * mSteps + x) * 6 + 3 * mSteps;
int p0 = 1 + y * mSteps + x ;
int p1 = 1 + y * mSteps + x + 1 ;
int p2 = 1 + (y + 1) * mSteps + x ;
int p3 = 1 + (y + 1) * mSteps + x + 1 ;
if(x == mSteps - 1)
{
p1 -= x + 1;
p3 -= x + 1;
}
// First triangle
twoface[2] = p0;
twoface[1] = p1;
twoface[0] = p2;
// Second triangle
twoface[5] = p1;
twoface[4] = p3;
twoface[3] = p2;
}
}
// Prepare buffer for indices
mIndexBuffer =
Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(
Ogre::HardwareIndexBuffer::IT_32BIT,
numEle,
Ogre::HardwareBuffer::HBU_STATIC, true);
mIndexBuffer->
writeData(0,
mIndexBuffer->getSizeInBytes(),
indexbuffer,
true);
delete []indexbuffer;
// Set index buffer for this submesh
mSubMesh->indexData->indexBuffer = mIndexBuffer;
mSubMesh->indexData->indexStart = 0;
mSubMesh->indexData->indexCount = numEle;
// Create our internal buffer for manipulations
mVertices = new POS_UV_VERTEX[1 + mSteps * mCircles];
}
示例13: GrassParticleField
GrassPatch::GrassPatch(int nb_blades, int nb_blade_segments, float width, float height, Ogre::SceneManager* ScnMgr)
{
int i, nb_particles;
// Create the particle field
nb_particles = nb_blades * (nb_blade_segments + 1);
m_Particles = new GrassParticleField(nb_particles, 1);
// Allocate the blade list
m_Blades = new Blade *[nb_blades];
m_NbBlades = nb_blades;
Ogre::Radian *angle = new Ogre::Radian(Ogre::Math::PI * ((rand()%1000) / 1000.0f));
// Create the blades of grass
for (i = 0; i < nb_blades; i++)
{
m_Blades[i] = new Blade(m_Particles,
i * (nb_blade_segments + 1),
nb_blade_segments,
4 + ((rand()%1000) / 1000.0f)*0.5f,
0.3f + ((rand()%1000) / 1000.0f)*0.1f,
width / 2 - ((rand()%1000) / 500.0f) * width,
height / 2 - ((rand()%1000) / 500.0f) * height,
*angle);
m_Blades[i]->moving = true;
m_Blades[i]->timeout = 0;
}
m_VertexCount = nb_blades * m_Blades[0]->GetStrippedVertexCount();
m_TriangleCount = ((nb_blade_segments - 1) << 1) + 1;
mvertexData = new Ogre::VertexData ();
// Vertex declaration
Ogre::VertexDeclaration* decl = mvertexData->vertexDeclaration;
Ogre::VertexBufferBinding* binding = mvertexData->vertexBufferBinding;
size_t offset = 0;
//position
decl->addElement (POSITION_BINDING, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
// normal here
decl->addElement(POSITION_BINDING, offset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
// Diffuse Color
decl->addElement(POSITION_BINDING, offset, Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR);
// texture here
decl->addElement(POSITION_BINDING, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);
offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT2);
//position updated each frame
Ogre::HardwareVertexBufferSharedPtr vbuf1 =
Ogre::HardwareBufferManager::getSingleton().createVertexBuffer (offset, // size of one whole vertex
m_VertexCount, // number of vertices
Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY, // usage
false); // no shadow buffer
binding->setBinding(POSITION_BINDING, vbuf1);
Ogre::HardwareVertexBufferSharedPtr vVertices = binding->getBuffer(POSITION_BINDING);
Ogre::Real *pVertices = static_cast<Ogre::Real*>( vVertices->lock( Ogre::HardwareBuffer::HBL_DISCARD ) );
// Colour up the blades
for (i = 0; i < m_NbBlades; i++)
m_Blades[i]->Paint (i, pVertices);
vVertices->unlock();
// Index buffer to handle triangle strip vertex buffer as triangle list
// Create index buffer
int nIndexes = m_TriangleCount*3*m_NbBlades;
Ogre::HardwareIndexBufferSharedPtr iBuf =
Ogre::HardwareBufferManager::getSingleton().createIndexBuffer (Ogre::HardwareIndexBuffer::IT_32BIT,
nIndexes,
Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY,
false);
// Fill index buffer
unsigned int* pIdx = static_cast<unsigned int*> (iBuf->lock (Ogre::HardwareBuffer::HBL_DISCARD));
unsigned int j = 0;
for (i = 0; i < m_NbBlades; i++)
m_Blades[i]->UpdateIndexBuffer(&j, i, pIdx);
iBuf->unlock ();
mRenderOp.vertexData = mvertexData;
// mRenderOp.vertexData->vertexCount = m_VertexCount;
mRenderOp.vertexData->vertexCount= nIndexes;
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.operationType = Ogre::RenderOperation::OT_TRIANGLE_LIST;
//.........这里部分代码省略.........
示例14: doExportMesh
//.........这里部分代码省略.........
else
{
msMaterial *pMat = msModel_GetMaterialAt(pModel, matIdx);
ogreSubMesh->setMaterialName(pMat->szName);
logMgr.logMessage("SubMesh Material Done.");
}
logMgr.logMessage("Setting up geometry...");
// Set up mesh geometry
ogreSubMesh->vertexData = new Ogre::VertexData();
ogreSubMesh->vertexData->vertexCount = msMesh_GetVertexCount (pMesh);
ogreSubMesh->vertexData->vertexStart = 0;
Ogre::VertexBufferBinding* bind = ogreSubMesh->vertexData->vertexBufferBinding;
Ogre::VertexDeclaration* decl = ogreSubMesh->vertexData->vertexDeclaration;
// Always 1 texture layer, 2D coords
#define POSITION_BINDING 0
#define NORMAL_BINDING 1
#define TEXCOORD_BINDING 2
decl->addElement(POSITION_BINDING, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
decl->addElement(NORMAL_BINDING, 0, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);
decl->addElement(TEXCOORD_BINDING, 0, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);
// Create buffers
Ogre::HardwareVertexBufferSharedPtr pbuf = Ogre::HardwareBufferManager::getSingleton().
createVertexBuffer(decl->getVertexSize(POSITION_BINDING), ogreSubMesh->vertexData->vertexCount,
Ogre::HardwareBuffer::HBU_DYNAMIC, false);
Ogre::HardwareVertexBufferSharedPtr nbuf = Ogre::HardwareBufferManager::getSingleton().
createVertexBuffer(decl->getVertexSize(NORMAL_BINDING), ogreSubMesh->vertexData->vertexCount,
Ogre::HardwareBuffer::HBU_DYNAMIC, false);
Ogre::HardwareVertexBufferSharedPtr tbuf = Ogre::HardwareBufferManager::getSingleton().
createVertexBuffer(decl->getVertexSize(TEXCOORD_BINDING), ogreSubMesh->vertexData->vertexCount,
Ogre::HardwareBuffer::HBU_DYNAMIC, false);
bind->setBinding(POSITION_BINDING, pbuf);
bind->setBinding(NORMAL_BINDING, nbuf);
bind->setBinding(TEXCOORD_BINDING, tbuf);
ogreSubMesh->useSharedVertices = false;
float* pPos = static_cast<float*>(
pbuf->lock(Ogre::HardwareBuffer::HBL_DISCARD));
logMgr.logMessage("Doing positions and texture coords...");
for (j = 0; j < ogreSubMesh->vertexData->vertexCount; ++j)
{
logMgr.logMessage("Doing vertex " + Ogre::StringConverter::toString(j));
msVertex *pVertex = msMesh_GetVertexAt (pMesh, (int)j);
msVertexEx *pVertexEx=msMesh_GetVertexExAt(pMesh, (int)j);
msVec3 Vertex;
msVertex_GetVertex (pVertex, Vertex);
*pPos++ = Vertex[0];
*pPos++ = Vertex[1];
*pPos++ = Vertex[2];
// Deal with bounds
currpos = Ogre::Vector3(Vertex[0], Vertex[1], Vertex[2]);
if (first)
{
min = max = currpos;
maxSquaredRadius = currpos.squaredLength();
first = false;
}
else
{
min.makeFloor(currpos);
max.makeCeil(currpos);
示例15: createSubMesh
//.........这里部分代码省略.........
bounds.add(&v[0], 1);
}
mesh->_setBounds(Ogre::AxisAlignedBox(bounds.minX()-0.5f, bounds.minY()-0.5f, bounds.minZ()-0.5f,
bounds.maxX()+0.5f, bounds.maxY()+0.5f, bounds.maxZ()+0.5f));
mesh->_setBoundingSphereRadius(bounds.getRadius());
// This function is just one long stream of Ogre-barf, but it works
// great.
Ogre::HardwareBufferManager *hwBufMgr = Ogre::HardwareBufferManager::getSingletonPtr();
Ogre::HardwareVertexBufferSharedPtr vbuf;
Ogre::HardwareIndexBufferSharedPtr ibuf;
Ogre::VertexBufferBinding *bind;
Ogre::VertexDeclaration *decl;
int nextBuf = 0;
Ogre::SubMesh *sub = mesh->createSubMesh();
// Add vertices
sub->useSharedVertices = false;
sub->vertexData = new Ogre::VertexData();
sub->vertexData->vertexStart = 0;
sub->vertexData->vertexCount = srcVerts.size();
decl = sub->vertexData->vertexDeclaration;
bind = sub->vertexData->vertexBufferBinding;
if(srcVerts.size())
{
vbuf = hwBufMgr->createVertexBuffer(Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3),
srcVerts.size(), vertUsage, vertShadowBuffer);
vbuf->writeData(0, vbuf->getSizeInBytes(), &srcVerts[0][0], true);
decl->addElement(nextBuf, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
bind->setBinding(nextBuf++, vbuf);
}
// Vertex normals
if(srcNorms.size())
{
vbuf = hwBufMgr->createVertexBuffer(Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3),
srcNorms.size(), vertUsage, vertShadowBuffer);
vbuf->writeData(0, vbuf->getSizeInBytes(), &srcNorms[0][0], true);
decl->addElement(nextBuf, 0, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);
bind->setBinding(nextBuf++, vbuf);
}
// Vertex colors
const std::vector<Ogre::Vector4> &colors = data->colors;
if(colors.size())
{
Ogre::RenderSystem *rs = Ogre::Root::getSingleton().getRenderSystem();
std::vector<Ogre::RGBA> colorsRGB(colors.size());
for(size_t i = 0;i < colorsRGB.size();i++)
{
Ogre::ColourValue clr(colors[i][0], colors[i][1], colors[i][2], colors[i][3]);
rs->convertColourValue(clr, &colorsRGB[i]);
}
vbuf = hwBufMgr->createVertexBuffer(Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR),
colorsRGB.size(), Ogre::HardwareBuffer::HBU_STATIC);
vbuf->writeData(0, vbuf->getSizeInBytes(), &colorsRGB[0], true);
decl->addElement(nextBuf, 0, Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);
bind->setBinding(nextBuf++, vbuf);
}
// Texture UV coordinates