code: function applyFluidForces(self, body) {
      // First pass at handling fluids. Assumes fluids are settled
      //   thus, only check at corner of body, and only from bottom up
      var box = body.aabb
      var cx = Math.floor(box.base[0])
      var cz = Math.floor(box.base[2])
      var y0 = Math.floor(box.base[1])
      var y1 = Math.floor(box.max[1])
  
      if (!self.testFluid(cx, y0, cz)) {
          body.inFluid = false
          body.ratioInFluid = 0
          return
      }
  
      // body is in a fluid - find out how much of body is submerged
      var submerged = 1
      var cy = y0 + 1
      while (cy <= y1 && self.testFluid(cx, cy, cz)) {
          submerged++
          cy++
      }
      var fluidLevel = y0 + submerged
      var heightInFluid = fluidLevel - box.base[1]
      var ratioInFluid = heightInFluid / box.vec[1]
      if (ratioInFluid > 1) ratioInFluid = 1
      var vol = box.vec[0] * box.vec[1] * box.vec[2]
      var displaced = vol * ratioInFluid
      // bouyant force = -gravity * fluidDensity * volumeDisplaced
      var f = _fluidVec
      vec3.scale(f, self.gravity, -self.fluidDensity * displaced)
      body.applyForce(f)
  
      body.inFluid = true
      body.ratioInFluid = ratioInFluid
  }
docs: /*
  FLUIDS