| 151 | } |
| 152 | |
| 153 | bool addshadowbox(const vec &bbmin, const vec &bbmax, const vec &extrude, const glmatrixf &mat) |
| 154 | { |
| 155 | vec4 v[8]; |
| 156 | float sx1 = 1e16f, sy1 = 1e16f, sx2 = -1e16f, sy2 = -1e16f; |
| 157 | int front = 0; |
| 158 | loopi(8) |
| 159 | { |
| 160 | vec4 &p = v[i]; |
| 161 | mat.transform(vec(i&1 ? bbmax.x : bbmin.x, i&2 ? bbmax.y : bbmin.y, i&4 ? bbmax.z : bbmin.z), p); |
| 162 | if(p.z >= -p.w) |
| 163 | { |
| 164 | float x = p.x / p.w, y = p.y / p.w; |
| 165 | sx1 = min(sx1, x); |
| 166 | sy1 = min(sy1, y); |
| 167 | sx2 = max(sx2, x); |
| 168 | sy2 = max(sy2, y); |
| 169 | front++; |
| 170 | } |
| 171 | } |
| 172 | vec4 ev; |
| 173 | mat.transform(extrude, ev); |
| 174 | if(ev.z < -ev.w && !front) return false; |
| 175 | if(front < 8 || ev.z < -ev.w) loopi(8) |
| 176 | { |
| 177 | const vec4 &p = v[i]; |
| 178 | if(p.z >= -p.w) |
| 179 | { |
| 180 | if(ev.z >= -ev.w) continue; |
| 181 | float t = ev.z/(ev.z - p.z), |
| 182 | w = ev.w + t*(p.w - ev.w), |
| 183 | x = (ev.x + t*(p.x - ev.x))/w, |
| 184 | y = (ev.y + t*(p.y - ev.y))/w; |
| 185 | sx1 = min(sx1, x); |
| 186 | sy1 = min(sy1, y); |
| 187 | sx2 = max(sx2, x); |
| 188 | sy2 = max(sy2, y); |
| 189 | continue; |
| 190 | } |
| 191 | loopj(3) |
| 192 | { |
| 193 | const vec4 &o = v[i^(1<<j)]; |
| 194 | if(o.z < -o.w) continue; |
| 195 | float t = p.z/(p.z - o.z), |
| 196 | w = p.w + t*(o.w - p.w), |
| 197 | x = (p.x + t*(o.x - p.x))/w, |
| 198 | y = (p.y + t*(o.y - p.y))/w; |
| 199 | sx1 = min(sx1, x); |
| 200 | sy1 = min(sy1, y); |
| 201 | sx2 = max(sx2, x); |
| 202 | sy2 = max(sy2, y); |
| 203 | } |
| 204 | if(ev.z < -ev.w) continue; |
| 205 | float t = p.z/(p.z - ev.z), |
| 206 | w = p.w + t*(ev.w - p.w), |
| 207 | x = (p.x + t*(ev.x - p.x))/w, |
| 208 | y = (p.y + t*(ev.y - p.y))/w; |
| 209 | sx1 = min(sx1, x); |
| 210 | sy1 = min(sy1, y); |
no test coverage detected