1 bool YfBuildConeVertices 2 ( 3 Yreal radius, 4 Yreal height, 5 Yuint slices, 6 YeOriginPose originPose, 7 Yuint vertexStriding, 8 Yuint vertexPos, 9 void* pVerticesBuffer10 )11 {12 if (slices < 2 || !pVerticesBuffer)13 {14 return false;15 }16 17 Yuint numVertices = slices + 2;18 19 // 顶点赋值20 char* vertexPtr = (char*)pVerticesBuffer + vertexPos;21 YsVector3* curVertexPtr = NULL;22 Yuint nOffset = 0;23 24 Yreal originOffsetY = 0.0f;25 if (originPose == YE_ORIGIN_POSE_TOP)26 {27 originOffsetY = -height;28 }29 else if (originPose == YE_ORIGIN_POSE_CENTER)30 {31 originOffsetY = -height * 0.5f;32 }33 34 // 锥尖顶点赋值35 {36 nOffset = 0; 37 curVertexPtr = (YsVector3*)(vertexPtr + nOffset);38 curVertexPtr->x = 0.0f;39 curVertexPtr->y = height + originOffsetY;40 curVertexPtr->z = 0.0f;41 }42 43 // 锥底顶点赋值44 {45 nOffset = (numVertices - 1) * vertexStriding; 46 curVertexPtr = (YsVector3*)(vertexPtr + nOffset);47 curVertexPtr->x = 0.0f;48 curVertexPtr->y = originOffsetY;49 curVertexPtr->z = 0.0f;50 }51 52 Yreal angleXZ;53 Yreal posX, posZ; 54 for (Yuint i = 0; i < slices; i++)55 {56 angleXZ = YD_REAL_TWAIN_PI * i / slices;57 posX = yf_sin(angleXZ);58 posZ = yf_cos(angleXZ);59 nOffset = (i + 1) * vertexStriding; 60 61 curVertexPtr = (YsVector3*)(vertexPtr + nOffset);62 curVertexPtr->x = radius * posX;63 curVertexPtr->y = originOffsetY;64 curVertexPtr->z = radius * posZ;65 }66 67 return true;68 }
三角形索引数据的生成
1 bool YfBuildConeTriIndices 2 ( 3 Yuint slices, 4 YeIndexType indexType, 5 Yuint indexStriding, 6 Yuint indexPos, 7 void* pTriIndicesBuffer 8 ) 9 {10 if (slices < 2 || !pTriIndicesBuffer)11 {12 return false;13 }14 15 Yuint numVertices = slices + 2;16 Yuint numTriangles = slices * 2;17 if (indexType == YE_INDEX_16_BIT && 18 numVertices > YD_MAX_UNSIGNED_INT16)19 {20 return false;21 }22 23 // 索引赋值24 char* indexPtr = (char*)pTriIndicesBuffer + indexPos;25 Yuint nOffset = 0;26 if (indexType == YE_INDEX_16_BIT)27 {28 YsTriIndex16* triIndexPtr = NULL;29 for (Yuint i= 0; i < slices; i++)30 {31 nOffset = (i * 2) * indexStriding;32 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);33 triIndexPtr->index0 = 0;34 triIndexPtr->index1 = 1 + i;35 triIndexPtr->index2 = 1 + (i + 1)%slices;36 37 nOffset += indexStriding;38 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);39 triIndexPtr->index0 = numVertices - 1;40 triIndexPtr->index1 = 1 + (i + 1)%slices;41 triIndexPtr->index2 = 1 + i;42 }43 }44 else45 {46 YsTriIndex32* triIndexPtr = NULL;47 for (Yuint i= 0; i < slices; i++)48 {49 nOffset = (i * 2) * indexStriding;50 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);51 triIndexPtr->index0 = 0;52 triIndexPtr->index1 = 1 + i;53 triIndexPtr->index2 = 1 + (i + 1)%slices;54 55 nOffset += indexStriding;56 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);57 triIndexPtr->index0 = numVertices - 1;58 triIndexPtr->index1 = 1 + (i + 1)%slices;59 triIndexPtr->index2 = 1 + i;60 }61 }62 63 return true;64 }
线框索引数据的生成
1 bool YfBuildConeWireIndices 2 ( 3 Yuint slices, 4 YeIndexType indexType, 5 Yuint indexStriding, 6 Yuint indexPos, 7 void* pWireIndicesBuffer 8 ) 9 {10 if (slices < 2 || !pWireIndicesBuffer)11 {12 return false;13 }14 15 Yuint numVertices = slices + 2;16 Yuint numLines = slices * 2;17 if (indexType == YE_INDEX_16_BIT && 18 numVertices > YD_MAX_UNSIGNED_INT16)19 {20 return false;21 }22 23 // 索引赋值24 char* indexPtr = (char*)pWireIndicesBuffer + indexPos;25 Yuint nOffset = 0;26 if (indexType == YE_INDEX_16_BIT)27 {28 YsLineIndex16* lineIndexPtr = NULL;29 for (Yuint i= 0; i < slices; i++)30 {31 nOffset = (i * 2) * indexStriding;32 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);33 lineIndexPtr->index0 = 0;34 lineIndexPtr->index1 = 1 + i;35 36 nOffset += indexStriding;37 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);38 lineIndexPtr->index0 = 1 + i;39 lineIndexPtr->index1 = 1 + (i + 1)%slices;40 }41 }42 else43 {44 YsLineIndex32* lineIndexPtr = NULL;45 for (Yuint i= 0; i < slices; i++)46 {47 nOffset = (i * 2) * indexStriding;48 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);49 lineIndexPtr->index0 = 0;50 lineIndexPtr->index1 = 1 + i;51 52 nOffset += indexStriding;53 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);54 lineIndexPtr->index0 = 1 + i;55 lineIndexPtr->index1 = 1 + (i + 1)%slices;56 }57 }58 59 return true;60 }