Divine Skins
Divine Skins Wiki

Bin & Particle Dictionary

Une référence des propriétés présentes dans un bin VFX de League of Legends, organisée par la classe à laquelle chacune appartient réellement.

Écrit par DAKA

Toutes les autres pages de cette section t'apprennent à faire quelque chose. Celle-ci est pour le moment où tu fais défiler un dump .py, tu tombes sur une propriété que tu n'as jamais vue, et tu veux juste savoir ce que c'est et où elle se trouve.

Les entrées sont regroupées par classe propriétaire, parce que dans un bin le même nom peut apparaître sur plusieurs classes, et savoir dans laquelle tu te trouves détermine ce que la valeur fait.

À lire à côté de Ruby

La plupart de ces propriétés se comprennent plus vite en les manipulant qu'en les lisant. Ruby prévisualise les VFX sur n'importe quel champion et intègre un éditeur de bin, donc tu peux changer une valeur et regarder le viewport au lieu de packager un mod pour découvrir ce qu'elle a fait.

D'où viennent ces noms

Chaque classe, propriété et type de cette page a été lu directement dans la disposition de classes enregistrée par le moteur, vérifiée sur le patch 16.16. Les noms de champs qui n'existent plus ont été retirés, et ceux qui vivent sur une autre classe que celle attendue sont annotés avec leur emplacement réel. Quelques comportements sont signalés là où le moteur fait autre chose que ce que le nom de la propriété laisse croire.

Tu peux trouver les données structurelles ici lol-meta-classes. Tu peux aussi trouver de la documentation sur les meta classes et leurs propriétés sur lol-meta-wiki.


Comment lire un bin

Un bin VFX est un arbre. La colonne vertébrale ressemble à ça :

VfxSystemDefinitionData              un effet complet, par ex. un recall ou un Q
└── complexEmitterDefinitionData     la liste des émetteurs du système
    └── VfxEmitterDefinitionData     un émetteur : une traînée, un flash, des étincelles
        ├── primitive                ce que chaque particule dessine
        └── pointeurs *Definition    érosion, palette, distorsion, enfants, ...

VfxSystemDefinitionData est le conteneur. Une propriété qui n'est pas dans le système joué pendant une compétence n'apparaîtra pas pendant cette compétence.

L'émetteur est là où tu passes le plus de temps. Il porte 135 champs enregistrés à lui seul, et accroche une douzaine d'objets de sous-définition optionnels via des pointeurs. Un pointeur nul signifie que toute la fonctionnalité est désactivée, ce qui explique pourquoi supprimer un bloc est souvent la bonne façon de désactiver quelque chose.

Enveloppes de valeur

Les propriétés numériques sont généralement enveloppées pour que le moteur puisse les garder constantes ou les faire varier :

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

Les enveloppes sont ValueFloat, ValueColor, ValueVector2 et ValueVector3. Chacune contient un constantValue plus un pointeur dynamics optionnel. Ce sont deux champs distincts, pas deux orthographes du même champ : la constante est toujours là, et dynamics est un objet supplémentaire accroché dessus.

CléVit surCe que c'est
constantValuel'enveloppeLa valeur écrite. Le type suit l'enveloppe : f32, vec4, vec2, vec3
dynamicsl'enveloppePointeur vers un objet de variable animée. Nul signifie que la constante est utilisée telle quelle
timesl'objet dynamicsPositions le long de la courbe
valuesl'objet dynamicsLa valeur à chaque entrée correspondante de times
probabilityTablesl'objet dynamicsRandomisation par particule. Voir ci-dessous
probabilityTables multiplie, il ne sélectionne pas

Une table de probabilité est souvent lue comme « choisir une de ces valeurs au hasard ». Ce n'est pas ça. Chaque table fait passer un tirage aléatoire uniforme dans sa propre courbe keyTimes vers keyValues et renvoie un multiplicateur, qui est ensuite appliqué à constantValue. Le tirage a lieu une fois par particule, à la naissance.

Donc un constantValue de 5 avec une table renvoyant l'intervalle 0.5 à 1 donne à chaque particule une valeur entre 2.5 et 5. Une table dont les keyValues traversent zéro, comme -1 à 1, inverse le signe sur environ la moitié des particules. C'est l'explication habituelle quand certaines particules défilent ou tournent dans le sens inverse des autres.

Note que keyTimes sur une table de probabilité est l'axe du tirage, pas l'âge de la particule.

Propriétés de naissance et leurs partenaires sur la durée de vie

Beaucoup de propriétés vont par paires. Celle en birth* est évaluée une fois, quand la particule apparaît. Sa partenaire sans le préfixe continue d'agir pendant toute la vie de la particule, et elle est multipliée avec la valeur de naissance plutôt que de la remplacer.

À la naissanceSur la durée de vie
birthColorColor
birthScale0scale0
birthRotation0rotation0
birthVelocityvelocity
birthAccelerationacceleration
birthDragdrag

Si une valeur semble fausse et qu'une seule moitié d'une paire est renseignée, vérifie l'autre moitié avant de changer quoi que ce soit.

Unités

Les rotations et vitesses de rotation sont en degrés et en degrés par seconde. Les durées de vie, périodes et délais sont en secondes. Les vitesses de défilement UV sont en UV par seconde, et la rotation UV en degrés. Les canaux de couleur vont de 0 à 1.

Randomisation, et le suffixe 0

