+ if(i->type->connect_index>=0)
+ {
+ Rod &crod = rods[i->type->connect_index];
+ if(i->type->limit==VehicleType::Rod::ROTATE && crod.type->limit==VehicleType::Rod::SLIDE_X)
+ {
+ Vector span = crod.position+i->type->connect_offset-i->position;
+ float cd = i->type->connect_point.norm();
+ Angle ca = Geometry::atan2(i->type->connect_point.z, i->type->connect_point.x);
+ span.x = sqrt(cd*cd-span.z*span.z)*(span.x>0 ? 1 : -1);
+ i->angle = Geometry::atan2(span.z, span.x)-ca;
+ crod.position.x = i->position.x+span.x-i->type->connect_offset.x;
+ }
+ else if(i->type->limit==VehicleType::Rod::ROTATE && crod.type->limit==VehicleType::Rod::ROTATE)
+ {
+ Vector span = crod.position-i->position;
+ float d = span.norm();
+ float cd1 = i->type->connect_point.norm();
+ float cd2 = i->type->connect_offset.norm();
+ float a = (d*d+cd1*cd1-cd2*cd2)/(2*d);
+ float b = sqrt(cd1*cd1-a*a);
+ float sign = (cross(i->type->connect_point, span).y>0 ? 1 : -1);
+ Vector conn = Vector(span.x*a-span.z*b, 0, span.z*a+span.x*b)/(d*sign);
+ Angle ca1 = Geometry::atan2(i->type->connect_point.z, i->type->connect_point.x);
+ Angle ca2 = Geometry::atan2(i->type->connect_offset.z, i->type->connect_offset.x);
+ i->angle = Geometry::atan2(conn.z, conn.x)-ca1;
+ crod.angle = Geometry::atan2(conn.z-span.z, conn.x-span.x)-ca2;
+ }
+ }