本文整理汇总了C++中Geometry::SetRawVertexData方法的典型用法代码示例。如果您正苦于以下问题:C++ Geometry::SetRawVertexData方法的具体用法?C++ Geometry::SetRawVertexData怎么用?C++ Geometry::SetRawVertexData使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Geometry
的用法示例。
在下文中一共展示了Geometry::SetRawVertexData方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CreatePatchGeometry
//.........这里部分代码省略.........
vertexBuffer->SetSize(row * row, MASK_POSITION | MASK_NORMAL | MASK_TEXCOORD1 | MASK_TANGENT);
SharedArrayPtr<unsigned char> cpuVertexData(new unsigned char[row * row * sizeof(Vector3)]);
SharedArrayPtr<unsigned char> occlusionCpuVertexData(new unsigned char[row * row * sizeof(Vector3)]);
float* vertexData = (float*)vertexBuffer->Lock(0, vertexBuffer->GetVertexCount());
float* positionData = (float*)cpuVertexData.Get();
float* occlusionData = (float*)occlusionCpuVertexData.Get();
BoundingBox box;
unsigned occlusionLevel = occlusionLodLevel_;
if (occlusionLevel > numLodLevels_ - 1)
occlusionLevel = numLodLevels_ - 1;
if (vertexData)
{
const IntVector2& coords = patch->GetCoordinates();
int lodExpand = (1 << (occlusionLevel)) - 1;
int halfLodExpand = (1 << (occlusionLevel)) / 2;
for (int z = 0; z <= patchSize_; ++z)
{
for (int x = 0; x <= patchSize_; ++x)
{
int xPos = coords.x_ * patchSize_ + x;
int zPos = coords.y_ * patchSize_ + z;
// Position
Vector3 position((float)x * spacing_.x_, GetRawHeight(xPos, zPos), (float)z * spacing_.z_);
*vertexData++ = position.x_;
*vertexData++ = position.y_;
*vertexData++ = position.z_;
*positionData++ = position.x_;
*positionData++ = position.y_;
*positionData++ = position.z_;
box.Merge(position);
// For vertices that are part of the occlusion LOD, calculate the minimum height in the neighborhood
// to prevent false positive occlusion due to inaccuracy between occlusion LOD & visible LOD
float minHeight = position.y_;
if (halfLodExpand > 0 && (x & lodExpand) == 0 && (z & lodExpand) == 0)
{
int minX = Max(xPos - halfLodExpand, 0);
int maxX = Min(xPos + halfLodExpand, numVertices_.x_ - 1);
int minZ = Max(zPos - halfLodExpand, 0);
int maxZ = Min(zPos + halfLodExpand, numVertices_.y_ - 1);
for (int nZ = minZ; nZ <= maxZ; ++nZ)
{
for (int nX = minX; nX <= maxX; ++nX)
minHeight = Min(minHeight, GetRawHeight(nX, nZ));
}
}
*occlusionData++ = position.x_;
*occlusionData++ = minHeight;
*occlusionData++ = position.z_;
// Normal
Vector3 normal = GetRawNormal(xPos, zPos);
*vertexData++ = normal.x_;
*vertexData++ = normal.y_;
*vertexData++ = normal.z_;
// Texture coordinate
Vector2 texCoord((float)xPos / (float)numVertices_.x_, 1.0f - (float)zPos / (float)numVertices_.y_);
*vertexData++ = texCoord.x_;
*vertexData++ = texCoord.y_;
// Tangent
Vector3 xyz = (Vector3::RIGHT - normal * normal.DotProduct(Vector3::RIGHT)).Normalized();
*vertexData++ = xyz.x_;
*vertexData++ = xyz.y_;
*vertexData++ = xyz.z_;
*vertexData++ = 1.0f;
}
}
vertexBuffer->Unlock();
vertexBuffer->ClearDataLost();
}
patch->SetBoundingBox(box);
if (drawRanges_.Size())
{
unsigned occlusionDrawRange = occlusionLevel << 4;
geometry->SetIndexBuffer(indexBuffer_);
geometry->SetDrawRange(TRIANGLE_LIST, drawRanges_[0].first_, drawRanges_[0].second_, false);
geometry->SetRawVertexData(cpuVertexData, MASK_POSITION);
maxLodGeometry->SetIndexBuffer(indexBuffer_);
maxLodGeometry->SetDrawRange(TRIANGLE_LIST, drawRanges_[0].first_, drawRanges_[0].second_, false);
maxLodGeometry->SetRawVertexData(cpuVertexData, MASK_POSITION);
occlusionGeometry->SetIndexBuffer(indexBuffer_);
occlusionGeometry->SetDrawRange(TRIANGLE_LIST, drawRanges_[occlusionDrawRange].first_, drawRanges_[occlusionDrawRange].second_, false);
occlusionGeometry->SetRawVertexData(occlusionCpuVertexData, MASK_POSITION);
}
patch->ResetLod();
}
示例2: CreatePatchGeometry
void Terrain::CreatePatchGeometry(TerrainPatch* patch)
{
PROFILE(CreatePatchGeometry);
unsigned row = patchSize_ + 1;
VertexBuffer* vertexBuffer = patch->GetVertexBuffer();
Geometry* geometry = patch->GetGeometry();
Geometry* maxLodGeometry = patch->GetMaxLodGeometry();
Geometry* minLodGeometry = patch->GetMinLodGeometry();
if (vertexBuffer->GetVertexCount() != row * row)
vertexBuffer->SetSize(row * row, MASK_POSITION | MASK_NORMAL | MASK_TEXCOORD1 | MASK_TANGENT);
SharedArrayPtr<unsigned char> cpuVertexData(new unsigned char[row * row * sizeof(Vector3)]);
float* vertexData = (float*)vertexBuffer->Lock(0, vertexBuffer->GetVertexCount());
float* positionData = (float*)cpuVertexData.Get();
BoundingBox box;
if (vertexData)
{
const IntVector2& coords = patch->GetCoordinates();
for (int z1 = 0; z1 <= patchSize_; ++z1)
{
for (int x1 = 0; x1 <= patchSize_; ++x1)
{
int xPos = coords.x_ * patchSize_ + x1;
int zPos = coords.y_ * patchSize_ + z1;
// Position
Vector3 position((float)x1 * spacing_.x_, GetRawHeight(xPos, zPos), (float)z1 * spacing_.z_);
*vertexData++ = position.x_;
*vertexData++ = position.y_;
*vertexData++ = position.z_;
*positionData++ = position.x_;
*positionData++ = position.y_;
*positionData++ = position.z_;
box.Merge(position);
// Normal
Vector3 normal = GetRawNormal(xPos, zPos);
*vertexData++ = normal.x_;
*vertexData++ = normal.y_;
*vertexData++ = normal.z_;
// Texture coordinate
Vector2 texCoord((float)xPos / (float)numVertices_.x_, 1.0f - (float)zPos / (float)numVertices_.y_);
*vertexData++ = texCoord.x_;
*vertexData++ = texCoord.y_;
// Tangent
Vector3 xyz = (Vector3::RIGHT - normal * normal.DotProduct(Vector3::RIGHT)).Normalized();
*vertexData++ = xyz.x_;
*vertexData++ = xyz.y_;
*vertexData++ = xyz.z_;
*vertexData++ = 1.0f;
}
}
vertexBuffer->Unlock();
vertexBuffer->ClearDataLost();
}
patch->SetBoundingBox(box);
if (drawRanges_.Size())
{
unsigned lastDrawRange = drawRanges_.Size() - 1;
geometry->SetIndexBuffer(indexBuffer_);
geometry->SetDrawRange(TRIANGLE_LIST, drawRanges_[0].first_, drawRanges_[0].second_, false);
geometry->SetRawVertexData(cpuVertexData, sizeof(Vector3), MASK_POSITION);
maxLodGeometry->SetIndexBuffer(indexBuffer_);
maxLodGeometry->SetDrawRange(TRIANGLE_LIST, drawRanges_[0].first_, drawRanges_[0].second_, false);
maxLodGeometry->SetRawVertexData(cpuVertexData, sizeof(Vector3), MASK_POSITION);
minLodGeometry->SetIndexBuffer(indexBuffer_);
minLodGeometry->SetDrawRange(TRIANGLE_LIST, drawRanges_[lastDrawRange].first_, drawRanges_[lastDrawRange].second_, false);
minLodGeometry->SetRawVertexData(cpuVertexData, sizeof(Vector3), MASK_POSITION);
}
// Offset the occlusion geometry by vertex spacing to reduce possibility of over-aggressive occlusion
patch->SetOcclusionOffset(-0.5f * (spacing_.x_ + spacing_.z_));
patch->ResetLod();
}