Lighting now uses the new box iterator, although it'll be replaced soon by the flood or random iterator.
This commit is contained in:
parent
70cd963e5c
commit
547be19e68
1 changed files with 6 additions and 29 deletions
35
lights.cpp
35
lights.cpp
|
@ -10,34 +10,19 @@ namespace lighting {
|
||||||
clear_light_target(at);
|
clear_light_target(at);
|
||||||
vector<Point> has_light;
|
vector<Point> has_light;
|
||||||
|
|
||||||
matrix::in_box it{$lightmap, at.x, at.y, (size_t)source.distance};
|
|
||||||
light_box(source, at, min, max);
|
|
||||||
|
|
||||||
dbc::check(it.x+1 == min.x, "box min x different");
|
for(matrix::in_box it{$lightmap, at.x, at.y, (size_t)source.distance}; it.next();) {
|
||||||
dbc::check(it.y == min.y, "box min y different");
|
if($paths.$paths[it.y][it.x] != WALL_PATH_LIMIT) {
|
||||||
dbc::check(it.right == max.x + 1, "box max.x/right different");
|
$lightmap[it.y][it.x] = light_level(source.strength, it.x, it.y);
|
||||||
dbc::check(it.bottom == max.y + 1, "box max.y/bottom different");
|
|
||||||
|
|
||||||
while(it.next()) {
|
|
||||||
auto &light_row = $lightmap[it.y];
|
|
||||||
auto &path_row = $paths.$paths[it.y];
|
|
||||||
|
|
||||||
if(path_row[it.x] != WALL_PATH_LIMIT) {
|
|
||||||
light_row[it.x] = light_level(source.strength, it.x, it.y);
|
|
||||||
has_light.push_back({it.x, it.y});
|
has_light.push_back({it.x, it.y});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const int wall_light = source.strength + WALL_LIGHT_LEVEL;
|
const int wall_light = source.strength + WALL_LIGHT_LEVEL;
|
||||||
for(auto point : has_light) {
|
for(auto point : has_light) {
|
||||||
for(int j = -1;point.y+j >= 0 && j <= 1 && point.y+j < $height; j++) {
|
for(matrix::in_box it{$lightmap, point.x, point.y, 1}; it.next();) {
|
||||||
auto &path_row = $paths.$paths[point.y+j];
|
if($paths.$paths[it.y][it.x] == WALL_PATH_LIMIT) {
|
||||||
auto &light_row = $lightmap[point.y+j];
|
$lightmap[it.y][it.x] = light_level(wall_light, point.x, point.y);
|
||||||
|
|
||||||
for(int i = -1; point.x+i >= 0 && i <= 1 && point.x+i < $width; i++) {
|
|
||||||
if(path_row[point.x+i] == WALL_PATH_LIMIT) {
|
|
||||||
light_row[point.x+i] = light_level(wall_light, point.x, point.y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,12 +53,4 @@ namespace lighting {
|
||||||
void LightRender::path_light(Matrix &walls) {
|
void LightRender::path_light(Matrix &walls) {
|
||||||
$paths.compute_paths(walls);
|
$paths.compute_paths(walls);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LightRender::light_box(LightSource source, Point from, Point &min_out, Point &max_out) {
|
|
||||||
using std::min, std::max;
|
|
||||||
min_out.x = max(int(from.x), source.distance) - source.distance;
|
|
||||||
max_out.x = min(from.x + source.distance, $width - 1);
|
|
||||||
min_out.y = max(int(from.y), source.distance) - source.distance;
|
|
||||||
max_out.y = min(from.y + source.distance, $height - 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue