void Tank::simulate()
{
if (!updated) return;
- RGB in_color;
-
- std::list<IConector *>::iterator i = in_list.begin();
- if (i != in_list.end()) {
- PlantItem *o = (PlantItem *)(*i);
- in_color = o->get_color();
- }
// le sumo lo que recibo
litros += actual_in_flow;
// calculo el nuevo color
- int r, g, b;
- float l = litros;
-
- r = (int)(fluid_color.r()*litros/l + in_color.r()*actual_in_flow/l);
- g = (int)(fluid_color.g()*litros/l + in_color.g()*actual_in_flow/l);
- b = (int)(fluid_color.b()*litros/l + in_color.b()*actual_in_flow/l);
-
- if (r>255) r = 255;
- if (g>255) g = 255;
- if (b>255) b = 255;
- fluid_color = RGB(r,g,b);
// le resto lo que entrego
litros -= actual_out_flow;
std::cout << " Litros : " << litros << std::endl;
#endif
updated = false;
+ color_updated = false;
}
void Tank::recieve_msg(int msg, IConector *who, void *data)
if (*((float *)data) < actual_out_flow)
actual_out_flow = *((float *)data);
}
+ break;
+ case MSG_RESPONSE_COLOR:
+ RGB c = *((RGB *)data);
+ PlantItem *ic = static_cast<PlantItem *>(*(in_list.begin()));
+ int r,g,b;
+ float total = litros + ic->get_actual_flow();
+
+ r = (int)(get_color().r()*litros/total + c.r()*ic->get_actual_flow()/total);
+ g = (int)(get_color().g()*litros/total + c.g()*ic->get_actual_flow()/total);
+ b = (int)(get_color().b()*litros/total + c.b()*ic->get_actual_flow()/total);
+ r %= 256;
+ g %= 256;
+ b %= 256;
+ set_color(RGB(r,g,b));
}
}