Module three.quarks - v0.15.7

three.quarks

npm github build-size npm-downloads discord

three.quarks is a high-performance javascript particle system based visual effect library for threejs written in modern TypeScript.

Join our discord for discussion.

landing image

three.quarks is a high-performance general-purpose particle system library with a WYSIWYG visual editor three.quarks-editor for it. It runs on top of the well-known WebGL library called three.js.

  • Port Simulation Compiler code to Rust
  • WebAssembly Particle Simulation on CPU. (WIP)
  • GPU simulation on GPU (WIP)
  • Node based / scriptable particle system (WIP)
  • Simulation Frequency - Performance
  • Unity / Standalone Cross-platform Native plugin to run VFX
  • Semi-compatible Unity (shuriken) Particle system
  • Support Mesh Standard Material and Mesh Basic Material
  • Batch Render Multiple Particle System (reduce draw calls) - BatchedParticleRenderer
  • Emission Shape and Control
    • Mesh Surface Emitter
  • Plugin System - Plugin
    • Customizable Behaviors
    • Customizable Emitter Shape
  • 4 Type of renderer
    • Billboard
    • Stretched Billboard
    • Mesh Renderer
    • Trail Renderer TrailBatch
  • Spawn Particle on Mesh Surface
  • Configuable RenderMode and BlendMode
  • 1D Bézier curve function for adjusting
  • Texture Atlas Animation
  • User Extension and Customization
  • A realtime editor to test and create visual effects three.quarks-editor
  • VFX json load and save

three.quarks computes most particle information on CPU, and it uses customized shader , instancing, batch techniques to render those particles with as few draw calls as possible. three.quarks supports one dimension piecewise Bézier curves for the customizable transform visual effect. Most importantly, developers can customize how the particle system works by adding their own Behavior.

npm install three.quarks

Add particle system to the scene

const clock = new THREE.Clock();
const batchSystem = new BatchedRenderer();
const texture = new TextureLoader().load("atlas.png");
// Particle system configuration
const muzzle = {
duration: 1,
looping: false,
startLife: new IntervalValue(0.1, 0.2),
startSpeed: new ConstantValue(0),
startSize: new IntervalValue(1, 5),
startColor: new ConstantColor(new THREE.Vector4(1, 1, 1, 1)),
worldSpace: false,

maxParticle: 5,
emissionOverTime: new ConstantValue(0),
emissionBursts: [{
time: 0,
count: new ConstantValue(1),
cycle: 1,
interval: 0.01,
probability: 1,
}],

shape: new PointEmitter(),
material: new MeshBasicMaterial({map: texture, blending: AdditiveBlending, transparent: true}),
startTileIndex: new ConstantValue(91),
uTileCount: 10,
vTileCount: 10,
renderOrder: 2,
renderMode: RenderMode.Mesh
};

// Create particle system based on your configuration
muzzle1 = new ParticleSystem(muzzle);
// developers can customize how the particle system works by
// using existing behavior or adding their own Behavior.
muzzle1.addBehavior(new ColorOverLife(new ColorRange(new THREE.Vector4(1, 0.3882312, 0.125, 1), new THREE.Vector4(1, 0.826827, 0.3014706, 1))));
muzzle1.addBehavior(new SizeOverLife(new PiecewiseBezier([[new Bezier(1, 0.95, 0.75, 0), 0]])));
// texture atlas animation
muzzle1.addBehavior(new FrameOverLife(new PiecewiseBezier([[new Bezier(91, 94, 97, 100), 0]])));
muzzle1.emitter.name = 'muzzle1';
muzzle1.emitter.position.x = 1;

batchSystem.addSystem(muzzle1);

// Add emitter to your Object3D
scene.add(muzzle1.emitter);
scene.add(batchSystem);

Add batch renderer update in your main loop

// update batched renderer
batchSystem.update(clock.getDelta());
const batchSystem = new BatchedRenderer();
const loader = new QuarksLoader();
loader.setCrossOrigin("");
loader.load(jsonURL, (obj) => {
// the API uses manuel loading because users may need to
// store the VFX somewhere to reuse it later.
QuarksUtil.addToBatchRenderer(obj, batchRenderer);
scene.add(obj);
}, () => {
}, () => {
});
scene.add(batchSystem);
const effect = loadedEffect.clone(true);
scene.add(effect);
QuarksUtil.setAutoDestroy(effect, true);
QuarksUtil.addToBatchRenderer(effect, batchSystem);
// if you want to stop the effect animation at the beginning you could run pause
QuarksUtil.pause(effect);
QuarksUtil.play(effect);

