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