Пример #1
0
 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;
 }
Пример #2
0
 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;
 }