Plusieurs propriétés de naissance finissent par 0, comme birthScale0 et birthRotation0. C'est un reliquat de nommage, pas une paire minimum-maximum. Il n'existe pas de birthScale1 sur la classe d'émetteur actuelle. La variation par particule vient de probabilityTables, comme ci-dessus.

Octets de drapeaux

Beaucoup de booléens ne sont pas des champs séparés. Ce sont des bits isolés empaquetés dans des octets de drapeaux partagés sur l'émetteur. Les outils texte les exposent individuellement en flag, donc tu les écris un par un, mais ils vivent à quatre ou huit par octet. La liste complète est dans Drapeaux de l'émetteur.


Niveau système

VfxSystemDefinitionData, le conteneur le plus externe. 33 champs enregistrés au patch 16.16.

PropriétéTypeCe que ça fait
particleNamestringNom lisible du système entier. Peut être renommé sans risque, et c'est ce qu'il y a de plus fiable à chercher quand le hash du conteneur n'est pas résolu
particlePathstringRegroupement de chemin utilisé par le moteur pour organiser les systèmes
complexEmitterDefinitionDatalist[embed]Les émetteurs que ce système possède. Le corps de l'effet
simpleEmitterDefinitionDatalist[embed]L'ancienne liste d'émetteurs. Encore présente sur les systèmes legacy
materialOverrideDefinitionslist[embed]Surcharges de matériaux à l'échelle du système. L'émetteur a sa propre liste du même nom
transformmtx44Appliqué au système entier, pour le redimensionner, le déplacer et le faire tourner d'un bloc. Voir Matrix Scaling
flagsu16Drapeaux de bits au niveau système. Deux sont connus : 0x100 bascule vélocité et drag vers une résolution analytique, et 0x800 est un mode low-spec agressif. Défaut 212
mEyeCandyboolMarque le système comme décoratif, donc il disparaît quand un joueur active Masquer les effets décoratifs
buildUpTimef32Période de montée en régime du système
visibilityRadiusf32Rayon de culling
overrideScaleCapoption[f32]Plafonne l'échelle applicable au système
scaleDynamicallyWithAttachedBoneboolL'échelle du système suit l'os auquel il est attaché
objectPathhashIdentifiant de chemin d'objet. Ajouté au patch 16.16
drawingLayeru8Dans quelle couche le système dessine
ClockToUseu8Quelle horloge pilote le temps du système
selfIlluminationf32Quantité d'auto-illumination
assetRemappingTablelist[embed]Remaps d'assets appliqués dans le système
soundOnCreateDefaultstringSon déclenché à la création du système
voiceOverOnCreateDefaultstringVoix déclenchée à la création
soundPersistentDefaultstringSon en boucle pendant la vie du système
mEyeCandy est une propriété du système

Elle est sur VfxSystemDefinitionData, pas sur l'émetteur, c'est pourquoi elle appartient au niveau système du bloc plutôt qu'à côté des réglages de rendu de l'émetteur.


Émetteur : identité et durée de vie

VfxEmitterDefinitionData. Tout, d'ici jusqu'à Drapeaux de l'émetteur, est sur cette classe sauf mention contraire dans une ligne.

PropriétéTypeCe que ça fait
emitterNamestringNom lisible d'un émetteur. Peut être renommé sans risque, et ça vaut le coup
disabledboolÉteint l'émetteur sans le supprimer
importanceu8Priorité de culling qualité, comparée au réglage vidéo Qualité des effets. Voir le tableau plus bas. Défaut 2
particleLifetimeValueFloatCombien de temps chaque particule vit après émission. Vaut 3.0 par défaut si absent. -1 est une sentinelle, voir l'avertissement plus bas
lifetimeoption[f32]Combien de temps l'émetteur lui-même tourne
particleLingeroption[f32]Secondes supplémentaires pendant lesquelles les particules restent visibles après la fin de l'émetteur. Si absent, vaut particleLifetime + 10, pas zéro
emitterLingeroption[f32]Secondes supplémentaires pendant lesquelles l'émetteur lui-même persiste
particleLingerTypeu8Quel comportement de persistance est utilisé
LingerpointerUn VfxLingerDefinitionData, pour une persistance qui modifie la particule au lieu de simplement retarder sa disparition
flexParticleLifetimepointerSurcharge flex de la durée de vie des particules
particleLifetime -1 veut dire deux choses opposées

-1 ne veut pas dire « particule infinie ». Ça veut dire « vivre jusqu'à l'arrêt de l'émetteur », et ce que ça donne dépend entièrement de isSingleParticle.

Avec isSingleParticle actif, le clamp de la fenêtre d'émission est ignoré, donc la fenêtre reste sans plafond, l'émetteur ne se termine jamais, et la particule persiste indéfiniment. C'est ainsi qu'on construit un accessoire attaché en permanence.

Sans isSingleParticle, la branche de clamp ne s'exécute jamais et la fenêtre d'émission reste au lifetime écrit. L'émetteur s'arrête là et emporte ses particules avec lui, donc un -1 continu disparaît au lieu de persister.

Un 9999 écrit se comporte comme -1.

Comment importance fait le culling

importance est comparée au réglage Qualité des effets du joueur quand le système construit ses émetteurs. C'est une catégorie, pas une échelle, et deux des valeurs se comportent autrement que le nom ne le suggère.