Note: the texture url reference is defined by the texture's name field. you may need to modify the texture url in json as needed.

JSON.stringify(muzzle1.emitter.toJSON())
JSON.stringify(muzzle1.emitter.parent.toJSON())

Launch Examples

npm install             # install dependencies
npm run build # build three.quarks
npm run example # start an HTTP server to serve example particle effects

three.quarks-editor can help you preview a set of particle system at once. and you can also adjust all the particle system at real time and export those system as a JSON file. Your app or game can load those JSON file later. It even includes a Javascript scripting system to test those effect in a similar environment to your application.

Check test folder

More examples will come up later.

If you want the best performance please consider `yarn link` [https://github.com/Alchemist0823/three.js](https://github.com/Alchemist0823/three.js). This version of three.js performs much better than official release, because it avoids unnecessary `getProgramCachedKey()` calls and material updates.

Enumerations

EmitterMode
RenderMode
SubParticleEmitMode

Classes

ApplyCollision
ApplyForce
ApplySequences
AxisAngleGenerator
BatchedRenderer
Bezier
ChangeEmitDirection
CircleEmitter
ColorBySpeed
ColorOverLife
ColorRange
ConeEmitter
ConstantColor
ConstantValue
DonutEmitter
EmitSubParticleSystem
Euler
EulerGenerator
ForceOverLife
FrameOverLife
Gradient
GravityForce
GridEmitter
HemisphereEmitter
IntervalValue
LimitSpeedOverLife
Matrix3
Matrix4
MeshSurfaceEmitter
NodeParticle
Noise
OrbitOverLife
ParticleEmitter
ParticleMeshPhysicsMaterial
ParticleMeshStandardMaterial
ParticleSystem
PiecewiseBezier
PiecewiseFunction
PointEmitter
QuarksLoader
QuarksUtil
Quaternion
RandomColor
RandomColorBetweenGradient
RandomQuatGenerator
RecordState
RectangleEmitter
Rotation3DOverLife
RotationBySpeed
RotationOverLife
SizeBySpeed
SizeOverLife
SpeedOverLife
SphereEmitter
SpriteBatch
SpriteParticle
TextureSequencer
TrailBatch
TrailParticle
TurbulenceField
Vector2
Vector3
Vector3Function
Vector4
VFXBatch
WidthOverLength

Interfaces

Behavior
BehaviorPlugin
BillBoardSettings
BurstParameters
BurstParametersJSON
CircleEmitterParameters
ColorGenerator
ConeEmitterParameters
Constructable
DonutEmitterParameters
EmissionState
EmitterShape
EmitterShapePlugin
FunctionColorGenerator
FunctionValueGenerator
GridEmitterParameters
HemisphereEmitterParameters
IEmitter
IParticle
IParticleSystem
JsonMetaData
MeshSettings
MetaData
Particle
ParticleSystemEvent
ParticleSystemJSONParameters
ParticleSystemParameters
Plugin
RectangleEmitterParameters
Resource
RotationGenerator
Sequencer
SerializationOptions
ShapeJSON
SphereEmitterParameters
StoredBatchSettings
StretchedBillBoardSettings
TrailSettings
ValueGenerator
Vector3Generator
VFXBatchSettings

Type Aliases

EulerOrder
FieldType
FunctionJSON
GeneratorMemory
ParameterPair
ParameterType
ParticleSystemEventType
RendererEmitterSettings

Variables

BatchedParticleRenderer
BehaviorTypes
DEG2RAD
EmitterShapes
MathUtils
MeshSurfaceEmitterPlugin
Plugins
RAD2DEG
WebGLCoordinateSystem
WebGPUCoordinateSystem

Functions

BehaviorFromJSON
ceilPowerOfTwo
clamp
ColorGeneratorFromJSON
damp
degToRad
denormalize
EmitterFromJSON
euclideanModulo
floorPowerOfTwo
generateUUID
GeneratorFromJSON
getPhysicsResolver
getValueFromEmitterMode
inverseLerp
isPowerOfTwo
lerp
loadPlugin
mapLinear
normalize
pingpong
radToDeg
randFloat
randFloatSpread
randInt
registerShaderChunks
RotationGeneratorFromJSON
seededRandom
SequencerFromJSON
setPhysicsResolver
setQuaternionFromProperEuler
smootherstep
smoothstep
unloadPlugin
ValueGeneratorFromJSON
Vector3GeneratorFromJSON