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