A highly customizable React component to simulate the fascinating behavior of unicellular organisms (like Physarum polycephalum or "slime mold") directly in your browser using Canvas. Create organic and interactive visualizations!
➡️ demo GIF here! ⬅️
- Canvas Simulation: Efficient rendering using
requestAnimationFrame
. - Highly Configurable: Adjust dozens of parameters to influence behavior and appearance.
- Custom Starting Shape: Use your own SVG to define the initial agent area.
- Random Default Behavior: Get unique simulations every time without effort.
- Brush Interaction: Influence the simulation in real-time with your mouse.
- Easy Integration: Simple React component to add to your projects.
- Lightweight: No heavy external dependencies (React is a
peerDependency
).
npm install react-slime-simulation
# or
yarn add react-slime-simulation
Import the component and add it to your application. By default, it will use random parameters and the built-in SVG.
import React from "react";
import SlimeSimulation from "react-slime-simulation";
import "./App.css"; // Make sure the container can take up space
function App() {
return (
<div style={{ width: "100vw", height: "100vh", overflow: "hidden" }}>
<SlimeSimulation />
</div>
);
}
export default App;
The simulation behavior can be finely tuned via props.
Prop | Type | Default | Description |
---|---|---|---|
useRandomDefaults |
boolean | true |
If true , ignores other parameter props and generates random values on each mount (original default behavior). If false , uses the provided prop values. |
svgShape |
string | Built-in SVG (see source code) | A string containing the complete SVG markup (...) to define the starting area. If invalid, agents appear randomly. |
initialAgents |
number | Random (600 -1100 ) |
Number of agents in the simulation. Significantly impacts performance. |
sensorOffset |
number | Random (5 -29 ) |
Distance at which agents "sense" traces ahead of them. |
agentSpeed |
number | Random (0.8 -1.9 ) |
Movement speed of agents per frame. |
trailStrength |
number | Random (0.5 -2.9 ) |
Amount of "trail" left by an agent at each step. |
evaporationRate |
number | Random (0.005 -0.044 ) |
Rate at which trails evaporate each frame. |
edgeAvoidance |
number | Random (0.0 -0.9 ) |
Strength with which agents try to avoid the edges of the simulation area. |
escapeThreshold |
number | Random (0.5 -1.0 ) |
Trace density threshold that triggers an agent's "escape" behavior. |
baseHue |
number | Random (0 -359 ) |
Base HSL hue for the trail color. |
hueRange |
number | Random (30 -89 ) |
Range of hue variation around baseHue , based on trace intensity. |
lightnessRange |
number | Random (20 -49 ) |
Range of lightness variation (L in HSL) around 50%, based on trace intensity. |
brushSize |
number | 4 |
Radius (in simulation pixels) of the mouse influence area. |
brushStrength |
number | 1.5 |
Strength with which the mouse leaves trails. |
pixelScale |
number | 6 |
Scaling factor. The simulation runs at windowWidth / pixelScale pixels wide. Decreasing increases resolution but reduces performance. |
edgeThreshold |
number | 3 |
Distance (in simulation pixels) to edges triggering edgeAvoidance logic. |
reshuffleCount |
number | 10 |
Number of times agents are initially repositioned for the "mixing" visual effect. |
startDelay |
number | 500 |
Delay in milliseconds before the main animation loop starts after initialization. |
Important Note on useRandomDefaults
: When useRandomDefaults
is true
(default), values you pass for initialAgents
, sensorOffset
, agentSpeed
, etc., will be ignored. Set useRandomDefaults
to false
to use your own custom values.
import SlimeSimulation from "react-slime-simulation";
function MyCustomSimulation() {
const settings = {
useRandomDefaults: false,
initialAgents: 450,
agentSpeed: 1.1,
evaporationRate: 0.025,
pixelScale: 7,
baseHue: 180,
hueRange: 15,
trailStrength: 1.8,
};
return <SlimeSimulation {...settings} />;
}
Define your SVG shape as a string. Make sure the SVG has a fill
to ensure rasterization works.
import SlimeSimulation from "react-slime-simulation";
function MySVGShapeSimulation() {
const customSvg = `
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="45" fill="#555" />
</svg>
`;
const settings = {
useRandomDefaults: false,
initialAgents: 600,
svgShape: customSvg,
baseHue: 300,
};
return <SlimeSimulation {...settings} />;
}
Contributions are welcome! If you have ideas for improvements, bug fixes, or new features:
- Fork the repository: https://github.com/LightInn/ReactSlimeSimulation.git
- Create your feature branch (
git checkout -b feature/my-awesome-feature
) - Commit your changes (
git commit -am 'Add my awesome feature'
) - Push to the branch (
git push origin feature/my-awesome-feature
) - Open a Pull Request!
Feel free to open an Issue to discuss major changes beforehand.
This project is licensed under the MIT License. See the LICENSE file for more details.