Divine Skins
Divine Skins Wiki

Bin & Particle Dictionary

Uma referência das propriedades dentro de um bin de VFX de League of Legends, organizada pela classe à qual cada uma realmente pertence.

Escrito por DAKA

Todas as outras páginas desta seção ensinam você a fazer alguma coisa. Esta é para o momento em que você está rolando um dump .py, esbarra numa propriedade que nunca viu e só quer saber o que ela é e onde fica.

As entradas estão agrupadas pela classe dona delas, porque num bin o mesmo nome pode aparecer em mais de uma classe, e saber em qual você está decide o que o valor faz.

Leia isto ao lado do Ruby

A maioria dessas propriedades fica mais fácil de entender mexendo nelas do que lendo sobre elas. O Ruby mostra VFX em qualquer campeão e tem um editor de bin embutido, então você muda um valor e olha a viewport em vez de empacotar um mod para descobrir o que aconteceu.

De onde vêm estes nomes

Cada classe, propriedade e tipo desta página foi lido do próprio layout de classes registrado pela engine, conferido no patch 16.16. Nomes de campos que não existem mais foram removidos, e os que vivem numa classe diferente da esperada estão marcados com onde realmente ficam. Alguns comportamentos estão anotados onde a engine faz algo diferente do que o nome da propriedade sugere.

Você encontra os dados estruturais aqui lol-meta-classes. Você também encontra documentação sobre as meta classes e suas propriedades em lol-meta-wiki.


Como ler um bin

Um bin de VFX é uma árvore. A espinha dorsal é assim:

VfxSystemDefinitionData              um efeito completo, por ex. um recall ou um Q
└── complexEmitterDefinitionData     a lista de emissores do sistema
    └── VfxEmitterDefinitionData     um emissor: um rastro, um flash, faíscas
        ├── primitive                o que cada partícula desenha
        └── ponteiros *Definition    erosão, paleta, distorção, filhos, ...

VfxSystemDefinitionData é o contêiner. Uma propriedade que não estiver dentro do sistema tocado durante uma habilidade não vai aparecer durante essa habilidade.

O emissor é onde você passa a maior parte do tempo. Ele carrega 135 campos registrados sozinho, e pendura uma dúzia de objetos de sub-definição opcionais em ponteiros. Um ponteiro nulo significa que aquele recurso inteiro está desligado, e é por isso que apagar um bloco costuma ser a forma correta de desativar alguma coisa.

Invólucros de valor

Propriedades numéricas costumam vir embrulhadas para que a engine possa mantê-las constantes ou variá-las:

rate: embed = ValueFloat {
    constantValue: f32 = 20
}

Os invólucros são ValueFloat, ValueColor, ValueVector2 e ValueVector3. Cada um guarda um constantValue mais um ponteiro dynamics opcional. São dois campos separados, não duas grafias do mesmo campo: a constante está sempre lá, e dynamics é um objeto extra pendurado nela.

ChaveVive emO que é
constantValueno invólucroO valor escrito. O tipo acompanha o invólucro: f32, vec4, vec2, vec3
dynamicsno invólucroPonteiro para um objeto de variável animada. Nulo significa que a constante é usada como está
timesno objeto dynamicsPosições ao longo da curva
valuesno objeto dynamicsO valor em cada entrada correspondente de times
probabilityTablesno objeto dynamicsAleatorização por partícula. Veja abaixo
probabilityTables multiplica, não seleciona

Uma tabela de probabilidade costuma ser lida como "escolha um destes valores ao acaso". Não é isso. Cada tabela passa um sorteio aleatório uniforme pela sua própria curva keyTimes para keyValues e devolve um multiplicador, que é então aplicado ao constantValue. O sorteio acontece uma vez por partícula, no nascimento.

Então um constantValue de 5 com uma tabela devolvendo a faixa 0.5 a 1 dá a cada partícula um valor entre 2.5 e 5. Uma tabela cujos keyValues cruzam o zero, como -1 a 1, inverte o sinal em cerca de metade das partículas. É a explicação habitual para um efeito em que algumas partículas rolam ou giram no sentido contrário às demais.

Note que keyTimes numa tabela de probabilidade é o eixo do sorteio, não a idade da partícula.

Propriedades de nascimento e seus pares ao longo da vida

Muitas propriedades vêm em pares. A de birth* é avaliada uma vez, quando a partícula nasce. A parceira sem o prefixo continua agindo ao longo da vida da partícula, e é multiplicada com o valor de nascimento em vez de substituí-lo.

No nascimentoAo longo da vida
birthColorColor
birthScale0scale0
birthRotation0rotation0
birthVelocityvelocity
birthAccelerationacceleration
birthDragdrag

Se um valor parece errado e só metade de um par está escrita, confira a outra metade antes de mudar qualquer coisa.

Unidades

Rotações e velocidades de rotação são em graus e graus por segundo. Tempos de vida, períodos e atrasos são em segundos. Velocidades de rolagem de UV são em UVs por segundo, e rotação de UV em graus. Canais de cor vão de 0 a 1.

Aleatorização e o sufixo 0

