27createGlowSphere(
int stacks = 32,
int slices = 32,
float radius = 1.0f, glm::vec3 emissiveColor = {10.0f, 6.0f, 2.0f})
34 mesh.
vertices.reserve(
static_cast<size_t>((stacks + 1) * (slices + 1)));
36 for (
int i = 0; i <= stacks; ++i) {
37 const float phi = std::numbers::pi_v<float> *
static_cast<float>(i) /
static_cast<float>(stacks);
38 const float sinPhi = std::sin(phi);
39 const float cosPhi = std::cos(phi);
41 for (
int j = 0; j <= slices; ++j) {
42 const float theta = 2.0f * std::numbers::pi_v<float> *
static_cast<float>(j) /
static_cast<float>(slices);
43 const float sinTheta = std::sin(theta);
44 const float cosTheta = std::cos(theta);
46 const glm::vec3 normal{sinPhi * cosTheta, cosPhi, sinPhi * sinTheta};
47 const glm::vec3 position = normal * radius;
48 const glm::vec2 uv{
static_cast<float>(j) /
static_cast<float>(slices),
49 static_cast<float>(i) /
static_cast<float>(stacks)};
56 tangent = glm::normalize(glm::vec3{-sinTheta, 0.0f, cosTheta});
58 tangent = glm::vec3{1.0f, 0.0f, 0.0f};
64 .tangent = glm::vec4(tangent, 1.0f),
71 mesh.
indices.reserve(
static_cast<size_t>(stacks * slices * 6));
73 for (
int i = 0; i < stacks; ++i) {
74 for (
int j = 0; j < slices; ++j) {
75 const uint32_t a =
static_cast<uint32_t
>(i * (slices + 1) + j);
76 const uint32_t b = a +
static_cast<uint32_t
>(slices + 1);
104 whiteTex.
pixels = {255, 255, 255, 255};
109 model.
textures.push_back(std::move(whiteTex));
112 model.
meshes.push_back(std::move(mesh));
LoadedModel createGlowSphere(int stacks=32, int slices=32, float radius=1.0f, glm::vec3 emissiveColor={10.0f, 6.0f, 2.0f})
Generate a procedural UV sphere as a LoadedModel with a bright emissive material suitable for testing...
Definition GlowSphere.hpp:27
Assimp-based model loading and CPU-side mesh/texture data types.
Everything returned by loadModel().
Definition ModelLoader.hpp:76
std::vector< MeshData > meshes
Definition ModelLoader.hpp:77
std::vector< TextureData > textures
Definition ModelLoader.hpp:78
float aoStrength
Definition ModelLoader.hpp:45
float metallicFactor
Default dielectric (non-metal).
Definition ModelLoader.hpp:43
glm::vec4 emissiveFactor
rgb in xyz, w unused.
Definition ModelLoader.hpp:47
AlphaMode alphaMode
Definition ModelLoader.hpp:48
glm::vec4 baseColorFactor
Definition ModelLoader.hpp:42
float roughnessFactor
Default mid-roughness.
Definition ModelLoader.hpp:44
float normalScale
Definition ModelLoader.hpp:46
CPU-side mesh data ready for GPU upload.
Definition ModelLoader.hpp:54
std::vector< uint32_t > indices
Definition ModelLoader.hpp:56
int emissiveTexIndex
Emissive texture.
Definition ModelLoader.hpp:61
std::vector< ModelVertex > vertices
Definition ModelLoader.hpp:55
MaterialData material
Scalar PBR factors.
Definition ModelLoader.hpp:62
One vertex in a loaded 3-D model (PBR-ready).
Definition ModelLoader.hpp:19
glm::vec3 position
Definition ModelLoader.hpp:20
RGBA pixel data for one texture (decoded from embedded PNG/JPEG).
Definition ModelLoader.hpp:67
int height
Definition ModelLoader.hpp:70
std::vector< uint8_t > pixels
Row-major RGBA, 4 bytes per pixel.
Definition ModelLoader.hpp:68
bool isSRGB
True for color textures (albedo, emissive); false for data (normal, MR).
Definition ModelLoader.hpp:71
int width
Definition ModelLoader.hpp:69