Qualité des effetsValeurs d'importance ignorées
0 à 1, Très basse et Basse0, 1, 5
2, Moyenne0, 1
3, Haute0, 4
4, Très haute4

Donc 0 à 3 montent en priorité, et 3 est critique pour le gameplay et n'est jamais retiré. 4 est un substitut basse qualité montré uniquement en réglages bas, et 5 est l'inverse, montré uniquement à partir de Moyenne. Associer un émetteur 4 à un émetteur 5 est la façon dont un effet livre deux versions de lui-même.

Quatre autres choses conditionnent l'existence même d'un émetteur : disabled, colorblindVisibility, ChanceToNotExist, et le bit 0x800 des flags système, qui retire tout sauf les importances 3 et 4.

rate, lifetime, particleLifetime et particleLinger sont illustrés avec des captures sur la page Emitter Library.


Émetteur : émission et rythme

PropriétéTypeCe que ça fait
rateValueFloatParticules émises par seconde. Sur un émetteur isSingleParticle ça fixe le nombre de particules à la place
flexRatepointerSurcharge flex du taux
rateByVelocityFunctionValueVector2Module le taux selon la vitesse de déplacement de l'émetteur
MaximumRateByVelocityoption[f32]Borne supérieure pour ce qui précède
timeBeforeFirstEmissionf32Délai avant la première apparition. Utile pour étaler un système en plusieurs temps
periodoption[f32]Durée d'un cycle d'émission
timeActiveDuringPeriodoption[f32]Quelle part de chaque period l'émetteur émet réellement
ChanceToNotExistf32Probabilité que l'émetteur soit entièrement ignoré à l'apparition
SpawnShapepointerUn IVfxShape donnant le volume dans lequel les particules apparaissent
FlexShapeDefinitionpointerVariante flex de la forme d'apparition
emissionSurfaceDefinitionpointerApparition sur une surface au lieu d'un volume
emissionMeshNamestringUn mesh utilisé comme forme d'émission
emissionMeshScalef32Met ce mesh d'émission à l'échelle
period et timeActiveDuringPeriod servent à faire des salves

Mets period à la durée du cycle et timeActiveDuringPeriod à une valeur plus courte, et l'émetteur pulse au lieu de tourner en continu. Laisser les deux vides donne un flux régulier.


Émetteur : placement et orientation

PropriétéTypeCe que ça fait
EmitterPositionValueVector3Où les particules apparaissent par rapport à l'origine de l'émetteur. Y positif vers le haut
translationOverridevec3Décale l'émetteur dans son ensemble
rotationOverridevec3Fait tourner l'émetteur dans son ensemble
scaleOverridevec3Met l'émetteur à l'échelle dans son ensemble
FlexInstanceScalepointerSurcharge flex de l'échelle d'instance
bindWeightValueFloatÀ quel point la particule suit ce à quoi elle est liée. 1 suit totalement, 0 la laisse derrière en espace monde
postRotateOrientationAxisvec3Axe utilisé quand hasPostRotateOrientation est actif
offsetLifetimeScalingvec3Module la durée de vie de la particule selon sa distance d'apparition à l'émetteur, par axe
offsetLifeScalingSymmetryModeu8Mode de symétrie pour ce qui précède
EmitterPosition ou translationOverride ?

EmitterPosition déplace l'endroit où les particules apparaissent dans l'émetteur. translationOverride décale l'émetteur dans son ensemble. Si un émetteur est mal placé, utilise le second ; si les particules sont mal placées dans un émetteur par ailleurs correct, utilise le premier.


Émetteur : propriétés de naissance

L'état donné à une particule à l'instant de son apparition. Tout ce qui s'appelle birth* est une condition initiale, pas une condition continue.

PropriétéTypeCe que ça fait
birthColorValueColorCouleur de départ, RGBA
birthScale0ValueVector3Taille de départ
birthRotation0ValueVector3Rotation de départ
birthRotationalVelocity0ValueVector3Vitesse de rotation de départ
birthRotationalAccelerationValueVector3Accélération de rotation de départ
birthVelocityValueVector3Vélocité de départ
birthAccelerationValueVector3Accélération de départ
birthDragValueVector3Drag de départ
birthOrbitalVelocityValueVector3Rotation orbitale. Voir l'avertissement plus bas
birthFrameRateValueFloatVitesse de lecture de départ pour une texture animée
birthUVOffsetValueVector2Décalage de départ dans la texture. Utile pour désynchroniser des particules qui partagent une planche
birthUvScrollRateValueVector2Vitesse de défilement UV de départ
birthUvRotateRateValueFloatVitesse de rotation UV de départ

Chacune a une jumelle flex* (flexBirthVelocity, flexBirthUVOffset, flexScaleBirthScale et ainsi de suite) qui la surcharge quand une valeur flex est fournie.

birthOrbitalVelocity n'ajoute aucune vélocité

Malgré son nom, cette propriété ne contribue en rien à la vélocité de la particule. Elle agit uniquement sur la transformation : elle fait tourner la matrice propre de la particule pendant que sa position stockée continue d'avancer sur birthVelocity et les forces seules.

Ça compte si tu raisonnes sur la distance parcourue par une particule. La traiter comme une vélocité tangentielle en plus de la rotation compte le mouvement deux fois et donne exactement le double de la longueur du trajet.


Émetteur : mouvement sur la durée de vie

Là où birth* fixe l'état de départ, celles-ci continuent d'agir.

