summaryrefslogtreecommitdiff
path: root/src/world.cpp
diff options
context:
space:
mode:
authorPaweł Redman <pawel.redman@gmail.com>2018-04-12 21:27:07 +0200
committerPaweł Redman <pawel.redman@gmail.com>2018-04-12 21:27:07 +0200
commitf405c37daccac93323081216b2484da498e2fecf (patch)
treec61932fa3036f1185a1f8fc0dbffdd084c1da12a /src/world.cpp
parentd307234efb1e687bfac06d48b01eb56d748e8510 (diff)
Tracing vs entities, bullets can now hit.
Diffstat (limited to 'src/world.cpp')
-rw-r--r--src/world.cpp35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/world.cpp b/src/world.cpp
index 05519f0..d09001c 100644
--- a/src/world.cpp
+++ b/src/world.cpp
@@ -391,12 +391,34 @@ out_no_hit:
trace_t world_t::ray_v_ents(v2f_t start, v2f_t end, cflags_t cflags,
- world::entity_t *ignore)
+ const entity_t *ignore)
{
- // TODO
- trace_t res;
- res.hit = false;
- return res;
+ trace_t best;
+ rectf_t rect;
+
+ best.hit = false;
+ best.frac = 2.0f;
+
+ rect = rectf_t(start, end).norm();
+
+ for (entity_t *ent : get_entities(rect, cflags)) {
+ trace_t trace;
+
+ if (ent == ignore)
+ continue;
+
+ trace = ray_v_rect(start, end, ent->cmodel.bounds);
+ if (!trace.hit)
+ continue;
+
+ if (trace.frac < best.frac) {
+ best = trace;
+ best.tile = nullptr;
+ best.ent = ent;
+ }
+ }
+
+ return best;
}
@@ -442,6 +464,7 @@ trace_t world_t::ray_v_tiles(v2f_t start, v2f_t end, cflags_t cflags)
res.hit = true;
res.end = x ^ transforms[quad];
res.frac = (x - start).len() / (end - start).len();
+ res.ent = nullptr;
res.tile = tile;
return res;
}
@@ -467,7 +490,7 @@ trace_t world_t::ray_v_tiles(v2f_t start, v2f_t end, cflags_t cflags)
}
trace_t world_t::ray_v_all(v2f_t start, v2f_t end, cflags_t cflags,
- world::entity_t *ignore)
+ const entity_t *ignore)
{
trace_t v_tiles, v_ents;