[11] 楔形体(Wedge)图形的生成算法


顶点数据的生成

 1 bool                        YfBuildWedgeVertices
 2 (
 3     Yreal                   width, 
 4     Yreal                   length, 
 5     Yreal                   height, 
 6     YeOriginPose            originPose,  
 7     Yuint                   vertexStriding, 
 8     Yuint                   vertexPos,
 9     void*                   pVerticesBuffer
10 )
11 {
12     if (!pVerticesBuffer)
13     {
14         return false;
15     }
16 
17     Yuint numVertices  = 6;
18 
19     // 顶点赋值
20     char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
21     YsVector3* curVertexPtr   = NULL;
22     Yuint nOffset = 0;
23 
24     YsVector3 vOriginOffset(-width / 2, -height / 2, -length / 2);
25     if (originPose == YE_ORIGIN_POSE_TOP)
26     {
27         vOriginOffset.y = -height;
28     }
29     else if (originPose == YE_ORIGIN_POSE_BOTTOM)
30     {
31         vOriginOffset.y = 0.0f;
32     }
33 
34     // 底四个顶点
35     for (Yuint j = 0; j < 2; j++)
36     {
37         for (Yuint i = 0; i < 2; i++)
38         {
39             nOffset = (j*2 + i) * vertexStriding;
40             curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
41             curVertexPtr->x = width*i + vOriginOffset.x;
42             curVertexPtr->y = vOriginOffset.y;
43             curVertexPtr->z = length*j + vOriginOffset.z;
44         }
45     }
46 
47     // 上顶点
48     nOffset = 4 * vertexStriding;
49     if (vertexPtr)
50     {
51         curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
52         curVertexPtr->x = vOriginOffset.x + width / 2;
53         curVertexPtr->y = height + vOriginOffset.y;
54         curVertexPtr->z = vOriginOffset.z;
55 
56         curVertexPtr = (YsVector3*)(vertexPtr + nOffset + vertexStriding);
57         curVertexPtr->x = vOriginOffset.x + width / 2;
58         curVertexPtr->y = height + vOriginOffset.y;
59         curVertexPtr->z = length + vOriginOffset.z;
60     }
61 
62     return true;
63 }     

三角形索引数据的生成

 1 bool                        YfBuildWedgeTriIndices
 2 (
 3     YeIndexType             indexType,
 4     Yuint                   indexStriding,  
 5     Yuint                   indexPos,
 6     void*                   pTriIndicesBuffer
 7 )
 8 {
 9     if (!pTriIndicesBuffer)
10     {
11         return false;
12     }
13 
14     char* indexPtr = (char*)pTriIndicesBuffer + indexPos;
15     if (indexType == YE_INDEX_16_BIT)
16     {
17         YsTriIndex16* triIndexPtr = NULL;
18 
19         // bottom
20         triIndexPtr = (YsTriIndex16*)(indexPtr + 0*indexStriding);
21         triIndexPtr->index0 = 0; triIndexPtr->index1 = 1; triIndexPtr->index2 = 3;
22         triIndexPtr = (YsTriIndex16*)(indexPtr + 1*indexStriding);
23         triIndexPtr->index0 = 0; triIndexPtr->index1 = 3; triIndexPtr->index2 = 2;
24 
25         // 4 face
26         triIndexPtr = (YsTriIndex16*)(indexPtr + 2*indexStriding);
27         triIndexPtr->index0 = 0; triIndexPtr->index1 = 2; triIndexPtr->index2 = 5;
28         triIndexPtr = (YsTriIndex16*)(indexPtr + 3*indexStriding);
29         triIndexPtr->index0 = 0; triIndexPtr->index1 = 5; triIndexPtr->index2 = 4;
30         triIndexPtr = (YsTriIndex16*)(indexPtr + 4*indexStriding);
31         triIndexPtr->index0 = 4; triIndexPtr->index1 = 5; triIndexPtr->index2 = 3;
32         triIndexPtr = (YsTriIndex16*)(indexPtr + 5*indexStriding);                                                
33         triIndexPtr->index0 = 4; triIndexPtr->index1 = 3; triIndexPtr->index2 = 1;
34 
35         // 2 face
36         triIndexPtr = (YsTriIndex16*)(indexPtr + 6*indexStriding);
37         triIndexPtr->index0 = 0; triIndexPtr->index1 = 4; triIndexPtr->index2 = 1;
38         triIndexPtr = (YsTriIndex16*)(indexPtr + 7*indexStriding);
39         triIndexPtr->index0 = 2; triIndexPtr->index1 = 3; triIndexPtr->index2 = 5;
40     }
41     else
42     {
43         YsTriIndex32* triIndexPtr = NULL;
44 
45         // bottom
46         triIndexPtr = (YsTriIndex32*)(indexPtr + 0*indexStriding);
47         triIndexPtr->index0 = 0; triIndexPtr->index1 = 1; triIndexPtr->index2 = 3;
48         triIndexPtr = (YsTriIndex32*)(indexPtr + 1*indexStriding);
49         triIndexPtr->index0 = 0; triIndexPtr->index1 = 3; triIndexPtr->index2 = 2;
50 
51         // 4 face
52         triIndexPtr = (YsTriIndex32*)(indexPtr + 2*indexStriding);
53         triIndexPtr->index0 = 0; triIndexPtr->index1 = 2; triIndexPtr->index2 = 5;
54         triIndexPtr = (YsTriIndex32*)(indexPtr + 3*indexStriding);
55         triIndexPtr->index0 = 0; triIndexPtr->index1 = 5; triIndexPtr->index2 = 4;
56         triIndexPtr = (YsTriIndex32*)(indexPtr + 4*indexStriding);
57         triIndexPtr->index0 = 4; triIndexPtr->index1 = 5; triIndexPtr->index2 = 3;
58         triIndexPtr = (YsTriIndex32*)(indexPtr + 5*indexStriding);                                                
59         triIndexPtr->index0 = 4; triIndexPtr->index1 = 3; triIndexPtr->index2 = 1;
60 
61         // 2 face
62         triIndexPtr = (YsTriIndex32*)(indexPtr + 6*indexStriding);
63         triIndexPtr->index0 = 0; triIndexPtr->index1 = 4; triIndexPtr->index2 = 1;
64         triIndexPtr = (YsTriIndex32*)(indexPtr + 7*indexStriding);
65         triIndexPtr->index0 = 2; triIndexPtr->index1 = 3; triIndexPtr->index2 = 5;
66     }
67 
68     return true;
69 }   

