| // |
| // Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // geometry_utils: |
| // Helper library for generating certain sets of geometry. |
| // |
| |
| #include "geometry_utils.h" |
| |
| #define _USE_MATH_DEFINES |
| #include <math.h> |
| |
| using namespace angle; |
| |
| SphereGeometry::SphereGeometry() |
| { |
| } |
| |
| SphereGeometry::~SphereGeometry() |
| { |
| } |
| |
| CubeGeometry::CubeGeometry() |
| { |
| } |
| |
| CubeGeometry::~CubeGeometry() |
| { |
| } |
| |
| void CreateSphereGeometry(size_t sliceCount, float radius, SphereGeometry *result) |
| { |
| size_t parellelCount = sliceCount / 2; |
| size_t vertexCount = (parellelCount + 1) * (sliceCount + 1); |
| size_t indexCount = parellelCount * sliceCount * 6; |
| float angleStep = static_cast<float>(2.0f * M_PI) / sliceCount; |
| |
| result->positions.resize(vertexCount); |
| result->normals.resize(vertexCount); |
| for (size_t i = 0; i < parellelCount + 1; i++) |
| { |
| for (size_t j = 0; j < sliceCount + 1; j++) |
| { |
| Vector3 direction(sinf(angleStep * i) * sinf(angleStep * j), cosf(angleStep * i), |
| sinf(angleStep * i) * cosf(angleStep * j)); |
| |
| size_t vertexIdx = i * (sliceCount + 1) + j; |
| result->positions[vertexIdx] = direction * radius; |
| result->normals[vertexIdx] = direction; |
| } |
| } |
| |
| result->indices.clear(); |
| result->indices.reserve(indexCount); |
| for (size_t i = 0; i < parellelCount; i++) |
| { |
| for (size_t j = 0; j < sliceCount; j++) |
| { |
| result->indices.push_back(static_cast<unsigned short>(i * (sliceCount + 1) + j)); |
| result->indices.push_back(static_cast<unsigned short>((i + 1) * (sliceCount + 1) + j)); |
| result->indices.push_back( |
| static_cast<unsigned short>((i + 1) * (sliceCount + 1) + (j + 1))); |
| |
| result->indices.push_back(static_cast<unsigned short>(i * (sliceCount + 1) + j)); |
| result->indices.push_back( |
| static_cast<unsigned short>((i + 1) * (sliceCount + 1) + (j + 1))); |
| result->indices.push_back(static_cast<unsigned short>(i * (sliceCount + 1) + (j + 1))); |
| } |
| } |
| } |
| |
| void GenerateCubeGeometry(float radius, CubeGeometry *result) |
| { |
| result->positions.resize(24); |
| result->positions[0] = Vector3(-radius, -radius, -radius); |
| result->positions[1] = Vector3(-radius, -radius, radius); |
| result->positions[2] = Vector3(radius, -radius, radius); |
| result->positions[3] = Vector3(radius, -radius, -radius); |
| result->positions[4] = Vector3(-radius, radius, -radius); |
| result->positions[5] = Vector3(-radius, radius, radius); |
| result->positions[6] = Vector3(radius, radius, radius); |
| result->positions[7] = Vector3(radius, radius, -radius); |
| result->positions[8] = Vector3(-radius, -radius, -radius); |
| result->positions[9] = Vector3(-radius, radius, -radius); |
| result->positions[10] = Vector3(radius, radius, -radius); |
| result->positions[11] = Vector3(radius, -radius, -radius); |
| result->positions[12] = Vector3(-radius, -radius, radius); |
| result->positions[13] = Vector3(-radius, radius, radius); |
| result->positions[14] = Vector3(radius, radius, radius); |
| result->positions[15] = Vector3(radius, -radius, radius); |
| result->positions[16] = Vector3(-radius, -radius, -radius); |
| result->positions[17] = Vector3(-radius, -radius, radius); |
| result->positions[18] = Vector3(-radius, radius, radius); |
| result->positions[19] = Vector3(-radius, radius, -radius); |
| result->positions[20] = Vector3(radius, -radius, -radius); |
| result->positions[21] = Vector3(radius, -radius, radius); |
| result->positions[22] = Vector3(radius, radius, radius); |
| result->positions[23] = Vector3(radius, radius, -radius); |
| |
| result->normals.resize(24); |
| result->normals[0] = Vector3(0.0f, -1.0f, 0.0f); |
| result->normals[1] = Vector3(0.0f, -1.0f, 0.0f); |
| result->normals[2] = Vector3(0.0f, -1.0f, 0.0f); |
| result->normals[3] = Vector3(0.0f, -1.0f, 0.0f); |
| result->normals[4] = Vector3(0.0f, 1.0f, 0.0f); |
| result->normals[5] = Vector3(0.0f, 1.0f, 0.0f); |
| result->normals[6] = Vector3(0.0f, 1.0f, 0.0f); |
| result->normals[7] = Vector3(0.0f, 1.0f, 0.0f); |
| result->normals[8] = Vector3(0.0f, 0.0f, -1.0f); |
| result->normals[9] = Vector3(0.0f, 0.0f, -1.0f); |
| result->normals[10] = Vector3(0.0f, 0.0f, -1.0f); |
| result->normals[11] = Vector3(0.0f, 0.0f, -1.0f); |
| result->normals[12] = Vector3(0.0f, 0.0f, 1.0f); |
| result->normals[13] = Vector3(0.0f, 0.0f, 1.0f); |
| result->normals[14] = Vector3(0.0f, 0.0f, 1.0f); |
| result->normals[15] = Vector3(0.0f, 0.0f, 1.0f); |
| result->normals[16] = Vector3(-1.0f, 0.0f, 0.0f); |
| result->normals[17] = Vector3(-1.0f, 0.0f, 0.0f); |
| result->normals[18] = Vector3(-1.0f, 0.0f, 0.0f); |
| result->normals[19] = Vector3(-1.0f, 0.0f, 0.0f); |
| result->normals[20] = Vector3(1.0f, 0.0f, 0.0f); |
| result->normals[21] = Vector3(1.0f, 0.0f, 0.0f); |
| result->normals[22] = Vector3(1.0f, 0.0f, 0.0f); |
| result->normals[23] = Vector3(1.0f, 0.0f, 0.0f); |
| |
| result->texcoords.resize(24); |
| result->texcoords[0] = Vector2(0.0f, 0.0f); |
| result->texcoords[1] = Vector2(0.0f, 1.0f); |
| result->texcoords[2] = Vector2(1.0f, 1.0f); |
| result->texcoords[3] = Vector2(1.0f, 0.0f); |
| result->texcoords[4] = Vector2(1.0f, 0.0f); |
| result->texcoords[5] = Vector2(1.0f, 1.0f); |
| result->texcoords[6] = Vector2(0.0f, 1.0f); |
| result->texcoords[7] = Vector2(0.0f, 0.0f); |
| result->texcoords[8] = Vector2(0.0f, 0.0f); |
| result->texcoords[9] = Vector2(0.0f, 1.0f); |
| result->texcoords[10] = Vector2(1.0f, 1.0f); |
| result->texcoords[11] = Vector2(1.0f, 0.0f); |
| result->texcoords[12] = Vector2(0.0f, 0.0f); |
| result->texcoords[13] = Vector2(0.0f, 1.0f); |
| result->texcoords[14] = Vector2(1.0f, 1.0f); |
| result->texcoords[15] = Vector2(1.0f, 0.0f); |
| result->texcoords[16] = Vector2(0.0f, 0.0f); |
| result->texcoords[17] = Vector2(0.0f, 1.0f); |
| result->texcoords[18] = Vector2(1.0f, 1.0f); |
| result->texcoords[19] = Vector2(1.0f, 0.0f); |
| result->texcoords[20] = Vector2(0.0f, 0.0f); |
| result->texcoords[21] = Vector2(0.0f, 1.0f); |
| result->texcoords[22] = Vector2(1.0f, 1.0f); |
| result->texcoords[23] = Vector2(1.0f, 0.0f); |
| |
| result->indices.resize(36); |
| result->indices[0] = 0; |
| result->indices[1] = 2; |
| result->indices[2] = 1; |
| result->indices[3] = 0; |
| result->indices[4] = 3; |
| result->indices[5] = 2; |
| result->indices[6] = 4; |
| result->indices[7] = 5; |
| result->indices[8] = 6; |
| result->indices[9] = 4; |
| result->indices[10] = 6; |
| result->indices[11] = 7; |
| result->indices[12] = 8; |
| result->indices[13] = 9; |
| result->indices[14] = 10; |
| result->indices[15] = 8; |
| result->indices[16] = 10; |
| result->indices[17] = 11; |
| result->indices[18] = 12; |
| result->indices[19] = 15; |
| result->indices[20] = 14; |
| result->indices[21] = 12; |
| result->indices[22] = 14; |
| result->indices[23] = 13; |
| result->indices[24] = 16; |
| result->indices[25] = 17; |
| result->indices[26] = 18; |
| result->indices[27] = 16; |
| result->indices[28] = 18; |
| result->indices[29] = 19; |
| result->indices[30] = 20; |
| result->indices[31] = 23; |
| result->indices[32] = 22; |
| result->indices[33] = 20; |
| result->indices[34] = 22; |
| result->indices[35] = 21; |
| } |