feat(fx): evaluate native Op7 particle pools
Docs Deploy / Build and Deploy MkDocs (push) Successful in 40s

This commit is contained in:
Valentin Popov committed 2026-10-18 08:55:47 +04:00
1 parent 2e02325bf0
commit 737e429cb1
3 files changed
+1477

No files matched your search

+14
View File
@@ -10,9 +10,23 @@ pub mod ambient_op3;
pub mod atmosphere; pub mod atmosphere;
pub mod environment; pub mod environment;
pub mod fx_visual; pub mod fx_visual;
pub mod op7;
pub mod shadow; pub mod shadow;
pub mod sky; pub mod sky;
/// Advances the native FX 16-bit-pair random state and returns its new high half.
///
/// Native helpers store `low' = low * 2 ^ high` and `high' = high >> 1 ^ low'`.
#[must_use]
pub fn advance_native_fx_random_state(state: &mut u32) -> u16 {
let low = *state as u16;
let high = (*state >> 16) as u16;
let next_low = low.wrapping_shl(1) ^ high;
let next_high = (high >> 1) ^ next_low;
*state = u32::from(next_low) | (u32::from(next_high) << 16);
next_high
}
use fparkan_binary::{Cursor, DecodeError}; use fparkan_binary::{Cursor, DecodeError};
use std::sync::Arc; use std::sync::Arc;
File diff suppressed because it is too large. Load diff
+20
View File
@@ -265,6 +265,26 @@ D110-порядок. Все три evaluator-а принимают уже соб
`context + 0x60 < 8`, а API этих evaluator-ов не выбирает другой context. `context + 0x60 < 8`, а API этих evaluator-ов не выбирает другой context.
Evaluator типа 2 принимает индекс context явно и учитывает этот gate в `active`. Evaluator типа 2 принимает индекс context явно и учитывает этот gate в `active`.
## Частицы Op7
`fparkan-fx::op7` вычисляет фиксированный набор частиц Op7 по body команды,
фазе эффекта, матрице владельца, позиции камеры и render context. После
инициализации состояние команды сохраняет случайно изменённые треки позиции
и масштаба. Body задаёт время групп, opacity, фазу материала и вертикальное
ускорение; последнее масштабируется переданным world scalar и применяется к
копии матрицы владельца каждой активной группы. Текущий preview
`fparkan-game` передаёт `world_scalar = 10.0`; чтение действующей настройки
мира пока не подключено.
Часы активной группы обновляются до применения detail cutoff отдельной
частицы. Cutoff сравнивает ordinal render context с постоянным порогом слота.
`Effect.dll` `0x1300` использует тот же порядок, поэтому скрытие слота не
останавливает часы его активной группы. Поток частиц последовательно задаёт
случайные изменения позиции и масштаба; для порогов видимости используется
отдельный поток. Шаг LFSR совпадает с нативным переходом двух половин, однако
семена отдельных экземпляров лишь детерминированно заменяют process-global
состояние и не воспроизводят общий порядок вызовов.
## Что остаётся за владельцем ## Что остаётся за владельцем
`EnvironmentSystem` не извлекает камеру из renderer, не разрешает материалы `EnvironmentSystem` не извлекает камеру из renderer, не разрешает материалы