您的位置:首页 > 其它

[12] 扇形体(Fan)图形的生成算法

2013-11-09 08:45 323 查看




顶点数据的生成

bool                        YfBuildFunVertices
(
Yreal                   radius,
Yreal                   degree,
Yreal                   height,
Yuint                   slices,
YeOriginPose            originPose,
Yuint                   vertexStriding,
Yuint                   vertexPos,
void*                   pVerticesBuffer
)
{
if (degree < 0 || degree > 360 || !pVerticesBuffer)
{
return false;
}
if (slices < 2 || !pVerticesBuffer)
{
return false;
}

Yuint numVertices  = (slices + 1) * 2;

char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
YsVector3* curVertexPtr   = NULL;
Yuint nOffset = 0;

Yreal originOffsetY = 0.0f;
if (originPose == YE_ORIGIN_POSE_TOP)
{
originOffsetY = -height;
}
else if (originPose == YE_ORIGIN_POSE_CENTER)
{
originOffsetY = -height * 0.5f;
}

// 柱顶顶点赋值
{
nOffset = 0;
curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
curVertexPtr->x = 0.0f;
curVertexPtr->y = height + originOffsetY;
curVertexPtr->z = 0.0f;
}

// 柱底顶点赋值
{
nOffset = (numVertices - 1) * vertexStriding;
curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
curVertexPtr->x = 0.0f;
curVertexPtr->y = originOffsetY;
curVertexPtr->z = 0.0f;
}

Yreal radian = YD_DEGREE_TO_RADIAN(degree);
Yreal angleXZ;
Yreal posX, posZ;
for (Yuint i = 0; i < slices; i++)
{
angleXZ = radian * i / (slices - 1);
posX = yf_sin(angleXZ);
posZ = yf_cos(angleXZ);

// 上顶点
{
nOffset = (1 + i) * vertexStriding;
curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
curVertexPtr->x = radius * posX;
curVertexPtr->y = height + originOffsetY;
curVertexPtr->z = radius * posZ;
}

// 下顶点
{
nOffset = (1 + slices + i) * vertexStriding;
curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
curVertexPtr->x = radius * posX;
curVertexPtr->y = originOffsetY;
curVertexPtr->z = radius * posZ;
}
}

return true;
}


三角形索引数据的生成

bool                        YfBuildFunTriIndices
(
Yuint                   slices,
YeIndexType             indexType,
Yuint                   indexStriding,
Yuint                   indexPos,
void*                   pTriIndicesBuffer
)
{
if (slices < 2 || !pTriIndicesBuffer)
{
return false;
}

Yuint numVertices  = (slices + 1) * 2;
Yuint numTriangles = slices * 4;
if (indexType == YE_INDEX_16_BIT &&
numVertices > YD_MAX_UNSIGNED_INT16)
{
return false;
}

// 索引赋值
char* indexPtr = (char*)pTriIndicesBuffer + indexPos;
Yuint nOffset = 0;
if (indexType == YE_INDEX_16_BIT)
{
YsTriIndex16* triIndexPtr = NULL;
for (Yuint i = 0; i < slices - 1; i++)
{
nOffset = (i * 4) * indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 0;
triIndexPtr->index1 = 1 + i;
triIndexPtr->index2 = 1 + i + 1;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = numVertices - 1;
triIndexPtr->index1 = 1 + slices + i + 1;
triIndexPtr->index2 = 1 + slices + i;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 1 + i;
triIndexPtr->index1 = 1 + slices + i;
triIndexPtr->index2 = 1 + i + 1;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 1 + i + 1;
triIndexPtr->index1 = 1 + slices + i;
triIndexPtr->index2 = 1 + slices + i + 1;
}

nOffset = ((slices - 1) * 4) * indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 0;
triIndexPtr->index1 = numVertices - 1;
triIndexPtr->index2 = 1;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 1;
triIndexPtr->index1 = numVertices - 1;
triIndexPtr->index2 = 1 + slices;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = 0;
triIndexPtr->index1 = slices;
triIndexPtr->index2 = numVertices - 1;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
triIndexPtr->index0 = slices;
triIndexPtr->index1 = numVertices - 2;
triIndexPtr->index2 = numVertices - 1;
}
else
{
YsTriIndex32* triIndexPtr = NULL;
for (Yuint i = 0; i < slices - 1; i++)
{
nOffset = (i * 4) * indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 0;
triIndexPtr->index1 = 1 + i;
triIndexPtr->index2 = 1 + i + 1;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = numVertices - 1;
triIndexPtr->index1 = 1 + slices + i + 1;
triIndexPtr->index2 = 1 + slices + i;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 1 + i;
triIndexPtr->index1 = 1 + slices + i;
triIndexPtr->index2 = 1 + i + 1;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 1 + i + 1;
triIndexPtr->index1 = 1 + slices + i;
triIndexPtr->index2 = 1 + slices + i + 1;
}

nOffset = ((slices - 1) * 4) * indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 0;
triIndexPtr->index1 = numVertices - 1;
triIndexPtr->index2 = 1;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 1;
triIndexPtr->index1 = numVertices - 1;
triIndexPtr->index2 = 1 + slices;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = 0;
triIndexPtr->index1 = slices;
triIndexPtr->index2 = numVertices - 1;

nOffset += indexStriding;
triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
triIndexPtr->index0 = slices;
triIndexPtr->index1 = numVertices - 2;
triIndexPtr->index2 = numVertices - 1;
}

return true;
}


线框索引数据的生成

bool                        YfBuildFunWireIndices
(
Yuint                   slices,
YeIndexType             indexType,
Yuint                   indexStriding,
Yuint                   indexPos,
void*                   pWireIndicesBuffer
)
{
if (slices < 2 || !pWireIndicesBuffer)
{
return false;
}

Yuint numVertices = (slices + 1) * 2;
Yuint numLines    = slices + (slices-1) * 2 + 5;
if (indexType == YE_INDEX_16_BIT &&
numVertices > YD_MAX_UNSIGNED_INT16)
{
return false;
}

// 索引赋值
char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
Yuint nOffset = 0;
if (indexType == YE_INDEX_16_BIT)
{
YsLineIndex16* lineIndexPtr = NULL;
for (Yuint i = 0; i < slices - 1; i++)
{
nOffset = (i * 3) * indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + slices + i;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + i + 1;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + slices + i;
lineIndexPtr->index1 = 1 + slices + i + 1;
}

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = slices;
lineIndexPtr->index1 = 2*slices;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = 2*slices + 1;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = 1;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = slices;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 2*slices + 1;
lineIndexPtr->index1 = slices + 1;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
lineIndexPtr->index0 = 2*slices + 1;
lineIndexPtr->index1 = 2*slices;
}
else
{
YsLineIndex32* lineIndexPtr = NULL;
for (Yuint i= 0; i < slices; i++)
{
YsLineIndex32* lineIndexPtr = NULL;
for (Yuint i = 0; i < slices - 1; i++)
{
nOffset = (i * 3) * indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + slices + i;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + i;
lineIndexPtr->index1 = 1 + i + 1;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 1 + slices + i;
lineIndexPtr->index1 = 1 + slices + i + 1;
}

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = slices;
lineIndexPtr->index1 = 2*slices;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = 2*slices + 1;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = 1;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 0;
lineIndexPtr->index1 = slices;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 2*slices + 1;
lineIndexPtr->index1 = slices + 1;

nOffset += indexStriding;
lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
lineIndexPtr->index0 = 2*slices + 1;
lineIndexPtr->index1 = 2*slices;
}
}

return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: