in globals.hxx.
void FGAIEntity::Transform() {
// Translate moving object w.r.t eye
- Point3D sc = scenery.get_center();
+ Point3D sc = globals->get_scenery()->get_center();
//cout << "sc0 = " << sc.x() << " sc1 = " << sc.y() << " sc2 = " << sc.z() << '\n';
//cout << "op0 = " << obj_pos.x() << " op1 = " << obj_pos.y() << " op2 = " << obj_pos.z() << '\n';
target_alt = new_altitude * SG_FEET_TO_METER;
}
- if( target_alt < scenery.get_cur_elev() ) {
- target_alt = scenery.get_cur_elev();
+ if( target_alt < globals->get_scenery()->get_cur_elev() ) {
+ target_alt = globals->get_scenery()->get_cur_elev();
}
TargetAltitude = target_alt;
if ( !strcmp(startup_units_node->getStringValue(), "feet") ) {
agl = (current_aircraft.fdm_state->get_Altitude()
- - scenery.get_cur_elev() * SG_METER_TO_FEET);
+ - globals->get_scenery()->get_cur_elev() * SG_METER_TO_FEET);
} else {
agl = (current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
- - scenery.get_cur_elev());
+ - globals->get_scenery()->get_cur_elev());
}
return agl;
copy_to_FGADA();
// Write FGExternal structure from socket to establish connection
int result = fdmsock->write(OutBuffer, nbytes);
- printf("Connection established.\n");
+ printf("Connection established = %d.\n", result);
}
}
copy_to_FGADA();
fgGetDouble("/sim/view/offset",view_offset);
- if ( view_offset == 0.0) {
- memcpy (&OutBuffer, &visuals_to_sixdof, sizeof (OutBuffer));
- int result = fdmsock->write(OutBuffer, nbytes);
- }
+ if ( view_offset == 0.0) {
+ memcpy (&OutBuffer, &visuals_to_sixdof, sizeof (OutBuffer));
+ fdmsock->write(OutBuffer, nbytes);
+ }
}
// Convert from the FGInterface struct to the FGADA struct (output)
bool FGADA::copy_to_FGADA () {
- ground_elevation = scenery.get_cur_elev();
+ ground_elevation = globals->get_scenery()->get_cur_elev();
return true;
}
if ( startup_trim->getBoolValue() ) {
SG_LOG(SG_FLIGHT, SG_INFO,
"Ready to trim, terrain altitude is: "
- << scenery.get_cur_elev() * SG_METER_TO_FEET );
- fgic->SetTerrainAltitudeFtIC( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ << globals->get_scenery()->get_cur_elev() * SG_METER_TO_FEET );
+ fgic->SetTerrainAltitudeFtIC( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
do_trim();
} else {
fdmex->RunIC(fgic); //apply any changes made through the set_ functions
eng->SetStarter( globals->get_controls()->get_starter(i) );
}
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
Position->SetSeaLevelRadius( get_Sea_level_radius() );
Position->SetRunwayRadius( get_Runway_altitude()
+ get_Sea_level_radius() );
&sea_level_radius_meters, &lat_geoc );
_set_Sea_level_radius( sea_level_radius_meters * SG_METER_TO_FEET );
fgic->SetSeaLevelRadiusFtIC( sea_level_radius_meters * SG_METER_TO_FEET );
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
- fgic->SetTerrainAltitudeFtIC( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
+ fgic->SetTerrainAltitudeFtIC( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
fgic->SetLatitudeRadIC( lat_geoc );
needTrim=true;
}
SG_LOG(SG_FLIGHT,SG_INFO,"FGJSBsim::set_Longitude: " << lon );
update_ic();
fgic->SetLongitudeRadIC( lon );
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
- fgic->SetTerrainAltitudeFtIC( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
+ fgic->SetTerrainAltitudeFtIC( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
needTrim=true;
}
&sea_level_radius_meters, &lat_geoc);
_set_Sea_level_radius( sea_level_radius_meters * SG_METER_TO_FEET );
fgic->SetSeaLevelRadiusFtIC( sea_level_radius_meters * SG_METER_TO_FEET );
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
- fgic->SetTerrainAltitudeFtIC( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
+ fgic->SetTerrainAltitudeFtIC( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
SG_LOG(SG_FLIGHT, SG_INFO,
- "Terrain altitude: " << scenery.get_cur_elev() * SG_METER_TO_FEET );
+ "Terrain altitude: " << globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
fgic->SetLatitudeRadIC( lat_geoc );
fgic->SetAltitudeFtIC(alt);
needTrim=true;
// Inform LaRCsim of the local terrain altitude
// Runway_altitude = get_Runway_altitude();
- Runway_altitude = scenery.get_cur_elev() * SG_METER_TO_FEET;
+ Runway_altitude = globals->get_scenery()->get_cur_elev() * SG_METER_TO_FEET;
// Weather
/* V_north_airmass = get_V_north_airmass();
void FGLaRCsim::set_Latitude(double lat) {
SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Latitude: " << lat );
snap_shot();
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
lsic->SetLatitudeGDRadIC(lat);
set_ls();
copy_from_LaRCsim(); //update the bus
SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Longitude: " << lon );
snap_shot();
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
lsic->SetLongitudeRadIC(lon);
set_ls();
copy_from_LaRCsim(); //update the bus
void FGLaRCsim::set_Altitude(double alt) {
SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Altitude: " << alt );
snap_shot();
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
lsic->SetAltitudeFtIC(alt);
set_ls();
copy_from_LaRCsim(); //update the bus
// The ground elevation doesn't come from FGInterface; query it
// from the scenery and set it for others to find.
- double ground = scenery.get_cur_elev();
+ double ground = globals->get_scenery()->get_cur_elev();
_set_Runway_altitude(ground * FT2M);
// cout << "YASIM: ground = " << ground << endl;
* SGD_DEGREES_TO_RADIANS );
set_Latitude( fgGetDouble("/position/latitude-deg")
* SGD_DEGREES_TO_RADIANS );
- double ground_elev_m = scenery.get_cur_elev();
+ double ground_elev_m = globals->get_scenery()->get_cur_elev();
double ground_elev_ft = ground_elev_m * SG_METER_TO_FEET;
if ( fgGetBool("/sim/startup/onground")
|| fgGetDouble("/position/altitude-ft") < ground_elev_ft ) {
_set_Geodetic_Position( lat, lon, alt );
_set_Sea_level_radius( sl_radius * SG_METER_TO_FEET );
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
_set_sin_lat_geocentric( lat_geoc );
_set_cos_lat_geocentric( lat_geoc );
_set_Geodetic_Position( lat_geod, lon, alt );
_set_Sea_level_radius( sl_radius2 * SG_METER_TO_FEET );
- _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
+ _set_Runway_altitude( globals->get_scenery()->get_cur_elev()
+ * SG_METER_TO_FEET );
_set_sin_lat_geocentric( lat_geoc );
_set_cos_lat_geocentric( lat_geoc );
return true;
}
+
void fgSetPosFromGlideSlope(void) {
double gs = fgGetDouble("/velocities/glideslope");
double od = fgGetDouble("/sim/startup/offset-distance");
cur_fdm_state = new FGUFO( dt );
} else if ( model == "external" ) {
cur_fdm_state = new FGExternal( dt );
- } else if ( model.find("network,") == 0 ) {
+ } else if ( model.find("network") == 0 ) {
string host = "localhost";
int port1 = 5501;
int port2 = 5502;
// Initialize the scenery management subsystem.
////////////////////////////////////////////////////////////////////
- scenery.init();
- scenery.bind();
+ globals->set_scenery( new FGScenery );
+ globals->get_scenery()->init();
+ globals->get_scenery()->bind();
if ( global_tile_mgr.init() ) {
// Load the local scenery data
SG_LOG( SG_GENERAL, SG_DEBUG,
"Current terrain elevation after tile mgr init " <<
- scenery.get_cur_elev() );
+ globals->get_scenery()->get_cur_elev() );
////////////////////////////////////////////////////////////////////
}
// Initialize the Scenery Management subsystem
- scenery.init();
-
-#if 0
- if( global_tile_mgr.init() ) {
- Load the local scenery data
- global_tile_mgr.update( longitude->getDoubleValue(),
- latitude->getDoubleValue() );
- } else {
- SG_LOG( SG_GENERAL, SG_ALERT, "Error in Tile Manager initialization!" );
- exit(-1);
- }
-#endif
+ // FIXME, what really needs to get initialized here, at the time
+ // this was commented out, scenery.init() was a noop
+ // scenery.init();
fgInitFDM();
class FGAIMgr;
class FGAircraftModel;
class FGModelMgr;
+class FGScenery;
class ssgRoot;
class ssgBranch;
// list of serial port-like configurations
string_list *channel_options_list;
+ // FlightGear scenery manager
+ FGScenery *scenery;
+
// SSG scene graph
ssgRoot * scene_graph;
ssgBranch * terrain_branch;
channel_options_list = l;
}
+ inline FGScenery * get_scenery () const { return scenery; }
+ inline void set_scenery ( FGScenery *s ) { scenery = s; }
+
inline ssgRoot * get_scene_graph () const { return scene_graph; }
inline void set_scene_graph (ssgRoot * s) { scene_graph = s; }
#include <simgear/math/point3d.hxx>
#include <simgear/math/polar3d.hxx>
#include <simgear/math/sg_geodesy.hxx>
+#include <simgear/math/vector.hxx>
#include <Scenery/scenery.hxx>
-
-#include <simgear/math/vector.hxx>
-/*
#include "globals.hxx"
-*/
#include "location.hxx"
Point3D p = Point3D(lon_deg * SG_DEGREES_TO_RADIANS,
lat_geoc_rad,
sea_level_radius_m);
- Point3D tmp = sgPolarToCart3d(p) - scenery.get_next_center();
+ Point3D tmp = sgPolarToCart3d(p) - globals->get_scenery()->get_next_center();
sgSetVec3(_zero_elev_view_pos, tmp[0], tmp[1], tmp[2]);
// Calculate the absolute view position
// aka Relative View Position
sgdVec3 scenery_center;
sgdSetVec3(scenery_center,
- scenery.get_next_center().x(),
- scenery.get_next_center().y(),
- scenery.get_next_center().z());
+ globals->get_scenery()->get_next_center().x(),
+ globals->get_scenery()->get_next_center().y(),
+ globals->get_scenery()->get_next_center().z());
sgdVec3 view_pos;
sgdSubVec3(view_pos, _absolute_view_pos, scenery_center);
sgSetVec3(_relative_view_pos, view_pos);
// now work without seg faulting the system.
// calculate our current position in cartesian space
- scenery.set_center( scenery.get_next_center() );
+ globals->get_scenery()->set_center( globals->get_scenery()->get_next_center() );
// update view port
fgReshape( fgGetInt("/sim/startup/xsize"),
ssgSetFOV( current__view->get_h_fov(),
current__view->get_v_fov() );
- double agl = current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
- - scenery.get_cur_elev();
+ double agl =
+ current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
+ - globals->get_scenery()->get_cur_elev();
if ( agl > 10.0 ) {
scene_nearplane = 10.0f;
// cout << "cur_fdm_state->get_inited() = " << cur_fdm_state->get_inited()
// << " cur_elev = " << scenery.get_cur_elev() << endl;
- if ( !cur_fdm_state->get_inited() && scenery.get_cur_elev() > -9990 ) {
+ if ( !cur_fdm_state->get_inited() &&
+ globals->get_scenery()->get_cur_elev() > -9990 )
+ {
SG_LOG(SG_FLIGHT,SG_INFO, "Finally initializing fdm");
cur_fdm_state->init();
cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
cur_fdm_state->get_Altitude() * SG_FEET_TO_METER); */
- if ( scenery.get_cur_elev() > -9990 && cur_fdm_state->get_inited() ) {
+ if ( globals->get_scenery()->get_cur_elev() > -9990
+ && cur_fdm_state->get_inited() )
+ {
if ( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER <
- (scenery.get_cur_elev() + alt_adjust_m - 3.0) ) {
+ (globals->get_scenery()->get_cur_elev() + alt_adjust_m - 3.0) ) {
// now set aircraft altitude above ground
printf("(*) Current Altitude = %.2f < %.2f forcing to %.2f\n",
cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
- scenery.get_cur_elev() + alt_adjust_m - 3.0,
- scenery.get_cur_elev() + alt_adjust_m );
- cur_fdm_state->set_Altitude( scenery.get_cur_elev()
- + alt_adjust_m );
+ globals->get_scenery()->get_cur_elev() + alt_adjust_m - 3.0,
+ globals->get_scenery()->get_cur_elev() + alt_adjust_m );
+ cur_fdm_state->set_Altitude( globals->get_scenery()->get_cur_elev()
+ + alt_adjust_m );
SG_LOG( SG_ALL, SG_DEBUG,
"<*> resetting altitude to "
Point3D obj_pos = sgGeodToCart( obj_posn );
// Translate moving object w.r.t eye
- Point3D Objtrans = obj_pos-scenery.get_center();
+ Point3D Objtrans = obj_pos - globals->get_scenery()->get_center();
bz[0]=Objtrans.x();
bz[1]=Objtrans.y();
bz[2]=Objtrans.z();
Point3D p = Point3D(lon_deg * SG_DEGREES_TO_RADIANS,
lat_geoc_rad,
sea_level_radius_m);
- Point3D tmp = sgPolarToCart3d(p) - scenery.get_next_center();
+ Point3D tmp = sgPolarToCart3d(p) - globals->get_scenery()->get_next_center();
sgSetVec3(_zero_elev_view_pos, tmp[0], tmp[1], tmp[2]);
// Calculate the absolute view position
// aka Relative View Position
sgdVec3 scenery_center;
sgdSetVec3(scenery_center,
- scenery.get_next_center().x(),
- scenery.get_next_center().y(),
- scenery.get_next_center().z());
+ globals->get_scenery()->get_next_center().x(),
+ globals->get_scenery()->get_next_center().y(),
+ globals->get_scenery()->get_next_center().z());
sgdVec3 view_pos;
sgdSubVec3(view_pos, _absolute_view_pos, scenery_center);
sgSetVec3(_relative_view_pos, view_pos);
// Release the hardware
ATC610xRelease( lock_fd );
+ SG_LOG( SG_IO, SG_ALERT,
+ " - Waiting for compass to come home." );
+
bool home = false;
+ int timeout = 900; // about 30 seconds
while ( ! home ) {
- SG_LOG( SG_IO, SG_DEBUG, "Checking if compass home ..." );
+ if ( timeout % 150 == 0 ) {
+ SG_LOG( SG_IO, SG_INFO, "waiting for compass = " << timeout );
+ } else {
+ SG_LOG( SG_IO, SG_DEBUG, "Checking if compass home ..." );
+ }
while ( ATC610xLock( lock_fd ) <= 0 );
#else
usleep(33);
#endif
+
+ --timeout;
}
compass_position = 0.0;
raw->brake[i] = globals->get_controls()->get_brake(i);
}
- raw->hground = scenery.get_cur_elev();
+ raw->hground = globals->get_scenery()->get_cur_elev();
}
globals->get_controls()->set_brake( i, raw->brake[i] );
}
globals->get_controls()->set_gear_down( raw->gear_handle );
- scenery.set_cur_elev( raw->hground );
+ globals->get_scenery()->set_cur_elev( raw->hground );
} else {
SG_LOG( SG_IO, SG_ALERT, "Error: version mismatch in raw2global()" );
SG_LOG( SG_IO, SG_ALERT,
#include "scenery.hxx"
-// Shared structure to hold current scenery parameters
-FGScenery scenery;
-
-
// Scenery Management system
FGScenery::FGScenery() {
SG_LOG( SG_TERRAIN, SG_INFO, "Initializing scenery subsystem" );
};
-extern FGScenery scenery;
-
-
-// Initialize the Scenery Management system
-int fgSceneryInit( void );
-
-
#endif // _SCENERY_HXX
double agl;
if ( current_aircraft.fdm_state ) {
agl = current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
- - scenery.get_cur_elev();
+ - globals->get_scenery()->get_cur_elev();
} else {
agl = 0.0;
}
double agl;
if ( current_aircraft.fdm_state ) {
agl = current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
- - scenery.get_cur_elev();
+ - globals->get_scenery()->get_cur_elev();
} else {
agl = 0.0;
}
double agl1;
if ( current_aircraft.fdm_state ) {
agl1 = current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
- - scenery.get_cur_elev();
+ - globals->get_scenery()->get_cur_elev();
} else {
agl1 = 0.0;
}
terra_transform->addKid( terra_range );
// calculate initial tile offset
- SetOffset( scenery.get_center() );
+ SetOffset( globals->get_scenery()->get_center() );
sgCoord sgcoord;
sgSetCoord( &sgcoord,
offset.x(), offset.y(), offset.z(),
if ( tile_cache.exists( current_bucket ) ) {
current_tile = tile_cache.get_tile( current_bucket );
- scenery.set_next_center( current_tile->center );
+ globals->get_scenery()->set_next_center( current_tile->center );
} else {
SG_LOG( SG_TERRAIN, SG_WARN, "Tile not found (Ok if initializing)" );
- scenery.set_next_center( Point3D(0.0) );
+ globals->get_scenery()->set_next_center( Point3D(0.0) );
}
if ( state == Running ) {
sgdVec3 sc;
sgdSetVec3( sc,
- scenery.get_center()[0],
- scenery.get_center()[1],
- scenery.get_center()[2] );
-
-#if 0
- if ( scenery.center == Point3D(0.0) ) {
- // initializing
- cout << "initializing scenery current elevation ... " << endl;
- sgdVec3 tmp_abs_view_pos;
-
- Point3D geod_pos = Point3D( longitude * SGD_DEGREES_TO_RADIANS,
- latitude * SGD_DEGREES_TO_RADIANS,
- 0.0);
- Point3D tmp = sgGeodToCart( geod_pos );
- scenery.center = tmp;
- sgdSetVec3( tmp_abs_view_pos, tmp.x(), tmp.y(), tmp.z() );
-
- // cout << "abs_view_pos = " << tmp_abs_view_pos << endl;
- prep_ssg_nodes(visibility_meters);
-
- double tmp_elev;
- if ( fgCurrentElev(tmp_abs_view_pos, sc, &hit_list,
- &tmp_elev, &scenery.cur_radius, scenery.cur_normal) )
- {
- scenery.set_cur_elev( tmp_elev );
- } else {
- scenery.set_cur_elev( 0.0 );
- }
- // cout << "result = " << scenery.get_cur_elev() << endl;
- } else {
-#endif
+ globals->get_scenery()->get_center()[0],
+ globals->get_scenery()->get_center()[1],
+ globals->get_scenery()->get_center()[2] );
/*
- cout << "abs view pos = "
+ cout << "abs view pos = "
<< globals->get_current_view()->get_abs_view_pos()[0] << ","
<< globals->get_current_view()->get_abs_view_pos()[1] << ","
<< globals->get_current_view()->get_abs_view_pos()[2]
// scenery center has been properly defined so any hit
// should be valid (and not just luck)
sgdSetVec3( sc,
- scenery.get_center()[0],
- scenery.get_center()[1],
- scenery.get_center()[2] );
+ globals->get_scenery()->get_center()[0],
+ globals->get_scenery()->get_center()[1],
+ globals->get_scenery()->get_center()[2] );
hit = fgCurrentElev(globals->get_current_view()->get_absolute_view_pos(),
sc,
current_tile->get_terra_transform(),
}
if ( hit ) {
- scenery.set_cur_elev( hit_elev );
- scenery.set_cur_radius( hit_radius );
- scenery.set_cur_normal( hit_normal );
+ globals->get_scenery()->set_cur_elev( hit_elev );
+ globals->get_scenery()->set_cur_radius( hit_radius );
+ globals->get_scenery()->set_cur_normal( hit_normal );
} else {
- scenery.set_cur_elev( -9999.0 );
- scenery.set_cur_radius( 0.0 );
- scenery.set_cur_normal( hit_normal );
+ globals->get_scenery()->set_cur_elev( -9999.0 );
+ globals->get_scenery()->set_cur_radius( 0.0 );
+ globals->get_scenery()->set_cur_normal( hit_normal );
}
// cout << "Current elevation = " << scenery.get_cur_elev() << endl;
while ( ! tile_cache.at_end() ) {
// cout << "processing a tile" << endl;
if ( (e = tile_cache.get_current()) ) {
- e->prep_ssg_node( scenery.get_center(), up, vis);
+ e->prep_ssg_node( globals->get_scenery()->get_center(), up, vis);
} else {
SG_LOG(SG_INPUT, SG_ALERT, "warning ... empty tile in cache");
}
Point3D vp( v->get_view_pos()[0],
v->get_view_pos()[1],
v->get_view_pos()[2] );
- rel_moonpos = l->fg_moonpos - ( vp + scenery.get_center() );
+ rel_moonpos = l->fg_moonpos - ( vp + globals->get_scenery()->get_center() );
sgSetVec3( to_moon, rel_moonpos.x(), rel_moonpos.y(), rel_moonpos.z() );
// printf( "Vector to moon = %.2f %.2f %.2f\n",
// to_moon[0], to_moon[1], to_moon[2]);
Point3D vp( v->get_view_pos()[0],
v->get_view_pos()[1],
v->get_view_pos()[2] );
- rel_sunpos = l->fg_sunpos - ( vp + scenery.get_center() );
+ rel_sunpos = l->fg_sunpos - ( vp + globals->get_scenery()->get_center() );
sgSetVec3( to_sun, rel_sunpos.x(), rel_sunpos.y(), rel_sunpos.z() );
// printf( "Vector to sun = %.2f %.2f %.2f\n",
// v->to_sun[0], v->to_sun[1], v->to_sun[2]);