本文整理汇总了C++中HardwareIndexBufferSharedPtr::getNumIndexes方法的典型用法代码示例。如果您正苦于以下问题:C++ HardwareIndexBufferSharedPtr::getNumIndexes方法的具体用法?C++ HardwareIndexBufferSharedPtr::getNumIndexes怎么用?C++ HardwareIndexBufferSharedPtr::getNumIndexes使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类HardwareIndexBufferSharedPtr
的用法示例。
在下文中一共展示了HardwareIndexBufferSharedPtr::getNumIndexes方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: generateShadowVolume
//.........这里部分代码省略.........
if (*lfi)
{
preCountIndexes += 3;
}
}
}
}
else
{
// Do both caps
int increment = ((flags & SRF_INCLUDE_DARK_CAP) ? 3 : 0) + ((flags & SRF_INCLUDE_LIGHT_CAP) ? 3 : 0);
if(increment != 0)
{
// Iterate over the triangles which are using this vertex set
EdgeData::TriangleList::const_iterator ti, tiend;
EdgeData::TriangleLightFacingList::const_iterator lfi;
ti = edgeData->triangles.begin() + eg.triStart;
tiend = ti + eg.triCount;
lfi = edgeData->triangleLightFacings.begin() + eg.triStart;
for ( ; ti != tiend; ++ti, ++lfi)
{
assert(ti->vertexSet == eg.vertexSet);
// Check it's light facing
if (*lfi)
preCountIndexes += increment;
}
}
}
}
// End pre-count
//Check if index buffer is to small
if (preCountIndexes > indexBuffer->getNumIndexes())
{
LogManager::getSingleton().logWarning(
"shadow index buffer size to small. Auto increasing buffer size to" +
StringConverter::toString(sizeof(unsigned short) * preCountIndexes));
SceneManager* pManager = Root::getSingleton()._getCurrentSceneManager();
if (pManager)
{
pManager->setShadowIndexBufferSize(preCountIndexes);
}
//Check that the index buffer size has actually increased
if (preCountIndexes > indexBuffer->getNumIndexes())
{
//increasing index buffer size has failed
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
"Lock request out of bounds.",
"ShadowCaster::generateShadowVolume");
}
}
else if(indexBufferUsedSize + preCountIndexes > indexBuffer->getNumIndexes())
{
indexBufferUsedSize = 0;
}
// Lock index buffer for writing, just enough length as we need
HardwareBufferLockGuard indexLock(indexBuffer,
sizeof(unsigned short) * indexBufferUsedSize, sizeof(unsigned short) * preCountIndexes,
indexBufferUsedSize == 0 ? HardwareBuffer::HBL_DISCARD : HardwareBuffer::HBL_NO_OVERWRITE);
unsigned short* pIdx = static_cast<unsigned short*>(indexLock.pData);
size_t numIndices = indexBufferUsedSize;
示例2: 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;
// If vertex size requires 32bit index buffer
if (mVData->vertexCount > 65536)
{
for (size_t i = 0; i < mIDataList.size(); ++i)
{
// check index size
IndexData* idata = mIDataList[i];
HardwareIndexBufferSharedPtr srcbuf = idata->indexBuffer;
if (srcbuf->getType() == HardwareIndexBuffer::IT_16BIT)
{
size_t indexCount = srcbuf->getNumIndexes();
// convert index buffer to 32bit.
HardwareIndexBufferSharedPtr newBuf =
HardwareBufferManager::getSingleton().createIndexBuffer(
HardwareIndexBuffer::IT_32BIT, indexCount,
srcbuf->getUsage(), srcbuf->hasShadowBuffer());
uint16* pSrcBase = static_cast<uint16*>(srcbuf->lock(HardwareBuffer::HBL_NORMAL));
uint32* pBase = static_cast<uint32*>(newBuf->lock(HardwareBuffer::HBL_NORMAL));
size_t j = 0;
while (j < indexCount)
{
*pBase++ = *pSrcBase++;
++j;
}
srcbuf->unlock();
newBuf->unlock();
// assign new index buffer.
idata->indexBuffer = newBuf;
}
}
}
}
}
示例3: generateShadowVolume
//.........这里部分代码省略.........
points to converge to a single point at infinity.
First side tri = near1, near0, far0
Second tri = far0, far1, near1
'far' indexes are 'near' index + originalVertexCount
because 'far' verts are in the second half of the
buffer
*/
*pIdx++ = v1;
*pIdx++ = v0;
*pIdx++ = v0 + originalVertexCount;
numIndices += 3;
// Are we extruding to infinity?
if (!(lightType == Light::LT_DIRECTIONAL &&
flags & SRF_EXTRUDE_TO_INFINITY))
{
// additional tri to make quad
*pIdx++ = v0 + originalVertexCount;
*pIdx++ = v1 + originalVertexCount;
*pIdx++ = v1;
numIndices += 3;
}
// Do dark cap tri
// Use McGuire et al method, a triangle fan covering all silhouette
// edges and one point (taken from the initial tri)
if (flags & SRF_INCLUDE_DARK_CAP)
{
if (firstDarkCapTri)
{
darkCapStart = v0 + originalVertexCount;
firstDarkCapTri = false;
}
else
{
*pIdx++ = darkCapStart;
*pIdx++ = v1 + originalVertexCount;
*pIdx++ = v0 + originalVertexCount;
numIndices += 3;
}
}
}
}
// Do light cap
if (flags & SRF_INCLUDE_LIGHT_CAP)
{
// separate light cap?
if ((*si)->isLightCapSeparate())
{
// update index count for this shadow renderable
indexData->indexCount = numIndices - indexData->indexStart;
// get light cap index data for update
indexData = (*si)->getLightCapRenderable()->getRenderOperationForUpdate()->indexData;
// start indexes after the current total
indexData->indexStart = numIndices;
}
// Iterate over the triangles which are using this vertex set
EdgeData::TriangleList::const_iterator ti, tiend;
EdgeData::TriangleLightFacingList::const_iterator lfi;
ti = edgeData->triangles.begin() + eg.triStart;
tiend = ti + eg.triCount;
lfi = edgeData->triangleLightFacings.begin() + eg.triStart;
for ( ; ti != tiend; ++ti, ++lfi)
{
const EdgeData::Triangle& t = *ti;
assert(t.vertexSet == eg.vertexSet);
// Check it's light facing
if (*lfi)
{
*pIdx++ = t.vertIndex[0];
*pIdx++ = t.vertIndex[1];
*pIdx++ = t.vertIndex[2];
numIndices += 3;
}
}
}
// update index count for current index data (either this shadow renderable or its light cap)
indexData->indexCount = numIndices - indexData->indexStart;
}
// Unlock index buffer
indexBuffer->unlock();
// In debug mode, check we didn't overrun the index buffer
assert(numIndices <= indexBuffer->getNumIndexes() &&
"Index buffer overrun while generating shadow volume!! "
"You must increase the size of the shadow index buffer.");
}