Fixed unload/disable crash. Added glowing plants.

develop
Warmist 2013-06-23 23:56:01 +03:00
parent 82deeafe89
commit 06915aeded
3 changed files with 96 additions and 31 deletions

@ -1,6 +1,7 @@
#include "renderer_light.hpp" #include "renderer_light.hpp"
#include <functional> #include <functional>
#include <string>
#include "Types.h" #include "Types.h"
@ -13,7 +14,9 @@
#include "df/flow_info.h" #include "df/flow_info.h"
#include "df/world.h" #include "df/world.h"
#include "df/building.h" #include "df/building.h"
#include "df/building_doorst.h"
#include "df/plant.h"
#include "df/plant_raw.h"
using df::global::gps; using df::global::gps;
using namespace DFHack; using namespace DFHack;
@ -54,6 +57,7 @@ rect2d getMapViewport()
lightingEngineViewscreen::lightingEngineViewscreen(renderer_light* target):lightingEngine(target) lightingEngineViewscreen::lightingEngineViewscreen(renderer_light* target):lightingEngine(target)
{ {
reinit(); reinit();
initRawSpecific();
} }
void lightingEngineViewscreen::reinit() void lightingEngineViewscreen::reinit()
@ -213,16 +217,47 @@ bool lightingEngineViewscreen::addLight(int tileId,const lightSource& light)
lights[tileId].flicker=true; lights[tileId].flicker=true;
return wasLight; return wasLight;
} }
lightCell getStandartColor(int colorId)
{
return lightCell(df::global::enabler->ccolor[colorId][0]/255.0f,
df::global::enabler->ccolor[colorId][1]/255.0f,
df::global::enabler->ccolor[colorId][2]/255.0f);
}
int getPlantNumber(const std::string& id)
{
std::vector<df::plant_raw*>& vec=df::plant_raw::get_vector();
for(int i=0;i<vec.size();i++)
{
if(vec[i]->id==id)
return i;
}
return -1;
}
void addPlant(const std::string& id,std::map<int,lightSource>& map,const lightSource& v)
{
int nId=getPlantNumber(id);
if(nId>0)
{
map[nId]=v;
}
}
void lightingEngineViewscreen::initRawSpecific()
{
addPlant("TOWER_CAP",glowPlants,lightSource(lightCell(0.65,0.65,0.65),6));
addPlant("MUSHROOM_CUP_DIMPLE",glowPlants,lightSource(lightCell(0.03,0.03,0.9),3));
addPlant("CAVE MOSS",glowPlants,lightSource(lightCell(0.3,0.3,0.9),2));
addPlant("MUSHROOM_HELMET_PLUMP",glowPlants,lightSource(lightCell(0.5,0.2,0.9),2));
}
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); lightSource sun(lightCell(1,1,1),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);
candle.flicker=true; lightSource torch(lightCell(0.9f,0.75f,0.3f),8);
lightSource torch(lightCell(0.96f,0.5f,0.1f),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;
@ -297,12 +332,16 @@ void lightingEngineViewscreen::doOcupancyAndLights()
DFHack::MaterialInfo mat(bld->mat_index,bld->mat_type); DFHack::MaterialInfo mat(bld->mat_index,bld->mat_type);
if(mat.isInorganic()) if(mat.isInorganic())
{ {
int color=mat.inorganic->material.basic_color[0]; int color=mat.inorganic->material.build_color[0]+8*mat.inorganic->material.build_color[2];
curCell*=lightCell(df::global::enabler->ccolor[color][0]/255.0f, curCell*=getStandartColor(color);
df::global::enabler->ccolor[color][1]/255.0f,
df::global::enabler->ccolor[color][2]/255.0f);
} }
} }
if(type==df::enums::building_type::Door)
{
df::building_doorst* door=static_cast<df::building_doorst*>(bld);
if(door->door_flags.bits.closed)
curCell*=lightCell(0,0,0);
}
} }
} }
} }
@ -366,6 +405,23 @@ void lightingEngineViewscreen::doOcupancyAndLights()
} }
} }
} }
for(int i=0;i<block->plants.size();i++)
{
df::plant* cPlant=block->plants[i];
df::coord2d pos=cPlant->pos;
int wx=pos.x-window_x+vp.first.x;
int wy=pos.y-window_y+vp.first.y;
int tile=getIndex(wx,wy);
if(wx>=vp.first.x && wy>=vp.first.y && wx<=vp.second.x && wy<=vp.second.y)
{
auto it=glowPlants.find(cPlant->material);
if(it!=glowPlants.end())
{
addLight(tile,it->second);
}
}
}
} }
if(df::global::cursor->x>-30000) if(df::global::cursor->x>-30000)
{ {

@ -2,7 +2,7 @@
#define RENDERER_LIGHT_INCLUDED #define RENDERER_LIGHT_INCLUDED
#include "renderer_opengl.hpp" #include "renderer_opengl.hpp"
#include "Types.h" #include "Types.h"
#include <map>
struct renderer_light : public renderer_wrap { struct renderer_light : public renderer_wrap {
private: private:
void colorizeTile(int x,int y) void colorizeTile(int x,int y)
@ -111,6 +111,7 @@ private:
void doFovs(); void doFovs();
bool lightUpCell(lightCell& power,int dx,int dy,int tx,int ty); bool lightUpCell(lightCell& power,int dx,int dy,int tx,int ty);
bool addLight(int tileId,const lightSource& light); bool addLight(int tileId,const lightSource& light);
void initRawSpecific();
size_t inline getIndex(int x,int y) size_t inline getIndex(int x,int y)
{ {
return x*h+y; return x*h+y;
@ -118,6 +119,11 @@ private:
std::vector<lightCell> lightMap; std::vector<lightCell> lightMap;
std::vector<lightCell> ocupancy; std::vector<lightCell> ocupancy;
std::vector<lightSource> lights; std::vector<lightSource> lights;
std::map<int,lightSource> glowPlants;
std::map<int,lightSource> glowVeins;
int w,h; int w,h;
DFHack::rect2d mapPort; DFHack::rect2d mapPort;
}; };

@ -20,7 +20,7 @@ using std::vector;
using std::string; using std::string;
enum RENDERER_MODE enum RENDERER_MODE
{ {
MODE_DEFAULT,MODE_TRIPPY,MODE_TRUECOLOR,MODE_LUA,MODE_LIGHT MODE_DEFAULT,MODE_TRIPPY,MODE_TRUECOLOR,MODE_LUA,MODE_LIGHT,MODE_LIGHT_OFF
}; };
RENDERER_MODE current_mode=MODE_DEFAULT; RENDERER_MODE current_mode=MODE_DEFAULT;
lightingEngine *engine=NULL; lightingEngine *engine=NULL;
@ -47,12 +47,6 @@ void removeOld()
if(current_mode!=MODE_DEFAULT) if(current_mode!=MODE_DEFAULT)
delete df::global::enabler->renderer; delete df::global::enabler->renderer;
current_mode=MODE_DEFAULT; current_mode=MODE_DEFAULT;
if(current_mode==MODE_LIGHT)
{
if(engine)
delete engine;
engine=0;
}
} }
void installNew(df::renderer* r,RENDERER_MODE newMode) void installNew(df::renderer* r,RENDERER_MODE newMode)
{ {
@ -241,6 +235,11 @@ static command_result rendermax(color_ostream &out, vector <string> & parameters
{ {
if(parameters.size()==0) if(parameters.size()==0)
return CR_WRONG_USAGE; return CR_WRONG_USAGE;
if(!df::global::enabler->renderer->uses_opengl())
{
out.printerr("Sorry, this plugin needs open gl enabled printmode. Try STANDARD or other non-2d");
return CR_FAILURE;
}
string cmd=parameters[0]; string cmd=parameters[0];
if(cmd=="trippy") if(cmd=="trippy")
{ {
@ -304,13 +303,6 @@ static command_result rendermax(color_ostream &out, vector <string> & parameters
return CR_OK; return CR_OK;
} }
else if(cmd=="light") else if(cmd=="light")
{
if(current_mode==MODE_LIGHT)
{
engine->calculate();
engine->updateWindow();
}
else
{ {
removeOld(); removeOld();
renderer_light *myRender=new renderer_light(df::global::enabler->renderer); renderer_light *myRender=new renderer_light(df::global::enabler->renderer);
@ -318,13 +310,14 @@ static command_result rendermax(color_ostream &out, vector <string> & parameters
engine=new lightingEngineViewscreen(myRender); engine=new lightingEngineViewscreen(myRender);
engine->calculate(); engine->calculate();
engine->updateWindow(); engine->updateWindow();
}
return CR_OK; return CR_OK;
} }
else if(cmd=="disable") else if(cmd=="disable")
{ {
if(current_mode==MODE_DEFAULT) if(current_mode==MODE_DEFAULT)
out.print("%s\n","Not installed, doing nothing."); out.print("%s\n","Not installed, doing nothing.");
else if(current_mode==MODE_LIGHT)
current_mode=MODE_LIGHT_OFF;
else else
removeOld(); removeOld();
@ -335,10 +328,20 @@ static command_result rendermax(color_ostream &out, vector <string> & parameters
DFhackCExport command_result plugin_onupdate (color_ostream &out) DFhackCExport command_result plugin_onupdate (color_ostream &out)
{ {
if(engine) if(engine)
{
if(current_mode==MODE_LIGHT_OFF)
{
delete engine;
engine=0;
removeOld();
}
else
{ {
engine->calculate(); engine->calculate();
engine->updateWindow(); engine->updateWindow();
} }
}
return CR_OK; return CR_OK;
} }
DFhackCExport command_result plugin_shutdown(color_ostream &) DFhackCExport command_result plugin_shutdown(color_ostream &)