Várias propriedades de nascimento terminam em 0, como birthScale0 e birthRotation0. Isso é resquício de nomenclatura, não um par mínimo-máximo. Não existe birthScale1 na classe de emissor atual. A variação por partícula vem de probabilityTables, como acima.

Bytes de flags

Muitos booleanos não são campos separados. São bits isolados empacotados em bytes de flags compartilhados no emissor. Ferramentas de texto os expõem um a um como flag, então você escreve um de cada vez, mas eles vivem quatro ou oito por byte. A lista completa está em Flags do emissor.


Nível do sistema

VfxSystemDefinitionData, o contêiner mais externo. 33 campos registrados no patch 16.16.

PropriedadeTipoO que faz
particleNamestringNome legível do sistema inteiro. Pode renomear sem medo, e é a coisa mais confiável para procurar quando o hash do contêiner não está resolvido
particlePathstringAgrupamento de caminho que a engine usa para organizar sistemas
complexEmitterDefinitionDatalist[embed]Os emissores deste sistema. O corpo do efeito
simpleEmitterDefinitionDatalist[embed]A lista de emissores mais antiga. Ainda presente em sistemas legacy
materialOverrideDefinitionslist[embed]Sobrescritas de material no nível do sistema. O emissor tem a própria lista de mesmo nome
transformmtx44Aplicado ao sistema inteiro, para escalar, mover e girar tudo de uma vez. Veja Matrix Scaling
flagsu16Flags de bit no nível do sistema. Duas são conhecidas: 0x100 troca velocidade e drag por uma solução analítica, e 0x800 é um modo low-spec agressivo. Padrão 212
mEyeCandyboolMarca o sistema como enfeite, então ele some quando o jogador liga Ocultar efeitos visuais
buildUpTimef32Período de aquecimento do sistema
visibilityRadiusf32Raio de culling
overrideScaleCapoption[f32]Limita o quanto o sistema pode ser escalado
scaleDynamicallyWithAttachedBoneboolA escala do sistema acompanha o osso ao qual está preso
objectPathhashIdentificador de caminho de objeto. Adicionado no patch 16.16
drawingLayeru8Em qual camada o sistema desenha
ClockToUseu8Qual relógio governa o tempo do sistema
selfIlluminationf32Quantidade de auto-iluminação
assetRemappingTablelist[embed]Remapeamentos de assets aplicados dentro do sistema
soundOnCreateDefaultstringSom disparado quando o sistema é criado
voiceOverOnCreateDefaultstringFala disparada na criação
soundPersistentDefaultstringSom em loop durante a vida do sistema
mEyeCandy é uma propriedade do sistema

Ela fica em VfxSystemDefinitionData, não no emissor, e por isso pertence ao nível de sistema do bloco em vez de ficar junto das configurações de renderização do emissor.


Emissor: identidade e tempo de vida

VfxEmitterDefinitionData. Tudo daqui até Flags do emissor está nesta classe, a menos que uma linha diga o contrário.

PropriedadeTipoO que faz
emitterNamestringNome legível de um emissor. Pode renomear sem medo, e vale a pena
disabledboolDesliga o emissor sem apagá-lo
importanceu8Prioridade de culling por qualidade, comparada com a configuração de vídeo Qualidade dos efeitos. Veja a tabela abaixo. Padrão 2
particleLifetimeValueFloatQuanto tempo cada partícula vive depois de emitida. Vale 3.0 por padrão se ausente. -1 é uma sentinela, veja o aviso abaixo
lifetimeoption[f32]Quanto tempo o próprio emissor roda
particleLingeroption[f32]Segundos extras em que as partículas continuam visíveis depois que o emissor termina. Se ausente, vale particleLifetime + 10, não zero
emitterLingeroption[f32]Segundos extras em que o próprio emissor permanece
particleLingerTypeu8Qual comportamento de permanência é usado
LingerpointerUm VfxLingerDefinitionData, para permanência que altera a partícula em vez de só atrasar o sumiço
flexParticleLifetimepointerSobrescrita flex do tempo de vida da partícula
particleLifetime -1 significa duas coisas opostas

-1 não significa "partícula infinita". Significa "viver até o emissor parar", e o que isso dá depende inteiramente de isSingleParticle.

Com isSingleParticle ligado, o clamp da janela de emissão é pulado, então a janela fica sem teto, o emissor nunca termina e a partícula persiste indefinidamente. É assim que se constrói um adereço preso permanentemente.

Sem isSingleParticle, o ramo do clamp nunca roda e a janela de emissão fica no lifetime escrito. O emissor para ali e leva as partículas junto, então um -1 contínuo some em vez de persistir.

Um 9999 escrito se comporta igual a -1.

Como importance faz o culling

importance é comparada com a configuração Qualidade dos efeitos do jogador quando o sistema monta seus emissores. É uma categoria, não uma escala, e dois dos valores se comportam de um jeito que o nome não sugere.

Qualidade dos efeitosValores de importance pulados
0 a 1, Muito baixa e Baixa0, 1, 5
2, Média0, 1
3, Alta0, 4
4, Muito alta4

