|
|
@ -2,12 +2,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include <functional>
|
|
|
|
#include <functional>
|
|
|
|
#include <string>
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include "Types.h"
|
|
|
|
#include "Types.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "modules/Gui.h"
|
|
|
|
#include "modules/Gui.h"
|
|
|
|
#include "modules/Screen.h"
|
|
|
|
#include "modules/Screen.h"
|
|
|
|
#include "modules/Maps.h"
|
|
|
|
#include "modules/Maps.h"
|
|
|
|
|
|
|
|
#include "modules/Units.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "df/graphic.h"
|
|
|
|
#include "df/graphic.h"
|
|
|
|
#include "df/viewscreen_dwarfmodest.h"
|
|
|
|
#include "df/viewscreen_dwarfmodest.h"
|
|
|
@ -275,13 +277,16 @@ void lightingEngineViewscreen::initRawSpecific()
|
|
|
|
static size_t max_list_size = 100000; // Avoid iterating over huge lists
|
|
|
|
static size_t max_list_size = 100000; // Avoid iterating over huge lists
|
|
|
|
void lightingEngineViewscreen::doOcupancyAndLights()
|
|
|
|
void lightingEngineViewscreen::doOcupancyAndLights()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
lightSource sun(lightCell(1,1,1),15);
|
|
|
|
// TODO better curve (+red dawn ?)
|
|
|
|
|
|
|
|
float daycol = abs((*df::global::cur_year_tick % 1200) - 600.0) / 600.0;
|
|
|
|
|
|
|
|
lightCell sky_col(daycol, daycol, daycol);
|
|
|
|
|
|
|
|
lightSource sky(sky_col, 15);
|
|
|
|
|
|
|
|
|
|
|
|
lightSource lava(lightCell(0.8f,0.2f,0.2f),5);
|
|
|
|
lightSource lava(lightCell(0.8f,0.2f,0.2f),5);
|
|
|
|
lightSource candle(lightCell(0.96f,0.84f,0.03f),5);
|
|
|
|
lightSource candle(lightCell(0.96f,0.84f,0.03f),5);
|
|
|
|
lightSource torch(lightCell(0.9f,0.75f,0.3f),8);
|
|
|
|
lightSource torch(lightCell(0.9f,0.75f,0.3f),8);
|
|
|
|
rect2d vp=getMapViewport();
|
|
|
|
rect2d vp=getMapViewport();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int window_x=*df::global::window_x;
|
|
|
|
int window_x=*df::global::window_x;
|
|
|
|
int window_y=*df::global::window_y;
|
|
|
|
int window_y=*df::global::window_y;
|
|
|
|
int window_z=*df::global::window_z;
|
|
|
|
int window_z=*df::global::window_z;
|
|
|
@ -299,7 +304,7 @@ void lightingEngineViewscreen::doOcupancyAndLights()
|
|
|
|
for(int block_x = 0; block_x < 16; block_x++)
|
|
|
|
for(int block_x = 0; block_x < 16; block_x++)
|
|
|
|
for(int block_y = 0; block_y < 16; block_y++)
|
|
|
|
for(int block_y = 0; block_y < 16; block_y++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cellArray[block_x][block_y] = lightCell(1,1,1);
|
|
|
|
cellArray[block_x][block_y] = sky_col;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int totalBlank = 0;
|
|
|
|
int totalBlank = 0;
|
|
|
|
int topLevel = df::global::world->map.z_count-1;
|
|
|
|
int topLevel = df::global::world->map.z_count-1;
|
|
|
@ -321,13 +326,17 @@ void lightingEngineViewscreen::doOcupancyAndLights()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cellArray[block_x][block_y]=lightCell(0,0,0);
|
|
|
|
cellArray[block_x][block_y]=lightCell(0,0,0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(basic_shape==df::tiletype_shape_basic::Floor || basic_shape==df::tiletype_shape_basic::Ramp || basic_shape==df::tiletype_shape_basic::Stair)
|
|
|
|
else if(basic_shape==df::tiletype_shape_basic::Floor || basic_shape==df::tiletype_shape_basic::Ramp || shape==df::tiletype_shape::STAIR_UP)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(ZZ!=window_z)
|
|
|
|
if(ZZ!=window_z)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cellArray[block_x][block_y]=lightCell(0,0,0);
|
|
|
|
cellArray[block_x][block_y]=lightCell(0,0,0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if(shape==df::tiletype_shape::STAIR_DOWN || shape==df::tiletype_shape::STAIR_UPDOWN)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
cellArray[block_x][block_y]*=lightCell(0.9,0.9,0.9);
|
|
|
|
|
|
|
|
}
|
|
|
|
if(d.bits.liquid_type == df::enums::tile_liquid::Water && d.bits.flow_size)
|
|
|
|
if(d.bits.liquid_type == df::enums::tile_liquid::Water && d.bits.flow_size)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cellArray[block_x][block_y] *= (lightCell(1,1,1) - (lightCell(1,1,1) - lightCell(0.63f,0.63f,0.75f))*((float)d.bits.flow_size/7.0f));
|
|
|
|
cellArray[block_x][block_y] *= (lightCell(1,1,1) - (lightCell(1,1,1) - lightCell(0.63f,0.63f,0.75f))*((float)d.bits.flow_size/7.0f));
|
|
|
@ -369,7 +378,7 @@ void lightingEngineViewscreen::doOcupancyAndLights()
|
|
|
|
if(!type)
|
|
|
|
if(!type)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//unallocated, do sky
|
|
|
|
//unallocated, do sky
|
|
|
|
addLight(tile,sun);
|
|
|
|
addLight(tile,sky);
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
df::tiletype_shape shape = ENUM_ATTR(tiletype,shape,*type);
|
|
|
|
df::tiletype_shape shape = ENUM_ATTR(tiletype,shape,*type);
|
|
|
@ -460,7 +469,7 @@ void lightingEngineViewscreen::doOcupancyAndLights()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(d->bits.outside && d->bits.flow_size==0)
|
|
|
|
if(d->bits.outside && d->bits.flow_size==0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
addLight(tile,sun);
|
|
|
|
addLight(tile,sky);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -527,4 +536,15 @@ void lightingEngineViewscreen::doOcupancyAndLights()
|
|
|
|
int tile=getIndex(wx,wy);
|
|
|
|
int tile=getIndex(wx,wy);
|
|
|
|
addLight(tile,cursor);
|
|
|
|
addLight(tile,cursor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
lightSource citizen(lightCell(0.80f,0.80f,0.90f),6);
|
|
|
|
|
|
|
|
for (int i=0;i<df::global::world->units.active.size();++i)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
df::unit *u = df::global::world->units.active[i];
|
|
|
|
|
|
|
|
if (u->pos.z != window_z ||
|
|
|
|
|
|
|
|
(u->pos.x < window_x || u->pos.x >= window_x+vpW) ||
|
|
|
|
|
|
|
|
(u->pos.y < window_y || u->pos.y >= window_y+vpH))
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (DFHack::Units::isCitizen(u) && !u->counters.unconscious)
|
|
|
|
|
|
|
|
addLight(getIndex(u->pos.x-window_x+1, u->pos.y-window_y+1),citizen);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|