[bug] Реплеи и лучшие моменты: полноценные шейдерные эффекты и HD вместо кубических fireball/flash #56

Closed
opened 2026-10-29 17:52:03 +00:00 by chexit · 2 comments
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Сформировано по прямому запросу автора проекта; текущий код просмотрен на f443f0a. Очень важный фикс по запросу автора. В повторах вместо выразительного огня/вспышек видны блоковые модели, пытающиеся их имитировать. Визуал лучших моментов должен соответствовать бою и поддерживать максимальное качество.

Подтверждённые места

  • record.rs::draw_ghosts создаёт модели airdef:fireball/airdef:flash, а также модельные факелы. Взрывы показываются по отдельной упрощённой 30-тиковой схеме.
  • lib.rs::shader_params/lights строят параметры объёмных взрывов/часть света из живых self.sim.blasts, а не из replay timeline. p[0] — live sim.tick.
  • Реплей показывается через CameraView. В патчах камеры имеют отдельный draw_mod_views с world/entity pipelines; нельзя предполагать, что постэффекты основной камеры автоматически попали в texture другого вида. Требуется проверить/подключить весь нужный конвейер форка.

Исправление

  • Общие effect events/описания для live/replay: огненный шар, flash, факел, след, дым, подсветка, обломки, пожары, звук. Записывать недостающие параметры и seed; не создавать вторую несовместимую версию каждого эффекта.
  • Полноценный view-specific render context: матрицы/depth, источники света, параметры шейдера, replay time/partial time, атмосфера/вода/тени, TAA/volumetric history. Источник эффектов — нужная запись, не текущий налёт.
  • Шейдерное пламя/взрыв заменяют заметные кубические заглушки, когда включён соответствующий рендер. Модельный fallback допустим для явно выключенных эффектов, но не как «максимальное кино».
  • Seek, пауза, slow motion и монтажный cut дают правильный возраст эффекта; после возврата на один timestamp кадр воспроизводим. Нет повторного урона, TNT, реального пожара или смешивания живых звуков/объектов с записью.
  • Вынести качество камеры из ограничений маленьких мониторов. Обычные monitor/grid камеры сохраняют свой экономный профиль; кино и export получают полный конвейер.

Приёмка

Один и тот же перехват над камерой в live и replay: корректные огонь, flash, локальный свет, дым и след, отсутствие кубических заглушек и чужих live-взрывов. Проверить Full/Reel/момент, обратную перемотку и ночь. Качество/разрешение и MP4 развиваются в #58, время окружения — #57. Этот P1-фикс не должен ждать всех новых эффектов из #51.

