mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-25 16:30:15 +00:00
Implement WoW-accurate DBC-driven sky system with lore-faithful celestial bodies
Add SkySystem coordinator that follows WoW's actual architecture where skyboxes are authoritative and procedural elements serve as fallbacks. Integrate lighting system across all renderers (terrain, WMO, M2, character) with unified parameters. Sky System: - SkySystem coordinator manages skybox, celestial bodies, stars, clouds, lens flare - Skybox is authoritative (baked stars from M2 models, procedural fallback only) - skyboxHasStars flag gates procedural star rendering (prevents double-star bug) Celestial Bodies (Lore-Accurate): - Two moons: White Lady (30-day cycle, pale white) + Blue Child (27-day cycle, pale blue) - Deterministic moon phases from server gameTime (not deltaTime toys) - Sun positioning driven by LightingManager directionalDir (DBC-sourced) - Camera-locked sky dome (translation ignored, rotation applied) Lighting Integration: - Apply LightingManager params to WMO, M2, character renderers - Unified lighting: directional light, diffuse color, ambient color, fog - Star occlusion by cloud density (70% weight) and fog density (30% weight) Documentation: - Add comprehensive SKY_SYSTEM.md technical guide - Update MEMORY.md with sky system architecture and anti-patterns - Update README.md with WoW-accurate descriptions Critical design decisions: - NO latitude-based star rotation (Azeroth not modeled as spherical planet) - NO always-on procedural stars (skybox authority prevents zone identity loss) - NO universal dual-moon setup (map-specific celestial configurations)
This commit is contained in:
parent
159a434c60
commit
8e60d0e781
16 changed files with 1036 additions and 47 deletions
|
|
@ -27,8 +27,14 @@ public:
|
|||
* Render celestial bodies (sun and moon)
|
||||
* @param camera Camera for view matrix
|
||||
* @param timeOfDay Time of day in hours (0-24)
|
||||
* @param sunDir Optional sun direction from lighting system (normalized)
|
||||
* @param sunColor Optional sun color from lighting system
|
||||
* @param gameTime Optional server game time in seconds (for deterministic moon phases)
|
||||
*/
|
||||
void render(const Camera& camera, float timeOfDay);
|
||||
void render(const Camera& camera, float timeOfDay,
|
||||
const glm::vec3* sunDir = nullptr,
|
||||
const glm::vec3* sunColor = nullptr,
|
||||
float gameTime = -1.0f);
|
||||
|
||||
/**
|
||||
* Enable/disable celestial rendering
|
||||
|
|
@ -42,10 +48,16 @@ public:
|
|||
void update(float deltaTime);
|
||||
|
||||
/**
|
||||
* Set moon phase (0.0 = new moon, 0.25 = first quarter, 0.5 = full, 0.75 = last quarter, 1.0 = new)
|
||||
* Set White Lady phase (primary moon, 0.0 = new, 0.5 = full, 1.0 = new)
|
||||
*/
|
||||
void setMoonPhase(float phase);
|
||||
float getMoonPhase() const { return moonPhase; }
|
||||
float getMoonPhase() const { return whiteLadyPhase_; }
|
||||
|
||||
/**
|
||||
* Set Blue Child phase (secondary moon, 0.0 = new, 0.5 = full, 1.0 = new)
|
||||
*/
|
||||
void setBlueChildPhase(float phase);
|
||||
float getBlueChildPhase() const { return blueChildPhase_; }
|
||||
|
||||
/**
|
||||
* Enable/disable automatic moon phase cycling
|
||||
|
|
@ -53,6 +65,12 @@ public:
|
|||
void setMoonPhaseCycling(bool enabled) { moonPhaseCycling = enabled; }
|
||||
bool isMoonPhaseCycling() const { return moonPhaseCycling; }
|
||||
|
||||
/**
|
||||
* Enable/disable two-moon rendering (White Lady + Blue Child)
|
||||
*/
|
||||
void setDualMoonMode(bool enabled) { dualMoonMode_ = enabled; }
|
||||
bool isDualMoonMode() const { return dualMoonMode_; }
|
||||
|
||||
/**
|
||||
* Get sun position in world space
|
||||
*/
|
||||
|
|
@ -77,11 +95,27 @@ private:
|
|||
void createCelestialQuad();
|
||||
void destroyCelestialQuad();
|
||||
|
||||
void renderSun(const Camera& camera, float timeOfDay);
|
||||
void renderMoon(const Camera& camera, float timeOfDay);
|
||||
void renderSun(const Camera& camera, float timeOfDay,
|
||||
const glm::vec3* sunDir = nullptr,
|
||||
const glm::vec3* sunColor = nullptr);
|
||||
void renderMoon(const Camera& camera, float timeOfDay); // White Lady (primary)
|
||||
void renderBlueChild(const Camera& camera, float timeOfDay); // Blue Child (secondary)
|
||||
|
||||
float calculateCelestialAngle(float timeOfDay, float riseTime, float setTime) const;
|
||||
|
||||
/**
|
||||
* Compute moon phase from game time (deterministic)
|
||||
* @param gameTime Server game time in seconds
|
||||
* @param cycleDays Lunar cycle length in game days
|
||||
* @return Phase 0.0-1.0 (0=new, 0.5=full, 1.0=new)
|
||||
*/
|
||||
float computePhaseFromGameTime(float gameTime, float cycleDays) const;
|
||||
|
||||
/**
|
||||
* Update moon phases from game time (server-driven)
|
||||
*/
|
||||
void updatePhasesFromGameTime(float gameTime);
|
||||
|
||||
std::unique_ptr<Shader> celestialShader;
|
||||
|
||||
uint32_t vao = 0;
|
||||
|
|
@ -90,11 +124,18 @@ private:
|
|||
|
||||
bool renderingEnabled = true;
|
||||
|
||||
// Moon phase system
|
||||
float moonPhase = 0.5f; // 0.0-1.0 (0=new, 0.5=full)
|
||||
// Moon phase system (two moons in Azeroth lore)
|
||||
float whiteLadyPhase_ = 0.5f; // 0.0-1.0 (0=new, 0.5=full) - primary moon
|
||||
float blueChildPhase_ = 0.25f; // 0.0-1.0 (0=new, 0.5=full) - secondary moon
|
||||
bool moonPhaseCycling = true;
|
||||
float moonPhaseTimer = 0.0f;
|
||||
static constexpr float MOON_CYCLE_DURATION = 240.0f; // 4 minutes for full cycle
|
||||
float moonPhaseTimer = 0.0f; // Fallback for deltaTime mode (development)
|
||||
bool dualMoonMode_ = true; // Default: render both moons (Azeroth-specific)
|
||||
|
||||
// WoW lunar cycle constants (in game days)
|
||||
// WoW day = 24 real minutes, so these are ~realistic game-world cycles
|
||||
static constexpr float WHITE_LADY_CYCLE_DAYS = 30.0f; // ~12 real hours for full cycle
|
||||
static constexpr float BLUE_CHILD_CYCLE_DAYS = 27.0f; // ~10.8 real hours (slightly faster)
|
||||
static constexpr float MOON_CYCLE_DURATION = 240.0f; // Fallback: 4 minutes (deltaTime mode)
|
||||
};
|
||||
|
||||
} // namespace rendering
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue