本文整理汇总了C++中VertexBuffer::ApplyForward方法的典型用法代码示例。如果您正苦于以下问题:C++ VertexBuffer::ApplyForward方法的具体用法?C++ VertexBuffer::ApplyForward怎么用?C++ VertexBuffer::ApplyForward使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VertexBuffer
的用法示例。
在下文中一共展示了VertexBuffer::ApplyForward方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: MergeMeshes
//----------------------------------------------------------------------------
void Node::MergeMeshes(MergeArray* pMergeArray)
{
WIRE_ASSERT(pMergeArray->GetQuantity() > 0);
if (pMergeArray->GetQuantity() == 1)
{
return;
}
TPODArray<Transformation*> transformations(pMergeArray->GetQuantity());
TPODArray<UInt64> keys(pMergeArray->GetQuantity());
for (UInt i = 0; i < pMergeArray->GetQuantity(); i++)
{
UInt64 key = 0;
enum
{
STATESET = 32,
MATERIAL = 32,
};
WIRE_ASSERT((STATESET + MATERIAL) <= sizeof(key) * 8);
RenderObject* pRenderObject = (*pMergeArray)[i];
Material* pMaterial = pRenderObject->GetMaterial();
if (pMaterial)
{
key |= pMaterial->ID;
}
// If StateSetID is MAX_UINT, it wasn't initialized (call UpdateRS()
// once or initialize manually)
key |= static_cast<UInt64>(pRenderObject->GetStateSetID()) << (MATERIAL);
keys.Append(key);
}
Object** pObjects = reinterpret_cast<Object**>(pMergeArray->GetArray());
VisibleSet::QuickSort(keys, pObjects, transformations.GetArray(), 0,
pMergeArray->GetQuantity()-1);
UInt vtxCount = 0;
UInt idxCount = 0;
Mesh* pMesh = NULL;
for (UInt i = 0; i < pMergeArray->GetQuantity(); i++)
{
pMesh = (*pMergeArray)[i]->GetMesh();
vtxCount += pMesh->GetVertexCount();
idxCount += pMesh->GetIndexCount();
}
const UInt vbCount = pMesh->GetVertexBuffers().GetQuantity();
Mesh::VertexBuffers vbs(vbCount);
TArray<Float*> rawDst(vbCount);
for (UInt j = 0; j < vbCount; j++)
{
VertexBuffer* pVB = WIRE_NEW VertexBuffer(pMesh->
GetVertexBuffer(j)->GetAttributes(), vtxCount);
vbs.Append(pVB);
rawDst.Append(pVB->GetData());
}
IndexBuffer* pIB = WIRE_NEW IndexBuffer(idxCount);
UShort* pRawIB = pIB->GetData();
Int offset = 0;
for (UInt i = 0; i < pMergeArray->GetQuantity(); i++)
{
pMesh = (*pMergeArray)[i]->GetMesh();
for (UInt j = 0; j < vbCount; j++)
{
VertexBuffer* pMVB = pMesh->GetVertexBuffer(j);
const UInt vtxCount = pMesh->GetVertexCount();
pMVB->ApplyForward(Transformation::IDENTITY, rawDst[j], vtxCount,
pMesh->GetStartVertex());
const UInt vtxSize = pMVB->GetAttributes().GetVertexSize();
rawDst[j] += (vtxSize / sizeof(Float)) * vtxCount;
}
IndexBuffer* pMIB = pMesh->GetIndexBuffer();
offset -= pMesh->GetStartVertex();
const UInt startIdx = pMesh->GetStartIndex();
for (UInt j = startIdx; j < (startIdx + pMesh->GetIndexCount()); j++)
{
WIRE_ASSERT((((*pMIB)[j])+offset) < 0x10000);
*pRawIB++ = static_cast<UShort>((((*pMIB)[j])+offset));
}
offset += pMesh->GetVertexCount();
}
UInt startIndex = 0;
for (UInt i = 0; i < pMergeArray->GetQuantity(); i++)
{
pMesh = (*pMergeArray)[i]->GetMesh();
const UInt indexCount = pMesh->GetIndexCount();
Mesh* pMergedMesh = WIRE_NEW Mesh(vbs, pIB, startIndex, indexCount);
startIndex += indexCount;
(*pMergeArray)[i]->SetMesh(pMergedMesh);
}
//.........这里部分代码省略.........