🤖 Filed by Codex, AI-агент Владимира (chexit). Сформировано по прямому запросу автора проекта; текущий код просмотрен на `f443f0a`. **Очень важный фикс по запросу автора.** В повторах вместо выразительного огня/вспышек видны блоковые модели, пытающиеся их имитировать. Визуал лучших моментов должен соответствовать бою и поддерживать максимальное качество. ### Подтверждённые места - [`record.rs::draw_ghosts`](https://gitea.maoniao.team/chexit/airdef/src/commit/f443f0a94a71eb2d446792f1829146f9563aaf5d/airdef-mod/src/sim/record.rs) создаёт модели `airdef:fireball`/`airdef:flash`, а также модельные факелы. Взрывы показываются по отдельной упрощённой 30-тиковой схеме. - [`lib.rs::shader_params`/`lights`](https://gitea.maoniao.team/chexit/airdef/src/commit/f443f0a94a71eb2d446792f1829146f9563aaf5d/airdef-mod/src/lib.rs) строят параметры объёмных взрывов/часть света из **живых** `self.sim.blasts`, а не из replay timeline. `p[0]` — live sim.tick. - Реплей показывается через CameraView. В патчах камеры имеют отдельный draw_mod_views с world/entity pipelines; нельзя предполагать, что постэффекты основной камеры автоматически попали в texture другого вида. Требуется проверить/подключить весь нужный конвейер форка. ### Исправление - Общие effect events/описания для live/replay: огненный шар, flash, факел, след, дым, подсветка, обломки, пожары, звук. Записывать недостающие параметры и seed; не создавать вторую несовместимую версию каждого эффекта. - Полноценный view-specific render context: матрицы/depth, источники света, параметры шейдера, replay time/partial time, атмосфера/вода/тени, TAA/volumetric history. Источник эффектов — нужная запись, не текущий налёт. - Шейдерное пламя/взрыв заменяют заметные кубические заглушки, когда включён соответствующий рендер. Модельный fallback допустим для явно выключенных эффектов, но не как «максимальное кино». - Seek, пауза, slow motion и монтажный cut дают правильный возраст эффекта; после возврата на один timestamp кадр воспроизводим. Нет повторного урона, TNT, реального пожара или смешивания живых звуков/объектов с записью. - Вынести качество камеры из ограничений маленьких мониторов. Обычные monitor/grid камеры сохраняют свой экономный профиль; кино и export получают полный конвейер. ### Приёмка Один и тот же перехват над камерой в live и replay: корректные огонь, flash, локальный свет, дым и след, отсутствие кубических заглушек и чужих live-взрывов. Проверить Full/Reel/момент, обратную перемотку и ночь. Качество/разрешение и MP4 развиваются в [#58](https://gitea.maoniao.team/chexit/airdef/issues/58), время окружения — [#57](https://gitea.maoniao.team/chexit/airdef/issues/57). Этот P1-фикс не должен ждать всех новых эффектов из [#51](https://gitea.maoniao.team/chexit/airdef/issues/51).
chexit added the area:renderingpriority:P1type:bugarea:simulation labels 2026-10-29 17:52:03 +00:00
Author
Owner

🤖 Agent: Codex — дополнительная проверка на 6f3fc644bc5194311a86baba722bc340215306b7.

В текущую задачу стоит включить завершение и воспроизводимость новых пожаров. Нативный characterization-test показал fires::replay_fire(1,100000.0) = (flame=0, smoke=0.15): level зажимает age/life до 1, но дым при f=1 остаётся 0.15; replay_fire не отсекает age>=life. record.rs::draw_ghosts продолжает эмитить дым при smoke>0.1, тогда как live step_fires удаляет Fire по life. Старые пожары в повторе поэтому дымят бессрочно.

Кроме того replay реконструирует fire из событий и подавляет все следующие события в радиусе 6 блоков без проверки, истёк ли предыдущий пожар; live ignite умеет продлевать/усиливать существующий. При реализации полноценного потока VFX лучше записывать/воспроизводить lifecycle пожара либо использовать один reducer для live/replay. Приёмка: timestamp до/после life, повторное попадание в ту же точку и seek назад/вперёд.

🤖 Agent: Codex — дополнительная проверка на `6f3fc644bc5194311a86baba722bc340215306b7`. В текущую задачу стоит включить завершение и воспроизводимость новых пожаров. Нативный characterization-test показал `fires::replay_fire(1,100000.0) = (flame=0, smoke=0.15)`: `level` зажимает age/life до 1, но дым при f=1 остаётся 0.15; replay_fire не отсекает age>=life. `record.rs::draw_ghosts` продолжает эмитить дым при smoke>0.1, тогда как live step_fires удаляет Fire по life. Старые пожары в повторе поэтому дымят бессрочно. Кроме того replay реконструирует fire из событий и подавляет все следующие события в радиусе 6 блоков без проверки, истёк ли предыдущий пожар; live ignite умеет продлевать/усиливать существующий. При реализации полноценного потока VFX лучше записывать/воспроизводить lifecycle пожара либо использовать один reducer для live/replay. Приёмка: timestamp до/после life, повторное попадание в ту же точку и seek назад/вперёд.
Author
Owner

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/8a12225 (запушено в main).

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/8a12225 (запушено в main).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#56