#pragma once // ----------------------------------------------------------------------------- // Всё render-only состояние живёт здесь и только здесь. // // Зачем отдельная структура: правило «эффекты не текут в симуляцию» должно // проверяться компилятором, а не вниманием. RenderGame принимает Game по // КОНСТАНТНОЙ ссылке — значит ни свет, ни трассеры, ни тряска камеры физически // не могут изменить состояние симуляции. Headless-прогоны (--accept, --headless) // View не создают вообще, поэтому цифры приёмки остаются цифрами симуляции. // ----------------------------------------------------------------------------- #include "render/atmos.h" #include "render/blood.h" #include "render/framebuffer.h" #include "render/fx.h" #include "render/iso.h" #include "render/lighting.h" #include "render/post.h" #include "render/scene.h" struct Game; struct View { iso::Camera cam; Scene scene; Lighting lighting; FxSystem fx; PostFx post; Dread dread; BloodField blood; // вечные декали, запечённые в спрайты пола Atmosphere atmos; // пепел в воздухе // Дельты считаются по накопительным счётчикам метрик: за один кадр рендера // проходит до MAX_STEPS_PER_FRAME шагов, поэтому флаг «выстрелил» не годится. int prevShots = 0; int prevKills = 0; int prevFriendly = 0; int prevMeleeHits = 0; bool horrorEnabled = true; // F5 — аварийный возврат к прежнему кадру bool showSight = false; // F6 — показать диски обзора // Гамма и усиление меняют САМУ таблицу рампы: без перепечатки ручки молчат. float rampGamma = -1.0f; float rampGain = -1.0f; void Init(); void RefreshRamp(); void Reset(const Game& game); }; void RenderGame(const Game& game, View& view, Framebuffer& fb, float alpha, float frameDt);