184 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C++
		
	
	
	
//
 | 
						|
// Copyright 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;
 | 
						|
}
 |