PropriétéTypeCe que ça fait
velocityValueVector3Vélocité pendant la vie de la particule
accelerationValueVector3Accélération pendant la vie
worldAccelerationIntegratedValueVector3Accélération en espace monde quelle que soit l'orientation de la particule. La gravité vit ici, en Y négatif
dragValueVector3Drag pendant la vie
scale0ValueVector3Échelle pendant la vie, multipliée avec birthScale0
rotation0IntegratedValueVector3Rotation pendant la vie
directionVelocityScalef32À quel point la particule s'étire dans sa direction de déplacement avec la vitesse. S'utilise avec isDirectionOriented
directionVelocityMinScalef32Plancher de cet étirement
fieldCollectionDefinitionpointerChamps de forces. Voir Champs de forces

Émetteur : couleur

PropriétéTypeCe que ça fait
birthColorValueColorCouleur à l'apparition
ColorValueColorCouleur pendant la vie de la particule, multipliée avec birthColor. Blanc par défaut
colorLookUpTypeX / colorLookUpTypeYu8Ce qui pilote chaque axe de la lecture dans particleColorTexture, par exemple l'âge de la particule
colorLookUpScalesvec2Échelle appliquée à ces coordonnées de lecture. Défaut 1, 1
colorLookUpOffsetsvec2Décalage appliqué à ces coordonnées de lecture
colorRenderFlagsu8Drapeaux de bits affectant l'application de la couleur au rendu
modulationFactorvec4Modulation appliquée à la couleur finale
censorModulateValuevec4Couleur utilisée quand le contenu est censuré pour une région
paletteDefinitionpointerUn VfxPaletteDefinitionData. Voir Palette
colorblindVisibilityu80 toujours visible, 1 seulement en mode normal, 2 seulement en mode daltonien

Lire une valeur RGBA

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

Les canaux vont de 0 à 1 plutôt que de 0 à 255. Pour convertir, divise par 255. Le canal vert ci-dessus vaut 180, et 180 / 255 donne 0.7059.

La quatrième valeur est l'alpha, où 0 est totalement transparent et 1 totalement opaque.

Pour recolorier en pratique, Quartz fait les calculs pour toi.


Émetteur : texture et UV

PropriétéTypeCe que ça fait
texturestringLe .dds ou .tex que l'émetteur dessine. Voir File Formats
particleColorTexturestringDégradé échantillonné pour colorer les particules, généralement sur leur durée de vie. Visé par les champs colorLookUp*
falloffTexturestringTexture de rampe d'atténuation
textureMultpointerUn VfxTextureMultDefinitionData, pas une simple chaîne. Voir Texture mult
texDivvec2Découpe la texture en grille, pour l'animation par planche
startFrameu16Première image d'une planche animée
numFramesu16Combien d'images la planche contient
frameRatef32À quelle vitesse ces images défilent
uvModeu8Comment les coordonnées UV sont interprétées
texAddressModeBaseu8Répétition, clamp ou miroir pour la texture de base
uvRotationValueFloatFait tourner la texture
uvScaleValueVector2Met la texture à l'échelle
uvTransformCentervec2Pivot pour la rotation et l'échelle UV
uvParallaxScalef32Quantité de parallaxe sur les UV
emitterUvScrollRatevec2Vitesse de défilement appliquée par émetteur
particleUVScrollRateIntegratedValueVector2Vitesse de défilement appliquée par particule
particleUVRotateRateIntegratedValueFloatVitesse de rotation appliquée par particule
isTexturePixelatedboolÉchantillonnage au plus proche voisin au lieu d'un filtrage lisse
Il n'existe pas de scrollRate simple

Le défilement est toujours cadré sur ce qu'il affecte. Sur l'émetteur moderne les champs sont birthUvScrollRate, emitterUvScrollRate et particleUVScrollRate. Un uvScrollRate nu n'existe que sur la classe legacy décrite dans Le modèle à composants legacy.


Émetteur : état de rendu

PropriétéTypeCe que ça fait
blendModeu8Comment la particule se mélange avec ce qui est derrière. Tableau complet plus bas
miscRenderFlagsu8Bits d'état de profondeur et de mélange. Voir l'avertissement plus bas
meshRenderFlagsu8Drapeaux de rendu pour les primitives mesh
colorRenderFlagsu8Drapeaux de rendu affectant la couleur
passi16Ordre de dessin. Plus bas dessine en premier et se retrouve dessous
renderPhaseOverrideu8Force l'émetteur dans une phase de rendu précise. Défaut 7, c'est-à-dire aucune surcharge
depthBiasFactorsvec2Décale la profondeur pour éviter que des surfaces coplanaires se battent
DepthPushPullf32Pousse ou tire la particule le long de la profondeur. Défaut 0. Le shader l'appelle PARTICLE_DEPTH_PUSH_PULL
alphaRefu8Seuil de test alpha, 0 à 255. Les pixels en dessous sont rejetés. Défaut 5
stencilModeu8Comportement du stencil
stencilRefu8Valeur de référence du stencil
StencilReferenceIdhashRéférence de stencil nommée
disableBackfaceCullboolDessine les deux faces de chaque polygone
softParticleParamspointerUn VfxSoftParticleDefinitionData. Voir Soft particles
sliceTechniqueRangef32Portée de la technique de slice
CustomMaterialpointerUn VfxMaterialDefinitionData remplaçant le matériau par défaut
materialOverrideDefinitionslist[embed]Surcharges par matériau pour cet émetteur
FilteringpointerUn VfxEmitterFiltering, contrôlant où l'émetteur a le droit d'apparaître
AudiopointerUn VfxEmitterAudio

