mirror of
https://github.com/jessicanataliagta/PSPRecomp
synced 2026-10-01 09:56:09 -04:00
099ce10186
volumetric clouds update 3
80 lines
4.8 KiB
Markdown
80 lines
4.8 KiB
Markdown
# CloudWorks: integração 1:1 com o estado do GTA VCS
|
||
|
||
## Estado atual
|
||
|
||
O shader usa os três perfis físicos, march adaptativo, sombras, extinção,
|
||
atmosfera e composição front-to-back do CloudWorks/ProperShaders. A câmera vem
|
||
do estado autoritativo do jogo (`TheCamera + 0x9B0`) e o passe é inserido no
|
||
world target depois dos opacos e antes do primeiro grupo equivalente a
|
||
`FadingEntities`.
|
||
|
||
Os valores que o ProperShaders de San Andreas obtém do timecycle e de
|
||
`CWeather` ainda são placeholders em `ProperShaders.ini`. Isso é intencional:
|
||
ligar um endereço não confirmado ao shader produz mudanças de clima erradas ou
|
||
leituras inválidas e não constitui uma integração 1:1.
|
||
|
||
## Fontes que precisam ser identificadas no guest
|
||
|
||
Para substituir cada placeholder, localizar no ELF do VCS e validar em runtime:
|
||
|
||
| Campo do INI | Fonte conceitual do ProperShaders/SA | Evidência necessária no VCS |
|
||
|---|---|---|
|
||
| `CoverageLow/Mid/High` | grupos de clima atual/anterior e interpolação | observar transições sunny/cloudy/rain/fog e reconstruir os três pesos |
|
||
| `SunDirection*` | direção real do sol ou lua | vetor unitário acompanhando hora; confirmar eixos do mundo do VCS |
|
||
| `DayProgression` | componente vertical da direção solar | faixa e pontos de troca sol/lua confirmados durante um ciclo completo |
|
||
| `SunColor*` | cor da corona/timecycle, modulada pelo clima | identificar RGB linear versus 0–255 e interpolação old/new weather |
|
||
| `CloudBaseColor*` | cor da base das nuvens do timecycle | separar da cor do céu/horizonte e validar dia, pôr do sol, noite e chuva |
|
||
| `AtmosphereDensity` | intensidade de chuva | localizar intensidade interpolada, não apenas o ID do clima |
|
||
| `Mist` | chuva, neblina e cloudiness combinadas | validar as três intensidades continuamente interpoladas |
|
||
| `FogColor*` | cor inferior do céu/horizonte | confirmar espaço de cor e ordem RGB |
|
||
| `FogStart` | plano inicial de fog da câmera | comparar com comandos GE `FOG1/FOG2` e o far clip do frame |
|
||
| `Speed` | tempo em segundos e vento | relógio monotônico do jogo + intensidade de vento interpolada |
|
||
| `RandomSeed` | seed de início/save, limitado e convertido em fase | escolher estatística estável e aplicar wrap em `2*pi` |
|
||
|
||
O relógio já tem uma pista confirmada: `gp + 0x1DE0` (hora) e
|
||
`gp + 0x1DE1` (minuto), usados por Project2DFX. Isso ajuda a localizar as
|
||
rotinas adjacentes de `CClock`, mas não substitui a direção solar contínua.
|
||
|
||
## Método de investigação
|
||
|
||
1. Encontrar referências às variáveis de hora conhecidas no AOT/disassembly e
|
||
seguir os consumidores que atualizam iluminação, céu e clima.
|
||
2. Instrumentar somente candidatos concretos, no máximo uma vez por frame, em
|
||
um log contendo hora, weather IDs/interpolação, vetores e cores.
|
||
3. Capturar uma rota reproduzível cobrindo meio-dia, pôr do sol, noite,
|
||
amanhecer, chuva e neblina. Confirmar continuidade e faixa de cada campo.
|
||
4. Criar um `VcsCloudWeatherState` lido do `GuestMemory` no mesmo ponto em que a
|
||
câmera autoritativa é capturada. Nunca ler guest memory no pixel/draw hot path.
|
||
5. Manter fallback por campo: valor guest validado quando finito e dentro da
|
||
faixa; caso contrário, placeholder do INI e aviso limitado no log.
|
||
6. Comparar screenshots pareadas contra o ProperShaders com as mesmas entradas
|
||
numéricas antes de ajustar qualquer constante artística.
|
||
|
||
## Renderização e ordem
|
||
|
||
O PSP não expõe um marcador chamado `RenderFadingEntities`. A fronteira atual é
|
||
inferida pelo estado GE: após geometria do world target com depth test+write,
|
||
sem blend/alpha test, o primeiro draw com blend, alpha test ou depth sem write é
|
||
tratado como o início dos objetos transparentes. O passe de nuvens é gravado
|
||
imediatamente antes desse draw, com depth `EQUAL` ao clear reverso (zero), para
|
||
preencher somente céu e permitir que árvores/grades/partículas sejam desenhadas
|
||
por cima.
|
||
|
||
Essa heurística deve ser validada em interiores, água, chuva, reflexos e efeitos
|
||
de missão. Se houver falsos limites, o passo seguinte é identificar o PC guest
|
||
da função que emite o primeiro draw de fading e transportar um marcador de fase
|
||
para o backend GE.
|
||
|
||
## Critérios para considerar a integração concluída
|
||
|
||
- Nenhum parâmetro visual de clima permanece obrigatório no INI.
|
||
- Transições old/new weather são contínuas e não saltam entre frames.
|
||
- Sol, lua, fog e base das nuvens acompanham o timecycle em um ciclo de 24 h.
|
||
- Nuvens ficam fixas no mundo durante rotação e translação da câmera.
|
||
- Opacos ocluem as nuvens; fading/folhagem/partículas são compostos por cima.
|
||
- Interior e cutscene não reutilizam uma câmera/target auxiliar.
|
||
- Um toggle desativa o recurso sem alterar a imagem original.
|
||
- Capturas A/B com entradas iguais reproduzem o ProperShaders sem ajustes
|
||
específicos feitos apenas para uma screenshot.
|
||
|