| 911 | } |
| 912 | |
| 913 | void MakeConeGeometry(uint64 divisions, StructuredBuffer& vtxBuffer, FormattedBuffer& idxBuffer, Array<Float3>& positions) |
| 914 | { |
| 915 | Assert_(divisions >= 3); |
| 916 | |
| 917 | const uint64 numVertices = 2 + divisions; |
| 918 | const uint64 numIndices = 3 * divisions * 2; |
| 919 | Assert_(numVertices <= UINT16_MAX); |
| 920 | |
| 921 | positions.Init(numVertices); |
| 922 | Array<uint16> indices(numIndices, 0); |
| 923 | |
| 924 | // The tip |
| 925 | uint16 tipIdx = 0; |
| 926 | positions[0] = Float3(0.0f, 0.0f, 0.0f); |
| 927 | |
| 928 | // The center of the base |
| 929 | uint16 centerIdx = 1; |
| 930 | positions[1] = Float3(0.0f, 0.0f, 1.0f); |
| 931 | |
| 932 | // The ring at the base |
| 933 | uint16 ringStartIdx = 2; |
| 934 | for(uint64 i = 0; i < divisions; ++i) |
| 935 | { |
| 936 | const float theta = (float(i) / divisions) * Pi2; |
| 937 | positions[i + ringStartIdx] = Float3(std::cos(theta), std::sin(theta), 1.0f); |
| 938 | } |
| 939 | |
| 940 | // Tip->ring triangles |
| 941 | uint64 currIdx = 0; |
| 942 | for(uint64 i = 0; i < divisions; ++i) |
| 943 | { |
| 944 | indices[currIdx++] = tipIdx; |
| 945 | indices[currIdx++] = uint16(ringStartIdx + i); |
| 946 | |
| 947 | uint64 prevRingIdx = i == 0 ? divisions - 1 : i - 1; |
| 948 | indices[currIdx++] = uint16(ringStartIdx + prevRingIdx); |
| 949 | } |
| 950 | |
| 951 | // Ring->center triangles |
| 952 | for(uint64 i = 0; i < divisions; ++i) |
| 953 | { |
| 954 | indices[currIdx++] = uint16(ringStartIdx + i); |
| 955 | indices[currIdx++] = centerIdx; |
| 956 | |
| 957 | uint64 prevRingIdx = i == 0 ? divisions - 1 : i - 1; |
| 958 | indices[currIdx++] = uint16(ringStartIdx + prevRingIdx); |
| 959 | } |
| 960 | |
| 961 | StructuredBufferInit vbInit; |
| 962 | vbInit.Stride = sizeof(Float3); |
| 963 | vbInit.NumElements = numVertices; |
| 964 | vbInit.InitData = positions.Data(); |
| 965 | vtxBuffer.Initialize(vbInit); |
| 966 | |
| 967 | FormattedBufferInit ibInit; |
| 968 | ibInit.Format = DXGI_FORMAT_R16_UINT; |
| 969 | ibInit.NumElements = numIndices; |
| 970 | ibInit.InitData = indices.Data(); |
no test coverage detected