aboutsummaryrefslogtreecommitdiff
path: root/src/scene/scene_types.h
blob: 9ca3276c73611aa4a4a08779ff55b103f4abf675 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#pragma once

#include <glm/glm.hpp>

namespace Donut
{
    // backend-agnostic scene/black-hole data shared by the Application and the
    // portable renderers (SceneRenderer, BlackHoleRenderer). the rendering itself
    // is written once on the RHI (rendering/rhi.h); these are just the inputs.

    // the scene editor and the simulation share ONE world at this scale: this many
    // grid units == one Schwarzschild radius. the SceneRenderer draws the hole's
    // horizon at this radius; the BlackHoleRenderer maps scene positions into
    // physical units (x SagA_rs / SCENE_UNITS_PER_RS) so placed objects line up.
    constexpr float SCENE_UNITS_PER_RS = 3.0f;

    // a placeable/editable sphere in the world-builder scene view. the app owns
    // the list; SceneRenderer draws it the same way on every backend.
    struct SceneObject
    {
        glm::vec3 position = { 0.0f, 2.0f, 0.0f };
        float     radius   = 2.0f;
        glm::vec3 color    = { 0.85f, 0.35f, 0.2f };
    };

    // live-tunable black-hole / accretion-disk parameters. radii are in
    // Schwarzschild radii; the inner edge is clamped to the ISCO (3 r_s).
    struct BlackHoleParams
    {
        float disk_inner_rs = 3.0f;      // inner edge (x r_s)
        float disk_outer_rs = 12.0f;     // outer edge (x r_s)
        float temperature   = 4800.0f;   // Kelvin at the flux peak (disk colour)
        float brightness    = 0.9f;      // disk exposure
        float turbulence    = 0.4f;      // 0 = smooth physical disk
        int   quality_steps = 15000;     // geodesic integration steps
        float fov_degrees   = 60.0f;     // camera field of view
    };
}