This commit is contained in:
2 files changed
+49
-7
No files matched your search
@@ -1139,8 +1139,7 @@ fn sky_sample(key: &InterpolatedKey) -> SkySample {
|
|||||||
fn sun_sample(key: &InterpolatedKey, birth: Option<SunBirth>) -> SunSample {
|
fn sun_sample(key: &InterpolatedKey, birth: Option<SunBirth>) -> SunSample {
|
||||||
let source = key.colors[12].rgba();
|
let source = key.colors[12].rgba();
|
||||||
let intensity = key.parameters[2];
|
let intensity = key.parameters[2];
|
||||||
// Native selector-0 outputs 5/6 are palette[9]/[14] (Terrain.dll RVA 0x3DFB0);
|
// CSun's sprite and flare opacity use palette[10]; its secondary light uses palette[14].
|
||||||
// CSun uses slot 5 alpha for flare opacity (+0x4B3AB) and slot 6 RGB for secondary light (+0x4B4BE).
|
|
||||||
SunSample {
|
SunSample {
|
||||||
active: birth.is_some(),
|
active: birth.is_some(),
|
||||||
rgb: [
|
rgb: [
|
||||||
@@ -1149,7 +1148,7 @@ fn sun_sample(key: &InterpolatedKey, birth: Option<SunBirth>) -> SunSample {
|
|||||||
source[2] * intensity,
|
source[2] * intensity,
|
||||||
],
|
],
|
||||||
values: [key.parameters[0], key.parameters[1]],
|
values: [key.parameters[0], key.parameters[1]],
|
||||||
packed: [key.colors[9], key.colors[14]],
|
packed: [key.colors[10], key.colors[14]],
|
||||||
intensity,
|
intensity,
|
||||||
birth,
|
birth,
|
||||||
}
|
}
|
||||||
@@ -1590,8 +1589,8 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn sun_packed_slots_feed_native_flare_alpha_and_secondary_light() {
|
fn sun_packed_slots_feed_native_flare_alpha_and_secondary_light() {
|
||||||
let mut palette = [0xFF00_0000_u32; KEY_COLOR_COUNT];
|
let mut palette = [0xFF00_0000_u32; KEY_COLOR_COUNT];
|
||||||
palette[9] = 0x4011_2233;
|
palette[9] = 0xFF00_0000;
|
||||||
palette[10] = 0xFFAA_BBCC;
|
palette[10] = 0x4011_2233;
|
||||||
palette[12] = 0xFFFF_FFFF;
|
palette[12] = 0xFFFF_FFFF;
|
||||||
palette[14] = 0x8044_5566;
|
palette[14] = 0x8044_5566;
|
||||||
let bytes = document(2, |out| {
|
let bytes = document(2, |out| {
|
||||||
@@ -1608,7 +1607,7 @@ mod tests {
|
|||||||
|
|
||||||
let sampled = parsed.sample_day(0, 0.0);
|
let sampled = parsed.sample_day(0, 0.0);
|
||||||
assert!(sampled.sun.active);
|
assert!(sampled.sun.active);
|
||||||
assert_eq!(sampled.sun.packed[0], PackedColor(palette[9]));
|
assert_eq!(sampled.sun.packed[0], PackedColor(palette[10]));
|
||||||
assert_eq!(sampled.sun.packed[1], PackedColor(palette[14]));
|
assert_eq!(sampled.sun.packed[1], PackedColor(palette[14]));
|
||||||
|
|
||||||
let birth = sampled.sun.birth.expect("sun birth");
|
let birth = sampled.sun.birth.expect("sun birth");
|
||||||
@@ -1617,7 +1616,7 @@ mod tests {
|
|||||||
0.0,
|
0.0,
|
||||||
crate::sky::SunConfig::from_birth(birth),
|
crate::sky::SunConfig::from_birth(birth),
|
||||||
);
|
);
|
||||||
assert_eq!(sun.sprite_color, PackedColor(palette[9]).rgba());
|
assert_eq!(sun.sprite_color, PackedColor(palette[10]).rgba());
|
||||||
assert_eq!(sun.secondary_color, PackedColor(palette[14]).rgba()[..3]);
|
assert_eq!(sun.secondary_color, PackedColor(palette[14]).rgba()[..3]);
|
||||||
|
|
||||||
let optics = crate::sky::sun_optics(
|
let optics = crate::sky::sun_optics(
|
||||||
@@ -1634,6 +1633,31 @@ mod tests {
|
|||||||
assert!((optics.flares[0].color[3] - 64.0 / 255.0).abs() < 1.0e-6);
|
assert!((optics.flares[0].color[3] - 64.0 / 255.0).abs() < 1.0e-6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sun_sprite_uses_interpolated_palette_ten() {
|
||||||
|
let mut first = [0xFF00_0000_u32; KEY_COLOR_COUNT];
|
||||||
|
first[9] = 0xFF00_0000;
|
||||||
|
first[10] = 0x32FF_2800;
|
||||||
|
first[12] = 0xFFFF_FFFF;
|
||||||
|
let mut second = first;
|
||||||
|
second[10] = 0x4BFF_4A00;
|
||||||
|
let bytes = document(2, |out| {
|
||||||
|
key(out, 0, 0, 0, first, [0.0, 0.0, 1.0, 0.0], &[]);
|
||||||
|
key(out, 12, 0, 1, second, [0.0, 0.0, 1.0, 0.0], &[]);
|
||||||
|
});
|
||||||
|
let mut parsed = TypedAtmosphere::parse(&bytes).expect("parse");
|
||||||
|
for key in &mut parsed.tracks[0].keys {
|
||||||
|
key.strings[0] = AtmosphereString {
|
||||||
|
raw: b"sun".to_vec(),
|
||||||
|
text: "sun".to_owned(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let sampled = parsed.sample_day(0, 7.2 * 3_600.0);
|
||||||
|
assert_eq!(sampled.sun.packed[0], PackedColor(0x41FF_3C00));
|
||||||
|
assert_ne!(sampled.sun.packed[0], PackedColor(first[9]));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn wraps_last_key_to_first_and_emits_events() {
|
fn wraps_last_key_to_first_and_emits_events() {
|
||||||
let palette = [0xFF00_0000_u32; KEY_COLOR_COUNT];
|
let palette = [0xFF00_0000_u32; KEY_COLOR_COUNT];
|
||||||
|
|||||||
@@ -189,6 +189,24 @@ OneShot -> воспроизвести разовый звук молни
|
|||||||
отдельный spatial source, применяет DirectSound range/pan и текущий listener.
|
отдельный spatial source, применяет DirectSound range/pan и текущий listener.
|
||||||
Отсутствие устройства вывода не должно останавливать симуляцию.
|
Отсутствие устройства вывода не должно останавливать симуляцию.
|
||||||
|
|
||||||
|
## Цвет солнца
|
||||||
|
|
||||||
|
Солнце берёт цвет спрайта и прозрачность бликов из `palette[10]` расписания
|
||||||
|
`sky.ske`; `palette[9]` — чёрный specular-компонент. Вторичный направленный
|
||||||
|
свет использует `palette[14]`. При выборке расписания это выражено так:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
packed: [key.colors[10], key.colors[14]],
|
||||||
|
```
|
||||||
|
|
||||||
|
Этот порядок соответствует живому GOG-замеру: `CSun+0x95c` содержал
|
||||||
|
`0x41FF3C00` (интерполяция `palette[10]`), `+0x960` — `0xFF000000`
|
||||||
|
(`palette[9]`), а `+0x964` — вторичный свет из `palette[14]`. В `Terrain.dll`
|
||||||
|
по VA `0x1004AA92..0x1004AAAB` цвет в `+0x95c` обновляется, только если
|
||||||
|
установлен бит 0 результата sky-query; иначе остаётся прежнее значение.
|
||||||
|
`AtmosphereFrame` пока не несёт этот бит обновления, поэтому sampler
|
||||||
|
выдаёт интерполированный цвет при каждом запросе.
|
||||||
|
|
||||||
## Что остаётся за владельцем
|
## Что остаётся за владельцем
|
||||||
|
|
||||||
`EnvironmentSystem` не извлекает камеру из renderer, не разрешает материалы
|
`EnvironmentSystem` не извлекает камеру из renderer, не разрешает материалы
|
||||||
|
|||||||
Reference in new issue
Block a user