当前位置: 首页>>代码示例>>C++>>正文


C++ VertexBuffer::ApplyForward方法代码示例

本文整理汇总了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);
	}
//.........这里部分代码省略.........
开发者ID:cbalderrama,项目名称:wire3d,代码行数:101,代码来源:WireNode.cpp


注:本文中的VertexBuffer::ApplyForward方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。