particri / DOCUMENTATION.md
ArifiIslam's picture
Add Trapcode Particular VFX systems: Aux trails, Layer emitter, Bounce physics, Curves over life (v1.1.0)
e14f09d verified
|
Raw History Blame Contribute Delete
21.8 kB
# Particri (بارتيكري) - Complete Technical Documentation & API Reference
## التوثيق التقني الشامل والمرجع الكامل لجميع دوال ومكونات المكتبة
Welcome to the definitive reference manual for **Particri**, the state-of-the-art C++20 and Python particle simulation and procedural rendering engine.
---
# 📑 Table of Contents (فهرس المحتويات)
1. [Architectural Overview (نظرة عامة على البنية البرمجية)](#1-architectural-overview)
2. [Class: ParticleEngine (محرك الجزيئات الأساسي)](#2-class-particleengine)
3. [Enums (الثوابت والتصنيفات)](#3-enums)
- [ParticleShape (أشكال الجزيئات)](#particleshape)
- [BlendMode (أوضاع دمج الألوان)](#blendmode)
- [EmitterShape (أشكال البواعث)](#emittershape)
4. [Math Primitives: Vec2 & Color4 (بُنى الرياضيات والألوان)](#4-math-primitives)
5. [Class: Presets (الأنماط الجاهزة فائقة الواقعية)](#5-class-presets)
6. [Class: StyleGenerator (مولد الستايلات اللانهائية)](#6-class-stylegenerator)
7. [Class: StockFactory (مصنع أصول الستوك الضخم لـ Shutterstock)](#7-class-stockfactory)
8. [Class: Exporter (نظام التصدير للصور والفيديو والمتحركات)](#8-class-exporter)
9. [Class: Studio (الأستوديو التفاعلي المباشر 60 FPS)](#9-class-studio)
10. [End-to-End Tutorials (أمثلة برمجية شاملة)](#10-end-to-end-tutorials)
---
# 1. Architectural Overview
Particri is architected in a high-performance two-tier hybrid model:
- **Tier 1: High-Performance C++20 Core (`_particri_core`)**:
- Implements SIMD vector math, force fields, and multithreaded rasterization.
- Integrates **`FastNoiseLite`** to compute divergence-free **Curl Noise** ($\nabla \cdot \vec{v} = 0$), producing smooth fluid-like particle turbulence.
- Generates mathematical light sprites on-the-fly (`Star4`, `Star8`, `Bokeh`, `Halo`, `Streak`, `Glitter`).
- High Dynamic Range (HDR) accumulation pipeline with multi-pass Gaussian Optical Bloom and Reinhard tone mapping.
- Exposes zero-copy NumPy memory views via **`pybind11`**.
- **Tier 2: Python High-Level API (`particri`)**:
- Intuitive, declarative class hierarchy with chaining support.
- Infinite procedural style synthesis engine.
- Automated Shutterstock batch production and SEO metadata generator.
- Real-time interactive studio with live 60 FPS Pygame viewport.
---
# 2. Class: ParticleEngine
The primary coordinator managing particles, emitters, forces, and rendering.
```python
import particri
engine = particri.ParticleEngine(max_particles=30000, width=1920, height=1080)
```
### Constructor: `__init__`
```python
ParticleEngine(max_particles: int = 25000, width: int = 1920, height: int = 1080)
```
- **`max_particles`** *(int)*: Maximum number of particles allocated in the pre-allocated C++ memory pool.
- **`width`** *(int)*: Frame buffer horizontal resolution in pixels.
- **`height`** *(int)*: Frame buffer vertical resolution in pixels.
---
### Emitter Management: `add_emitter`
Configures and attaches a new procedural particle emitter to the system.
```python
engine.add_emitter(
shape=particri.EmitterShape.Point,
position=(960.0, 540.0),
size=(100.0, 100.0),
rate=200.0,
speed_range=(20.0, 120.0),
angle_range=(0.0, 6.283185),
lifetime_range=(1.5, 3.5),
size_start_range=(6.0, 18.0),
size_end_range=(0.0, 2.0),
color_start=(1.0, 0.85, 0.35, 1.0),
color_variance=(0.1, 0.1, 0.05, 0.0),
color_end=(1.0, 0.5, 0.1, 0.0),
particle_shape=particri.ParticleShape.Star4,
twinkle_speed_range=(3.0, 12.0),
rotation_speed_range=(-2.0, 2.0),
drag=0.15,
radial_velocity=True,
seed=42
) -> int
```
#### Parameters:
- **`shape`** (`EmitterShape`): Geometry from which particles originate (`Point`, `Circle`, `Ring`, `Box`, `Line`).
- **`position`** (`Tuple[float, float]`): Center `(x, y)` coordinate of the emitter in pixels.
- **`size`** (`Tuple[float, float]`): Emitter dimensions:
- For `Box`: `(width, height)`.
- For `Circle`: `(inner_radius, outer_radius)` (inner radius is 0 for solid disc).
- For `Ring`: `(inner_radius, outer_radius)`.
- **`rate`** (`float`): Emission rate in particles spawned per second.
- **`speed_range`** (`Tuple[float, float]`): Min and max initial ejection velocity in pixels/second.
- **`angle_range`** (`Tuple[float, float]`): Min and max ejection angle in radians `[0, 2π]`.
- **`lifetime_range`** (`Tuple[float, float]`): Min and max lifespan of each particle in seconds.
- **`size_start_range`** (`Tuple[float, float]`): Min and max initial particle diameter in pixels.
- **`size_end_range`** (`Tuple[float, float]`): Min and max diameter at the end of particle lifetime.
- **`color_start`** (`Tuple[float, float, float, float]`): Initial RGBA color in normalized float `[0.0, 1.0+]` (supports HDR values > 1.0).
- **`color_variance`** (`Tuple[float, float, float, float]`): Random jitter added to `color_start` per particle.
- **`color_end`** (`Tuple[float, float, float, float]`): Target RGBA color at the end of particle lifetime.
- **`particle_shape`** (`ParticleShape`): Visual sprite shape (`Bokeh`, `Star4`, `Star8`, `Halo`, `Streak`, `Glitter`).
- **`twinkle_speed_range`** (`Tuple[float, float]`): Frequency of specular twinkle oscillation.
- **`rotation_speed_range`** (`Tuple[float, float]`): Angular rotation speed in radians/second.
- **`drag`** (`float`): Particle specific air resistance coefficient.
- **`radial_velocity`** (`bool`): If `True`, velocity points radially outward from the emitter center.
- **`seed`** (`int`): PRNG seed for reproducible particle distribution.
- **Returns**: `int` - Index of the newly created emitter.
---
### Physics & Force Fields
#### `add_curl_noise`
Adds divergence-free 2D/3D turbulence field computed via finite differences over OpenSimplex2 noise. Guarantees $\nabla \cdot \vec{v} = 0$, giving fluid-like swirling motion without clumping.
```python
engine.add_curl_noise(seed: int = 1337, strength: float = 120.0, frequency: float = 0.003, speed: float = 0.3) -> ParticleEngine
```
- **`seed`**: FastNoiseLite PRNG seed.
- **`strength`**: Force magnitude scaling the curl velocity vectors.
- **`frequency`**: Spatial scale of noise vortices (lower = larger swirling eddies).
- **`speed`**: Temporal rate of evolution of the noise field over time.
#### `add_vortex`
Adds an orbital rotational vortex force around a specified coordinate.
```python
engine.add_vortex(center: Tuple[float, float], strength: float = 150.0, radial_pull: float = 20.0, radius: float = 800.0) -> ParticleEngine
```
- **`center`**: `(x, y)` coordinate of the vortex core.
- **`strength`**: Tangential rotational speed.
- **`radial_pull`**: Inward (positive) or outward (negative) suction force.
- **`radius`**: Maximum effective radius of the vortex field.
#### `add_gravity`
Adds constant directional acceleration (gravity, wind, or diagonal draft).
```python
engine.add_gravity(gx: float = 0.0, gy: float = 98.0) -> ParticleEngine
```
#### `add_drag`
Adds global fluid damping resistance proportional to velocity ($F = -k \cdot v$).
```python
engine.add_drag(coeff: float = 0.5) -> ParticleEngine
```
#### `add_attractor`
Attracts (positive strength) or repels (negative strength) particles towards a point.
```python
engine.add_attractor(target: Tuple[float, float], strength: float = 200.0, min_distance: float = 20.0, max_distance: float = 800.0) -> ParticleEngine
```
#### `add_brownian`
Adds chaotic microscopic Brownian motion jitter (critical for floating dust and pollen).
```python
engine.add_brownian(strength: float = 30.0, seed: int = 42) -> ParticleEngine
```
---
### Trapcode Particular Iconic VFX Systems
#### 1. Auxiliary System (`enable_aux_system` / `disable_aux_system`)
Recreates Trapcode Particular's famous **Aux System** where primary parent particles emit secondary child particles (sparkle trails, smoke dust, or explosive death bursts):
```python
engine.enable_aux_system(
rate: float = 15.0, # Aux particles emitted per parent per second
lifetime: float = 1.2, # Lifespan of child particles in seconds
size_range: Tuple[float, float] = (4.0, 0.5), # (start_size, end_size)
color_start: Tuple[float, float, float, float] = (1.0, 0.9, 0.4, 0.9),
color_end: Tuple[float, float, float, float] = (1.0, 0.4, 0.1, 0.0),
inherit_color: bool = True, # If True, inherits current parent color
velocity_inheritance: float = 0.15, # Percentage of parent velocity inherited
spread: float = 25.0, # Random velocity dispersion jitter
particle_shape: ParticleShape = ParticleShape.Glitter,
size_curve: CurveType = CurveType.Bell,
opacity_curve: CurveType = CurveType.GrowAndFade,
emit_at_death: int = 0 # Burst count when parent particle dies
) -> ParticleEngine
engine.disable_aux_system() -> ParticleEngine
```
#### 2. Layer / Mask Image Emitter (`add_layer_emitter`)
Recreates Trapcode Particular's **Layer Grid Emitter**. Particles are born exclusively from non-empty pixels of an image, logo, or text mask, with optional **automatic pixel color inheritance**:
```python
engine.add_layer_emitter(
image: Union[str, Path, np.ndarray], # Filepath or (H, W, 4) NumPy array
rate: float = 500.0,
threshold: float = 0.05, # Alpha / luminance cutoff
inherit_layer_color: bool = True, # Particles born with the exact colors of the logo
speed_range: Tuple[float, float] = (5.0, 30.0),
lifetime_range: Tuple[float, float] = (1.0, 2.5),
size_start_range: Tuple[float, float] = (4.0, 10.0),
size_end_range: Tuple[float, float] = (0.0, 1.0),
particle_shape: ParticleShape = ParticleShape.Star8,
size_curve: CurveType = CurveType.Bell,
opacity_curve: CurveType = CurveType.GrowAndFade,
drag: float = 0.2,
seed: int = 42
) -> int
```
#### 3. Floor & Bounce Collision Physics (`add_bounce_plane`)
Recreates Trapcode Particular's **Bounce Physics**. Adds collision planes (floors, ceilings, walls) that particles bounce against with elasticity (restitution) and surface friction:
```python
engine.add_bounce_plane(
coord: float = 900.0, # Floor coordinate (y) or wall coordinate (x)
bounce: float = 0.65, # Elasticity restitution [0.0 = clay stop, 1.0 = superball]
friction: float = 0.85, # Tangential friction factor [0.0 = full stop, 1.0 = frictionless]
is_horizontal: bool = True,# True for Floor/Ceiling (Y), False for Walls (X)
is_max: bool = True # True for Floor / Right Wall (>= coord), False for Ceiling / Left Wall (<= coord)
) -> ParticleEngine
```
#### 4. Curves Over Life (`CurveType`)
Advanced mathematical curves for evaluating size and opacity dynamically across particle lifespan:
- `CurveType.Linear`: Linear ramp from start to end.
- `CurveType.Bell`: $\sin(\pi t)$, peaks at mid-life and fades gracefully at birth and death.
- `CurveType.GrowAndFade`: Grows during first 15% of life, sustains until 75%, then fades out.
- `CurveType.Pulse`: Oscillating shimmer wave.
- `CurveType.Decay`: Exponential decay $e^{-3.5t}$.
- `CurveType.EaseIn`: Quadratic ease in ($t^2$).
- `CurveType.EaseOut`: Quadratic ease out ($1 - (1-t)^2$).
---
### Simulation & Lifecycle Methods
#### `burst`
Instantly spawns $N$ particles in a single frame from the specified emitter.
```python
engine.burst(emitter_idx: int = 0, count: int = 100) -> ParticleEngine
```
#### `update`
Advances physics simulation, force application, lifecycles, and particle emission by `dt` seconds.
```python
engine.update(dt: float) -> ParticleEngine
```
#### `warmup`
Fast-forwards the simulation by `duration` seconds in steps of `step` to achieve steady-state visual dispersion before rendering.
```python
engine.warmup(duration: float = 2.0, step: float = 1.0 / 60.0) -> ParticleEngine
```
#### `clear` / `reset_forces` / `reset_emitters`
```python
engine.clear() # Deactivates all active particles
engine.reset_forces() # Removes all registered force fields
engine.reset_emitters() # Removes all registered emitters
```
---
### Rendering Methods
#### `render`
Renders the current frame to an **(H, W, 4) uint8 RGBA** NumPy array with tone mapping.
```python
engine.render(
blend_mode: BlendMode = BlendMode.Additive,
bloom: bool = True,
bloom_threshold: float = 0.35,
bloom_intensity: float = 0.8,
bloom_radius: int = 8
) -> np.ndarray
```
- **`blend_mode`**: Blending mode applied during sprite accumulation.
- **`bloom`**: Whether to apply the multi-pass optical Gaussian glow filter.
- **`bloom_threshold`**: Luminance cutoff for bright pixels feeding into the bloom pyramid.
- **`bloom_intensity`**: Multiplier for the composited glow aura.
- **`bloom_radius`**: Kernel radius in pixels for the separable Gaussian blur.
- **Returns**: `np.ndarray` of shape `(H, W, 4)` and type `uint8`.
#### `render_hdr`
Renders to an **(H, W, 4) float32 HDR RGBA** NumPy array without 8-bit clamping.
---
# 3. Enums
### `ParticleShape`
Procedural mathematical light sprites:
- **`ParticleShape.Bokeh`** (0): Soft circular out-of-focus optical disc with smooth edge falloff and subtle rim brightening.
- **`ParticleShape.Star4`** (1): 4-point diamond cross flare with razor-sharp horizontal/vertical diffraction spikes and glowing core.
- **`ParticleShape.Star8`** (2): 8-point cinematic Hollywood starburst with major cross rays and diagonal accent spikes.
- **`ParticleShape.Halo`** (3): Concentric ethereal shockwave ring.
- **`ParticleShape.Streak`** (4): Directional motion-blur spark automatically oriented and stretched along the particle's velocity vector.
- **`ParticleShape.Glitter`** (5): Microscopic faceted crystal facet with high-contrast pinpoint specular sparkle.
- **`ParticleShape.Custom`** (6): Custom RGBA user-provided sprite texture.
### `BlendMode`
- **`BlendMode.Additive`** (0): Adds color values ($C_{dst} += C_{src} \cdot \alpha$). Essential for stars, fire, and glowing light.
- **`BlendMode.Screen`** (1): Soft brightening formula without blowing out into pure white ($1 - (1 - dst)(1 - src)$).
- **`BlendMode.Alpha`** (2): Standard Porter-Duff alpha over blending ($src \cdot \alpha + dst \cdot (1 - \alpha)$). Ideal for smoke, dust, and dark particles.
- **`BlendMode.ColorDodge`** (3): Hyper-luminous magical color dodge ($dst / (1 - src)$).
### `EmitterShape`
- **`EmitterShape.Point`** (0): Emits from a single coordinate.
- **`EmitterShape.Circle`** (1): Emits inside a circular disc.
- **`EmitterShape.Ring`** (2): Emits in a concentric ring between inner and outer radii.
- **`EmitterShape.Box`** (3): Emits uniformly within a rectangular boundary.
- **`EmitterShape.Line`** (4): Emits along a line segment.
---
# 4. Math Primitives
### `Vec2`
2D vector class supporting full vector arithmetic:
```python
from particri import Vec2
v = Vec2(10.0, 20.0)
v.x += 5.0
```
### `Color4`
HDR RGBA color structure:
```python
from particri import Color4
c = Color4(1.0, 0.85, 0.35, 1.0)
c_hex = Color4.from_hex(0xFFD700, alpha=1.0) # Gold
```
---
# 5. Class: Presets
Curated VFX presets that faithfully reproduce every style from luxury stock photography:
```python
import particri
```
### 1. `Presets.golden_sparkles`
Replicates Reference Panel 2: Golden diamond stars, soft glowing bokeh dust, and fine glitter.
```python
engine = particri.Presets.golden_sparkles(width=1920, height=1080, density=1.0, seed=42)
```
### 2. `Presets.starburst_cluster`
Replicates Reference Panel 3: Dense central explosive golden star cluster radiating sparkling dust.
```python
engine = particri.Presets.starburst_cluster(width=1920, height=1080, density=1.0, seed=101)
```
### 3. `Presets.cosmic_nebula`
Replicates Reference Panel 4: Swirling purple/indigo stardust cloud driven by Curl Noise fluid turbulence.
```python
engine = particri.Presets.cosmic_nebula(width=1920, height=1080, density=1.0, seed=202)
```
### 4. `Presets.light_streaks`
Replicates Reference Panel 1: High-velocity directional cyan/emerald light streaks and anamorphic rays.
```python
engine = particri.Presets.light_streaks(width=1920, height=1080, density=1.0, seed=303)
```
### 5. `Presets.glitter_field`
Replicates Reference Bottom Panel: Dense luxury gold glitter texture with high-frequency specular twinkle.
```python
engine = particri.Presets.glitter_field(width=1920, height=1080, density=1.0, seed=404)
```
### 6. `Presets.circle_wreath`
Sparkling circular ring / wreath frame for luxury logos, monograms, and invitation headers.
```python
engine = particri.Presets.circle_wreath(width=1920, height=1080, radius=340.0, density=1.0, seed=505)
```
### 7. `Presets.heart_burst`
Romantic heart-shaped particle constellation for Valentine's Day, weddings, and greeting cards.
```python
engine = particri.Presets.heart_burst(width=1920, height=1080, scale=18.0, density=1.0, seed=606)
```
### 8. `Presets.golden_rain`
Vertical cascading waterfall / rain curtain of twinkling gold dust and soft bokeh drops.
```python
engine = particri.Presets.golden_rain(width=1920, height=1080, density=1.0, seed=707)
```
---
# 6. Class: StyleGenerator (The Infinite Styles Engine)
Procedural synthesis engine capable of producing thousands of unique, non-repeating particle styles.
```python
engine = particri.StyleGenerator.create(
seed=1234,
width=1920,
height=1080,
palette_name="gold", # 'gold', 'cosmic', 'solar', 'emerald', 'rose', 'cyberpunk', 'diamond', or None (procedural)
motion_type="swirl" # 'swirl', 'burst', 'drift', 'rain', 'vortex', 'cosmic'
)
```
- **`palette_name=None`**: Automatically derives harmonious complementary or split-complementary color palettes using golden ratio hue shifts.
- **`motion_type=None`**: Automatically curates physics parameters, drag coefficients, turbulence frequencies, and Brownian factors.
---
# 7. Class: StockFactory (Shutterstock Mass-Production)
Specialized bulk generator engineered to produce thousands of commercial stock assets for **Shutterstock**, **Adobe Stock**, **Freepik**, and **Envato**.
```python
from particri import StockFactory
```
### `StockFactory.create_asset`
Creates a single commercial asset archetype and its associated SEO metadata.
```python
engine, metadata = StockFactory.create_asset(
category="frame", # 'overlay', 'frame', 'burst', 'wave', 'corner', 'glitter'
theme="gold", # 'gold', 'silver', 'rose_gold', 'cosmic', 'emerald', 'solar'
resolution="4K", # '4K' (3840x2160), '1080p', 'Square' (3000x3000), 'Vertical' (2160x3840)
seed=100
)
```
### `StockFactory.generate_batch`
Mass-produces an entire collection of assets and writes a ready-to-upload `shutterstock_bulk_upload_manifest.csv` with optimized titles, descriptions, and 35+ SEO keywords per item!
```python
records = StockFactory.generate_batch(
output_dir="shutterstock_gold_pack",
count=100,
resolution="4K",
export_black_preview=True # Saves transparent PNG + pure black composite for video editors
)
```
---
# 8. Class: Exporter
High-fidelity export pipeline:
```python
from particri import Exporter
```
- **`Exporter.save_image(image_array, filepath, quality=95)`**: Saves to 32-bit RGBA PNG, WebP (lossless), or JPG.
- **`Exporter.save_sequence(engine, output_dir, frames=120, fps=60, warmup=1.5)`**: Exports a numbered sequence of transparent PNG frames.
- **`Exporter.save_video(engine, filepath, duration=4.0, fps=60, warmup=1.5)`**: Exports smooth 60 FPS MP4 video.
- **`Exporter.save_gif(engine, filepath, duration=2.5, fps=30, warmup=1.5)`**: Exports an animated GIF.
---
# 9. Class: Studio
Real-time interactive GUI viewport running at 60 FPS via Pygame:
```python
from particri import Studio
Studio.launch()
```
### Keyboard & Mouse Controls:
- **`[1 - 5]`**: Switch between reference presets (Sparkles, Burst, Nebula, Streaks, Glitter).
- **`[6]`**: Generate a completely new infinite procedural style on-the-fly!
- **`[SPACE]`**: Trigger particle explosion / burst.
- **`[B]`**: Toggle Optical Bloom on / off.
- **`[S]`**: Save high-resolution PNG screenshot to disk.
- **`Mouse Click & Drag`**: Emit particles interactively at cursor location.
---
# 10. End-to-End Tutorials
### Tutorial 1: Generate 1,000 Shutterstock 4K Assets with Metadata
```python
import particri
# Produce 1,000 unique 4K stock assets
particri.StockFactory.generate_batch(
output_dir="my_shutterstock_collection_4k",
count=1000,
resolution="4K",
export_black_preview=True
)
print("Complete! Upload the generated PNGs and the manifest CSV directly to Shutterstock.")
```
### Tutorial 2: Creating a Custom Swirling Golden Spell Circle
```python
import particri
engine = particri.ParticleEngine(max_particles=35000, width=1920, height=1080)
cx, cy = 960.0, 540.0
# 1. Add physics forces
engine.add_vortex(center=(cx, cy), strength=160.0, radial_pull=15.0, radius=600.0)
engine.add_curl_noise(seed=42, strength=80.0, frequency=0.003, speed=0.25)
engine.add_drag(0.15)
# 2. Add sparkling ring emitter
engine.add_emitter(
shape=particri.EmitterShape.Ring,
position=(cx, cy),
size=(250.0, 320.0),
rate=450.0,
speed_range=(10.0, 40.0),
lifetime_range=(2.0, 4.5),
size_start_range=(16.0, 48.0),
color_start=(1.0, 0.9, 0.45, 1.0),
color_end=(1.0, 0.5, 0.1, 0.0),
particle_shape=particri.ParticleShape.Star4,
twinkle_speed_range=(6.0, 18.0)
)
# 3. Simulate and save
engine.warmup(2.5)
frame = engine.render(bloom=True, bloom_intensity=0.9)
particri.Exporter.save_image(frame, "golden_spell_vortex.png")
```