25 template<
typename... Args>
27 T(std::forward<Args>(args)...) {}
29 void draw(VkPrimitiveTopology topology, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
31 uint32_t lastIndex = instanceCount > 1 ? (firstInstance + instanceCount) : firstInstance + 1;
32 for (uint32_t inst = firstInstance; inst < lastIndex; ++inst)
34 if (!T::instance(inst))
continue;
38 case (VK_PRIMITIVE_TOPOLOGY_POINT_LIST): {
39 uint32_t endVertex = firstVertex + vertexCount;
40 for (uint32_t i = firstVertex; i < endVertex; ++i)
46 case (VK_PRIMITIVE_TOPOLOGY_LINE_LIST): {
48 uint32_t primitiveCount = vertexCount / 2;
49 uint32_t endVertex = firstVertex + primitiveCount * 2;
50 for (uint32_t i = firstVertex; i < endVertex; i += 2)
56 case (VK_PRIMITIVE_TOPOLOGY_LINE_STRIP): {
57 uint32_t endVertex = firstVertex + ((vertexCount >= 2) ? (vertexCount - 1) : 0);
58 for (uint32_t i = firstVertex; i < endVertex; ++i)
64 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST): {
65 uint32_t primtiveCount = vertexCount / 3;
66 uint32_t endVertex = firstVertex + primtiveCount * 3;
67 for (uint32_t i = firstVertex; i < endVertex; i += 3)
69 T::triangle(i, i + 1, i + 2);
73 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP): {
75 uint32_t endVertex = firstVertex + ((vertexCount >= 3) ? (vertexCount - 2) : 0);
76 for (uint32_t i = firstVertex; i < endVertex; ++i)
78 T::triangle(i, i + 1, i + 2);
82 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN): {
84 uint32_t endVertex = firstVertex + ((vertexCount >= 3) ? (vertexCount - 2) : 0);
85 for (uint32_t i = firstVertex + 1; i < endVertex; ++i)
87 T::triangle(firstVertex, i + 1, i + 2);
91 case (VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY):
92 case (VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY):
93 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY):
94 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY):
95 case (VK_PRIMITIVE_TOPOLOGY_PATCH_LIST):
97 warn(
"PrimitiveFunctor::draw(topology = ", topology,
", ...) not implemented.");
103 template<
class IndexArray>
104 void drawIndexed(VkPrimitiveTopology topology, IndexArray indices, uint32_t firstIndex, uint32_t indexCount, uint32_t firstInstance, uint32_t instanceCount)
106 uint32_t lastIndex = instanceCount > 1 ? (firstInstance + instanceCount) : firstInstance + 1;
107 for (uint32_t inst = firstInstance; inst < lastIndex; ++inst)
109 if (!T::instance(inst))
continue;
113 case (VK_PRIMITIVE_TOPOLOGY_POINT_LIST): {
114 uint32_t endIndex = firstIndex + indexCount;
115 for (uint32_t i = firstIndex; i < endIndex; ++i)
117 T::point(indices->at(i));
121 case (VK_PRIMITIVE_TOPOLOGY_LINE_LIST): {
122 uint32_t primtiveCount = indexCount / 2;
123 uint32_t endIndex = firstIndex + primtiveCount * 2;
124 for (uint32_t i = firstIndex; i < endIndex; i += 2)
126 T::line(indices->at(i), indices->at(i + 1));
130 case (VK_PRIMITIVE_TOPOLOGY_LINE_STRIP): {
132 uint32_t endIndex = firstIndex + ((indexCount >= 2) ? (indexCount - 1) : 0);
133 for (uint32_t i = firstIndex; i < endIndex; ++i)
135 T::line(indices->at(i), indices->at(i + 1));
139 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST): {
140 uint32_t primtiveCount = indexCount / 3;
141 uint32_t endIndex = firstIndex + primtiveCount * 3;
142 for (uint32_t i = firstIndex; i < endIndex; i += 3)
144 T::triangle(indices->at(i), indices->at(i + 1), indices->at(i + 2));
148 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP): {
150 uint32_t endIndex = firstIndex + ((indexCount >= 3) ? (indexCount - 2) : 0);
151 for (uint32_t i = firstIndex; i < endIndex; ++i)
153 T::triangle(indices->at(i), indices->at(i + 1), indices->at(i + 2));
157 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN): {
159 uint32_t endIndex = firstIndex + ((indexCount >= 3) ? (indexCount - 2) : 0);
160 for (uint32_t i = firstIndex + 1; i < endIndex; ++i)
162 T::triangle(indices->at(firstIndex), indices->at(i + 1), indices->at(i + 2));
166 case (VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY):
167 case (VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY):
168 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY):
169 case (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY):
170 case (VK_PRIMITIVE_TOPOLOGY_PATCH_LIST):
172 warn(
"PrimitiveFunctor::drawIndexed(topology = ", topology,
", ...) not implemented.");