diff --git a/v2/CLAUDE.md b/v2/CLAUDE.md index 3c7eb84..33bcce1 100644 --- a/v2/CLAUDE.md +++ b/v2/CLAUDE.md @@ -1506,7 +1506,7 @@ ближний 0.75..1.0 редкий и крупный — стена дождя в глубине; полосы перекрываются — слоистость не видна линиями). Суммарная плотность ~5× одиночного слоя: дождь 0.077 (ливень ~10 700 капель у игры), снег - 0.0405 (~5 800 хлопьев). Глобальный + 0.0415 (~5 800 хлопьев). Глобальный номер gi = i + k·7919/6271 разводит колонки слоёв — без него слои легли бы в одни x. `rainPoints`/`snowPoints(spec, t, win, layer?)` — без layer все слои разом (тесты/счётчики). Потолки RAIN_MAX/SNOW_MAX — diff --git a/v2/apps/game/src/main.ts b/v2/apps/game/src/main.ts index 22bfdf1..75dfc23 100644 --- a/v2/apps/game/src/main.ts +++ b/v2/apps/game/src/main.ts @@ -555,7 +555,9 @@ addCloud: (v) => renderer.addVoxelCloud(v), }) : null; void audio.playTheme(currentArea.id); - // float-цель: следящая камера продолжит с той же точки без микро-скачка + // цель камеры — центр тайла входа; герой может стоять на safeEntry со + // сдвигом (спираль поиска свободного места): первый кадр после фейда + // показывает вход, следящая камера подхватывает героя на первом тике renderer.setTarget([c.x, GROUND_Y, c.z]); } diff --git a/v2/packages/engine/src/index.ts b/v2/packages/engine/src/index.ts index 58ee723..afa8f96 100644 --- a/v2/packages/engine/src/index.ts +++ b/v2/packages/engine/src/index.ts @@ -107,9 +107,9 @@ dayNightAmbient, dayNightFactor, dimColor, flickerFactor, lerpAmbient, lerpColor, } from './render/daynight'; export type { DayNightSpec } from './render/daynight'; -export { DEFAULT_WEATHER, WeatherSystem, clampWeather, snowPoints, windVector, rainPoints } from './render/weather'; +export { DEFAULT_WEATHER, WeatherSystem, clampWeather, snowPoints, windVector, rainPoints, weatherWindow, RAIN_LAYERS, SNOW_LAYERS } from './render/weather'; export type { WeatherSpec } from './render/weather'; -export { LightningSystem, lightningEnvelope, boltPoints, lightningEnvLight, LIGHTNING_TOP, LIGHTNING_DURATION, LIGHTNING_FLASH, LIGHTNING_ENV_SHARE } from './render/lightning'; +export { LightningSystem, lightningEnvelope, boltPoints, lightningEnvLight, LIGHTNING_TOP, LIGHTNING_DURATION, LIGHTNING_FLASH, LIGHTNING_ENV_SHARE, LIGHTNING_COLOR } from './render/lightning'; export type { LightningInfo, BoltPoint } from './render/lightning'; export type { PointLightOptions, PointLightHandle, SpotLightOptions, SpotLightHandle } from './render/voxelRenderer'; // setDayAmbient/setNight/addPointLight/addSpotLight — методы класса VoxelRenderer diff --git a/v2/packages/engine/src/render/lightning.ts b/v2/packages/engine/src/render/lightning.ts index ecc57bf..914cfdf 100644 --- a/v2/packages/engine/src/render/lightning.ts +++ b/v2/packages/engine/src/render/lightning.ts @@ -71,7 +71,7 @@ * от seed (номер удара) — чистая функция, детерминированная. */ export function boltPoints(seed: number, at: readonly [number, number, number]): BoltPoint[] { const pts: BoltPoint[] = []; - const steps = Math.round(LIGHTNING_TOP / 3); // 58 узлов канала + const steps = Math.round(LIGHTNING_TOP / 3); // 59 узлов канала (TOP 176) const p1 = boltHash(seed, 1.3) * Math.PI * 2; // фазы и частоты зигзага const p2 = boltHash(seed, 2.9) * Math.PI * 2; const f1 = 0.55 + boltHash(seed, 4.1) * 0.3; diff --git a/v2/packages/engine/src/render/voxelRenderer.ts b/v2/packages/engine/src/render/voxelRenderer.ts index e1f4323..57af270 100644 --- a/v2/packages/engine/src/render/voxelRenderer.ts +++ b/v2/packages/engine/src/render/voxelRenderer.ts @@ -15,7 +15,7 @@ import { createSpriteLayer, createQuadLayer, makeParticleLightUniforms, packParticleLights, particleEnv } from './particles'; import type { ParticleLayer, ParticleLight, ParticleSpot, ParticleLightUniforms } from './particles'; import { createFogComposite, makeFogUniforms, fogColor } from './fog'; -import { LIGHTNING_FLASH, LIGHTNING_TOP, lightningEnvLight } from './lightning'; +import { LIGHTNING_COLOR, LIGHTNING_FLASH, LIGHTNING_TOP, lightningEnvLight } from './lightning'; import { particleWindow } from './polyWindow'; /** Облако деформированных вокселей (позы рига — не выровнены по сетке). */ @@ -246,7 +246,9 @@ this.scene.add(this.zenith.target); // вспышка молнии: направленный свет с тенями из точки разряда, // по умолчанию погашен (visible false — shadow map не рендерится) - this.flash = new THREE.DirectionalLight(0xdfe8ff, 0); + this.flash = new THREE.DirectionalLight( + new THREE.Color(...LIGHTNING_COLOR), 0, // 0xdfe8ff + ); this.flash.castShadow = true; this.flash.visible = false; this.flash.shadow.mapSize.set(1024, 1024); diff --git a/v2/packages/engine/src/render/weather.ts b/v2/packages/engine/src/render/weather.ts index d0939c8..8385a80 100644 --- a/v2/packages/engine/src/render/weather.ts +++ b/v2/packages/engine/src/render/weather.ts @@ -119,7 +119,7 @@ { from: 0.75, to: 1.0, density: 0.008 }, // ближний: редкие крупные капли ]; -/** Полосы глубины слоёв снега и плотности (сумма 0.0405 против 0.007). */ +/** Полосы глубины слоёв снега и плотности (сумма 0.0415 против 0.007). */ const SNOW_BANDS: readonly { from: number; to: number; density: number }[] = [ { from: 0.0, to: 0.3, density: 0.010 }, { from: 0.15, to: 0.45, density: 0.008 },