Então 0 a 3 sobem em prioridade, e 3 é crítico para a jogabilidade e nunca é cortado. 4 é um substituto de baixa qualidade mostrado só em configurações baixas, e 5 é o inverso, mostrado só de Média para cima. Parear um emissor 4 com um emissor 5 é como um efeito entrega duas versões de si mesmo.

Outras quatro coisas decidem se um emissor existe: disabled, colorblindVisibility, ChanceToNotExist e o bit 0x800 das flags do sistema, que remove tudo exceto importance 3 e 4.

rate, lifetime, particleLifetime e particleLinger aparecem com capturas de tela na página Emitter Library.


Emissor: emissão e tempo

PropriedadeTipoO que faz
rateValueFloatPartículas emitidas por segundo. Num emissor isSingleParticle ela define a quantidade de partículas em vez disso
flexRatepointerSobrescrita flex da taxa
rateByVelocityFunctionValueVector2Escala a taxa conforme a velocidade de deslocamento do emissor
MaximumRateByVelocityoption[f32]Limite superior para o acima
timeBeforeFirstEmissionf32Atraso antes de qualquer coisa nascer. Útil para escalonar um sistema em etapas
periodoption[f32]Duração de um ciclo de emissão
timeActiveDuringPeriodoption[f32]Quanto de cada period o emissor realmente emite
ChanceToNotExistf32Probabilidade de o emissor ser pulado por completo ao nascer
SpawnShapepointerUm IVfxShape dando o volume onde as partículas nascem
FlexShapeDefinitionpointerVariante flex da forma de nascimento
emissionSurfaceDefinitionpointerNascimento sobre uma superfície em vez de um volume
emissionMeshNamestringUma mesh usada como forma de emissão
emissionMeshScalef32Escala essa mesh de emissão
period e timeActiveDuringPeriod são como se fazem rajadas

Ponha period na duração do ciclo e timeActiveDuringPeriod num valor menor, e o emissor pulsa em vez de rodar continuamente. Deixar os dois vazios dá um fluxo constante.


Emissor: posicionamento e orientação

PropriedadeTipoO que faz
EmitterPositionValueVector3Onde as partículas nascem em relação à origem do emissor. Y positivo é para cima
translationOverridevec3Desloca o emissor como um todo
rotationOverridevec3Gira o emissor como um todo
scaleOverridevec3Escala o emissor como um todo
FlexInstanceScalepointerSobrescrita flex da escala da instância
bindWeightValueFloatO quanto a partícula acompanha aquilo a que está presa. 1 acompanha totalmente, 0 a deixa para trás no espaço do mundo
postRotateOrientationAxisvec3Eixo usado quando hasPostRotateOrientation está ligado
offsetLifetimeScalingvec3Escala o tempo de vida da partícula pela distância em que ela nasceu do emissor, por eixo
offsetLifeScalingSymmetryModeu8Modo de simetria para o acima
EmitterPosition ou translationOverride?

EmitterPosition move onde as partículas nascem dentro do emissor. translationOverride desloca o emissor como um todo. Se um emissor está fora de lugar use o segundo; se as partículas estão mal posicionadas dentro de um emissor de resto correto, use o primeiro.


Emissor: propriedades de nascimento

O estado que a partícula recebe no instante em que nasce. Tudo chamado birth* é condição inicial, não contínua.

PropriedadeTipoO que faz
birthColorValueColorCor inicial, RGBA
birthScale0ValueVector3Tamanho inicial
birthRotation0ValueVector3Rotação inicial
birthRotationalVelocity0ValueVector3Velocidade de giro inicial
birthRotationalAccelerationValueVector3Aceleração rotacional inicial
birthVelocityValueVector3Velocidade inicial
birthAccelerationValueVector3Aceleração inicial
birthDragValueVector3Drag inicial
birthOrbitalVelocityValueVector3Rotação orbital. Veja o aviso abaixo
birthFrameRateValueFloatTaxa de reprodução inicial para uma textura animada
birthUVOffsetValueVector2Deslocamento inicial dentro da textura. Útil para dessincronizar partículas que dividem uma folha
birthUvScrollRateValueVector2Taxa inicial de rolagem de UV
birthUvRotateRateValueFloatTaxa inicial de rotação de UV

Cada uma tem uma irmã flex* (flexBirthVelocity, flexBirthUVOffset, flexScaleBirthScale e assim por diante) que a sobrescreve quando um valor flex é fornecido.

birthOrbitalVelocity não adiciona velocidade nenhuma

Apesar do nome, ela não contribui em nada para a velocidade da partícula. É só transformação: gira a matriz própria da partícula enquanto a posição armazenada continua avançando por birthVelocity e forças apenas.

Isso importa se você está raciocinando sobre a distância que uma partícula percorre. Tratá-la como velocidade tangencial somada à rotação conta o movimento duas vezes e dá exatamente o dobro do comprimento do caminho.


Emissor: movimento ao longo da vida

Onde birth* define o estado inicial, estas continuam agindo.

