本文整理汇总了C++中HardwareVertexBufferSharedPtr::lock方法的典型用法代码示例。如果您正苦于以下问题:C++ HardwareVertexBufferSharedPtr::lock方法的具体用法?C++ HardwareVertexBufferSharedPtr::lock怎么用?C++ HardwareVertexBufferSharedPtr::lock使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类HardwareVertexBufferSharedPtr
的用法示例。
在下文中一共展示了HardwareVertexBufferSharedPtr::lock方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: extrudeVertices
// ------------------------------------------------------------------------
void ShadowCaster::extrudeVertices(
const HardwareVertexBufferSharedPtr& vertexBuffer,
size_t originalVertexCount, const Vector4& light, Real extrudeDist)
{
assert (vertexBuffer->getVertexSize() == sizeof(float) * 3
&& "Position buffer should contain only positions!");
// Extrude the first area of the buffer into the second area
// Lock the entire buffer for writing, even though we'll only be
// updating the latter because you can't have 2 locks on the same
// buffer
float* pSrc = static_cast<float*>(
vertexBuffer->lock(HardwareBuffer::HBL_NORMAL));
// TODO: We should add extra (ununsed) vertices ensure source and
// destination buffer have same alignment for slight performance gain.
float* pDest = pSrc + originalVertexCount * 3;
OptimisedUtil::getImplementation()->extrudeVertices(
light, extrudeDist,
pSrc, pDest, originalVertexCount);
vertexBuffer->unlock();
}
示例2: updateTextureGeometry
//---------------------------------------------------------------------
void BorderPanelOverlayElement::updateTextureGeometry()
{
PanelOverlayElement::updateTextureGeometry();
/* Each cell is
0-----2
| /|
| / |
|/ |
1-----3
*/
// No choice but to lock / unlock each time here, but lock only small sections
HardwareVertexBufferSharedPtr vbuf =
mRenderOp2.vertexData->vertexBufferBinding->getBuffer(TEXCOORD_BINDING);
// Can't use discard since this discards whole buffer
float* pUV = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
for (uint i = 0; i < 8; ++i)
{
*pUV++ = mBorderUV[i].u1; *pUV++ = mBorderUV[i].v1;
*pUV++ = mBorderUV[i].u1; *pUV++ = mBorderUV[i].v2;
*pUV++ = mBorderUV[i].u2; *pUV++ = mBorderUV[i].v1;
*pUV++ = mBorderUV[i].u2; *pUV++ = mBorderUV[i].v2;
}
vbuf->unlock();
}
示例3:
//-----------------------------------------------------------------------
size_t
MeshInformer::getVertices(Vector3* pDst,
const VertexData* vertexData)
{
const VertexElement* posElem = vertexData->vertexDeclaration->findElementBySemantic(VES_POSITION);
HardwareVertexBufferSharedPtr vbuf = vertexData->vertexBufferBinding->getBuffer(posElem->getSource());
size_t vertex_stride = vbuf->getVertexSize();
size_t vertexCount = vertexData->vertexCount;
void* pBase = vbuf->lock(
vertex_stride * vertexData->vertexStart,
vertex_stride * vertexCount,
HardwareBuffer::HBL_READ_ONLY);
uchar* pSrc; posElem->baseVertexPointerToElement(pBase, &pSrc);
for (size_t i = 0; i < vertexCount; ++i, pSrc += vertex_stride, ++pDst)
{
const float* pFloat = reinterpret_cast<const float*>(pSrc);
pDst->x = pFloat[0];
pDst->y = pFloat[1];
pDst->z = pFloat[2];
}
vbuf->unlock();
return vertexCount;
}
示例4:
void Rectangle2D::setCorners(Real left, Real top, Real right, Real bottom, bool updateAABB)
{
HardwareVertexBufferSharedPtr vbuf =
mRenderOp.vertexData->vertexBufferBinding->getBuffer(POSITION_BINDING);
float* pFloat = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
*pFloat++ = left;
*pFloat++ = top;
*pFloat++ = -1;
*pFloat++ = left;
*pFloat++ = bottom;
*pFloat++ = -1;
*pFloat++ = right;
*pFloat++ = top;
*pFloat++ = -1;
*pFloat++ = right;
*pFloat++ = bottom;
*pFloat++ = -1;
vbuf->unlock();
if(updateAABB)
{
mBox.setExtents(
std::min(left, right), std::min(top, bottom), 0,
std::max(left, right), std::max(top, bottom), 0);
}
}
示例5: _updateRenderQueue
void ShaderParticleRenderer::_updateRenderQueue(RenderQueue* queue, Ogre::list<Particle*>::type& currentParticles, bool cullIndividually)
{
// be sure that we have enough space in buffers
if (!allocateBuffers(currentParticles.size())) {
assert(0 && "Cannot allocate buffers");
return;
}
// update vertex data
mRadius = 0.0f;
if (!currentParticles.empty()) {
HardwareVertexBufferSharedPtr pVB = mVertexData->vertexBufferBinding->getBuffer(0);
uchar* pDataVB = reinterpret_cast<uchar*>(pVB->lock(HardwareBuffer::HBL_DISCARD));
for (Ogre::list<Particle*>::type::iterator it=currentParticles.begin(); it!=currentParticles.end(); ++it) {
Particle* pParticle = *it;
addParticle(pDataVB, *pParticle);
pDataVB += 4 * mVertexSize;
float fDist = (mParentNode != NULL) ? mParentNode->getPosition().distance(pParticle->mPosition) : pParticle->mPosition.length();
if (fDist > mRadius)
mRadius = fDist;
}
pVB->unlock();
}
// setup counts
mVertexData->vertexCount = currentParticles.size() * 4;
mIndexData->indexCount = currentParticles.size() * 6;
// update render queue
queue->addRenderable(this, mRenderQueueID);
}
示例6: updateColours
//---------------------------------------------------------------------
void TextAreaOverlayElement::updateColours(void)
{
// Convert to system-specific
RGBA topColour, bottomColour;
Root::getSingleton().convertColourValue(mColourTop, &topColour);
Root::getSingleton().convertColourValue(mColourBottom, &bottomColour);
HardwareVertexBufferSharedPtr vbuf =
mRenderOp.vertexData->vertexBufferBinding->getBuffer(COLOUR_BINDING);
RGBA* pDest = static_cast<RGBA*>(
vbuf->lock(HardwareBuffer::HBL_DISCARD, Root::getSingleton().getFreqUpdatedBuffersUploadOption()) );
for (size_t i = 0; i < mAllocSize; ++i)
{
// First tri (top, bottom, top)
*pDest++ = topColour;
*pDest++ = bottomColour;
*pDest++ = topColour;
// Second tri (top, bottom, bottom)
*pDest++ = topColour;
*pDest++ = bottomColour;
*pDest++ = bottomColour;
}
vbuf->unlock();
}
示例7: addProfile
//--------------------------------------------------------------------------
void MeshLodTests::addProfile(LodConfig& config)
{
// Get the first two vertices and put the edge into the profile
// It doesn't matter if there is no such edge, because edges are removed and created dynamically.
// The vertex positions should exist or you get an assert.
VertexData* vertexData = config.mesh->getSubMesh(0)->vertexData;
const VertexElement* elemPos = vertexData->vertexDeclaration->findElementBySemantic(VES_POSITION);
HardwareVertexBufferSharedPtr vbuf = vertexData->vertexBufferBinding->getBuffer(elemPos->getSource());
assert(vbuf->getNumVertices() > 2);
unsigned char* vertex = static_cast<unsigned char*>(vbuf->lock(HardwareBuffer::HBL_READ_ONLY));
float* pFloat;
elemPos->baseVertexPointerToElement(vertex, &pFloat);
ProfiledEdge edge;
edge.src.x = *pFloat++;
edge.src.y = *pFloat++;
edge.src.z = *pFloat;
vertex += vbuf->getVertexSize();
elemPos->baseVertexPointerToElement(vertex, &pFloat);
edge.dst.x = *pFloat++;
edge.dst.y = *pFloat++;
edge.dst.z = *pFloat;
edge.cost = LodData::NEVER_COLLAPSE_COST;
config.advanced.profile.push_back(edge);
vbuf->unlock();
}
示例8:
void Line3D::drawLines(void)
{
if(mDrawn)
return;
else
mDrawn = true;
// Initialization stuff
mRenderOp.indexData = 0;
mRenderOp.vertexData->vertexCount = mPoints.size();
mRenderOp.vertexData->vertexStart = 0;
mRenderOp.operationType = RenderOperation::OT_LINE_LIST; // OT_LINE_LIST, OT_LINE_STRIP
mRenderOp.useIndexes = false;
VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration;
VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding;
decl->addElement(POSITION_BINDING, 0, VET_FLOAT3, VES_POSITION);
HardwareVertexBufferSharedPtr vbuf =
HardwareBufferManager::getSingleton().createVertexBuffer(
decl->getVertexSize(POSITION_BINDING),
mRenderOp.vertexData->vertexCount,
HardwareBuffer::HBU_STATIC_WRITE_ONLY);
bind->setBinding(POSITION_BINDING, vbuf);
// Drawing stuff
int size = mPoints.size();
Vector3 vaabMin = mPoints[0];
Vector3 vaabMax = mPoints[0];
Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
for(int i = 0; i < size; i++)
{
*prPos++ = mPoints[i].x;
*prPos++ = mPoints[i].y;
*prPos++ = mPoints[i].z;
if(mPoints[i].x < vaabMin.x)
vaabMin.x = mPoints[i].x;
if(mPoints[i].y < vaabMin.y)
vaabMin.y = mPoints[i].y;
if(mPoints[i].z < vaabMin.z)
vaabMin.z = mPoints[i].z;
if(mPoints[i].x > vaabMax.x)
vaabMax.x = mPoints[i].x;
if(mPoints[i].y > vaabMax.y)
vaabMax.y = mPoints[i].y;
if(mPoints[i].z > vaabMax.z)
vaabMax.z = mPoints[i].z;
}
vbuf->unlock();
mBox.setExtents(vaabMin, vaabMax);
}
示例9: createCone
void GeomUtils::createCone(Ogre::VertexData*& vertexData, Ogre::IndexData*& indexData,
float radius , float height, int nVerticesInBase)
{
assert(vertexData && indexData);
// define the vertex format
VertexDeclaration* vertexDecl = vertexData->vertexDeclaration;
// positions
vertexDecl->addElement(0, 0, VET_FLOAT3, VES_POSITION);
// allocate the vertex buffer
vertexData->vertexCount = nVerticesInBase + 1;
HardwareVertexBufferSharedPtr vBuf = HardwareBufferManager::getSingleton().createVertexBuffer(vertexDecl->getVertexSize(0), vertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY, false);
VertexBufferBinding* binding = vertexData->vertexBufferBinding;
binding->setBinding(0, vBuf);
float* pVertex = static_cast<float*>(vBuf->lock(HardwareBuffer::HBL_DISCARD));
// allocate index buffer - cone and base
indexData->indexCount = (3 * nVerticesInBase) + (3 * (nVerticesInBase - 2));
indexData->indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer(HardwareIndexBuffer::IT_16BIT, indexData->indexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY, false);
HardwareIndexBufferSharedPtr iBuf = indexData->indexBuffer;
unsigned short* pIndices = static_cast<unsigned short*>(iBuf->lock(HardwareBuffer::HBL_DISCARD));
//Positions : cone head and base
for (int i=0; i<3; i++)
*pVertex++ = 0.0f;
//Base :
float fDeltaBaseAngle = (2 * Math::PI) / nVerticesInBase;
for (int i=0; i<nVerticesInBase; i++)
{
float angle = i * fDeltaBaseAngle;
*pVertex++ = radius * cosf(angle);
*pVertex++ = height;
*pVertex++ = radius * sinf(angle);
}
//Indices :
//Cone head to vertices
for (int i=0; i<nVerticesInBase; i++)
{
*pIndices++ = 0;
*pIndices++ = (i%nVerticesInBase) + 1;
*pIndices++ = ((i+1)%nVerticesInBase) + 1;
}
//Cone base
for (int i=0; i<nVerticesInBase-2; i++)
{
*pIndices++ = 1;
*pIndices++ = i + 3;
*pIndices++ = i + 2;
}
// Unlock
vBuf->unlock();
iBuf->unlock();
}
示例10: ModVertexAlpha
void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType)
{
// Get the vertex colour buffer of this mesh
const Ogre::VertexElement* ves_diffuse = ent->getMesh()->getSubMesh(0)->vertexData->vertexDeclaration->findElementBySemantic( Ogre::VES_DIFFUSE );
HardwareVertexBufferSharedPtr colourBuffer = ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource());
// Lock
void* pData = colourBuffer->lock(HardwareBuffer::HBL_NORMAL);
// Iterate over all vertices
int vertex_size = colourBuffer->getVertexSize();
float * currentVertex = NULL;
for (unsigned int i=0; i<colourBuffer->getNumVertices(); ++i)
{
// Get a pointer to the vertex colour
ves_diffuse->baseVertexPointerToElement( pData, ¤tVertex );
unsigned char alpha=0;
if (meshType == 0) alpha = i%2 ? 0 : 255; // this is a cylinder, so every second vertex belongs to the bottom-most row
else if (meshType == 1)
{
if (i>= 49 && i <= 64) alpha = 0; // bottom-most row
else if (i>= 33 && i <= 48) alpha = 64; // second bottom-most row
else alpha = 255;
}
uint8 tmpR = static_cast<uint8>(255);
uint8 tmpG = static_cast<uint8>(255);
uint8 tmpB = static_cast<uint8>(255);
uint8 tmpA = static_cast<uint8>(alpha);
// This does not matter since R and B are always 1.
/*VertexElementType format = Root::getSingleton().getRenderSystem()->getColourVertexElementType();
switch (format)
{
case VET_COLOUR_ARGB:
std::swap(tmpR, tmpB);
break;
case VET_COLOUR_ABGR:
break;
default:
break;
}*/
// Modify
*((uint32*)currentVertex) = tmpR | (tmpG << 8) | (tmpB << 16) | (tmpA << 24);
// Move to the next vertex
pData = static_cast<unsigned char *> (pData) + vertex_size;
}
// Unlock
ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource())->unlock();
}
示例11: fillHardwareBuffers
void NxLine::fillHardwareBuffers()
{
int size = mPoints.size();
prepareHardwareBuffers(size,0, mUseVertexColour);
if (!size)
{
mBox.setExtents(Vector3::ZERO,Vector3::ZERO);
mDirty=false;
return;
}
Nx::Vector3 vaabMin = mPoints[0];
Nx::Vector3 vaabMax = mPoints[0];
HardwareVertexBufferSharedPtr vbuf = mRenderOp.vertexData->vertexBufferBinding->getBuffer(0);
Real *prPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
{
for(int i = 0; i < size; i++)
{
*prPos++ = mPoints[i].x;
*prPos++ = mPoints[i].y;
*prPos++ = mPoints[i].z;
if(mPoints[i].x < vaabMin.x)
vaabMin.x = mPoints[i].x;
if(mPoints[i].y < vaabMin.y)
vaabMin.y = mPoints[i].y;
if(mPoints[i].z < vaabMin.z)
vaabMin.z = mPoints[i].z;
if(mPoints[i].x > vaabMax.x)
vaabMax.x = mPoints[i].x;
if(mPoints[i].y > vaabMax.y)
vaabMax.y = mPoints[i].y;
if(mPoints[i].z > vaabMax.z)
vaabMax.z = mPoints[i].z;
}
}
vbuf->unlock();
if( mUseVertexColour ) {
HardwareVertexBufferSharedPtr cbuf = mRenderOp.vertexData->vertexBufferBinding->getBuffer(1);
cbuf->writeData(0, size * sizeof(unsigned int), &mPointsColor[0], true );
}
mBox.setExtents( NxVec3ToOgre( vaabMin ), NxVec3ToOgre( vaabMax ) );
mDirty = false;
}
示例12: _updateColors
void MovableText::_updateColors(void){
assert(mpFont);
assert(!mpMaterial.isNull());
// Convert to system-specific
RGBA color;
Root::getSingleton().convertColourValue(mColor, &color);
HardwareVertexBufferSharedPtr vbuf = mRenderOp.vertexData->vertexBufferBinding->getBuffer(COLOUR_BINDING);
RGBA *pDest = static_cast<RGBA*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
for (int i = 0; i < (int)mRenderOp.vertexData->vertexCount; ++i)
*pDest++ = color;
vbuf->unlock();
mUpdateColors = false;
}
示例13: extendBuffers
//---------------------------------------------------------------------
void TangentSpaceCalc::extendBuffers(VertexSplits& vertexSplits)
{
if (!vertexSplits.empty())
{
// ok, need to increase the vertex buffer size, and alter some indexes
// vertex buffers first
VertexBufferBinding* newBindings = HardwareBufferManager::getSingleton().createVertexBufferBinding();
const VertexBufferBinding::VertexBufferBindingMap& bindmap =
mVData->vertexBufferBinding->getBindings();
for (VertexBufferBinding::VertexBufferBindingMap::const_iterator i =
bindmap.begin(); i != bindmap.end(); ++i)
{
HardwareVertexBufferSharedPtr srcbuf = i->second;
// Derive vertex count from buffer not vertex data, in case using
// the vertexStart option in vertex data
size_t newVertexCount = srcbuf->getNumVertices() + vertexSplits.size();
// Create new buffer & bind
HardwareVertexBufferSharedPtr newBuf =
HardwareBufferManager::getSingleton().createVertexBuffer(
srcbuf->getVertexSize(), newVertexCount, srcbuf->getUsage(),
srcbuf->hasShadowBuffer());
newBindings->setBinding(i->first, newBuf);
// Copy existing contents (again, entire buffer, not just elements referenced)
newBuf->copyData(*(srcbuf.get()), 0, 0, srcbuf->getNumVertices() * srcbuf->getVertexSize(), true);
// Split vertices, read / write from new buffer
char* pBase = static_cast<char*>(newBuf->lock(HardwareBuffer::HBL_NORMAL));
for (VertexSplits::iterator spliti = vertexSplits.begin();
spliti != vertexSplits.end(); ++spliti)
{
const char* pSrcBase = pBase + spliti->first * newBuf->getVertexSize();
char* pDstBase = pBase + spliti->second * newBuf->getVertexSize();
memcpy(pDstBase, pSrcBase, newBuf->getVertexSize());
}
newBuf->unlock();
}
// Update vertex data
// Increase vertex count according to num splits
mVData->vertexCount += vertexSplits.size();
// Flip bindings over to new buffers (old buffers released)
HardwareBufferManager::getSingleton().destroyVertexBufferBinding(mVData->vertexBufferBinding);
mVData->vertexBufferBinding = newBindings;
}
}
示例14: updatePositionGeometry
//---------------------------------------------------------------------
void PanelOverlayElement::updatePositionGeometry(void)
{
/*
0-----2
| /|
| / |
|/ |
1-----3
*/
Real left, right, top, bottom;
/* Convert positions into -1, 1 coordinate space (homogenous clip space).
- Left / right is simple range conversion
- Top / bottom also need inverting since y is upside down - this means
that top will end up greater than bottom and when computing texture
coordinates, we have to flip the v-axis (ie. subtract the value from
1.0 to get the actual correct value).
*/
left = _getDerivedLeft() * 2 - 1;
right = left + (mWidth * 2);
top = -((_getDerivedTop() * 2) - 1);
bottom = top - (mHeight * 2);
HardwareVertexBufferSharedPtr vbuf =
mRenderOp.vertexData->vertexBufferBinding->getBuffer(POSITION_BINDING);
float* pPos = static_cast<float*>(
vbuf->lock(HardwareBuffer::HBL_DISCARD) );
// Use the furthest away depth value, since materials should have depth-check off
// This initialised the depth buffer for any 3D objects in front
Real zValue = Root::getSingleton().getRenderSystem()->getMaximumDepthInputValue();
*pPos++ = left;
*pPos++ = top;
*pPos++ = zValue;
*pPos++ = left;
*pPos++ = bottom;
*pPos++ = zValue;
*pPos++ = right;
*pPos++ = top;
*pPos++ = zValue;
*pPos++ = right;
*pPos++ = bottom;
*pPos++ = zValue;
vbuf->unlock();
}
示例15: testSingleIndexBufSingleVertexBuf
void EdgeBuilderTests::testSingleIndexBufSingleVertexBuf()
{
/* This tests the edge builders ability to find shared edges in the simple case
of a single index buffer referencing a single vertex buffer
*/
VertexData vd;
IndexData id;
// Test pyramid
vd.vertexCount = 4;
vd.vertexStart = 0;
vd.vertexDeclaration = HardwareBufferManager::getSingleton().createVertexDeclaration();
vd.vertexDeclaration->addElement(0, 0, VET_FLOAT3, VES_POSITION);
HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(sizeof(float)*3, 4, HardwareBuffer::HBU_STATIC,true);
vd.vertexBufferBinding->setBinding(0, vbuf);
float* pFloat = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
*pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ;
*pFloat++ = 50 ; *pFloat++ = 0 ; *pFloat++ = 0 ;
*pFloat++ = 0 ; *pFloat++ = 100; *pFloat++ = 0 ;
*pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = -50;
vbuf->unlock();
id.indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer(
HardwareIndexBuffer::IT_16BIT, 12, HardwareBuffer::HBU_STATIC, true);
id.indexCount = 12;
id.indexStart = 0;
unsigned short* pIdx = static_cast<unsigned short*>(id.indexBuffer->lock(HardwareBuffer::HBL_DISCARD));
*pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 2;
*pIdx++ = 0; *pIdx++ = 2; *pIdx++ = 3;
*pIdx++ = 1; *pIdx++ = 3; *pIdx++ = 2;
*pIdx++ = 0; *pIdx++ = 3; *pIdx++ = 1;
id.indexBuffer->unlock();
EdgeListBuilder edgeBuilder;
edgeBuilder.addVertexData(&vd);
edgeBuilder.addIndexData(&id);
EdgeData* edgeData = edgeBuilder.build();
// Should be only one group, since only one vertex buffer
CPPUNIT_ASSERT(edgeData->edgeGroups.size() == 1);
// 4 tris
CPPUNIT_ASSERT(edgeData->triangles.size() == 4);
EdgeData::EdgeGroup& eg = edgeData->edgeGroups[0];
// 6 edges
CPPUNIT_ASSERT(eg.edges.size() == 6);
delete edgeData;
}