本文整理汇总了C++中CGrowableArray::last方法的典型用法代码示例。如果您正苦于以下问题:C++ CGrowableArray::last方法的具体用法?C++ CGrowableArray::last怎么用?C++ CGrowableArray::last使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CGrowableArray
的用法示例。
在下文中一共展示了CGrowableArray::last方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Create
//.........这里部分代码省略.........
if(!FillBatch(batch, &pui32Idx[i * 3], pVtx, nStride, nOffsetWeight, eTypeWeight, nOffsetIdx, eTypeIdx, nVertexBones))
{
free(pui32IdxNew);
return PVR_FAIL;
}
for(iBatch = lBatch.begin(); iBatch != lBatch.end(); ++iBatch)
{
if(iBatch->Contains(batch))
{
ppBatch[i] = &*iBatch;
break;
}
}
_ASSERT(iBatch != lBatch.end());
}
// Now that we know how many batches there are, we can allocate the output arrays
CPVRTBoneBatches::nBatchBoneMax = nBatchBoneMax;
pnBatches = (int*) calloc(lBatch.size() * nBatchBoneMax, sizeof(*pnBatches));
pnBatchBoneCnt = (int*) calloc(lBatch.size(), sizeof(*pnBatchBoneCnt));
pnBatchOffset = (int*) calloc(lBatch.size(), sizeof(*pnBatchOffset));
// Create the new triangle index list, the new vertex list, and the batch information.
nTriCnt = 0;
nBatchCnt = 0;
for(iBatch = lBatch.begin(); iBatch != lBatch.end(); ++iBatch)
{
// Write pnBatches, pnBatchBoneCnt and pnBatchOffset for this batch.
iBatch->Write(&pnBatches[nBatchCnt * nBatchBoneMax], &pnBatchBoneCnt[nBatchCnt]);
pnBatchOffset[nBatchCnt] = nTriCnt;
++nBatchCnt;
// Copy any triangle indices for this batch
for(i = 0; i < nTriNum; ++i)
{
if(ppBatch[i] != &*iBatch)
continue;
for(j = 0; j < 3; ++j)
{
ui32SrcIdx = pui32Idx[3 * i + j];
// Get desired bone indices for this vertex/tri
pV = &pVtx[ui32SrcIdx * nStride];
PVRTVertexRead(&vWeight, &pV[nOffsetWeight], eTypeWeight, nVertexBones);
PVRTVertexRead(&vIdx, &pV[nOffsetIdx], eTypeIdx, nVertexBones);
iBatch->GetVertexBoneIndices(&vIdx.x, &vWeight.x, nVertexBones);
_ASSERT(vIdx.x == 0 || vIdx.x != vIdx.y);
// Check the list of copies of this vertex for one with suitable bone indices
for(k = 0; k < (int)pvDup[ui32SrcIdx].size(); ++k)
{
pV2 = pVtxBuf->at(pvDup[ui32SrcIdx][k]);
PVRTVertexRead(&vWeight2, &pV2[nOffsetWeight], eTypeWeight, nVertexBones);
PVRTVertexRead(&vIdx2, &pV2[nOffsetIdx], eTypeIdx, nVertexBones);
if(BonesMatch(&vIdx2.x, &vIdx.x))
{
pui32IdxNew[3 * nTriCnt + j] = pvDup[ui32SrcIdx][k];
break;
}
}
if(k != (int)pvDup[ui32SrcIdx].size())
continue;
// Did not find a suitable duplicate of the vertex, so create one
pVtxBuf->Append(pV, 1);
pvDup[ui32SrcIdx].push_back(pVtxBuf->size() - 1);
PVRTVertexWrite(&pVtxBuf->last()[nOffsetIdx], eTypeIdx, nVertexBones, &vIdx);
pui32IdxNew[3 * nTriCnt + j] = pVtxBuf->size() - 1;
}
++nTriCnt;
}
}
_ASSERTE(nTriCnt == nTriNum);
_ASSERTE(nBatchCnt == (int)lBatch.size());
// Copy indices to output
memcpy(pui32Idx, pui32IdxNew, nTriNum * 3 * sizeof(*pui32IdxNew));
// Move vertices to output
*pnVtxNumOut = pVtxBuf->Surrender(pVtxOut);
// Free working memory
delete [] pvDup;
delete pVtxBuf;
FREE(ppBatch);
FREE(pui32IdxNew);
return PVR_SUCCESS;
}