summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/ray.h
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-10-30 12:59:00 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-11-01 21:45:24 +0100
commitb9aa144a7fd572ea1695e30d7736a5f10dd2d4e8 (patch)
tree3347e9117ed8d29013c50215efbab1c4e9f702be /crawl-ref/source/ray.h
parent03350fc556e032072673562dc15f06920bc5fc87 (diff)
downloadcrawl-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.h38
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