Valeurs de blendMode

Elles sont fixes, et identiques pour toutes les primitives. Chaque mode choisit un facteur de mélange source et destination, et une opération de mélange.

ModeSrcDestOpÉcrit la profondeurMélange
0ONEONEADDnonoui
1SRC_ALPHAINV_SRC_ALPHAADDnonoui
2ZEROINV_SRC_COLORADDnonoui
3ouinon
4SRC_ALPHAONEADDnonoui
5ONEINV_SRC_ALPHAADDnonoui
6ONEONEMINnonoui
7ONEONEMAXnonoui
8INV_DEST_ALPHADEST_ALPHAADDnonoui

Lire ce tableau en pratique :

  • 0 et 4 sont les modes additifs. Le noir n'apporte rien, ce sont donc ceux qu'on peut recolorier vers le noir sans risque.
  • 1 est le mélange alpha standard, ce qui se rapproche le plus de « normal ».
  • 2 assombrit, puisqu'il multiplie par l'inverse de la couleur source.
  • 3 est le mode opaque. C'est le seul qui écrit la profondeur et le seul qui ne mélange pas du tout.
  • 6 et 7 prennent le minimum ou le maximum entre source et destination au lieu d'additionner.
Le bit 0 de miscRenderFlags désactive le test de profondeur, en inversé

Le bit 0 correspond au DepthEnable de l'état depth-stencil, et il est inversé : quand le bit est actif, le test de profondeur est désactivé. Mettre miscRenderFlags à 1 est ce qui fait qu'une particule se dessine à travers la géométrie.

Ce n'est pas un drapeau d'inversion de faces, et l'idée qu'une valeur de 4 désactive l'écriture de profondeur en laissant le test actif ne tient pas. L'écriture de profondeur est décidée par blendMode, et seul le mode 3 l'active.

La comparaison utilisée est LESS_EQUAL et non LESS, ce qui permet à un décal au sol coplanaire de s'afficher du tout.


Drapeaux de l'émetteur

Quatre octets sur l'émetteur, chacun portant jusqu'à huit bits nommés. Les outils texte les exposent un par un en flag.

DrapeauCe que ça fait
TextureFlipU / TextureFlipVMiroir de la texture sur chaque axe
particleIsLocalOrientationL'orientation de la particule est lue en espace local
isLocalOrientationL'orientation de l'émetteur est lue en espace local
isDirectionOrientedLes particules s'orientent selon leur direction de déplacement
isUniformScaleL'échelle est verrouillée sur une seule valeur pour tous les axes
hasPostRotateOrientationApplique postRotateOrientationAxis après la rotation
isRandomStartFrameChaque particule démarre sur une image aléatoire de la planche
doesCastShadowL'émetteur contribue aux ombres
isRotationEnabledActive la rotation tout court
uvScrollClampClampe le défilement UV au lieu de le boucler
isFollowingTerrainLes particules suivent la hauteur du terrain
isGroundLayerDessine comme une couche au sol
useEmissionMeshNormalForBirthLes particules partent le long des normales du mesh d'émission
useNavmeshMaskMasque l'effet contre le terrain pour qu'il ne déborde pas sur les murs
ParticlesShareRandomValueToutes les particules tirent la même valeur aléatoire
SortEmittersByPosTrie les émetteurs par position
IsEmitterSpaceLes particules sont simulées en espace émetteur plutôt qu'en espace monde
HasVariableStartTimeLe temps de départ varie par particule
isSingleParticleExactement une particule au lieu d'un flux
doesParticleLifetimeScaleLa durée de vie des particules suit l'échelle du système
doesLifetimeScaleLa durée de vie de l'émetteur suit l'échelle du système
WriteAlphaOnlyN'écrit que le canal alpha

Primitives

primitive est un pointeur qui décide de ce que chaque particule dessine. Le laisser vide donne le quad billboard face caméra par défaut.

ClasseCe que ça dessine
VfxPrimitiveCameraQuadUn quad plat toujours face à la caméra. Le défaut, et la plupart des particules que tu croises
VfxPrimitiveCameraUnitQuadUn quad face caméra à taille unitaire
VfxPrimitiveArbitraryQuadUn quad à orientation fixe qui ne fait pas face à la caméra
VfxPrimitiveMeshUn mesh
VfxPrimitiveAttachedMeshUn mesh attaché à un os. Ajoute UseAvatarSpecificSubmeshMask
VfxPrimitiveCameraTrailUne traînée face caméra
VfxPrimitiveArbitraryTrailUne traînée à orientation fixe
VfxPrimitiveRibbonUn ruban
VfxPrimitiveBeamUn faisceau entre deux points
VfxPrimitiveCameraSegmentBeamUn faisceau segmenté face caméra
VfxPrimitiveCameraSegmentSeriesBeamUne série de faisceaux segmentés
VfxPrimitiveLaserUn laser
VfxPrimitivePlanarProjectionProjette la texture sur un plan. Décals au sol
VfxPrimitiveRayUn rayon
VfxPrimitiveNonRenderableNe dessine rien. Sert aux émetteurs qui n'existent que pour engendrer des enfants ou piloter de la logique

Champs de mesh

