Upload upstream chromium 67.0.3396
[platform/framework/web/chromium-efl.git] / third_party / angle / util / geometry_utils.cpp
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 // geometry_utils:
7 //   Helper library for generating certain sets of geometry.
8 //
9
10 #include "geometry_utils.h"
11
12 #define _USE_MATH_DEFINES
13 #include <math.h>
14
15 using namespace angle;
16
17 SphereGeometry::SphereGeometry()
18 {
19 }
20
21 SphereGeometry::~SphereGeometry()
22 {
23 }
24
25 CubeGeometry::CubeGeometry()
26 {
27 }
28
29 CubeGeometry::~CubeGeometry()
30 {
31 }
32
33 void CreateSphereGeometry(size_t sliceCount, float radius, SphereGeometry *result)
34 {
35     size_t parellelCount = sliceCount / 2;
36     size_t vertexCount   = (parellelCount + 1) * (sliceCount + 1);
37     size_t indexCount    = parellelCount * sliceCount * 6;
38     float angleStep      = static_cast<float>(2.0f * M_PI) / sliceCount;
39
40     result->positions.resize(vertexCount);
41     result->normals.resize(vertexCount);
42     for (size_t i = 0; i < parellelCount + 1; i++)
43     {
44         for (size_t j = 0; j < sliceCount + 1; j++)
45         {
46             Vector3 direction(sinf(angleStep * i) * sinf(angleStep * j), cosf(angleStep * i),
47                               sinf(angleStep * i) * cosf(angleStep * j));
48
49             size_t vertexIdx             = i * (sliceCount + 1) + j;
50             result->positions[vertexIdx] = direction * radius;
51             result->normals[vertexIdx]   = direction;
52         }
53     }
54
55     result->indices.clear();
56     result->indices.reserve(indexCount);
57     for (size_t i = 0; i < parellelCount; i++)
58     {
59         for (size_t j = 0; j < sliceCount; j++)
60         {
61             result->indices.push_back(static_cast<unsigned short>(i * (sliceCount + 1) + j));
62             result->indices.push_back(static_cast<unsigned short>((i + 1) * (sliceCount + 1) + j));
63             result->indices.push_back(
64                 static_cast<unsigned short>((i + 1) * (sliceCount + 1) + (j + 1)));
65
66             result->indices.push_back(static_cast<unsigned short>(i * (sliceCount + 1) + j));
67             result->indices.push_back(
68                 static_cast<unsigned short>((i + 1) * (sliceCount + 1) + (j + 1)));
69             result->indices.push_back(static_cast<unsigned short>(i * (sliceCount + 1) + (j + 1)));
70         }
71     }
72 }
73
74 void GenerateCubeGeometry(float radius, CubeGeometry *result)
75 {
76     result->positions.resize(24);
77     result->positions[0]  = Vector3(-radius, -radius, -radius);
78     result->positions[1]  = Vector3(-radius, -radius, radius);
79     result->positions[2]  = Vector3(radius, -radius, radius);
80     result->positions[3]  = Vector3(radius, -radius, -radius);
81     result->positions[4]  = Vector3(-radius, radius, -radius);
82     result->positions[5]  = Vector3(-radius, radius, radius);
83     result->positions[6]  = Vector3(radius, radius, radius);
84     result->positions[7]  = Vector3(radius, radius, -radius);
85     result->positions[8]  = Vector3(-radius, -radius, -radius);
86     result->positions[9]  = Vector3(-radius, radius, -radius);
87     result->positions[10] = Vector3(radius, radius, -radius);
88     result->positions[11] = Vector3(radius, -radius, -radius);
89     result->positions[12] = Vector3(-radius, -radius, radius);
90     result->positions[13] = Vector3(-radius, radius, radius);
91     result->positions[14] = Vector3(radius, radius, radius);
92     result->positions[15] = Vector3(radius, -radius, radius);
93     result->positions[16] = Vector3(-radius, -radius, -radius);
94     result->positions[17] = Vector3(-radius, -radius, radius);
95     result->positions[18] = Vector3(-radius, radius, radius);
96     result->positions[19] = Vector3(-radius, radius, -radius);
97     result->positions[20] = Vector3(radius, -radius, -radius);
98     result->positions[21] = Vector3(radius, -radius, radius);
99     result->positions[22] = Vector3(radius, radius, radius);
100     result->positions[23] = Vector3(radius, radius, -radius);
101
102     result->normals.resize(24);
103     result->normals[0]  = Vector3(0.0f, -1.0f, 0.0f);
104     result->normals[1]  = Vector3(0.0f, -1.0f, 0.0f);
105     result->normals[2]  = Vector3(0.0f, -1.0f, 0.0f);
106     result->normals[3]  = Vector3(0.0f, -1.0f, 0.0f);
107     result->normals[4]  = Vector3(0.0f, 1.0f, 0.0f);
108     result->normals[5]  = Vector3(0.0f, 1.0f, 0.0f);
109     result->normals[6]  = Vector3(0.0f, 1.0f, 0.0f);
110     result->normals[7]  = Vector3(0.0f, 1.0f, 0.0f);
111     result->normals[8]  = Vector3(0.0f, 0.0f, -1.0f);
112     result->normals[9]  = Vector3(0.0f, 0.0f, -1.0f);
113     result->normals[10] = Vector3(0.0f, 0.0f, -1.0f);
114     result->normals[11] = Vector3(0.0f, 0.0f, -1.0f);
115     result->normals[12] = Vector3(0.0f, 0.0f, 1.0f);
116     result->normals[13] = Vector3(0.0f, 0.0f, 1.0f);
117     result->normals[14] = Vector3(0.0f, 0.0f, 1.0f);
118     result->normals[15] = Vector3(0.0f, 0.0f, 1.0f);
119     result->normals[16] = Vector3(-1.0f, 0.0f, 0.0f);
120     result->normals[17] = Vector3(-1.0f, 0.0f, 0.0f);
121     result->normals[18] = Vector3(-1.0f, 0.0f, 0.0f);
122     result->normals[19] = Vector3(-1.0f, 0.0f, 0.0f);
123     result->normals[20] = Vector3(1.0f, 0.0f, 0.0f);
124     result->normals[21] = Vector3(1.0f, 0.0f, 0.0f);
125     result->normals[22] = Vector3(1.0f, 0.0f, 0.0f);
126     result->normals[23] = Vector3(1.0f, 0.0f, 0.0f);
127
128     result->texcoords.resize(24);
129     result->texcoords[0]  = Vector2(0.0f, 0.0f);
130     result->texcoords[1]  = Vector2(0.0f, 1.0f);
131     result->texcoords[2]  = Vector2(1.0f, 1.0f);
132     result->texcoords[3]  = Vector2(1.0f, 0.0f);
133     result->texcoords[4]  = Vector2(1.0f, 0.0f);
134     result->texcoords[5]  = Vector2(1.0f, 1.0f);
135     result->texcoords[6]  = Vector2(0.0f, 1.0f);
136     result->texcoords[7]  = Vector2(0.0f, 0.0f);
137     result->texcoords[8]  = Vector2(0.0f, 0.0f);
138     result->texcoords[9]  = Vector2(0.0f, 1.0f);
139     result->texcoords[10] = Vector2(1.0f, 1.0f);
140     result->texcoords[11] = Vector2(1.0f, 0.0f);
141     result->texcoords[12] = Vector2(0.0f, 0.0f);
142     result->texcoords[13] = Vector2(0.0f, 1.0f);
143     result->texcoords[14] = Vector2(1.0f, 1.0f);
144     result->texcoords[15] = Vector2(1.0f, 0.0f);
145     result->texcoords[16] = Vector2(0.0f, 0.0f);
146     result->texcoords[17] = Vector2(0.0f, 1.0f);
147     result->texcoords[18] = Vector2(1.0f, 1.0f);
148     result->texcoords[19] = Vector2(1.0f, 0.0f);
149     result->texcoords[20] = Vector2(0.0f, 0.0f);
150     result->texcoords[21] = Vector2(0.0f, 1.0f);
151     result->texcoords[22] = Vector2(1.0f, 1.0f);
152     result->texcoords[23] = Vector2(1.0f, 0.0f);
153
154     result->indices.resize(36);
155     result->indices[0]  = 0;
156     result->indices[1]  = 2;
157     result->indices[2]  = 1;
158     result->indices[3]  = 0;
159     result->indices[4]  = 3;
160     result->indices[5]  = 2;
161     result->indices[6]  = 4;
162     result->indices[7]  = 5;
163     result->indices[8]  = 6;
164     result->indices[9]  = 4;
165     result->indices[10] = 6;
166     result->indices[11] = 7;
167     result->indices[12] = 8;
168     result->indices[13] = 9;
169     result->indices[14] = 10;
170     result->indices[15] = 8;
171     result->indices[16] = 10;
172     result->indices[17] = 11;
173     result->indices[18] = 12;
174     result->indices[19] = 15;
175     result->indices[20] = 14;
176     result->indices[21] = 12;
177     result->indices[22] = 14;
178     result->indices[23] = 13;
179     result->indices[24] = 16;
180     result->indices[25] = 17;
181     result->indices[26] = 18;
182     result->indices[27] = 16;
183     result->indices[28] = 18;
184     result->indices[29] = 19;
185     result->indices[30] = 20;
186     result->indices[31] = 23;
187     result->indices[32] = 22;
188     result->indices[33] = 20;
189     result->indices[34] = 22;
190     result->indices[35] = 21;
191 }