PropriedadeTipoO que faz
velocityValueVector3Velocidade ao longo da vida da partícula
accelerationValueVector3Aceleração ao longo da vida
worldAccelerationIntegratedValueVector3Aceleração no espaço do mundo, independente da orientação da partícula. A gravidade mora aqui, como Y negativo
dragValueVector3Drag ao longo da vida
scale0ValueVector3Escala ao longo da vida, multiplicada com birthScale0
rotation0IntegratedValueVector3Rotação ao longo da vida
directionVelocityScalef32O quanto a partícula se estica na direção do movimento com a velocidade. Usado com isDirectionOriented
directionVelocityMinScalef32Piso desse esticamento
fieldCollectionDefinitionpointerCampos de força. Veja Campos de força

Emissor: cor

PropriedadeTipoO que faz
birthColorValueColorCor ao nascer
ColorValueColorCor ao longo da vida da partícula, multiplicada com birthColor. Branco por padrão
colorLookUpTypeX / colorLookUpTypeYu8O que governa cada eixo da leitura em particleColorTexture, por exemplo a idade da partícula
colorLookUpScalesvec2Escala aplicada a essas coordenadas de leitura. Padrão 1, 1
colorLookUpOffsetsvec2Deslocamento aplicado a essas coordenadas de leitura
colorRenderFlagsu8Flags de bit que afetam como a cor é aplicada na renderização
modulationFactorvec4Modulação aplicada à cor final
censorModulateValuevec4Cor usada quando o conteúdo é censurado para uma região
paletteDefinitionpointerUm VfxPaletteDefinitionData. Veja Paleta
colorblindVisibilityu80 sempre visível, 1 só no modo normal, 2 só no modo daltônico

Lendo um valor RGBA

birthColor: embed = ValueColor {
    constantValue: vec4 = { 1, 0.7059, 0, 1 }
}

Os canais vão de 0 a 1 em vez de 0 a 255. Para converter, divida por 255. O canal verde acima é 180, e 180 / 255 dá 0.7059.

O quarto valor é o alfa, onde 0 é totalmente transparente e 1 totalmente opaco.

Para recolorir na prática, o Quartz faz as contas para você.


Emissor: textura e UV

PropriedadeTipoO que faz
texturestringO .dds ou .tex que o emissor desenha. Veja File Formats
particleColorTexturestringGradiente amostrado para colorir partículas, normalmente ao longo da vida delas. Mirado pelos campos colorLookUp*
falloffTexturestringTextura de rampa de atenuação
textureMultpointerUm VfxTextureMultDefinitionData, não uma string simples. Veja Texture mult
texDivvec2Divide a textura numa grade, para animação por folha
startFrameu16Primeiro quadro de uma folha animada
numFramesu16Quantos quadros a folha tem
frameRatef32Com que velocidade esses quadros passam
uvModeu8Como as coordenadas UV são interpretadas
texAddressModeBaseu8Repetição, clamp ou espelho para a textura base
uvRotationValueFloatGira a textura
uvScaleValueVector2Escala a textura
uvTransformCentervec2Pivô para rotação e escala de UV
uvParallaxScalef32Quantidade de paralaxe nas UVs
emitterUvScrollRatevec2Taxa de rolagem aplicada por emissor
particleUVScrollRateIntegratedValueVector2Taxa de rolagem aplicada por partícula
particleUVRotateRateIntegratedValueFloatTaxa de rotação aplicada por partícula
isTexturePixelatedboolAmostragem por vizinho mais próximo em vez de filtragem suave
Não existe um scrollRate simples

A rolagem é sempre delimitada pelo que ela afeta. No emissor moderno os campos são birthUvScrollRate, emitterUvScrollRate e particleUVScrollRate. Um uvScrollRate puro existe apenas na classe legacy descrita em O modelo de componentes legacy.


Emissor: estado de renderização

PropriedadeTipoO que faz
blendModeu8Como a partícula se mistura com o que está atrás. Tabela completa abaixo
miscRenderFlagsu8Bits de estado de profundidade e mistura. Veja o aviso abaixo
meshRenderFlagsu8Flags de renderização para primitivos de mesh
colorRenderFlagsu8Flags de renderização que afetam a cor
passi16Ordem de desenho. Menor desenha primeiro e fica embaixo
renderPhaseOverrideu8Força o emissor numa fase de renderização específica. Padrão 7, ou seja, sem sobrescrita
depthBiasFactorsvec2Empurra a profundidade para superfícies coplanares não brigarem
DepthPushPullf32Empurra ou puxa a partícula ao longo da profundidade. Padrão 0. O shader chama isso de PARTICLE_DEPTH_PUSH_PULL
alphaRefu8Limiar de teste de alfa, 0 a 255. Pixels abaixo são descartados. Padrão 5
stencilModeu8Comportamento do stencil
stencilRefu8Valor de referência do stencil
StencilReferenceIdhashReferência de stencil nomeada
disableBackfaceCullboolDesenha os dois lados de cada face
softParticleParamspointerUm VfxSoftParticleDefinitionData. Veja Soft particles
sliceTechniqueRangef32Alcance da técnica de slice
CustomMaterialpointerUm VfxMaterialDefinitionData substituindo o material padrão
materialOverrideDefinitionslist[embed]Sobrescritas por material para este emissor
FilteringpointerUm VfxEmitterFiltering, controlando onde o emissor pode aparecer
AudiopointerUm VfxEmitterAudio

