Work in progress!
Rust + wasm library for declarative modeling of simple particle behaviours.
npm install behaviours-rs
10000 points repelling each other:
import { createSimulation } from "behaviours-rs";
const [width, height] = [600, 600];
const numPoints = 10000;
const points = new Float32Array(numPoints * 2);
for (let i = 0; i < numPoints; i++) {
const x = Math.random() * width;
const y = Math.random() * height;
points[i * 2] = x;
points[i * 2 + 1] = y;
}
// main behaviour modeling
const behaviours = [
["repel", { f: 0.3, r: 50.0 }],
["dampen", { f: 0.1 }]
];
const simulation = createSimulation(points, 2, behaviours);
const canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
document.body.appendChild(canvas);
const ctx = canvas.getContext("2d");
const loop = () => {
ctx.clearRect(0, 0, 600, 600);
simulation.step();
const positions = simulation.get();
for (let i = 0; i < positions.length; i += 2) {
const x = positions[i];
const y = positions[i + 1];
ctx.fillRect(x, y, 1, 1);
}
requestAnimationFrame(loop);
};
loop();
Running examples:
cd ./examples/
npm install
npm start
points
-Float32Array
of flatx
,y
,z
(if in 3d) positions:[ x1,y1,z1, x2,y2,z2, ... ]
dimensions
-2
or3
, can be omitted, defaults to2
behaviours
- tree of behaviours
simulation.step()
- single step of simulationsimulation.get()
- returns all positions (same format aspoints
when creating simulation)simulation.getIf(test)
- returns all points matching provided test (look at"if"
behaviour)simulation.setMeta(idx, key, value)
- sets additionalkey
/value
for specified pointsimulation.getMeta(idx, key)
- returns value for providedkey
or empty string
["repel", { f, r, p }]
f
- force, ideally between0.0
and1.0
r
- impact radiusp
- position when the repelling happens, if ommited the points repel each other
["attract", { f, r, p }]
f
- force, ideally between0.0
and1.0
r
- impact radiusp
- position when the attraction happens, if ommited the points attract each other
["dampen", { f }]"
- dampens velocityf
- force, ideally between0.0
and1.0
["if", { test }, children]
- executeschildren
whentest
passestest
: [op
,key
,value
], whereop
is either"==
" or"!="
, andkey
/value
are this point's metadata
["collide", { test, r }, children]
- executeschildren
when points collide in givenr
, optionally passing atest
test
- same as in"if"
, optionalr
- radius of collision
["set", { ke, value }]"
- setskey
/value
metadata on current point
For collide
and if
usage look into examples/03.js
.