顶点数据的生成
1 bool YfBuildSpiralStairsVertices
2 (
3 Yreal radius,
4 Yreal assistRadius,
5 Yreal height,
6 Yuint slices,
7 Yuint stacks,
8 YeOriginPose originPose,
9 Yuint vertexStriding,
10 Yuint vertexPos,
11 void* pVerticesBuffer
12 )
13 {
14 if (stacks < 1 || slices < 3 || !pVerticesBuffer)
15 {
16 return false;
17 }
18 Yuint numVertices = 2 + stacks * 4;
19 //Yuint numTriangles = stacks * 8;
20
21 char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
22 YsVector3* curVertexPtr = NULL;
23 Yuint nOffset = 0;
24
25 Yreal originOffsetY = 0.0f;
26 if (originPose == YE_ORIGIN_POSE_TOP)
27 {
28 originOffsetY = -height;
29 }
30 else if (originPose == YE_ORIGIN_POSE_CENTER)
31 {
32 originOffsetY = -height * 0.5f;
33 }
34
35 Yreal fStepTexcoord = 1.0f / (stacks - 1);
36 Yreal fStepHeight = height / stacks;
37 Yreal fStepAngle = YD_REAL_TWAIN_PI / slices;
38
39 Yreal angleXZ;
40 Yreal posX, posZ;
41 for (Yuint i = 0; i <= stacks; i++)
42 {
43 angleXZ = i * fStepAngle;
44 posX = yf_sin(angleXZ);
45 posZ = yf_cos(angleXZ);
46
47 nOffset = i * 4 * vertexStriding;
48 curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
49 curVertexPtr->x = radius * posX;
50 curVertexPtr->y = i * fStepHeight + originOffsetY;
51 curVertexPtr->z = radius * posZ;
52
53 nOffset += vertexStriding;
54 curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
55 curVertexPtr->x = assistRadius * posX;
56 curVertexPtr->y = i * fStepHeight + originOffsetY;
57 curVertexPtr->z = assistRadius * posZ;
58
59 if (i == stacks)
60 {
61 continue;
62 }
63
64 nOffset += vertexStriding;
65 curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
66 curVertexPtr->x = radius * posX;
67 curVertexPtr->y = (i+1) * fStepHeight + originOffsetY;
68 curVertexPtr->z = radius * posZ;
69
70 nOffset += vertexStriding;
71 curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
72 curVertexPtr->x = assistRadius * posX;
73 curVertexPtr->y = (i+1) * fStepHeight + originOffsetY;
74 curVertexPtr->z = assistRadius * posZ;
75 }
76
77 return true;
78 }
三角形索引数据的生成和线框索引数据的生成与楼梯的生成方式一样
1 bool YfBuildSpiralStairsTriIndices
2 (
3 Yuint stacks,
4 YeIndexType indexType,
5 Yuint indexStriding,
6 Yuint indexPos,
7 void* pTriIndicesBuffer
8 )
9 {
10 return YfBuildStairsTriIndices(
11 stacks,
12 indexType,
13 indexStriding,
14 indexPos,
15 pTriIndicesBuffer
16 );
17 }
18
19 bool YfBuildSpiralStairsWireIndices
20 (
21 Yuint stacks,
22 YeIndexType indexType,
23 Yuint indexStriding,
24 Yuint indexPos,
25 void* pWireIndicesBuffer
26 )
27 {
28 return YfBuildStairsWireIndices(
29 stacks,
30 indexType,
31 indexStriding,
32 indexPos,
33 pWireIndicesBuffer
34 );
35 }