/**
* Тесты env-света частиц: чистая функция particleEnv (ambient целиком +
* доля солнца) и константы режима lit. Освещаемые частицы видят ровно
* столько света, сколько даёт сцена, — рендер пересчитывает при тиках.
*/
import { describe, expect, it } from 'vitest';
import { particleEnv, PARTICLE_ENV_SUN, litVisibility } from '../particles';
describe('particleEnv (env-свет освещаемых частиц)', () => {
it('ambient входит целиком с интенсивностью', () => {
const [r, g, b] = particleEnv(
{ r: 0.5, g: 0.6, b: 0.7, intensity: 0.5 },
{ r: 0, g: 0, b: 0, intensity: 0 },
);
expect(r).toBeCloseTo(0.25);
expect(g).toBeCloseTo(0.3);
expect(b).toBeCloseTo(0.35);
});
it('солнце входит с долей PARTICLE_ENV_SUN', () => {
const [r] = particleEnv(
{ r: 0, g: 0, b: 0, intensity: 0 },
{ r: 1, g: 1, b: 1, intensity: 2 },
);
expect(r).toBeCloseTo(2 * PARTICLE_ENV_SUN);
});
it('ночь: тёмный ambient + погасшее солнце — свет почти нулевой', () => {
const [r, g, b] = particleEnv(
{ r: 0.04, g: 0.04, b: 0.07, intensity: 0.55 },
{ r: 1, g: 1, b: 1, intensity: 0.08 },
);
const luma = r * 0.3 + g * 0.6 + b * 0.1;
expect(luma).toBeLessThan(0.1); // в темноте частица невидима
});
it('день: ambient + солнце дают received, насыщающий видимость', () => {
const [r, g, b] = particleEnv(
{ r: 0.58, g: 0.58, b: 0.62, intensity: 0.55 },
{ r: 1, g: 0.9, b: 0.8, intensity: 2.0 },
);
const luma = r * 0.3 + g * 0.6 + b * 0.1;
expect(litVisibility(luma)).toBe(1); // vis = 1 — как раньше
});
});
describe('litVisibility (кривая видимости lit-частиц)', () => {
it('ночь в темноте: слабый свет давится квадратом — частица невидима', () => {
// линейная кривая давала vis ~0.1 (серые точки), квадрат — в ~10 раз меньше
expect(litVisibility(0.06)).toBeLessThan(0.015);
expect(litVisibility(0.09)).toBeLessThan(0.03);
});
it('лампа/день: яркий свет насыщает vis в 1', () => {
expect(litVisibility(0.7)).toBe(1);
expect(litVisibility(5)).toBe(1);
});
it('монотонность и клампы: больше света — виднее, минус не ломает', () => {
expect(litVisibility(0.3)).toBeGreaterThan(litVisibility(0.1));
expect(litVisibility(-0.5)).toBe(0);
});
});