Les primitives mesh portent un VfxMeshDefinitionData dans mMesh. Attention aux préfixes m : ils ne s'écrivent pas comme les champs propres à l'émetteur.

PropriétéTypeCe que ça fait
mMeshNamestringLe mesh à dessiner
mMeshSkeletonNamestringSquelette pour un mesh animé
mSimpleMeshNamestringUn mesh simple .scb ou .sco
mSubmeshesToDrawlist[string]Quels submeshes s'affichent
mSubmeshesToDrawAlwayslist[string]Submeshes toujours affichés
mLockMeshToAttachmentboolVerrouille le mesh sur son point d'attache
mAnimationNamestringAnimation à jouer sur le mesh
mAnimationVariantslist[string]Animations alternatives

Les primitives mesh portent aussi AlignPitchToCamera et AlignYawToCamera sur VfxPrimitiveMeshBase.

Types de fichiers mesh

ExtensionCe que c'est
.scbMesh statique, binaire
.scoMesh statique, texte ASCII, porte joints et matériaux
.sknMesh riggé, le standard pour les modèles de champions
.sklSquelette associé à un .skn

Une paire .skn et .skl dans un dossier de particules signifie un mesh animé. Voir Meshes as Particles.

Traînée et ruban

VfxPrimitiveTrailBase porte un VfxTrailDefinitionData dans mTrail :

PropriétéTypeCe que ça fait
mBirthTilingSizeValueVector3Taille de tuilage à la naissance
mCutofff32Longueur d'arc à laquelle la traînée cesse d'être prolongée
mMaxAddedPerFramei32Plafond de points ajoutés par frame
mSmoothingModeu8Lissage appliqué le long de la traînée
mModeu8Mode de traînée

VfxRibbonDefinitionData porte birthTilingSize en ValueVector2.


Classes de sous-définition

Chacune est accrochée à un pointeur sur l'émetteur. Nul signifie que la fonctionnalité est entièrement désactivée.

Texture mult

VfxTextureMultDefinitionData. Une seconde texture multipliée par-dessus la base, la même idée que Multiply dans un éditeur d'images. Le champ textureMult de l'émetteur pointe vers cet objet, et le nom de fichier réel est la chaîne textureMult à l'intérieur.

PropriétéTypeCe que ça fait
textureMultstringLa texture de multiplication
texDivMultvec2Découpe en grille pour la texture de multiplication
texAddressModeMultu8Mode de répétition
uvScaleMultValueVector2Échelle sur les UV de multiplication
UvRotationMultValueFloatRotation sur les UV de multiplication
uvTransformCenterMultvec2Pivot pour cette rotation et cette échelle
birthUvScrollRateMultValueVector2Vitesse de défilement à la naissance
emitterUvScrollRateMultvec2Vitesse de défilement par émetteur
birthUVOffsetMultValueVector2Décalage UV de départ
birthUvRotateRateMultValueFloatVitesse de rotation UV de départ
ParticleIntegratedUvScrollMultIntegratedValueVector2Défilement par particule
ParticleIntegratedUvRotateMultIntegratedValueFloatRotation par particule

Son octet de drapeaux porte uvScrollAlphaMult, uvScrollClampMult, TextureMultFilpU, TextureMultFilpV et isRandomStartFrameMult. Ces deux-là s'écrivent vraiment comme ça dans le moteur, donc cherche « Filp » plutôt que « Flip » quand tu pars les chercher.

Palette

VfxPaletteDefinitionData. Colore les particules en échantillonnant une texture de dégradé au lieu d'utiliser une valeur plate.

PropriétéTypeCe que ça fait
paletteTexturestringL'image de dégradé
PaletteTextureAddressModeu8Mode de répétition pour le dégradé
paletteSelectorValueVector3Où échantillonner dans la palette
palleteSrcMixColorValueColorCouleur mélangée au résultat échantillonné
PaletteUAnimationCurveValueFloatAnime la coordonnée U
PaletteVAnimationCurveValueFloatAnime la coordonnée V
paletteCounti32Nombre de palettes dans la texture
Palette ou Pallete ?

La classe et la plupart des champs utilisent l'orthographe correcte. La faute de frappe du moteur survit dans exactement un champ, palleteSrcMixColor, donc chercher « pallete » dans un bin passera à côté de presque tout. Cherche « palette ».

Érosion alpha

VfxAlphaErosionDefinitionData. Dissout la particule avec une map. C'est ainsi que presque tout effet de combustion ou de balayage est construit.

PropriétéTypeCe que ça fait
erosionMapNamestringLa texture d'érosion
erosionMapAddressModeu8Mode de répétition pour la map
erosionMapChannelMixerValueColorQuels canaux de la map sont utilisés, et dans quelle proportion
erosionDriveCurveValueFloatComment l'érosion progresse
erosionDriveSourceu8Ce qui la pilote, par exemple l'âge de la particule
erosionFeatherIn / erosionFeatherOutf32Douceur à chaque bord de la limite
erosionSliceWidthf32Largeur de la bande en érosion
LingerErosionDriveCurveValueFloatUne courbe séparée utilisée pendant la persistance
UseLingerErosionDriveCurveboolActive cette courbe séparée

Une map d'érosion est généralement en niveaux de gris, où le blanc s'érode en premier et le noir en dernier. Les maps multi-canaux portent un motif indépendant par canal de couleur, et erosionMapChannelMixer choisit entre eux.