Valores de blendMode

São fixos e iguais para todos os primitivos. Cada modo escolhe um fator de mistura de origem e destino e uma operação de mistura.

ModoSrcDestOpEscreve profundidadeMistura
0ONEONEADDnãosim
1SRC_ALPHAINV_SRC_ALPHAADDnãosim
2ZEROINV_SRC_COLORADDnãosim
3simnão
4SRC_ALPHAONEADDnãosim
5ONEINV_SRC_ALPHAADDnãosim
6ONEONEMINnãosim
7ONEONEMAXnãosim
8INV_DEST_ALPHADEST_ALPHAADDnãosim

Lendo essa tabela na prática:

  • 0 e 4 são os modos aditivos. O preto não contribui com nada, então são os seguros para recolorir na direção do preto.
  • 1 é a mistura alfa padrão, o mais próximo de "normal".
  • 2 escurece, já que multiplica pelo inverso da cor de origem.
  • 3 é o modo opaco. É o único que escreve profundidade e o único que não mistura nada.
  • 6 e 7 pegam o mínimo ou o máximo entre origem e destino em vez de somar.
O bit 0 de miscRenderFlags desliga o teste de profundidade, invertido

O bit 0 corresponde ao DepthEnable do estado depth-stencil, e é invertido: quando o bit está ligado, o teste de profundidade está desligado. Pôr miscRenderFlags em 1 é o que faz uma partícula desenhar através da geometria.

Não é uma flag de inversão de faces, e a leitura de que um valor 4 desliga a escrita de profundidade mantendo o teste ligado não se sustenta. A escrita de profundidade é decidida pelo blendMode, e só o modo 3 a ativa.

A comparação usada é LESS_EQUAL e não LESS, e é isso que permite a um decal coplanar no chão sequer aparecer.


Flags do emissor

Quatro bytes no emissor, cada um carregando até oito bits nomeados. Ferramentas de texto os expõem um a um como flag.

FlagO que faz
TextureFlipU / TextureFlipVEspelha a textura em cada eixo
particleIsLocalOrientationA orientação da partícula é lida no espaço local
isLocalOrientationA orientação do emissor é lida no espaço local
isDirectionOrientedAs partículas se orientam pela direção do movimento
isUniformScaleA escala fica travada num único valor para todos os eixos
hasPostRotateOrientationAplica postRotateOrientationAxis depois da rotação
isRandomStartFrameCada partícula começa num quadro aleatório da folha
doesCastShadowO emissor contribui para as sombras
isRotationEnabledHabilita a rotação de todo
uvScrollClampFaz clamp da rolagem de UV em vez de repetir
isFollowingTerrainAs partículas acompanham a altura do terreno
isGroundLayerDesenha como camada de chão
useEmissionMeshNormalForBirthAs partículas saem ao longo das normais da mesh de emissão
useNavmeshMaskMascara o efeito contra o terreno para não vazar sobre paredes
ParticlesShareRandomValueTodas as partículas sorteiam o mesmo valor aleatório
SortEmittersByPosOrdena os emissores por posição
IsEmitterSpaceAs partículas são simuladas no espaço do emissor em vez do mundo
HasVariableStartTimeO tempo de início varia por partícula
isSingleParticleExatamente uma partícula em vez de um fluxo
doesParticleLifetimeScaleO tempo de vida da partícula escala com o sistema
doesLifetimeScaleO tempo de vida do emissor escala com o sistema
WriteAlphaOnlyEscreve somente o canal alfa

Primitivos

primitive é um ponteiro que decide o que cada partícula desenha. Deixá-lo vazio dá o quad billboard padrão voltado para a câmera.

ClasseO que desenha
VfxPrimitiveCameraQuadUm quad plano sempre voltado para a câmera. O padrão, e a maioria das partículas que você encontra
VfxPrimitiveCameraUnitQuadUm quad voltado para a câmera em tamanho unitário
VfxPrimitiveArbitraryQuadUm quad de orientação fixa que não fica voltado para a câmera
VfxPrimitiveMeshUma mesh
VfxPrimitiveAttachedMeshUma mesh presa a um osso. Adiciona UseAvatarSpecificSubmeshMask
VfxPrimitiveCameraTrailUm rastro voltado para a câmera
VfxPrimitiveArbitraryTrailUm rastro de orientação fixa
VfxPrimitiveRibbonUma fita
VfxPrimitiveBeamUm feixe entre dois pontos
VfxPrimitiveCameraSegmentBeamUm feixe segmentado voltado para a câmera
VfxPrimitiveCameraSegmentSeriesBeamUma série de feixes segmentados
VfxPrimitiveLaserUm laser
VfxPrimitivePlanarProjectionProjeta a textura num plano. Decals de chão
VfxPrimitiveRayUm raio
VfxPrimitiveNonRenderableNão desenha nada. Para emissores que existem só para gerar filhos ou mover lógica

Campos de mesh

Primitivos de mesh carregam um VfxMeshDefinitionData em mMesh. Repare nos prefixos m: eles não se escrevem como os campos próprios do emissor.

