顶点数据的生成
1 bool YfBuildGearwheelVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, 6 Yuint slices, 7 YeOriginPose originPose, 8 Yuint vertexStriding, 9 Yuint vertexPos, 10 void* pVerticesBuffer 11 ) 12 { 13 if (slices < 2 || !pVerticesBuffer) 14 { 15 return false; 16 } 17 18 Yuint numVertices = slices*4 + 2; 19 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 // 柱顶顶点赋值 36 { 37 nOffset = 0; 38 curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 39 curVertexPtr->x = 0.0f; 40 curVertexPtr->y = height + originOffsetY; 41 curVertexPtr->z = 0.0f; 42 } 43 44 // 柱底顶点赋值 45 { 46 nOffset = (numVertices - 1) * vertexStriding; 47 curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 48 curVertexPtr->x = 0.0f; 49 curVertexPtr->y = originOffsetY; 50 curVertexPtr->z = 0.0f; 51 } 52 53 Yreal angleXZ; 54 Yreal posX, posZ; 55 Yreal fRadius; 56 for (Yuint i = 0; i < 2*slices; i++) 57 { 58 angleXZ = YD_REAL_TWAIN_PI * i / (slices*2); 59 posX = yf_sin(angleXZ); 60 posZ = yf_cos(angleXZ); 61 fRadius = (i%2 == 0) ? radius : assistRadius; 62 63 // 上顶点 64 { 65 nOffset = (1 + i) * vertexStriding; 66 curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 67 curVertexPtr->x = fRadius * posX; 68 curVertexPtr->y = height + originOffsetY; 69 curVertexPtr->z = fRadius * posZ; 70 } 71 72 // 下顶点 73 { 74 nOffset = (1 + 2*slices + i) * vertexStriding; 75 curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 76 curVertexPtr->x = fRadius * posX; 77 curVertexPtr->y = originOffsetY; 78 curVertexPtr->z = fRadius * posZ; 79 } 80 } 81 82 return true; 83 }
三角形索引数据的生成
1 bool YfBuildGearwheelTriIndices 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*4 + 2; 16 if (indexType == YE_INDEX_16_BIT && 17 numVertices > YD_MAX_UNSIGNED_INT16) 18 { 19 return false; 20 } 21 Yuint numTriangles = slices * 8; 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 < 2 * slices; i++) 30 { 31 nOffset = (i * 4) * indexStriding; 32 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 33 triIndexPtr->index0 = 0; 34 triIndexPtr->index1 = 1 + i; 35 triIndexPtr->index2 = 1 + (i + 1) % (2*slices); 36 37 nOffset += indexStriding; 38 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 39 triIndexPtr->index0 = numVertices - 1; 40 triIndexPtr->index1 = 1 + slices*2 + (i + 1) % (2*slices); 41 triIndexPtr->index2 = 1 + slices*2 + i; 42 43 nOffset += indexStriding; 44 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 45 triIndexPtr->index0 = 1 + i; 46 triIndexPtr->index1 = 1 + slices*2 + i; 47 triIndexPtr->index2 = 1 + (i + 1) % (2*slices); 48 49 nOffset += indexStriding; 50 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 51 triIndexPtr->index0 = 1 + (i + 1) % (2*slices); 52 triIndexPtr->index1 = 1 + slices*2 + i; 53 triIndexPtr->index2 = 1 + slices*2 + (i + 1) % (2*slices); 54 } 55 } 56 else 57 { 58 YsTriIndex32* triIndexPtr = NULL; 59 for (Yuint i = 0; i < 2 * slices; i++) 60 { 61 nOffset = (i * 4) * indexStriding; 62 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 63 triIndexPtr->index0 = 0; 64 triIndexPtr->index1 = 1 + i; 65 triIndexPtr->index2 = 1 + (i + 1) % (2*slices); 66 67 nOffset += indexStriding; 68 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 69 triIndexPtr->index0 = numVertices - 1; 70 triIndexPtr->index1 = 1 + slices*2 + (i + 1) % (2*slices); 71 triIndexPtr->index2 = 1 + slices*2 + i; 72 73 nOffset += indexStriding; 74 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 75 triIndexPtr->index0 = 1 + i; 76 triIndexPtr->index1 = 1 + slices*2 + i; 77 triIndexPtr->index2 = 1 + (i + 1) % (2*slices); 78 79 nOffset += indexStriding; 80 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 81 triIndexPtr->index0 = 1 + (i + 1) % (2*slices); 82 triIndexPtr->index1 = 1 + slices*2 + i; 83 triIndexPtr->index2 = 1 + slices*2 + (i + 1) % (2*slices); 84 } 85 } 86 87 return true; 88 }
线框索引数据的生成
1 bool YfBuildGearwheelWireIndices 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) * 2 + 2; 16 Yuint numLines = (slices*2) * 5; 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 < 2 * slices; i++) 30 { 31 nOffset = (i * 3) * indexStriding; 32 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 33 lineIndexPtr->index0 = 1 + i; 34 lineIndexPtr->index1 = 1 + (i + 1)%(slices*2); 35 36 nOffset += indexStriding; 37 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 38 lineIndexPtr->index0 = 1 + slices*2 + i; 39 lineIndexPtr->index1 = 1 + slices*2 + (i + 1)%(slices*2); 40 41 nOffset += indexStriding; 42 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 43 lineIndexPtr->index0 = 1 + i; 44 lineIndexPtr->index1 = 1 + slices*2 + i; 45 } 46 47 Yuint half = 6 * slices * indexStriding; 48 for (Yuint i = 0; i < slices; i++) 49 { 50 nOffset = half + (i * 2) * indexStriding; 51 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 52 lineIndexPtr->index0 = 0; 53 lineIndexPtr->index1 = 1 + i*2 + 1; 54 55 nOffset += indexStriding; 56 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 57 lineIndexPtr->index0 = numVertices - 1; 58 lineIndexPtr->index1 = 1 + slices*2 + i*2 + 1; 59 } 60 } 61 else 62 { 63 YsLineIndex32* lineIndexPtr = NULL; 64 for (Yuint i = 0; i < 2 * slices; i++) 65 { 66 nOffset = (i * 3) * indexStriding; 67 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 68 lineIndexPtr->index0 = 1 + i; 69 lineIndexPtr->index1 = 1 + (i + 1)%(slices*2); 70 71 nOffset += indexStriding; 72 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 73 lineIndexPtr->index0 = 1 + slices*2 + i; 74 lineIndexPtr->index1 = 1 + slices*2 + (i + 1)%(slices*2); 75 76 nOffset += indexStriding; 77 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 78 lineIndexPtr->index0 = 1 + i; 79 lineIndexPtr->index1 = 1 + slices*2 + i; 80 } 81 82 Yuint half = 6 * slices * indexStriding; 83 for (Yuint i = 0; i < slices; i++) 84 { 85 nOffset = half + (i * 2) * indexStriding; 86 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 87 lineIndexPtr->index0 = 0; 88 lineIndexPtr->index1 = 1 + i*2 + 1; 89 90 nOffset += indexStriding; 91 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 92 lineIndexPtr->index0 = numVertices - 1; 93 lineIndexPtr->index1 = 1 + slices*2 + i*2 + 1; 94 } 95 } 96 97 return true; 98 }