Distorsion

VfxDistortionDefinitionData. Déforme ce qui est dessiné derrière la particule. Ondes de choc et effets de chaleur.

PropriétéTypeCe que ça fait
normalMapTexturestringNormal map pilotant la distorsion
distortionf32Intensité
distortionModeu8Quel mode de distorsion est utilisé

Réflexion et fresnel

VfxReflectionDefinitionData. Le bloc de réflexion et de liseré lumineux. fresnel vit ici, pas sur l'émetteur.

PropriétéTypeCe que ça fait
reflectionMapTexturestringLa map de réflexion
reflectionOpacityDirectf32Intensité de réflexion de face
reflectionOpacityGlancingf32Intensité de réflexion en incidence rasante
reflectionFresnelf32Terme de fresnel pour la réflexion
reflectionFresnelColorvec4Couleur de ce terme
fresnelf32Intensité du fresnel, le liseré lumineux en incidence rasante
fresnelColorvec4Couleur de ce liseré

Soft particles

VfxSoftParticleDefinitionData. Adoucit la couture nette là où une particule croise la géométrie.

PropriétéTypeCe que ça fait
beginInf32Décalage avant le début du fondu entrant
beginOutf32Décalage avant le début du fondu sortant
deltaInf32Distance couverte par le fondu entrant
deltaOutf32Distance couverte par le fondu sortant

Il y a un cinquième octet de mode qui choisit lequel des deux fondus s'applique. Un pointeur softParticleParams nul désactive complètement la fonctionnalité, et il n'existe pas de champ on/off séparé.

Linger

VfxLingerDefinitionData. Modifie la particule pendant la phase de persistance au lieu de simplement retarder sa disparition.

PropriétéTypeCe que ça fait
LingerRotationValueVector3Rotation appliquée pendant la persistance
LingerScaleValueVector3Échelle appliquée pendant la persistance
KeyedLingerVelocityValueVector3Vélocité pendant la persistance
KeyedLingerAccelerationValueVector3Accélération pendant la persistance
KeyedLingerDragValueVector3Drag pendant la persistance
SeparateLingerColorValueColorUne couleur différente pendant la persistance

Chacune a un drapeau Use* correspondant : UseLingerRotation, UseLingerScale, UseKeyedLingerVelocity, UseKeyedLingerAcceleration, UseKeyedLingerDrag et UseSeparateLingerColor. Renseigner la valeur sans son drapeau ne fait rien.

Matériaux et drivers

VfxMaterialDefinitionData contient un lien Material et une map materialDrivers. Les drivers animent un paramètre de matériau au lieu de le garder constant.

ClasseCe que ça fait
VfxColorOverLifeMaterialDriverPilote une couleur sur la durée de vie de la particule
VfxFloatOverLifeMaterialDriverPilote un seul float sur la durée de vie
VfxSineMaterialDriverFait osciller une valeur sur une sinusoïde, pour pulser

Pour le travail sur les glows et le toon shader, voir Static Materials.


Champs de forces

VfxFieldCollectionDefinitionData, atteint via le fieldCollectionDefinition de l'émetteur. Là où birthVelocity met une particule en mouvement, un champ continue d'agir sur elle.

PropriétéTypeCe que ça fait
fieldAccelerationDefinitionslist[embed]Accélération constante, par exemple la gravité
fieldAttractionDefinitionslist[embed]Attire les particules vers un point
fieldDragDefinitionslist[embed]Ralentit les particules
fieldNoiseDefinitionslist[embed]Ajoute de la turbulence
fieldOrbitalDefinitionslist[embed]Fait tourner les particules autour d'un axe

Formes d'émission

SpawnShape pointe vers un IVfxShape.

ClasseCe que ça fait
VfxShapeSphereApparition dans une sphère, avec un radius
VfxShapeBoxApparition dans une boîte
VfxShapeCylinderApparition dans un cylindre
VfxShapeVolumeComportement de volume partagé, porte ses propres flags
VfxShapeLegacyL'ancien système de formes, encore présent sur beaucoup d'effets

VfxEmissionMeshData gère l'apparition depuis un mesh, avec meshName, skeletonName, AnimationName, meshScale, maxJointWeights, Submeshes et useSurfaceNormalForBirthPhysics.


Particules enfants

VfxChildParticleSetDefinitionData, atteint via le childParticleSetDefinition de l'émetteur. C'est ainsi qu'une traînée sème des étincelles ou qu'une explosion projette des débris.

PropriétéTypeCe que ça fait
childrenIdentifierslist[embed]Les systèmes enfants à engendrer, sous forme d'entrées VfxChildIdentifier
boneToSpawnAtlist[string]Os sur lesquels les enfants apparaissent
childrenProbabilityValueFloatChance qu'un enfant apparaisse tout court
childEmitOnDeathboolEngendrer l'enfant à la mort de la particule parente plutôt qu'à sa naissance
ParentInheritanceDefinitionpointerUn VfxParentInheritanceParams décidant de ce dont l'enfant hérite

VfxChildIdentifier contient effect (un lien), effectKey (un hash) et effectName (une chaîne).

VfxParentInheritanceParams contient Mode et RelativeOffset. Ce décalage est un canal relatif au parent à part entière, distinct de l'EmitterPosition propre à l'enfant.

Les enfants apparaissent une fois, à la naissance

