Cogs.Core
MeshGeneratorCone.h
1#pragma once
2
3#include "MeshGeneratorCommon.h"
4
5namespace
6{
7 void coneFactory(Mesh * m, const ShapeDefinition & definition, int kRefinementLevels, int kMaxSamples)
8 {
9 const float nzc = 2.f / std::sqrt(5.f);
10 const float nzs = 1.f / std::sqrt(5.f);
11
12 const int n = samplesFromLevel(definition.refinement, kRefinementLevels, kMaxSamples) + 3; // +2 is minimum (one triangle at end), but looks bad.
13
14 //Uses X dimension for radius, Z for height. Ignores Y
15 auto & r = definition.size.x;
16 auto & h = definition.size.z;
17
18 std::vector<PositionNormalTexVertex> V(2 * n + 2 * (n + 1));
19 for (int i = 0; i < n; i++) {
20 float u = (i + 0.5f) / float(n);
21 float cu = std::cos(glm::pi<float>() * 2.0f * u);
22 float su = std::sin(glm::pi<float>() * 2.0f * u);
23 V[i] = PositionNormalTexVertex({ glm::vec3(0.f, 0.f, -h), glm::vec3(0.f, 0.f, -1.f), glm::vec2(u, 0.f) });
24 V[n + 2 * (n + 1) + i] = PositionNormalTexVertex({ glm::vec3(0.f, 0.f, h), glm::vec3(nzc*su, nzc*cu, nzs), glm::vec2(u, 1.f) });
25 }
26
27 for (int i = 0; i <= n; i++) {
28 float u = float(i) / float(n);
29 float cu = r * std::cos(glm::pi<float>() * 2.0f * u);
30 float su = r * std::sin(glm::pi<float>() * 2.0f * u);
31 V[n + 0 * (n + 1) + i] = PositionNormalTexVertex({ glm::vec3(su, cu, -h), glm::vec3(0.f, 0.f, -1.f), glm::vec2(u, 0.f) });
32 V[n + 1 * (n + 1) + i] = PositionNormalTexVertex({ glm::vec3(su, cu, -h), glm::vec3(nzc*su, nzc*cu, nzs), glm::vec2(u, 0.f) });
33 }
34
35 std::vector<uint32_t> I;
36 I.reserve(3 * 4 * n);
37 for (int i = 0; i < n; i++) { // start cap
38 I.push_back(i);
39 I.push_back(n + i);
40 I.push_back(n + i + 1);
41 }
42 for (int i = 0; i < n; i++) { // body
43 I.push_back(n + 1 * (n + 1) + i + 1);
44 I.push_back(n + 1 * (n + 1) + i);
45 I.push_back(n + 2 * (n + 1) + i);
46 }
47
48 m->setVertexData(V.data(), V.size());
49 m->setIndexData(I.data(), I.size());
50 m->setBounds(computeBoundingBoxFromVertexFormat(V.begin(), V.end()));
51 }
52}
Meshes contain streams of vertex data in addition to index data and options defining geometry used fo...
Definition: Mesh.h:265
void setIndexData(const uint32_t *data, size_t count)
Convenience method for setting index data from a raw pointer to data and count number of elements.
Definition: Mesh.h:705
void setBounds(Geometry::BoundingBox box)
Set custom bounds for the mesh.
Definition: Mesh.h:298
void setVertexData(Element *elements, size_t count)
Set vertex data.
Definition: Mesh.h:754
Defines creation values for a unique shape.
Definition: ShapeType.h:74