Files
PSPRecomp/docs/VCS_CLOUDWORKS_GAME_INTEGRATION.md
Jessica_Natalia 099ce10186 volumetric clouds update 3
volumetric clouds update 3
2026-08-13 16:57:15 -03:00

80 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.