volumetric clouds update 3
4.8 KiB
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
- Encontrar referências às variáveis de hora conhecidas no AOT/disassembly e seguir os consumidores que atualizam iluminação, céu e clima.
- Instrumentar somente candidatos concretos, no máximo uma vez por frame, em um log contendo hora, weather IDs/interpolação, vetores e cores.
- Capturar uma rota reproduzível cobrindo meio-dia, pôr do sol, noite, amanhecer, chuva e neblina. Confirmar continuidade e faixa de cada campo.
- Criar um
VcsCloudWeatherStatelido doGuestMemoryno mesmo ponto em que a câmera autoritativa é capturada. Nunca ler guest memory no pixel/draw hot path. - Manter fallback por campo: valor guest validado quando finito e dentro da faixa; caso contrário, placeholder do INI e aviso limitado no log.
- 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.