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