Il n'y a pas d'alimentation continue du parent vers l'enfant. Un système enfant est créé exactement une fois, au moment où sa particule porteuse naît, et à partir de là il tourne comme un système indépendant sur sa propre horloge. Le seul démantèlement est la mort de la particule porteuse.

Une conséquence à connaître : pour un porteur isSingleParticle il y a exactement une particule et donc exactement une création d'enfant, et la fermeture de la fenêtre d'émission du parent ne peut pas l'empêcher.

L'héritage est un mode, pas une chaîne fixe

Ce dont un enfant hérite de son parent est décidé par la valeur Mode sur VfxParentInheritanceParams. Quand aucun ParentInheritanceDefinition n'est écrit, l'enfant tourne sous le mode par défaut. Tout modèle mental supposant un ensemble fixe de termes hérités sera juste pour le défaut et faux pour le reste.

Les systèmes enfants s'imbriquent, et le moteur les parcourt en profondeur d'abord, donc une imbrication à trois niveaux se compose à chaque niveau.

Un motif courant est un émetteur parent en VfxPrimitiveNonRenderable : il ne dessine rien et n'existe que pour placer ses enfants.


Le modèle à composants legacy

Les effets plus anciens utilisent un second modèle d'émetteur à base de composants, toujours livré dans le moteur. Tu le croiseras sur les champions de longue date. Il est documenté ici pour que tu le reconnaisses, pas pour que tu écrives du nouveau travail avec.

ClasseTailleRôle
VfxEmitterLegacySimple13 champsL'émetteur legacy simple, atteint via le pointeur LegacySimple de l'émetteur
VfxLegacyRenderComponent66 champsÉtat de rendu legacy
VfxLegacyPhysicsComponent37 champsMouvement et placement legacy
VfxLegacyLifetimeComponent17 champsRythme legacy
VfxLegacyGeometryComponent1 champGéométrie legacy

Beaucoup de noms apparaissent sur les deux modèles. blendMode, texture, bindWeight, birthVelocity, particleLifetime et d'autres existent sur l'émetteur moderne et sur un composant legacy, à des offsets différents. Quand une valeur semble sans effet, vérifie lequel des deux tu es en train d'éditer.

Trois noms n'existent que sur le modèle legacy :

PropriétéTypeVit sur
uvScrollRatevec2VfxEmitterLegacySimple
particleBindvec2VfxEmitterLegacySimple
lockedToEmitterboolVfxEmitterLegacySimple

VfxEmitterLegacySimple porte aussi birthScale, scale, birthRotation, birthRotationalVelocity, rotation, scaleBias, orientation, fixedOrbitType, hasFixedOrbit et scaleUpFromOrigin. Note les birthScale et birthRotation sans suffixe ici, face à birthScale0 et birthRotation0 sur l'émetteur moderne.

Le pointeur LegacySimple est ce qu'utilisent les émetteurs de la liste simpleEmitterDefinitionData du système. Si un système remplit cette liste plutôt que complexEmitterDefinitionData, c'est ce bloc que lisent ses émetteurs.

Propriétés que l'émetteur a perdues

Quatre propriétés d'émetteur ont été retirées et n'apparaîtront que dans de vieux bins ou de vieilles documentations.

PropriétéRetirée auRemplacée par
shape14.1SpawnShape
Material14.1CustomMaterial et materialOverrideDefinitions
materialDrivers14.1La map materialDrivers sur VfxMaterialDefinitionData
flexOffset15.11Rien directement

assetCategory a été retirée de VfxSystemDefinitionData au patch 14.15.


Ce qu'on interprète facilement de travers

Une courte liste des mauvaises lectures qui coûtent le plus de temps.

SuppositionCe qui est vrai en réalité
birthScale0 et birthScale1 sont une paire min-maxIl n'existe pas de birthScale1. Le 0 est un reliquat de nommage, et la randomisation vient de probabilityTables
probabilityTables choisit une valeur dans un ensembleIl multiplie constantValue par un tirage aléatoire, une fois par particule
birthOrbitalVelocity ajoute un mouvement orbitalIl agit uniquement sur la transformation et n'apporte aucune vélocité
miscRenderFlags inverse les facesLe bit 0 désactive le test de profondeur, en inversé, donc 1 veut dire test désactivé
Le sens de blendMode dépend de la primitiveL'état de mélange est le même pour toutes les primitives. Seul le mode 3 écrit la profondeur
textureMult est un nom de fichierC'est un pointeur vers toute une classe de définition. Le nom de fichier est un champ à l'intérieur
mEyeCandy est un réglage d'émetteurIl est sur le système
Un scrollRate simple existeSeules des variantes cadrées existent, plus un uvScrollRate uniquement legacy
Un champ on/off de soft particle existeUn pointeur softParticleParams nul est l'interrupteur
particleLifetime à -1 veut dire particule infinieÇa veut dire « vivre jusqu'à l'arrêt de l'émetteur ». Persistant seulement avec isSingleParticle
Un particleLinger absent vaut zéroIl vaut particleLifetime + 10 par défaut
Un enfant meurt quand la fenêtre de l'émetteur parent se fermeUn enfant est un système indépendant. Il se termine quand ses propres émetteurs s'épuisent ou quand sa particule porteuse est retirée

Les noms et types de cette page ont été lus dans la disposition de classes enregistrée par le moteur pour le patch 16.16. Si une propriété manque ou si une description est fausse, ça vaut le coup de la corriger : voir Comment contribuer.