This is a "falling water" simulation based on a simple Cellular automata algorithm.
Have a look at the attachment.
The problem is I have designed the algorihm and according to my logic it's so simple it should work straight away. But some times there are groups of water that will accumulate mid air and not fall down.
There are 2 options :
1) My knowledge of LUA isn't sufficient and I am making a mistake in code
2) There is this tiny bug somewhere out there and I can't find it.
Code: Select all
(....) MaxMass = 1.0; --The normal, un-pressurized mass of a full water cell MaxCompress = 0.02; --//How much excess water a cell can store, compared to the cell above it MinFlow = 0 MinMass = 0.0001; --//Ignore cells that are dry function simulateCompression() local Flow = 0 for i = 1, map_y+1 do for j = 1, map_x+1 do if grid[i][j] == 1 then local remaining_mass = mass[map_y+2-i][j] if remaining_mass > MinMass then if (grid[map_y+2-i+1][j] == 1) and mass[map_y+2-i+1][j]<(MaxMass+MaxCompress) then Flow = math.min( remaining_mass, MaxMass+MaxCompress - mass[map_y+2-i+1][j])*math.min(globdt,0.3) Flow = math.max(0,Flow) b1x = Flow remaining_mass = remaining_mass- Flow mass[map_y+2-i][j] = remaining_mass newmass[map_y+2-i][j] = mass[map_y+2-i][j] newmass[map_y+2-i+1][j] = mass[map_y+2-i+1][j] +Flow end end end end end for i = 1, map_y+2 do for j = 1, map_x+2 do mass[i][j] = newmass[i][j] end end end