bool Conduct::check_connection()
{
- ConnectorType aux;
+ ConnectorType aux, aux1, aux2;
CItem *_item0, *_item1;
- if ( is_connected )
- return is_connected;
switch (get_img_actual()) {
- case 0:
- connect_vec[0].type = is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0);
- connect_vec[1].type = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5,& _item1);
- break;
- case 1:
- connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0);
- connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item1);
+ case 0:
+ aux1 = is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0);
+ aux2 = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5,& _item1);
+ break;
+ case 1:
+ aux1 = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0);
+ aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item1);
}
- if ( connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF ) {
- aux = connect_vec[0].type;
- connect_vec[0].type = connect_vec[1].type;
- connect_vec[1].type = aux;
+ if ( (aux1 != UNDEF) && (aux2 != UNDEF) ) {
+ if (!is_connected) {
+ connect_vec[0].type = aux2;
+ connect_vec[1].type = aux1;
+ }
connect_vec[0].id_dest = _item0->get_id();
connect_vec[1].id_dest = _item1->get_id();
return ( is_connected = (connect_vec[0].type != connect_vec[1].type) );
}
- else return is_connected;
+ return is_connected = false;
}
/*si no estoy conectado pregunto por el del otro lado, y ahi puedo setear los dos
connect_vec[1].type = is_other_connection_area(get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item); //pregunto que hay abajo
switch ( connect_vec[1].type ) {
case IN:
- connect_vec[1] = OUT;
- connect_vec[0] = IN;
+ connect_vec[1].type = OUT;
+ connect_vec[0].type = IN;
break;
case OUT:
- connect_vec[1] = IN;
- connect_vec[0] = OUT;
+ connect_vec[1].type = IN;
+ connect_vec[0].type = OUT;
break;
case UNDEF:
return UNDEF;
}
+ is_connected = true;
return connect_vec[0].type;
}
connect_vec[0].type = is_other_connection_area( get_position_x()+16, get_position_y()-5,& _item);//pregunto que hay arriba.
switch ( connect_vec[0].type ) {
case IN:
- connect_vec[0] = OUT;
- connect_vec[1] = IN;
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
break;
case OUT:
- connect_vec[0] = IN;
- connect_vec[1] = OUT;
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
break;
case UNDEF:
return UNDEF;
}
+ is_connected = true;
return connect_vec[1].type;
}
break;
connect_vec[1].type = is_other_connection_area(get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item);//pregunto por la derecha
switch ( connect_vec[1].type ) {
case IN:
- connect_vec[1] = OUT;
- connect_vec[0] = IN;
+ connect_vec[1].type = OUT;
+ connect_vec[0].type = IN;
break;
case OUT:
- connect_vec[1] = IN;
- connect_vec[0] = OUT;
+ connect_vec[1].type = IN;
+ connect_vec[0].type = OUT;
break;
case UNDEF:
return UNDEF;
connect_vec[0].type = is_other_connection_area(get_position_x()-5, get_position_y()+16, &_item); //pregunto por la izquierda.
switch ( connect_vec[0].type ) {
case IN:
- connect_vec[0] = OUT;
- connect_vec[1] = IN;
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
break;
case OUT:
- connect_vec[0] = IN;
- connect_vec[1] = OUT;
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
break;
case UNDEF:
return UNDEF;
bool Exclusa::check_connection()
{
- ConnectorType aux;
+ ConnectorType aux, aux1, aux2;
CItem *_item0, *_item1;
switch (get_img_actual()) {
- case 0:
- connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //izquierda
- connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16,& _item1); //derecha
- break;
- case 1:
- connect_vec[0].type = is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0); // arriba
- connect_vec[1].type = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item1); //abajo
+ case 0:
+ aux1 = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //izquierda
+ aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16,& _item1); //derecha
+ break;
+ case 1:
+ aux1 = is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0); // arriba
+ aux2 = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item1); //abajo
}
- if ( connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF ) {
- aux = connect_vec[0].type;
- connect_vec[0].type = connect_vec[1].type;
- connect_vec[1].type = aux;
+ if ( aux1 != UNDEF && aux2 != UNDEF ) {
+ if (!is_connected) {
+ //aux = connect_vec[0].type;
+ // Aca van invertidos los tipos de entrada/salida
+ connect_vec[0].type = aux2; //connect_vec[1].type;
+ connect_vec[1].type = aux1;
+ }
connect_vec[0].id_dest = _item0->get_id();
connect_vec[1].id_dest = _item1->get_id();
return ( is_connected = (connect_vec[0].type != connect_vec[1].type) );
}
- else return is_connected;
+ return is_connected = false;
}
ConnectorType Exclusa::get_connector_type(int _a, int _b)
{
CItem *_item;
switch (imgActual) {
- case 0:
+ case 1:
if ( (_a <= x+image->get_width()-10 )&&(_a >= x + 10) && (_b <= y+10) &&(_b > 0 ) ){ //arriba
if ( is_connected ) return connect_vec[0].type;
connect_vec[1].type = is_other_connection_area(get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item); //pregunto que hay abajo
switch ( connect_vec[1].type ) {
case IN:
- connect_vec[1] = OUT;
- connect_vec[0] = IN;
+ connect_vec[1].type = OUT;
+ connect_vec[0].type = IN;
break;
case OUT:
- connect_vec[1] = IN;
- connect_vec[0] = OUT;
+ connect_vec[1].type = IN;
+ connect_vec[0].type = OUT;
break;
case UNDEF:
return UNDEF;
}
+ is_connected = true;
return connect_vec[0].type;
}
connect_vec[0].type = is_other_connection_area( get_position_x()+16, get_position_y()-5,& _item);//pregunto que hay arriba.
switch ( connect_vec[0].type ) {
case IN:
- connect_vec[0] = OUT;
- connect_vec[1] = IN;
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
break;
case OUT:
- connect_vec[0] = IN;
- connect_vec[1] = OUT;
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
break;
case UNDEF:
return UNDEF;
}
+ is_connected = true;
return connect_vec[1].type;
}
break;
- case 1:
+ case 0:
if ((_a <= x+10 )&&(_a > 0) && (_b <= y+image->get_height()-10) &&(_b >= y+10 )){ //izquierda
if ( is_connected ) return connect_vec[0].type;
connect_vec[1].type = is_other_connection_area(get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item);//pregunto por la derecha
switch ( connect_vec[1].type ) {
case IN:
- connect_vec[1] = OUT;
- connect_vec[0] = IN;
+ connect_vec[1].type = OUT;
+ connect_vec[0].type = IN;
break;
case OUT:
- connect_vec[1] = IN;
- connect_vec[0] = OUT;
+ connect_vec[1].type = IN;
+ connect_vec[0].type = OUT;
break;
case UNDEF:
return UNDEF;
connect_vec[0].type = is_other_connection_area(get_position_x()-5, get_position_y()+16, &_item); //pregunto por la izquierda.
switch ( connect_vec[0].type ) {
case IN:
- connect_vec[0] = OUT;
- connect_vec[1] = IN;
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
break;
case OUT:
- connect_vec[0] = IN;
- connect_vec[1] = OUT;
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
break;
case UNDEF:
return UNDEF;
bool Splitter::check_connection()
{
- ConnectorType aux;
+ ConnectorType aux, aux1, aux2;
CItem *_item0, *_item1;
switch (get_img_actual()) {
case 0:
- connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //arriba-izquierda h
- connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item1);//abajo-derecha v
+ aux1 = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //arriba-izquierda h
+ aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item1);//abajo-derecha v
break;
case 1:
- connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5,& _item0);//arriba-derecha v
- connect_vec[1].type = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item1);//abajo-izquierda h
+ aux1 = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5,& _item0);//arriba-derecha v
+ aux2 = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item1);//abajo-izquierda h
break;
case 2:
- connect_vec[1].type = is_other_connection_area( get_position_x() + 16, get_position_y() - 5, &_item1);//arriba-izquierda v
- connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item0); //abajo-derecha h
+ aux2 = is_other_connection_area( get_position_x() + 16, get_position_y() - 5, &_item1);//arriba-izquierda v
+ aux1 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item0); //abajo-derecha h
break;
case 3:
- connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item1);//arriba-derecha h
- connect_vec[0].type = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item0); //abajo-izquierda v
+ aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item1);//arriba-derecha h
+ aux1 = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item0); //abajo-izquierda v
}
- if (connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF) {
- aux = connect_vec[0].type;
- connect_vec[0].type = connect_vec[1].type;
- connect_vec[1].type = aux;
+ if ((aux2 != UNDEF) && (aux1 != UNDEF)) {
+ if (!is_connected) {
+ connect_vec[0].type = aux2;
+ connect_vec[1].type = aux1;
+ }
connect_vec[0].id_dest = _item0->get_id();
connect_vec[1].id_dest = _item1->get_id();
return ( is_connected = (connect_vec[0].type != connect_vec[1].type) );
}
- else return is_connected;
+ return is_connected = false;
}
ConnectorType Splitter::get_connector_type(int _a, int _b)
{
CItem *_item;
- if ( ! is_connected ) {
- switch (imgActual) {
- case 0:
- if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) // arriba - izquierda h
- return is_other_connection_area (get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item);
- if ( (_a <= x+image->get_width()-10)&&(_a>=x+image->get_width()-22)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) )//abajo-derecha v
- return is_other_connection_area( get_position_x()-5, get_position_y()+16,& _item);
- break;
- case 1:
- if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) //arriba-derecha v
- return is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item);
- if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-izquierda h
- return is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5, &_item);
- break;
- case 2:
- if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) //arriba-izquierda v
- return is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item);
- if ( (_a <= x+image->get_width()-1)&&(_a>=x+image->get_width()-10)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-derecha h
- return is_other_connection_area( get_position_x() + 16, get_position_y() - 5,& _item);
- break;
- case 3:
- if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) //arriba-derecha h
- return is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item);
- if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) // abajo-izquierda v
- return is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item);
- }
- } else {
- switch (imgActual) {
- case 0:
- if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) // arriba - izquierda h
- return connect_vec[0].type;
- if ( (_a <= x+image->get_width()-10)&&(_a>=x+image->get_width()-22)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) )//abajo-derecha v
- return connect_vec[1].type;
- break;
- case 1:
- if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) //arriba-derecha v
- return connect_vec[0].type;
- if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-izquierda h
- return connect_vec[1].type;
- break;
- case 2:
- if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) //arriba-izquierda v
- return connect_vec[1].type;
- if ( (_a <= x+image->get_width()-1)&&(_a>=x+image->get_width()-10)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-derecha h
- return connect_vec[0].type;
- break;
- case 3:
- if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) //arriba-derecha h
- return connect_vec[1].type;
- if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) // abajo-izquierda v
- return connect_vec[0].type;
- }
+ switch (imgActual) {
+ case 0:
+ if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) {// arriba - izquierda h
+ if ( is_connected ) return connect_vec[0].type;
+ connect_vec[1].type = is_other_connection_area (get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item);
+ switch ( connect_vec[1].type ) {
+ case IN:
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
+ break;
+ case OUT:
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
+ break;
+ case UNDEF:
+ return UNDEF;
+ }
+ is_connected = true;
+ return connect_vec[0].type;
+ }
+ if ( (_a <= x+image->get_width()-10)&&(_a>=x+image->get_width()-22)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) {//abajo-derecha v
+ if ( is_connected ) return connect_vec[1].type;
+ connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16,& _item);
+ switch ( connect_vec[0].type ) {
+ case IN:
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
+ break;
+ case OUT:
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
+ break;
+ case UNDEF:
+ return UNDEF;
+ }
+ is_connected = true;
+ return connect_vec[1].type;
+ }
+ break;
+ case 1:
+ if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) {//arriba-derecha v
+ if (is_connected) return connect_vec[0].type;
+ connect_vec[1].type = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item);
+ switch ( connect_vec[1].type ) {
+ case IN:
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
+ break;
+ case OUT:
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
+ break;
+ case UNDEF:
+ return UNDEF;
+ }
+ is_connected = true;
+ return connect_vec[0].type;
+ }
+
+ if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) {// abajo-izquierda h
+ if ( is_connected ) return connect_vec[1].type;
+ connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5, &_item);
+ switch ( connect_vec[0].type ) {
+ case IN:
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
+ break;
+ case OUT:
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
+ break;
+ case UNDEF:
+ return UNDEF;
+ }
+ is_connected = true;
+ return connect_vec[1].type;
+ }
+ break;
+ case 2:
+ if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) {//arriba-izquierda v
+ if ( is_connected ) return connect_vec[1].type;
+ connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item);
+ switch ( connect_vec[0].type ) {
+ case IN:
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
+ break;
+ case OUT:
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
+ break;
+ case UNDEF:
+ return UNDEF;
+ }
+ is_connected = true;
+ return connect_vec[1].type;
+ }
+
+ if ( (_a <= x+image->get_width()-1)&&(_a>=x+image->get_width()-10)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) {// abajo-derecha h
+ if (is_connected ) return connect_vec[0].type;
+ connect_vec[1].type = is_other_connection_area( get_position_x() + 16, get_position_y() - 5,& _item);
+ switch ( connect_vec[1].type ) {
+ case IN:
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
+ break;
+ case OUT:
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
+ break;
+ case UNDEF:
+ return UNDEF;
+ }
+ is_connected = true;
+ return connect_vec[0].type;
+ }
+ break;
+ case 3:
+ if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) {//arriba-derecha h
+ if ( is_connected ) return connect_vec[1].type;
+ connect_vec[0].type = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item);
+ switch ( connect_vec[0].type ) {
+ case IN:
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
+ break;
+ case OUT:
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
+ break;
+ case UNDEF:
+ return UNDEF;
+ }
+ is_connected = true;
+ return connect_vec[1].type;
+ }
+
+ if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) {// abajo-izquierda v
+ if ( is_connected ) return connect_vec[0].type;
+ connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item);
+ switch ( connect_vec[1].type ) {
+ case IN:
+ connect_vec[0].type = IN;
+ connect_vec[1].type = OUT;
+ break;
+ case OUT:
+ connect_vec[0].type = OUT;
+ connect_vec[1].type = IN;
+ break;
+ case UNDEF:
+ return UNDEF;
+ }
+ is_connected = true;
+ return connect_vec[0].type;
+ }
}
return UNDEF;
}
void Conduct::update(int dir)
{
// Si ya me actualice, no lo tengo que hacer de nuevo
- if (updated) return;
+ if (updated) {
+ std::list<IConector *>::iterator i = in_list.begin();
+ if (i != in_list.end()) {
+ PlantItem *o = (PlantItem *)(*i);
+ set_color( o->get_color() );
+ }
+ return;
+ }
// Seteo mi actualizar en true para evitar entrar de nuevo
actual_flow = 99999;
updated = true;
return;
}
- std::list<IConector *>::iterator i = in_list.begin();
- if (i != in_list.end()) {
- PlantItem *o = (PlantItem *)(*i);
- set_color( o->get_color() );
- }
#ifdef DEBUG
std::cout << name << "::Flujo actual = " << actual_flow << " de " << max_flow << std::endl;
#endif
void Exclusa::update(int dir)
{
+ std::list<IConector *>::iterator i = in_list.begin();
+ if (i != in_list.end()) {
+ PlantItem *o = (PlantItem *)(*i);
+ set_color( o->get_color() );
+ }
// Primero me fijo si la entrada esta operando, es decir
// si hay alguien conectado para automatizar.
if (input->is_operational()) {
void Exclusa::simulate()
{
- std::list<IConector *>::iterator i = in_list.begin();
- if (i != in_list.end()) {
- PlantItem *o = (PlantItem *)(*i);
- set_color( o->get_color() );
- }
#ifdef DEBUG
std::cout << name << ": " << ((is_open)?"Abierta":"Cerrada") << std::endl;
#endif
(*i1)->update();
std::list<PlantItem *>::iterator i2;
+ for(i2=items.begin(); i2!=items.end(); i2++)
+ (*i2)->update();
+
for(i2=items.begin(); i2!=items.end(); i2++)
(*i2)->simulate();
void Union::update(int dir)
{
// Si ya me actualice, no lo tengo que hacer de nuevo
- if (updated) return;
+ RGB c_in1, c_in2;
+ unsigned r=0,g=0,b=0;
+ float c_f1, c_f2; // para ver los flujos de cada uno
+
+ if (updated) {
+ std::list<IConector *>::iterator i = in_list.begin();
+ if (i != in_list.end()) {
+ PlantItem *o = (PlantItem *)(*i);
+ c_in1 = o->get_color();
+ c_f1 = o->get_actual_flow();
+ i++;
+ o = (PlantItem *)(*i);
+ c_in2 = o->get_color();
+ c_f2 = o->get_actual_flow();
+ }
+
+ set_color( RGB(r,g,b) );
+ if ((c_f1 != 0) && (c_f2 != 0)) {
+ // Si ambas entradas traen flujo, sumo sus colores
+ int total = c_f1+c_f2;
+ r = ((int)((c_in1.r()*c_f1/total+c_in2.r()*c_f2/total)))%256;
+ g = ((int)((c_in1.g()*c_f1/total+c_in2.g()*c_f2/total)))%256;
+ b = ((int)((c_in1.b()*c_f1/total+c_in2.b()*c_f2/total)))%256;
+ set_color(RGB(r,g,b));
+ } else {
+ // Veo que entrada trae color
+ if (c_f1 != 0) {
+ set_color( c_in1 );
+ }
+ if (c_f2 != 0) {
+ set_color( c_in2 );
+ }
+ }
+ return;
+ }
// Seteo mi actualizar en true para evitar entrar de nuevo
// FIXME : 99999 == INFINITO!!
actual_flow = 99999;
void Union::simulate()
{
- RGB c_in1, c_in2;
- unsigned r=0,g=0,b=0;
- float c_f1, c_f2; // para ver los flujos de cada uno
-
- if (!updated) {
- return;
- }
- std::list<IConector *>::iterator i = in_list.begin();
- if (i != in_list.end()) {
- PlantItem *o = (PlantItem *)(*i);
- c_in1 = o->get_color();
- c_f1 = o->get_actual_flow();
- i++;
- o = (PlantItem *)(*i);
- c_in2 = o->get_color();
- c_f2 = o->get_actual_flow();
- }
+ if (!updated) return;
- set_color( RGB(r,g,b) );
- if ((c_f1 != 0) && (c_f2 != 0)) {
- // Si ambas entradas traen flujo, sumo sus colores
- r = ((c_in1.r()+c_in2.r())/2)%256;
- g = ((c_in1.g()+c_in2.g())/2)%256;
- b = ((c_in1.b()+c_in2.b())/2)%256;
- set_color(RGB(r,g,b));
- } else {
- // Veo que entrada trae color
- if (c_f1 != 0) {
- set_color( c_in1 );
- }
- if (c_f2 != 0) {
- set_color( c_in2 );
- }
- }
-
#ifdef DEBUG
std::cout << name << "::Flujo actual = " << actual_flow << std::endl;
#endif