1// 2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. 3// Use of this source code is governed by a BSD-style license that can be 4// found in the LICENSE file. 5// 6 7#include "geometry_utils.h" 8 9#define _USE_MATH_DEFINES 10#include <math.h> 11 12void CreateSphereGeometry(size_t sliceCount, float radius, SphereGeometry *result) 13{ 14 size_t parellelCount = sliceCount / 2; 15 size_t vertexCount = (parellelCount + 1) * (sliceCount + 1); 16 size_t indexCount = parellelCount * sliceCount * 6; 17 float angleStep = (2.0f * M_PI) / sliceCount; 18 19 result->positions.resize(vertexCount); 20 result->normals.resize(vertexCount); 21 for (size_t i = 0; i < parellelCount + 1; i++) 22 { 23 for (size_t j = 0; j < sliceCount + 1; j++) 24 { 25 Vector3 direction(sinf(angleStep * i) * sinf(angleStep * j), 26 cosf(angleStep * i), 27 sinf(angleStep * i) * cosf(angleStep * j)); 28 29 size_t vertexIdx = i * (sliceCount + 1) + j; 30 result->positions[vertexIdx] = direction * radius; 31 result->normals[vertexIdx] = direction; 32 } 33 } 34 35 result->indices.clear(); 36 result->indices.reserve(indexCount); 37 for (size_t i = 0; i < parellelCount; i++) 38 { 39 for (size_t j = 0; j < sliceCount; j++) 40 { 41 result->indices.push_back( i * (sliceCount + 1) + j ); 42 result->indices.push_back((i + 1) * (sliceCount + 1) + j ); 43 result->indices.push_back((i + 1) * (sliceCount + 1) + (j + 1)); 44 45 result->indices.push_back( i * (sliceCount + 1) + j ); 46 result->indices.push_back((i + 1) * (sliceCount + 1) + (j + 1)); 47 result->indices.push_back( i * (sliceCount + 1) + (j + 1)); 48 } 49 } 50} 51 52void GenerateCubeGeometry(float radius, CubeGeometry *result) 53{ 54 result->positions.resize(24); 55 result->positions[ 0] = Vector3(-radius, -radius, -radius); 56 result->positions[ 1] = Vector3(-radius, -radius, radius); 57 result->positions[ 2] = Vector3( radius, -radius, radius); 58 result->positions[ 3] = Vector3( radius, -radius, -radius); 59 result->positions[ 4] = Vector3(-radius, radius, -radius); 60 result->positions[ 5] = Vector3(-radius, radius, radius); 61 result->positions[ 6] = Vector3( radius, radius, radius); 62 result->positions[ 7] = Vector3( radius, radius, -radius); 63 result->positions[ 8] = Vector3(-radius, -radius, -radius); 64 result->positions[ 9] = Vector3(-radius, radius, -radius); 65 result->positions[10] = Vector3( radius, radius, -radius); 66 result->positions[11] = Vector3( radius, -radius, -radius); 67 result->positions[12] = Vector3(-radius, -radius, radius); 68 result->positions[13] = Vector3(-radius, radius, radius); 69 result->positions[14] = Vector3( radius, radius, radius); 70 result->positions[15] = Vector3( radius, -radius, radius); 71 result->positions[16] = Vector3(-radius, -radius, -radius); 72 result->positions[17] = Vector3(-radius, -radius, radius); 73 result->positions[18] = Vector3(-radius, radius, radius); 74 result->positions[19] = Vector3(-radius, radius, -radius); 75 result->positions[20] = Vector3( radius, -radius, -radius); 76 result->positions[21] = Vector3( radius, -radius, radius); 77 result->positions[22] = Vector3( radius, radius, radius); 78 result->positions[23] = Vector3( radius, radius, -radius); 79 80 result->normals.resize(24); 81 result->normals[ 0] = Vector3( 0.0f, -1.0f, 0.0f); 82 result->normals[ 1] = Vector3( 0.0f, -1.0f, 0.0f); 83 result->normals[ 2] = Vector3( 0.0f, -1.0f, 0.0f); 84 result->normals[ 3] = Vector3( 0.0f, -1.0f, 0.0f); 85 result->normals[ 4] = Vector3( 0.0f, 1.0f, 0.0f); 86 result->normals[ 5] = Vector3( 0.0f, 1.0f, 0.0f); 87 result->normals[ 6] = Vector3( 0.0f, 1.0f, 0.0f); 88 result->normals[ 7] = Vector3( 0.0f, 1.0f, 0.0f); 89 result->normals[ 8] = Vector3( 0.0f, 0.0f, -1.0f); 90 result->normals[ 9] = Vector3( 0.0f, 0.0f, -1.0f); 91 result->normals[10] = Vector3( 0.0f, 0.0f, -1.0f); 92 result->normals[11] = Vector3( 0.0f, 0.0f, -1.0f); 93 result->normals[12] = Vector3( 0.0f, 0.0f, 1.0f); 94 result->normals[13] = Vector3( 0.0f, 0.0f, 1.0f); 95 result->normals[14] = Vector3( 0.0f, 0.0f, 1.0f); 96 result->normals[15] = Vector3( 0.0f, 0.0f, 1.0f); 97 result->normals[16] = Vector3(-1.0f, 0.0f, 0.0f); 98 result->normals[17] = Vector3(-1.0f, 0.0f, 0.0f); 99 result->normals[18] = Vector3(-1.0f, 0.0f, 0.0f); 100 result->normals[19] = Vector3(-1.0f, 0.0f, 0.0f); 101 result->normals[20] = Vector3( 1.0f, 0.0f, 0.0f); 102 result->normals[21] = Vector3( 1.0f, 0.0f, 0.0f); 103 result->normals[22] = Vector3( 1.0f, 0.0f, 0.0f); 104 result->normals[23] = Vector3( 1.0f, 0.0f, 0.0f); 105 106 result->texcoords.resize(24); 107 result->texcoords[ 0] = Vector2(0.0f, 0.0f); 108 result->texcoords[ 1] = Vector2(0.0f, 1.0f); 109 result->texcoords[ 2] = Vector2(1.0f, 1.0f); 110 result->texcoords[ 3] = Vector2(1.0f, 0.0f); 111 result->texcoords[ 4] = Vector2(1.0f, 0.0f); 112 result->texcoords[ 5] = Vector2(1.0f, 1.0f); 113 result->texcoords[ 6] = Vector2(0.0f, 1.0f); 114 result->texcoords[ 7] = Vector2(0.0f, 0.0f); 115 result->texcoords[ 8] = Vector2(0.0f, 0.0f); 116 result->texcoords[ 9] = Vector2(0.0f, 1.0f); 117 result->texcoords[10] = Vector2(1.0f, 1.0f); 118 result->texcoords[11] = Vector2(1.0f, 0.0f); 119 result->texcoords[12] = Vector2(0.0f, 0.0f); 120 result->texcoords[13] = Vector2(0.0f, 1.0f); 121 result->texcoords[14] = Vector2(1.0f, 1.0f); 122 result->texcoords[15] = Vector2(1.0f, 0.0f); 123 result->texcoords[16] = Vector2(0.0f, 0.0f); 124 result->texcoords[17] = Vector2(0.0f, 1.0f); 125 result->texcoords[18] = Vector2(1.0f, 1.0f); 126 result->texcoords[19] = Vector2(1.0f, 0.0f); 127 result->texcoords[20] = Vector2(0.0f, 0.0f); 128 result->texcoords[21] = Vector2(0.0f, 1.0f); 129 result->texcoords[22] = Vector2(1.0f, 1.0f); 130 result->texcoords[23] = Vector2(1.0f, 0.0f); 131 132 result->indices.resize(36); 133 result->indices[ 0] = 0; result->indices[ 1] = 2; result->indices[ 2] = 1; 134 result->indices[ 3] = 0; result->indices[ 4] = 3; result->indices[ 5] = 2; 135 result->indices[ 6] = 4; result->indices[ 7] = 5; result->indices[ 8] = 6; 136 result->indices[ 9] = 4; result->indices[10] = 6; result->indices[11] = 7; 137 result->indices[12] = 8; result->indices[13] = 9; result->indices[14] = 10; 138 result->indices[15] = 8; result->indices[16] = 10; result->indices[17] = 11; 139 result->indices[18] = 12; result->indices[19] = 15; result->indices[20] = 14; 140 result->indices[21] = 12; result->indices[22] = 14; result->indices[23] = 13; 141 result->indices[24] = 16; result->indices[25] = 17; result->indices[26] = 18; 142 result->indices[27] = 16; result->indices[28] = 18; result->indices[29] = 19; 143 result->indices[30] = 20; result->indices[31] = 23; result->indices[32] = 22; 144 result->indices[33] = 20; result->indices[34] = 22; result->indices[35] = 21; 145} 146