← Back to catalog
text-effects / particle-text-dissolve
Particle Text Dissolve
Text assembles from a seeded particle cloud (or dissolves into it): per-particle targets sampled once from the rendered text bitmap at mount, table-driven particles, zero per-particle tweens, one onUpdate painter.
Use this effect
VideoML XML
Save this example as example.videoml.xml and place the downloaded asset in an assets/ directory beside it. Run vml pipeline example.videoml.xml with a VideoML installation that supports frame effects.
Download Geist-Latin.woff2 to assets/.
<vml id="catalog-example" width="1280" height="720" fps="30" duration="4s">
<voiceover seed="0"/>
<assets>
<asset id="font" src="assets/Geist-Latin.woff2" media-type="font/woff2"/>
</assets>
<scene id="example" start="0s" duration="4s">
<frame-effect id="effect" effect-id="videoml/particle-text-dissolve" effect-version="1" props='{"parameters":{"text":"VideoML","density":"med","accent":"green","direction":"in"}}' start="0s" duration="4s"/>
</scene>
</vml>
TypeScript
Requires the frozen stdlib package, a page element with id="effect-root", and the referenced local assets. Revoke any generated object URLs when the host disposes the effect.
import { createEffectRegistry, mountEffect } from '@videoml/stdlib/effects';
import { registerParticleEffects } from '@videoml/stdlib/effects/particles';
const root = document.querySelector<HTMLElement>('#effect-root');
if (!root) throw new Error('Missing #effect-root');
const assets: Record<string, string> = {};
const assetResponse = await fetch('/catalog-assets/Geist-Latin.woff2');
if (!assetResponse.ok) throw new Error('Asset unavailable');
assets.font = URL.createObjectURL(await assetResponse.blob());
const registry = createEffectRegistry();
registerParticleEffects(registry);
const effect = mountEffect(root, registry, {
"id": "videoml/particle-text-dissolve",
"version": "1",
"parameters": {
"text": "VideoML",
"density": "med",
"accent": "green",
"direction": "in"
},
"startFrame": 0,
"endFrame": 120
}, { width: 1280, height: 720, fps: 30, seed: 0, assets });
await effect.seek(0);
// Call await effect.dispose() and revoke asset URLs when finished.implemented · interactive preview
This entry is implemented but not yet verified.