线框索引数据的生成

  1 bool                        YfBuildWedgeWireIndices
  2 (
  3     YeIndexType             indexType,
  4     Yuint                   indexStriding,  
  5     Yuint                   indexPos,
  6     void*                   pWireIndicesBuffer
  7 )
  8 {
  9     if (!pWireIndicesBuffer)
 10     {
 11         return false;
 12     }
 13 
 14     Yuint numVertices = 6;
 15     Yuint numLines    = 9;
 16 
 17     // 索引赋值
 18     char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
 19     Yuint nOffset = 0;
 20     if (indexType == YE_INDEX_16_BIT)
 21     {
 22         YsLineIndex16* lineIndexPtr = NULL;
 23 
 24         nOffset = 0 * indexStriding;
 25         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 26         lineIndexPtr->index0 = 0;
 27         lineIndexPtr->index1 = 1;
 28 
 29         nOffset = 1 * indexStriding;
 30         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 31         lineIndexPtr->index0 = 0;
 32         lineIndexPtr->index1 = 4;
 33 
 34         nOffset = 2 * indexStriding;
 35         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 36         lineIndexPtr->index0 = 4;
 37         lineIndexPtr->index1 = 1;
 38 
 39         nOffset = 3 * indexStriding;
 40         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 41         lineIndexPtr->index0 = 2;
 42         lineIndexPtr->index1 = 3;
 43 
 44         nOffset = 4 * indexStriding;
 45         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 46         lineIndexPtr->index0 = 2;
 47         lineIndexPtr->index1 = 5;
 48 
 49         nOffset = 5 * indexStriding;
 50         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 51         lineIndexPtr->index0 = 5;
 52         lineIndexPtr->index1 = 3;
 53 
 54         nOffset = 6 * indexStriding;
 55         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 56         lineIndexPtr->index0 = 0;
 57         lineIndexPtr->index1 = 2;
 58 
 59         nOffset = 7 * indexStriding;
 60         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 61         lineIndexPtr->index0 = 4;
 62         lineIndexPtr->index1 = 5;
 63 
 64         nOffset = 8 * indexStriding;
 65         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 66         lineIndexPtr->index0 = 1;
 67         lineIndexPtr->index1 = 3;
 68     }
 69     else
 70     {
 71         YsLineIndex32* lineIndexPtr = NULL;
 72 
 73         nOffset = 0 * indexStriding;
 74         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 75         lineIndexPtr->index0 = 0;
 76         lineIndexPtr->index1 = 1;
 77 
 78         nOffset = 1 * indexStriding;
 79         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 80         lineIndexPtr->index0 = 0;
 81         lineIndexPtr->index1 = 4;
 82 
 83         nOffset = 2 * indexStriding;
 84         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 85         lineIndexPtr->index0 = 4;
 86         lineIndexPtr->index1 = 1;
 87 
 88         nOffset = 3 * indexStriding;
 89         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 90         lineIndexPtr->index0 = 2;
 91         lineIndexPtr->index1 = 3;
 92 
 93         nOffset = 4 * indexStriding;
 94         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 95         lineIndexPtr->index0 = 2;
 96         lineIndexPtr->index1 = 5;
 97 
 98         nOffset = 5 * indexStriding;
 99         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
100         lineIndexPtr->index0 = 5;
101         lineIndexPtr->index1 = 3;
102 
103         nOffset = 6 * indexStriding;
104         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
105         lineIndexPtr->index0 = 0;
106         lineIndexPtr->index1 = 2;
107 
108         nOffset = 7 * indexStriding;
109         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
110         lineIndexPtr->index0 = 4;
111         lineIndexPtr->index1 = 5;
112 
113         nOffset = 8 * indexStriding;
114         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
115         lineIndexPtr->index0 = 1;
116         lineIndexPtr->index1 = 3;
117     }
118 
119     return true;
120 }


 

原文地址:https://www.cnblogs.com/WhyEngine/p/3415250.html