public bool Intersects(FluidContainer container) { if (container.m_min.X > m_max.X || m_min.X > container.m_max.X) { return false; } if (container.m_min.Y > m_max.Y || m_min.Y > container.m_max.Y) { return false; } return container.m_min.Z <= m_max.Z && m_min.Z <= container.m_max.Z; }
private void TickSimulation() { if (m_addQueue.Count > 0) { var cellsToAdd = m_addQueue.Dequeue(); var container = new FluidContainer(m_mappingFunction, m_blocks, m_solidCell); m_containers.Add(container); foreach (var next in cellsToAdd) { var cellToAdd = next; container.Add(cellToAdd); } } foreach (var container in m_containers) { if (container.Update) { container.Step(); } } var keepList = new List<FluidContainer>(); for (var i = 0; i < m_containers.Count; ++i) { var keepContainer = true; var discard = m_containers[i]; if (!discard.Alive) { continue; } for (var j = i + 1; j < m_containers.Count; ++j) { var keep = m_containers[j]; if (!(keep.Alive && discard.Intersects(keep))) { continue; } foreach (var cell in discard.Cells) { keep.Add(cell); } keepContainer = false; break; } if (keepContainer) { keepList.Add(discard); } } m_containers = keepList; }