MCPcopy Create free account
hub / github.com/assaultcube/AC / addshadowbox

Function addshadowbox

source/src/shadow.cpp:153–250  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

151}
152
153bool 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);

Callers 1

renderMethod · 0.85

Calls 9

vecClass · 0.85
minFunction · 0.85
maxFunction · 0.85
swapFunction · 0.85
extrudeshadowtilesFunction · 0.85
addshadowtilesFunction · 0.85
transformMethod · 0.80
loopiFunction · 0.70
loopjFunction · 0.70

Tested by

no test coverage detected