Fix object visuals flashing brightly or disappearing when switching them at night

This commit is contained in:
Perttu Ahola 2012-03-30 13:44:48 +03:00
parent 6b20ea0752
commit bbf3eebb1a

@ -575,6 +575,7 @@ private:
float m_reset_textures_timer; float m_reset_textures_timer;
bool m_visuals_expired; bool m_visuals_expired;
float m_step_distance_counter; float m_step_distance_counter;
u8 m_last_light;
public: public:
GenericCAO(IGameDef *gamedef, ClientEnvironment *env): GenericCAO(IGameDef *gamedef, ClientEnvironment *env):
@ -604,7 +605,8 @@ public:
m_anim_timer(0), m_anim_timer(0),
m_reset_textures_timer(-1), m_reset_textures_timer(-1),
m_visuals_expired(false), m_visuals_expired(false),
m_step_distance_counter(0) m_step_distance_counter(0),
m_last_light(255)
{ {
if(gamedef == NULL) if(gamedef == NULL)
ClientActiveObject::registerType(getType(), create); ClientActiveObject::registerType(getType(), create);
@ -707,8 +709,8 @@ public:
m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF); m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
m_spritenode->setMaterialFlag(video::EMF_FOG_ENABLE, true); m_spritenode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
m_spritenode->setColor(video::SColor(255,0,0,0)); u8 li = m_last_light;
m_spritenode->setVisible(false); /* Set visible when brightness is known */ m_spritenode->setColor(video::SColor(255,li,li,li));
m_spritenode->setSize(m_prop.visual_size*BS); m_spritenode->setSize(m_prop.visual_size*BS);
{ {
const float txs = 1.0 / 1; const float txs = 1.0 / 1;
@ -724,7 +726,8 @@ public:
double dy = BS*m_prop.visual_size.Y/2; double dy = BS*m_prop.visual_size.Y/2;
{ // Front { // Front
scene::IMeshBuffer *buf = new scene::SMeshBuffer(); scene::IMeshBuffer *buf = new scene::SMeshBuffer();
video::SColor c(255,255,255,255); u8 li = m_last_light;
video::SColor c(255,li,li,li);
video::S3DVertex vertices[4] = video::S3DVertex vertices[4] =
{ {
video::S3DVertex(-dx,-dy,0, 0,0,0, c, 0,1), video::S3DVertex(-dx,-dy,0, 0,0,0, c, 0,1),
@ -745,7 +748,8 @@ public:
} }
{ // Back { // Back
scene::IMeshBuffer *buf = new scene::SMeshBuffer(); scene::IMeshBuffer *buf = new scene::SMeshBuffer();
video::SColor c(255,255,255,255); u8 li = m_last_light;
video::SColor c(255,li,li,li);
video::S3DVertex vertices[4] = video::S3DVertex vertices[4] =
{ {
video::S3DVertex(dx,-dy,0, 0,0,0, c, 1,1), video::S3DVertex(dx,-dy,0, 0,0,0, c, 1,1),
@ -777,8 +781,8 @@ public:
mesh->drop(); mesh->drop();
m_meshnode->setScale(v3f(1)); m_meshnode->setScale(v3f(1));
// Will be shown when we know the brightness u8 li = m_last_light;
m_meshnode->setVisible(false); setMeshColor(m_meshnode->getMesh(), video::SColor(255,li,li,li));
} else { } else {
infostream<<"GenericCAO::addToScene(): \""<<m_prop.visual infostream<<"GenericCAO::addToScene(): \""<<m_prop.visual
<<"\" not supported"<<std::endl; <<"\" not supported"<<std::endl;
@ -811,6 +815,7 @@ public:
{ {
bool is_visible = (m_hp != 0); bool is_visible = (m_hp != 0);
u8 li = decode_light(light_at_pos); u8 li = decode_light(light_at_pos);
m_last_light = li;
video::SColor color(255,li,li,li); video::SColor color(255,li,li,li);
if(m_meshnode){ if(m_meshnode){
setMeshColor(m_meshnode->getMesh(), color); setMeshColor(m_meshnode->getMesh(), color);