0.1.1 • Published 6 years ago
behaviours-rs v0.1.1
behaviours-rs
Work in progress!
Rust + wasm library for declarative modeling of simple particle behaviours.
Installation
npm install behaviours-rs
Example
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 startAPI
Constructor
const simulation = createSimulation(points, dimensions, behaviours) - creates new simulation
points-Float32Arrayof flatx,y,z(if in 3d) positions:[ x1,y1,z1, x2,y2,z2, ... ]dimensions-2or3, can be omitted, defaults to2behaviours- tree of behaviours
Functions
simulation.step()- single step of simulationsimulation.get()- returns all positions (same format aspointswhen creating simulation)simulation.getIf(test)- returns all points matching provided test (look at"if"behaviour)simulation.setMeta(idx, key, value)- sets additionalkey/valuefor specified pointsimulation.getMeta(idx, key)- returns value for providedkeyor empty string
Behaviours
["repel", { f, r, p }]f- force, ideally between0.0and1.0r- impact radiusp- position when the repelling happens, if ommited the points repel each other
["attract", { f, r, p }]f- force, ideally between0.0and1.0r- impact radiusp- position when the attraction happens, if ommited the points attract each other
["dampen", { f }]"- dampens velocityf- force, ideally between0.0and1.0
["if", { test }, children]- executeschildrenwhentestpassestest:op,key,value, whereopis either"==" or"!=", andkey/valueare this point's metadata
["collide", { test, r }]test- same as in"if"r- radius of collision
["set", { ke, value }]"- setskey/valuemetadata on current point
For collide and if usage look into examples/03.js.