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

4.8 KiB
Raw Permalink Blame History

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.