I was thinking about vision model that woul make more sense. So, here it is.
There is two vision checks - one in normal spectrum, and another in infrared. Infrared one relies on thing's own thermal emission and does not require light.
Algorithm for calculating "obscureness" for normal vision (NV):
1. Start with 100%.
2. Add some number for insufficient light. It can be binary (as it is no), or scale with light levels below good. If target has Night Camo, this penalty is MULTIPLIED by Night Camo value.
3. If target has any (non-night-specific) Camo, add it's value too.
4. For every cell on sight line obscured by smoke and probably other obstacles (fire, windows, doors, bushes etc), add value proportional to number of obstacles and their "obstacleness".
5. Multiply it all by range.
6. If result is more than some threshold, target is invisible.
For Infrared Vision (IR), algorithm is similar, but there is no step 2, and value of Camo at step 3 and obstacleness of things at step 4 can be different. For example, smoke is worse at blocking IR than NV, and fire is better. Some camos can block only one type of vision, or one better than another.