PropriedadeTipoO que faz
mMeshNamestringA mesh a desenhar
mMeshSkeletonNamestringEsqueleto para uma mesh animada
mSimpleMeshNamestringUma mesh simples .scb ou .sco
mSubmeshesToDrawlist[string]Quais submeshes renderizam
mSubmeshesToDrawAlwayslist[string]Submeshes que sempre renderizam
mLockMeshToAttachmentboolTrava a mesh no ponto de fixação
mAnimationNamestringAnimação a tocar na mesh
mAnimationVariantslist[string]Animações alternativas

Primitivos de mesh também carregam AlignPitchToCamera e AlignYawToCamera em VfxPrimitiveMeshBase.

Tipos de arquivo de mesh

ExtensãoO que é
.scbMesh estática, binária
.scoMesh estática, texto ASCII, carrega joints e materiais
.sknMesh com rig, o padrão para modelos de campeões
.sklEsqueleto pareado com um .skn

Um par .skn e .skl dentro de uma pasta de partículas significa uma mesh animada. Veja Meshes as Particles.

Rastro e fita

VfxPrimitiveTrailBase carrega um VfxTrailDefinitionData em mTrail:

PropriedadeTipoO que faz
mBirthTilingSizeValueVector3Tamanho do ladrilho ao nascer
mCutofff32Comprimento de arco em que o rastro para de ser estendido
mMaxAddedPerFramei32Limite de pontos adicionados por quadro
mSmoothingModeu8Suavização aplicada ao longo do rastro
mModeu8Modo do rastro

VfxRibbonDefinitionData carrega birthTilingSize como ValueVector2.


Classes de sub-definição

Cada uma pende de um ponteiro no emissor. Nulo significa que o recurso está totalmente desligado.

Texture mult

VfxTextureMultDefinitionData. Uma segunda textura multiplicada sobre a base, a mesma ideia do Multiply num editor de imagem. O campo textureMult do emissor aponta para este objeto, e o nome de arquivo real é a string textureMult dentro dele.

PropriedadeTipoO que faz
textureMultstringA textura de multiplicação
texDivMultvec2Divisão em grade para a textura de multiplicação
texAddressModeMultu8Modo de repetição
uvScaleMultValueVector2Escala nas UVs de multiplicação
UvRotationMultValueFloatRotação nas UVs de multiplicação
uvTransformCenterMultvec2Pivô para essa rotação e escala
birthUvScrollRateMultValueVector2Taxa de rolagem ao nascer
emitterUvScrollRateMultvec2Taxa de rolagem por emissor
birthUVOffsetMultValueVector2Deslocamento inicial de UV
birthUvRotateRateMultValueFloatTaxa inicial de rotação de UV
ParticleIntegratedUvScrollMultIntegratedValueVector2Rolagem por partícula
ParticleIntegratedUvRotateMultIntegratedValueFloatRotação por partícula

Seu byte de flags carrega uvScrollAlphaMult, uvScrollClampMult, TextureMultFilpU, TextureMultFilpV e isRandomStartFrameMult. Esses dois últimos são escritos assim mesmo na engine, então procure por "Filp" e não "Flip" quando for atrás deles.

Paleta

VfxPaletteDefinitionData. Colore as partículas amostrando uma textura de gradiente em vez de usar um valor chapado.

PropriedadeTipoO que faz
paletteTexturestringA imagem de gradiente
PaletteTextureAddressModeu8Modo de repetição do gradiente
paletteSelectorValueVector3Onde amostrar na paleta
palleteSrcMixColorValueColorCor misturada ao resultado amostrado
PaletteUAnimationCurveValueFloatAnima a coordenada U
PaletteVAnimationCurveValueFloatAnima a coordenada V
paletteCounti32Número de paletas na textura
Palette ou Pallete?

A classe e a maioria dos campos usam a grafia correta. O erro de digitação da própria engine sobrevive em exatamente um campo, palleteSrcMixColor, então procurar "pallete" num bin vai deixar quase tudo de fora. Procure "palette".

Erosão de alfa

VfxAlphaErosionDefinitionData. Dissolve a partícula usando um mapa. É assim que praticamente todo efeito de queimar ou apagar é construído.

PropriedadeTipoO que faz
erosionMapNamestringA textura de erosão
erosionMapAddressModeu8Modo de repetição do mapa
erosionMapChannelMixerValueColorQuais canais do mapa são usados e em que proporção
erosionDriveCurveValueFloatComo a erosão progride
erosionDriveSourceu8O que a governa, por exemplo a idade da partícula
erosionFeatherIn / erosionFeatherOutf32Suavidade em cada borda do limite
erosionSliceWidthf32Largura da faixa que erode
LingerErosionDriveCurveValueFloatUma curva separada usada durante a permanência
UseLingerErosionDriveCurveboolHabilita essa curva separada

Um mapa de erosão costuma ser em tons de cinza, onde o branco erode primeiro e o preto por último. Mapas multicanal carregam um padrão independente por canal de cor, e erosionMapChannelMixer escolhe entre eles.

Distorção

