Is there anyway to have the edge behavior be to teleport to the other edge of the bounding box instead of staying physically contained? So that I might create a constant flow in a particular direction
Louie
2026-02-11 01:52:16 +0000 UTC
second this
Max Swart
2026-01-19 03:16:14 +0000 UTC
Stunning work!
Sadly, I’m still struggling to make it work on a Mac. I’m not sure where to add the code (I’m a newbie). Could any Mac user who got this working please share the file? Cheers.
Felipe Faundez
2026-01-18 11:47:36 +0000 UTC
I've got the same problem - it seems lowering the force multiplier helps, but I haven't been able to figure out how to remove it completly
Pierce Wilson
2026-01-12 19:19:02 +0000 UTC
Great work! However I am getting strong and weird jerks of the particles, even when the strenght of the noise is small and the force multiplier is well bellow 1.
If I add trails, I get a lot of weird very long and straight lines.
What can it be? I am using 2025.31760 on a Mac, with the code changed as per the comment
Fernando
2025-12-08 10:19:39 +0000 UTC
Honestly I don't know, it's not in my priorities hehe
Edgar Schubhan
2025-12-05 12:16:38 +0000 UTC
How would you go about creating a renderable fluid geometry for this? I would like to render with PBR or substance to make a realistic interactive water sim installation.
Adam Anden
2025-11-23 03:37:18 +0000 UTC
Łukasz Furman commented this on another post :
MACOS arm: replace the code in glsl1 <- POP_Fluid_Solver Comp
// M1 Max compatible version - using memory barriers instead of atomics
// NOTE: This requires careful thread dispatch to minimize race conditions
uint flatten3(ivec3 c, uint R){
return uint(c.x) + R * (uint(c.y) + R * uint(c.z));
}
struct TriliInfo { ivec3 i0; vec3 f; };
TriliInfo triliInfo(vec3 x, vec3 bmin, vec3 size, uint R){
TriliInfo t;
vec3 h = size / float(R);
vec3 g = (x - bmin) / h - vec3(0.5);
t.i0 = ivec3(floor(g));
t.f = clamp(fract(g), 0.0, 1.0);
return t;
}
void splatV_trilinear_grid(vec3 p, vec3 v, vec3 bmin, vec3 size, uint R){
vec3 bmax = bmin + size;
if (any(lessThan(p, bmin)) || any(greaterThan(p, bmax))) return;
TriliInfo t = triliInfo(p, bmin, size, R);
ivec3 lo = ivec3(0), hi = ivec3(int(R)-1);
ivec3 i0 = clamp(t.i0, lo, hi);
vec3 f = t.f;
for (int dz=0; dz<=1; ++dz){
float wz = (dz==0) ? (1.0 - f.z) : f.z;
int z = clamp(i0.z + dz, lo.z, hi.z);
for (int dy=0; dy<=1; ++dy){
float wy = (dy==0) ? (1.0 - f.y) : f.y;
int y = clamp(i0.y + dy, lo.y, hi.y);
for (int dx=0; dx<=1; ++dx){
float wx = (dx==0) ? (1.0 - f.x) : f.x;
int x = clamp(i0.x + dx, lo.x, hi.x);
float w = wx * wy * wz;
uint idx = flatten3(ivec3(x,y,z), R);
// Non-atomic accumulation with memory barrier
// Race conditions possible but often acceptable for smooth fields
memoryBarrierBuffer();
AccV[idx].x += v.x * w;
AccV[idx].y += v.y * w;
AccV[idx].z += v.z * w;
AccW[idx] += w;
memoryBarrierBuffer();
}
}
}
}
void main(){
const uint id = TDIndex();
if (id >= TDNumElements()) return;
uint R = max(SimRes, 1u);
vec3 size = vec3(SimSizex, SimSizey, SimSizez);
vec3 bmin = vec3(-0.5*SimSizex, -0.5*SimSizey, -0.5*SimSizez);
vec3 p = TDIn_P(1, id);
vec3 v = TDIn_v(1, id);
splatV_trilinear_grid(p, v, bmin, size, R);
}
Edgar Schubhan
2025-11-18 12:21:35 +0000 UTC
Same here for only 5 days I couldnt upgrade my license... Have you manage to resolve this problem?
Miguel Guerrero
2025-11-17 12:36:41 +0000 UTC
getting an attribute error on experimental 31310 "There is already a b
tYk
2025-11-17 04:55:33 +0000 UTC
Hi, excellent and thanks for sharing. Unfortunately not working for Mac and I am having a look to why...
Marc Princivalle
2025-11-16 09:12:26 +0000 UTC
Thank you SARV !!!
Dewpoint
2025-11-14 20:34:12 +0000 UTC
Played with it yesterday-very cool! Looking forward to your upcoming deeper dive tutorial.
Tosca aka nanotopia
2025-11-14 18:05:35 +0000 UTC
Are you gonna do a deepdive on how you built this? I’m craving the knowledge🤪