diff options
author | Robert Vollmert <rvollmert@gmx.net> | 2009-10-30 12:59:00 +0100 |
---|---|---|
committer | Robert Vollmert <rvollmert@gmx.net> | 2009-11-01 21:45:24 +0100 |
commit | b9aa144a7fd572ea1695e30d7736a5f10dd2d4e8 (patch) | |
tree | 3347e9117ed8d29013c50215efbab1c4e9f702be /crawl-ref/source/ray.h | |
parent | 03350fc556e032072673562dc15f06920bc5fc87 (diff) | |
download | crawl-ref-b9aa144a7fd572ea1695e30d7736a5f10dd2d4e8.tar.gz crawl-ref-b9aa144a7fd572ea1695e30d7736a5f10dd2d4e8.zip |
Replace ray_def by a version using "diamond rays".
Think of the map tiled with squares (the cells).
Previously, a ray was blocked by any part of an opaque cell
except the very corners (to allow looking through diagonal
maps -- we can move through those after all).
In the new version, the rays are the same, but a dungeon feature
is only considered to occupy the the central "diamond": convex
hull of the mid points of the edges. The corners of the
diamond are considered part of the feature, so vertically or
horizontally adjacent walls still block.
This has some effect on LOS: It's a bit more permissive on
diagonals and around corners.
The main advantage is that most rays will now have a footprint
(the sequence of cells it passes through) that is like the
old anti-aliased rays, without requiring any ray munging.
TODO:
* Make sure we don't hang because of stopping at a corner.
* Implement proper bouncing.
* Reenable setting/getting degrees for chaos beams.
Diffstat (limited to 'crawl-ref/source/ray.h')
-rw-r--r-- | crawl-ref/source/ray.h | 38 |
1 files changed, 7 insertions, 31 deletions
diff --git a/crawl-ref/source/ray.h b/crawl-ref/source/ray.h index 5dd97dd0a9..477f8fcbf7 100644 --- a/crawl-ref/source/ray.h +++ b/crawl-ref/source/ray.h @@ -1,50 +1,26 @@ /* * File: ray.h * Summary: Ray definition - * Written by: Linley Henzell */ #ifndef RAY_H #define RAY_H -// direction of advance: -enum adv_type -{ - ADV_X = 0, // changed x - ADV_Y = 1, // changed y - ADV_XY = 2 // changed x and y (diagonal) -}; +#include "geom2d.h" struct ray_def { -public: - double accx; - double accy; - double slope; - // Quadrant by sign of x/y coordinate. - int quadx; - int quady; - // For cycling: where did we come from? + geom::ray r; int cycle_idx; -public: - ray_def(double accx = 0.0, double accy = 0.0, double slope = 0.0, - int quadx = 1, int quady = 1, int fullray_idx = -1); - int x() const; - int y() const; - coord_def pos() const; + ray_def() {} + ray_def(const geom::ray& _r) + : r(_r), cycle_idx(0) {} - // returns the direction taken - adv_type advance(); + coord_def pos() const; + bool advance(); void advance_and_bounce(); void regress(); - -protected: - adv_type raw_advance_pos(); - void flip(); - double reflect(bool x, double oldc, double newc) const; - void set_reflect_point(const double oldx, const double oldy, - bool blocked_x, bool blocked_y); }; #endif |