VfxDistortionDefinitionData. Distorce o que é desenhado atrás da partícula. Ondas de choque e ondulação de calor.

PropriedadeTipoO que faz
normalMapTexturestringNormal map que governa a distorção
distortionf32Intensidade
distortionModeu8Qual modo de distorção é usado

Reflexo e fresnel

VfxReflectionDefinitionData. O bloco de contorno luminoso e reflexo. fresnel mora aqui, não no emissor.

PropriedadeTipoO que faz
reflectionMapTexturestringO mapa de reflexo
reflectionOpacityDirectf32Intensidade do reflexo de frente
reflectionOpacityGlancingf32Intensidade do reflexo em ângulo rasante
reflectionFresnelf32Termo de fresnel para o reflexo
reflectionFresnelColorvec4Cor desse termo
fresnelf32Intensidade do fresnel, o contorno luminoso em ângulo rasante
fresnelColorvec4Cor desse contorno

Soft particles

VfxSoftParticleDefinitionData. Suaviza a emenda dura onde uma partícula cruza a geometria.

PropriedadeTipoO que faz
beginInf32Deslocamento antes do início do esmaecimento para dentro
beginOutf32Deslocamento antes do início do esmaecimento para fora
deltaInf32Distância coberta pelo esmaecimento para dentro
deltaOutf32Distância coberta pelo esmaecimento para fora

Há um quinto byte de modo escolhendo qual dos dois esmaecimentos se aplica. Um ponteiro softParticleParams nulo desliga o recurso por completo, e não existe campo liga/desliga separado.

Linger

VfxLingerDefinitionData. Altera a partícula durante a fase de permanência em vez de só atrasar sua remoção.

PropriedadeTipoO que faz
LingerRotationValueVector3Rotação aplicada durante a permanência
LingerScaleValueVector3Escala aplicada durante a permanência
KeyedLingerVelocityValueVector3Velocidade durante a permanência
KeyedLingerAccelerationValueVector3Aceleração durante a permanência
KeyedLingerDragValueVector3Drag durante a permanência
SeparateLingerColorValueColorUma cor diferente durante a permanência

Cada uma tem uma flag Use* correspondente: UseLingerRotation, UseLingerScale, UseKeyedLingerVelocity, UseKeyedLingerAcceleration, UseKeyedLingerDrag e UseSeparateLingerColor. Definir o valor sem a flag não faz nada.

Materiais e drivers

VfxMaterialDefinitionData guarda um link Material e um mapa materialDrivers. Os drivers animam um parâmetro de material em vez de mantê-lo constante.

ClasseO que faz
VfxColorOverLifeMaterialDriverGoverna uma cor ao longo da vida da partícula
VfxFloatOverLifeMaterialDriverGoverna um único float ao longo da vida
VfxSineMaterialDriverOscila um valor numa senoide, para pulsar

Para trabalho com glow e toon shader, veja Static Materials.


Campos de força

VfxFieldCollectionDefinitionData, alcançado pelo fieldCollectionDefinition do emissor. Onde birthVelocity põe uma partícula em movimento, um campo continua agindo sobre ela.

PropriedadeTipoO que faz
fieldAccelerationDefinitionslist[embed]Aceleração constante, por exemplo gravidade
fieldAttractionDefinitionslist[embed]Puxa partículas na direção de um ponto
fieldDragDefinitionslist[embed]Desacelera as partículas
fieldNoiseDefinitionslist[embed]Acrescenta turbulência
fieldOrbitalDefinitionslist[embed]Gira as partículas em torno de um eixo

Formas de emissão

SpawnShape aponta para um IVfxShape.

ClasseO que faz
VfxShapeSphereNascer dentro de uma esfera, com um radius
VfxShapeBoxNascer dentro de uma caixa
VfxShapeCylinderNascer dentro de um cilindro
VfxShapeVolumeComportamento de volume compartilhado, carrega as próprias flags
VfxShapeLegacyO sistema de formas mais antigo, ainda presente em muitos efeitos

VfxEmissionMeshData cuida do nascimento a partir de uma mesh, com meshName, skeletonName, AnimationName, meshScale, maxJointWeights, Submeshes e useSurfaceNormalForBirthPhysics.


Partículas filhas

VfxChildParticleSetDefinitionData, alcançado pelo childParticleSetDefinition do emissor. É assim que um rastro solta faíscas ou uma explosão joga destroços.

PropriedadeTipoO que faz
childrenIdentifierslist[embed]Os sistemas filhos a gerar, como entradas VfxChildIdentifier
boneToSpawnAtlist[string]Ossos em que os filhos nascem
childrenProbabilityValueFloatChance de um filho nascer
childEmitOnDeathboolGerar o filho quando a partícula pai morre, e não quando ela nasce
ParentInheritanceDefinitionpointerUm VfxParentInheritanceParams decidindo o que o filho herda

VfxChildIdentifier guarda effect (um link), effectKey (um hash) e effectName (uma string).

VfxParentInheritanceParams guarda Mode e RelativeOffset. Esse deslocamento é um canal relativo ao pai por direito próprio, separado do EmitterPosition do próprio filho.

Os filhos nascem uma vez, no nascimento

