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

Function raycube

source/src/physics.cpp:8–61  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6#include "cube.h"
7
8float raycube(const vec &o, const vec &ray, vec &surface)
9{
10 surface = vec(0, 0, 0);
11
12 if(ray.iszero()) return -1;
13
14 vec v = o;
15 float dist = 0, dx = 0, dy = 0, dz = 0;
16
17 int nr;
18 for(nr=0;nr<512;nr++) // sam's suggestion :: I found no map which got nr > 350
19 {
20 int x = int(v.x), y = int(v.y);
21 if(x < 0 || y < 0 || x >= ssize || y >= ssize) return -1;
22 sqr *s = S(x, y);
23 float floor = s->floor, ceil = s->ceil;
24 if(s->type==FHF) floor -= s->vdelta/4.0f;
25 if(s->type==CHF) ceil += s->vdelta/4.0f;
26 if(SOLID(s) || v.z < floor || v.z > ceil)
27 {
28 if((!dx && !dy) || s->wtex==DEFAULT_SKY || (!SOLID(s) && v.z > ceil && s->ctex==DEFAULT_SKY)) return -1;
29 if(s->type!=CORNER)// && s->type!=FHF && s->type!=CHF)
30 {
31 if(dx<dy) surface.x = ray.x>0 ? -1 : 1;
32 else surface.y = ray.y>0 ? -1 : 1;
33 sqr *n = S(x+(int)surface.x, y+(int)surface.y);
34 if(SOLID(n) || (v.z < floor && v.z < n->floor) || (v.z > ceil && v.z > n->ceil))
35 {
36 surface = dx<dy ? vec(0, ray.y>0 ? -1 : 1, 0) : vec(ray.x>0 ? -1 : 1, 0, 0);
37 n = S(x+(int)surface.x, y+(int)surface.y);
38 if(SOLID(n) || (v.z < floor && v.z < n->floor) || (v.z > ceil && v.z > n->ceil))
39 surface = vec(0, 0, ray.z>0 ? -1 : 1);
40 }
41 }
42 dist = max(dist-0.1f, 0.0f);
43 break;
44 }
45 dx = ray.x ? (x + (ray.x > 0 ? 1 : 0) - v.x)/ray.x : 1e16f;
46 dy = ray.y ? (y + (ray.y > 0 ? 1 : 0) - v.y)/ray.y : 1e16f;
47 dz = ray.z ? ((ray.z > 0 ? ceil : floor) - v.z)/ray.z : 1e16f;
48 if(dz < dx && dz < dy)
49 {
50 if(ray.z>0 && s->ctex==DEFAULT_SKY) return -1;
51 if(s->type!=FHF && s->type!=CHF) surface.z = ray.z>0 ? -1 : 1;
52 dist += dz;
53 break;
54 }
55 float disttonext = 0.1f + min(dx, dy);
56 v.add(vec(ray).mul(disttonext));
57 dist += disttonext;
58 }
59 if (nr == 512) return -1;
60 return dist;
61}
62
63bool raycubelos(const vec &from, const vec &to, float margin)
64{

Callers 2

raycubelosFunction · 0.85
addbulletholeFunction · 0.85

Calls 6

vecClass · 0.85
maxFunction · 0.85
minFunction · 0.85
mulMethod · 0.80
iszeroMethod · 0.45
addMethod · 0.45

Tested by

no test coverage detected