#include "geometryOverrideHighPerformanceHelper.h"
#include <maya/MFloatVector.h>
constexpr float PI = 3.14159265358979323846f;
void createSphere(float radius,
unsigned int sliceCount,
unsigned int stackCount,
Float3Array& positions,
Float3Array& normals,
Float3Array& tangents,
Float3Array& biTangents,
Float2Array& texCoords,
IndexList& indices,
)
{
positions.clear();
normals.clear();
tangents.clear();
texCoords.clear();
indices.clear();
const std::size_t vertexCount = stackCount * sliceCount + 1;
const std::size_t indexCount = sliceCount * 3 * 2 + (sliceCount - 2) * sliceCount * 6;
positions.reserve(vertexCount);
normals.reserve(vertexCount);
tangents.reserve(vertexCount);
texCoords.reserve(vertexCount);
indices.reserve(indexCount);
positions.emplace_back( 0.0f, radius, 0.0f );
normals.emplace_back( 0.0f, 1.0f, 0.0f );
tangents.emplace_back( 1.0f, 0.0f, 0.0f );
biTangents.emplace_back(0.0f, 0.0f, -1.0f);
texCoords.emplace_back( 0.0f, 0.0f );
const float phiStep = PI / stackCount;
const float thetaStep = 2.0f * PI / sliceCount;
for (unsigned int i = 1; i <= stackCount - 1; ++i)
{
float phi = i * phiStep;
for (unsigned int j = 0; j <= sliceCount; ++j)
{
float theta = j * thetaStep;
Float3 position;
position.x = radius * sinf(phi) * cosf(theta);
position.y = radius * cosf(phi);
position.z = radius * sinf(phi) * sinf(theta);
positions.emplace_back( position.x, position.y, position.z );
normals.emplace_back( normal.
x, normal.
y, normal.
z );
-radius * sinf(phi) * sinf(theta),
0.0f,
radius * sinf(phi) * cosf(theta)
);
tangents.emplace_back( tangent.
x, tangent.
y, tangent.
z );
biTangents.emplace_back(biTangent.
x, biTangent.
y, biTangent.
z);
texCoords.emplace_back( theta / PI, phi / PI);
}
}
positions.emplace_back( 0.0f, -radius, 0.0f );
normals.emplace_back( 0.0f, -1.0f, 0.0f );
tangents.emplace_back( 1.0f, 0.0f, 0.0f );
biTangents.emplace_back(0.0f, 0.0f, -1.0f);
texCoords.emplace_back( 0.0f, 1.0f );
for (unsigned int i = 1; i <= sliceCount; ++i)
{
indices.push_back(0);
indices.push_back(i + 1);
indices.push_back(i);
}
unsigned int baseIndex = 1;
unsigned int ringVertexCount = sliceCount + 1;
for (unsigned int i = 0; i < sliceCount - 2; ++i)
{
for (unsigned int j = 0; j < sliceCount; ++j)
{
indices.push_back(baseIndex + i * ringVertexCount + j);
indices.push_back(baseIndex + i * ringVertexCount + j + 1);
indices.push_back(baseIndex + (i + 1) * ringVertexCount + j);
indices.push_back(baseIndex + (i + 1) * ringVertexCount + j);
indices.push_back(baseIndex + i * ringVertexCount + j + 1);
indices.push_back(baseIndex + (i + 1) * ringVertexCount + j + 1);
}
}
unsigned int southPoleIndex = (unsigned int)positions.size() - 1;
baseIndex = southPoleIndex - ringVertexCount;
for (unsigned int i = 0; i < sliceCount; ++i)
{
indices.push_back(southPoleIndex);
indices.push_back(baseIndex + i);
indices.push_back(baseIndex + i + 1);
}
}