Não existe alimentação contínua do pai para o filho. Um sistema filho é criado exatamente uma vez, no momento em que a partícula portadora nasce, e daí em diante roda como um sistema independente no próprio relógio. O único desmonte é a morte da partícula portadora.

Uma consequência que vale saber: para uma portadora isSingleParticle existe exatamente uma partícula e portanto exatamente uma criação de filho, e o fechamento da janela de emissão do pai não consegue impedir isso.

A herança é um modo, não uma cadeia fixa

O que um filho herda do pai é decidido pelo valor Mode em VfxParentInheritanceParams. Quando nenhum ParentInheritanceDefinition é escrito, o filho roda no modo padrão. Qualquer modelo mental que suponha um conjunto fixo de coisas herdadas vai acertar no padrão e errar no resto.

Sistemas filhos aninham, e a engine percorre em profundidade, então um aninhamento de três níveis se compõe em cada nível.

Um padrão comum é um emissor pai usando VfxPrimitiveNonRenderable: ele não desenha nada e existe apenas para posicionar seus filhos.


O modelo de componentes legacy

Efeitos mais antigos usam um segundo modelo de emissor, baseado em componentes, que ainda vem na engine. Você vai encontrá-lo em campeões antigos. Está documentado aqui para você reconhecê-lo, não para escrever coisa nova com ele.

ClasseTamanhoPapel
VfxEmitterLegacySimple13 camposO emissor legacy simples, alcançado pelo ponteiro LegacySimple do emissor
VfxLegacyRenderComponent66 camposEstado de renderização legacy
VfxLegacyPhysicsComponent37 camposMovimento e posicionamento legacy
VfxLegacyLifetimeComponent17 camposTempo legacy
VfxLegacyGeometryComponent1 campoGeometria legacy

Muitos nomes aparecem nos dois modelos. blendMode, texture, bindWeight, birthVelocity, particleLifetime e outros existem no emissor moderno e num componente legacy, em offsets diferentes. Quando um valor parece não surtir efeito, veja qual dos dois você está editando de fato.

Três nomes existem apenas no modelo legacy:

PropriedadeTipoVive em
uvScrollRatevec2VfxEmitterLegacySimple
particleBindvec2VfxEmitterLegacySimple
lockedToEmitterboolVfxEmitterLegacySimple

VfxEmitterLegacySimple também carrega birthScale, scale, birthRotation, birthRotationalVelocity, rotation, scaleBias, orientation, fixedOrbitType, hasFixedOrbit e scaleUpFromOrigin. Repare no birthScale e birthRotation sem sufixo aqui, contra birthScale0 e birthRotation0 no emissor moderno.

O ponteiro LegacySimple é o que os emissores da lista simpleEmitterDefinitionData do sistema usam. Se um sistema preenche essa lista em vez de complexEmitterDefinitionData, é esse bloco que seus emissores leem.

Propriedades que o emissor perdeu

Quatro propriedades do emissor foram aposentadas e só vão aparecer em bins antigos ou documentação antiga.

PropriedadeRemovida emSubstituída por
shape14.1SpawnShape
Material14.1CustomMaterial e materialOverrideDefinitions
materialDrivers14.1O mapa materialDrivers em VfxMaterialDefinitionData
flexOffset15.11Nada diretamente

assetCategory foi removida de VfxSystemDefinitionData no patch 14.15.


Coisas fáceis de entender errado

Uma lista curta das leituras equivocadas que mais custam tempo.

SuposiçãoO que é verdade
birthScale0 e birthScale1 são um par mín-máxNão existe birthScale1. O 0 é resquício de nomenclatura, e a aleatoriedade vem de probabilityTables
probabilityTables escolhe um valor de um conjuntoEle multiplica constantValue por um sorteio, uma vez por partícula
birthOrbitalVelocity adiciona movimento orbitalÉ só transformação e não contribui com velocidade nenhuma
miscRenderFlags inverte facesO bit 0 desliga o teste de profundidade, invertido, então 1 significa teste desligado
O sentido de blendMode depende do primitivoO estado de mistura é o mesmo para todos os primitivos. Só o modo 3 escreve profundidade
textureMult é um nome de arquivoÉ um ponteiro para uma classe de definição inteira. O nome do arquivo é um campo lá dentro
mEyeCandy é uma configuração do emissorEstá no sistema
Existe um scrollRate simplesSó existem variantes delimitadas, mais um uvScrollRate exclusivo do legacy
Existe um campo liga/desliga de soft particleUm ponteiro softParticleParams nulo é o interruptor
particleLifetime em -1 significa partícula infinitaSignifica "viver até o emissor parar". Só persiste junto com isSingleParticle
Um particleLinger ausente vale zeroEle vale particleLifetime + 10 por padrão
Um filho morre quando a janela do emissor pai fechaUm filho é um sistema independente. Termina quando seus próprios emissores se esgotam ou quando a partícula portadora é removida

Os nomes e tipos desta página foram lidos do layout de classes registrado pela engine para o patch 16.16. Se faltar uma propriedade ou uma descrição estiver errada, vale corrigir: veja Como contribuir.