1a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard//
2a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard// Use of this source code is governed by a BSD-style license that can be
4a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard// found in the LICENSE file.
5a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard//
6a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard
7a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard#include "geometry_utils.h"
8a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard
9a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard#define _USE_MATH_DEFINES
10a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard#include <math.h>
11a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard
12a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroardvoid CreateSphereGeometry(size_t sliceCount, float radius, SphereGeometry *result)
13a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard{
14a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard    size_t parellelCount = sliceCount / 2;
15a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard    size_t vertexCount = (parellelCount + 1) * (sliceCount + 1);
160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    size_t indexCount = parellelCount * sliceCount * 6;
17368ae73ad0627dac41709b925fc02a12548ab80dnicolasroard    float angleStep = (2.0f * M_PI) / sliceCount;
180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions.resize(vertexCount);
203992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->normals.resize(vertexCount);
210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    for (size_t i = 0; i < parellelCount + 1; i++)
223992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    {
230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (size_t j = 0; j < sliceCount + 1; j++)
240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        {
253992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            Vector3 direction(sinf(angleStep * i) * sinf(angleStep * j),
263992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard                              cosf(angleStep * i),
273992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard                              sinf(angleStep * i) * cosf(angleStep * j));
280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
299820e7e753b7e1977ef3d2163605431769ce9165nicolasroard            size_t vertexIdx = i * (sliceCount + 1) + j;
300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            result->positions[vertexIdx] = direction * radius;
319820e7e753b7e1977ef3d2163605431769ce9165nicolasroard            result->normals[vertexIdx] = direction;
326a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford        }
339820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    }
349820e7e753b7e1977ef3d2163605431769ce9165nicolasroard
350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->indices.clear();
36c5590eb1a20b112e67e4c43684790587f844fc6bnicolasroard    result->indices.reserve(indexCount);
3764fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford    for (size_t i = 0; i < parellelCount; i++)
387638772c0ceb5528b12c9943bad5391658d6c78dJohn Reck    {
3919161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        for (size_t j = 0; j < sliceCount; j++)
4019161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        {
4171f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard            result->indices.push_back( i      * (sliceCount + 1) +  j     );
4292e2341248e99c691f38820503984bc5e2f18811nicolasroard            result->indices.push_back((i + 1) * (sliceCount + 1) +  j     );
43ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroard            result->indices.push_back((i + 1) * (sliceCount + 1) + (j + 1));
4492e2341248e99c691f38820503984bc5e2f18811nicolasroard
456a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford            result->indices.push_back( i      * (sliceCount + 1) +  j     );
466a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford            result->indices.push_back((i + 1) * (sliceCount + 1) + (j + 1));
4763a7dac01d394523799939596b960cb03321798dJohn Hoford            result->indices.push_back( i      * (sliceCount + 1) + (j + 1));
480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
526a07dfbe03c8396cc43840a1630ea480a2cff663John Hofordvoid GenerateCubeGeometry(float radius, CubeGeometry *result)
533992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard{
54c5590eb1a20b112e67e4c43684790587f844fc6bnicolasroard    result->positions.resize(24);
550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[ 0] = Vector3(-radius, -radius, -radius);
560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[ 1] = Vector3(-radius, -radius,  radius);
570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[ 2] = Vector3( radius, -radius,  radius);
58952144dd3146a195ea4bd0be3f88275df8b31c64nicolasroard    result->positions[ 3] = Vector3( radius, -radius, -radius);
593992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->positions[ 4] = Vector3(-radius,  radius, -radius);
603992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->positions[ 5] = Vector3(-radius,  radius,  radius);
613992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->positions[ 6] = Vector3( radius,  radius,  radius);
623992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->positions[ 7] = Vector3( radius,  radius, -radius);
633992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->positions[ 8] = Vector3(-radius, -radius, -radius);
640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[ 9] = Vector3(-radius,  radius, -radius);
65c5590eb1a20b112e67e4c43684790587f844fc6bnicolasroard    result->positions[10] = Vector3( radius,  radius, -radius);
6619161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    result->positions[11] = Vector3( radius, -radius, -radius);
6719161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    result->positions[12] = Vector3(-radius, -radius,  radius);
68c5590eb1a20b112e67e4c43684790587f844fc6bnicolasroard    result->positions[13] = Vector3(-radius,  radius,  radius);
690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[14] = Vector3( radius,  radius,  radius);
700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[15] = Vector3( radius, -radius,  radius);
71f7cfa85f7dc2bb29affefff9374f3a4029b8a057nicolasroard    result->positions[16] = Vector3(-radius, -radius, -radius);
720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[17] = Vector3(-radius, -radius,  radius);
730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[18] = Vector3(-radius,  radius,  radius);
740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[19] = Vector3(-radius,  radius, -radius);
750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[20] = Vector3( radius, -radius, -radius);
760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[21] = Vector3( radius, -radius,  radius);
77f7cfa85f7dc2bb29affefff9374f3a4029b8a057nicolasroard    result->positions[22] = Vector3( radius,  radius,  radius);
780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->positions[23] = Vector3( radius,  radius, -radius);
790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    result->normals.resize(24);
819820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[ 0] = Vector3( 0.0f, -1.0f,  0.0f);
823024aa22d372c0d6608b143a0c46b86c2104f9b1nicolasroard    result->normals[ 1] = Vector3( 0.0f, -1.0f,  0.0f);
833024aa22d372c0d6608b143a0c46b86c2104f9b1nicolasroard    result->normals[ 2] = Vector3( 0.0f, -1.0f,  0.0f);
843024aa22d372c0d6608b143a0c46b86c2104f9b1nicolasroard    result->normals[ 3] = Vector3( 0.0f, -1.0f,  0.0f);
853024aa22d372c0d6608b143a0c46b86c2104f9b1nicolasroard    result->normals[ 4] = Vector3( 0.0f,  1.0f,  0.0f);
863024aa22d372c0d6608b143a0c46b86c2104f9b1nicolasroard    result->normals[ 5] = Vector3( 0.0f,  1.0f,  0.0f);
879820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[ 6] = Vector3( 0.0f,  1.0f,  0.0f);
889820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[ 7] = Vector3( 0.0f,  1.0f,  0.0f);
899820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[ 8] = Vector3( 0.0f,  0.0f, -1.0f);
909820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[ 9] = Vector3( 0.0f,  0.0f, -1.0f);
919820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[10] = Vector3( 0.0f,  0.0f, -1.0f);
926a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[11] = Vector3( 0.0f,  0.0f, -1.0f);
936a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[12] = Vector3( 0.0f,  0.0f,  1.0f);
949820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[13] = Vector3( 0.0f,  0.0f,  1.0f);
959820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[14] = Vector3( 0.0f,  0.0f,  1.0f);
969820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->normals[15] = Vector3( 0.0f,  0.0f,  1.0f);
976a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[16] = Vector3(-1.0f,  0.0f,  0.0f);
986a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[17] = Vector3(-1.0f,  0.0f,  0.0f);
996a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[18] = Vector3(-1.0f,  0.0f,  0.0f);
1006a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[19] = Vector3(-1.0f,  0.0f,  0.0f);
1016a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[20] = Vector3( 1.0f,  0.0f,  0.0f);
1026a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[21] = Vector3( 1.0f,  0.0f,  0.0f);
1036a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[22] = Vector3( 1.0f,  0.0f,  0.0f);
1046a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->normals[23] = Vector3( 1.0f,  0.0f,  0.0f);
1056a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford
1066a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords.resize(24);
1076a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords[ 0] = Vector2(0.0f, 0.0f);
1089820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[ 1] = Vector2(0.0f, 1.0f);
1099820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[ 2] = Vector2(1.0f, 1.0f);
1109820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[ 3] = Vector2(1.0f, 0.0f);
1119820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[ 4] = Vector2(1.0f, 0.0f);
1129820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[ 5] = Vector2(1.0f, 1.0f);
1139820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[ 6] = Vector2(0.0f, 1.0f);
1146a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords[ 7] = Vector2(0.0f, 0.0f);
1159820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[ 8] = Vector2(0.0f, 0.0f);
1169820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[ 9] = Vector2(0.0f, 1.0f);
1179820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[10] = Vector2(1.0f, 1.0f);
1187638772c0ceb5528b12c9943bad5391658d6c78dJohn Reck    result->texcoords[11] = Vector2(1.0f, 0.0f);
1199820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[12] = Vector2(0.0f, 0.0f);
12064fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford    result->texcoords[13] = Vector2(0.0f, 1.0f);
1219820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[14] = Vector2(1.0f, 1.0f);
1229820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[15] = Vector2(1.0f, 0.0f);
1239820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[16] = Vector2(0.0f, 0.0f);
1249820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->texcoords[17] = Vector2(0.0f, 1.0f);
1256a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords[18] = Vector2(1.0f, 1.0f);
1266a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords[19] = Vector2(1.0f, 0.0f);
1276a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords[20] = Vector2(0.0f, 0.0f);
1286a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords[21] = Vector2(0.0f, 1.0f);
1296a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords[22] = Vector2(1.0f, 1.0f);
1306a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->texcoords[23] = Vector2(1.0f, 0.0f);
1319820e7e753b7e1977ef3d2163605431769ce9165nicolasroard
1326a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->indices.resize(36);
1336a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->indices[ 0] =  0; result->indices[ 1] =  2; result->indices[ 2] =  1;
1346a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->indices[ 3] =  0; result->indices[ 4] =  3; result->indices[ 5] =  2;
1356a07dfbe03c8396cc43840a1630ea480a2cff663John Hoford    result->indices[ 6] =  4; result->indices[ 7] =  5; result->indices[ 8] =  6;
1369820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->indices[ 9] =  4; result->indices[10] =  6; result->indices[11] =  7;
1379820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->indices[12] =  8; result->indices[13] =  9; result->indices[14] = 10;
1389820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->indices[15] =  8; result->indices[16] = 10; result->indices[17] = 11;
1399820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->indices[18] = 12; result->indices[19] = 15; result->indices[20] = 14;
1409820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->indices[21] = 12; result->indices[22] = 14; result->indices[23] = 13;
1419820e7e753b7e1977ef3d2163605431769ce9165nicolasroard    result->indices[24] = 16; result->indices[25] = 17; result->indices[26] = 18;
1423992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->indices[27] = 16; result->indices[28] = 18; result->indices[29] = 19;
1433992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->indices[30] = 20; result->indices[31] = 23; result->indices[32] = 22;
1443992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    result->indices[33] = 20; result->indices[34] = 22; result->indices[35] = 21;
1453992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard}
1463992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard