X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=shapes.hpp;h=876ce3c550ebf97c3951850d4483f1ddaf6fe1ae;hp=5fcefdb1f648607b6a20c1cc91930da889292324;hb=76e0d790f76df0c32b09118870145ec5f9eaf153;hpb=a03f2bc751bbd7f91cbc2f52d2f0f6e753d6f776 diff --git a/shapes.hpp b/shapes.hpp index 5fcefdb..876ce3c 100644 --- a/shapes.hpp +++ b/shapes.hpp @@ -1,4 +1,6 @@ #include +#include +#include #define GLM_FORCE_PURE #include @@ -15,7 +17,79 @@ constexpr array quadToTriangles(const array quads) { }; } -constexpr array cube() { +constexpr array plane() { + return quadToTriangles({ + glm::vec3(1, 1, 0), + glm::vec3(-1, 1, 0), + glm::vec3(-1, -1, 0), + glm::vec3(1, -1, 0) + }); +} + +inline vector cube() { + int i = 0; + vector vertices(36); + + const array front = { + glm::vec3(1, -1, -1), + glm::vec3(-1, -1, -1), + glm::vec3(-1, 1, -1), + glm::vec3(1, 1, -1) + }; + + for (auto v: quadToTriangles(front)) + vertices[i++] = v; + + const array back = { + glm::vec3(1, 1, 1), + glm::vec3(-1, 1, 1), + glm::vec3(-1, -1, 1), + glm::vec3(1, -1, 1) + }; + for (auto v: quadToTriangles(back)) + vertices[i++] = v; + + + const array top = { + glm::vec3(1, 1, -1), + glm::vec3(-1, 1, -1), + glm::vec3(-1, 1, 1), + glm::vec3(1, 1, 1) + }; + for (auto v: quadToTriangles(top)) + vertices[i++] = v; + + const array bottom = { + glm::vec3(1, -1, 1), + glm::vec3(-1, -1, 1), + glm::vec3(-1, -1, -1), + glm::vec3(1, -1, -1) + }; + for (auto v: quadToTriangles(bottom)) + vertices[i++] = v; + + const array left = { + glm::vec3(-1, 1, 1), + glm::vec3(-1, 1, -1), + glm::vec3(-1, -1, -1), + glm::vec3(-1, -1, 1) + }; + for (auto v: quadToTriangles(left)) + vertices[i++] = v; + + const array right = { + glm::vec3(1, 1, -1), + glm::vec3(1, 1, 1), + glm::vec3(1, -1, 1), + glm::vec3(1, -1, -1) + }; + for (auto v: quadToTriangles(right)) + vertices[i++] = v; + + return vertices; +} + +constexpr array cubeArray() { int i = 0; array vertices; @@ -77,3 +151,98 @@ constexpr array cube() { return vertices; } + +constexpr glm::vec3 pyramid[18] = { + glm::vec3(0.0f, 1.0f, 0.0f), + glm::vec3(1.0f, -1.0f, -1.0f), + glm::vec3(-1.0f, -1.0f, -1.0f), + + glm::vec3(0.0f, 1.0f, 0.0f), + glm::vec3(-1.0f, -1.0f, 1.0f), + glm::vec3(1.0f, -1.0f, 1.0f), + + glm::vec3(0.0f, 1.0f, 0.0f), + glm::vec3(-1.0f, -1.0f, -1.0f), + glm::vec3(-1.0f, -1.0f, 1.0f), + + glm::vec3(0.0f, 1.0f, 0.0f), + glm::vec3(1.0f, -1.0f, 1.0f), + glm::vec3(1.0f, -1.0f, -1.0f), + + glm::vec3(1, -1, 1), + glm::vec3(-1, -1, 1), + glm::vec3(-1, -1, -1), + glm::vec3(-1, -1, -1), + glm::vec3(1, -1, -1), + glm::vec3(1, -1, 1) +}; + +// taken from http://www.songho.ca/opengl/gl_sphere.html +#define SECTOR_COUNT 16 +#define STACK_COUNT 16 +inline std::vector sphere(float radius = 1) { + float sectorStep = 2 * M_PI / SECTOR_COUNT; + float stackStep = M_PI / STACK_COUNT; + + std::vector vertices; + + for(int i = 0; i <= STACK_COUNT; i++) { + float stackAngle = M_PI / 2 - i * stackStep; // starting from pi/2 to -pi/2 + float xy = radius * cosf(stackAngle); // r * cos(u) + float z = radius * sinf(stackAngle); // r * sin(u) + + // add (sectorCount+1) vertices per stack + // the first and last vertices have same position and normal, but different tex coords + for(int j = 0; j <= SECTOR_COUNT; j++) + { + float sectorAngle = j * sectorStep; // starting from 0 to 2pi + + // vertex position (x, y, z) + float x = xy * cosf(sectorAngle); // r * cos(u) * cos(v) + float y = xy * sinf(sectorAngle); // r * cos(u) * sin(v) + vertices.push_back({x, y, z}); + + // normalized vertex normal (nx, ny, nz) + /* nx = x * lengthInv; */ + /* ny = y * lengthInv; */ + /* nz = z * lengthInv; */ + /* normals.push_back(nx); */ + /* normals.push_back(ny); */ + /* normals.push_back(nz); */ + + } + } + return vertices; +} + +inline std::vector sphereIndices() { + // generate CCW index list of sphere triangles + vector indices; + int k1, k2; + for(int i = 0; i < STACK_COUNT; ++i) + { + k1 = i * (SECTOR_COUNT + 1); // beginning of current stack + k2 = k1 + SECTOR_COUNT + 1; // beginning of next stack + + for(int j = 0; j < SECTOR_COUNT; ++j, ++k1, ++k2) + { + // 2 triangles per sector excluding first and last stacks + // k1 => k2 => k1+1 + if(i != 0) + { + indices.push_back(k1); + indices.push_back(k2); + indices.push_back(k1 + 1); + } + + // k1+1 => k2 => k2+1 + if(i != (STACK_COUNT-1)) + { + indices.push_back(k1 + 1); + indices.push_back(k2); + indices.push_back(k2 + 1); + } + } + } + return indices; +}