//
// Written by Curtis Olson, started May 1998.
//
-// Copyright (C) 1998 - 2001 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 1998 - 2001 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
#endif
#include <simgear/compiler.h>
-
+#include <plib/ul.h>
#include <Main/main.hxx>
#include <simgear/scene/tgdb/apt_signs.hxx>
#include <simgear/scene/tgdb/obj.hxx>
#include <simgear/scene/tgdb/vasi.hxx>
+#include <simgear/scene/model/placementtrans.hxx>
#include <Aircraft/aircraft.hxx>
#include <Include/general.hxx>
FGTileEntry::FGTileEntry ( const SGBucket& b )
: center( Point3D( 0.0 ) ),
tile_bucket( b ),
- terra_transform( new ssgTransform ),
- vasi_lights_transform( new ssgTransform ),
- rwy_lights_transform( new ssgTransform ),
- taxi_lights_transform( new ssgTransform ),
+ terra_transform( new ssgPlacementTransform ),
+ vasi_lights_transform( new ssgPlacementTransform ),
+ rwy_lights_transform( new ssgPlacementTransform ),
+ taxi_lights_transform( new ssgPlacementTransform ),
terra_range( new ssgRangeSelector ),
vasi_lights_selector( new ssgSelector ),
rwy_lights_selector( new ssgSelector ),
void FGTileEntry::prep_ssg_node( const Point3D& p, sgVec3 up, float vis) {
if ( !loaded ) return;
- SetOffset( p );
-
// visibility can change from frame to frame so we update the
// range selector cutoff's each time.
terra_range->setRange( 0, SG_ZERO );
gnd_lights_range->setRange( 1, vis * 1.5 + bounding_radius );
}
- sgVec3 sgTrans;
- sgSetVec3( sgTrans, offset.x(), offset.y(), offset.z() );
- terra_transform->setTransform( sgTrans );
+ sgdVec3 sgdTrans;
+ sgdSetVec3( sgdTrans, center.x(), center.y(), center.z() );
FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
if ( gnd_lights_transform ) {
sgCopyVec3( lift_vec, up );
double agl;
- agl = globals->get_current_view()->getAltitudeASL_ft()
- * SG_FEET_TO_METER - globals->get_scenery()->get_cur_elev();
+ agl = globals->get_current_view()->getAltitudeASL_ft()*SG_FEET_TO_METER
+ - globals->get_current_view()->getSGLocation()->get_cur_elev_m();
- // sgTrans just happens to be the
- // vector from scenery center to the center of this tile which
- // is what we want to calculate the distance of
- sgVec3 to;
- sgCopyVec3( to, sgTrans );
- double dist = sgLengthVec3( to );
+ // Compute the distance of the scenery center from the view position.
+ double dist = center.distance3D(p);
if ( general.get_glDepthBits() > 16 ) {
sgScaleVec3( lift_vec, 10.0 + agl / 100.0 + dist / 10000 );
sgScaleVec3( lift_vec, 10.0 + agl / 20.0 + dist / 5000 );
}
- sgVec3 lt_trans;
- sgCopyVec3( lt_trans, sgTrans );
-
- sgAddVec3( lt_trans, lift_vec );
- gnd_lights_transform->setTransform( lt_trans );
+ sgdVec3 dlt_trans;
+ sgdCopyVec3( dlt_trans, sgdTrans );
+ sgdVec3 dlift_vec;
+ sgdSetVec3( dlift_vec, lift_vec );
+ sgdAddVec3( dlt_trans, dlift_vec );
+ gnd_lights_transform->setTransform( dlt_trans );
// select which set of lights based on sun angle
float sun_angle = l->get_sun_angle() * SGD_RADIANS_TO_DEGREES;
// we fudge agl by 30 meters so that the lifting function
// doesn't phase in until we are > 30m agl.
double agl;
- agl = globals->get_current_view()->getAltitudeASL_ft()
- * SG_FEET_TO_METER - globals->get_scenery()->get_cur_elev()
- - 30.0;
+ agl = globals->get_current_view()->getAltitudeASL_ft()*SG_FEET_TO_METER
+ - globals->get_current_view()->getSGLocation()->get_cur_elev_m()
+ - 30.0;
if ( agl < 0.0 ) {
agl = 0.0;
}
sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
}
- sgVec3 lt_trans;
- sgCopyVec3( lt_trans, sgTrans );
-
- sgAddVec3( lt_trans, lift_vec );
- vasi_lights_transform->setTransform( lt_trans );
+ sgdVec3 dlt_trans;
+ sgdCopyVec3( dlt_trans, sgdTrans );
+ sgdVec3 dlift_vec;
+ sgdSetVec3( dlift_vec, lift_vec );
+ sgdAddVec3( dlt_trans, dlift_vec );
+ vasi_lights_transform->setTransform( dlt_trans );
// generally, vasi lights are always on
vasi_lights_selector->select(0x01);
// we fudge agl by 30 meters so that the lifting function
// doesn't phase in until we are > 30m agl.
double agl;
- agl = globals->get_current_view()->getAltitudeASL_ft()
- * SG_FEET_TO_METER - globals->get_scenery()->get_cur_elev()
- - 30.0;
+ agl = globals->get_current_view()->getAltitudeASL_ft()*SG_FEET_TO_METER
+ - globals->get_current_view()->getSGLocation()->get_cur_elev_m()
+ - 30.0;
if ( agl < 0.0 ) {
agl = 0.0;
}
sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
}
- sgVec3 lt_trans;
- sgCopyVec3( lt_trans, sgTrans );
-
- sgAddVec3( lt_trans, lift_vec );
- rwy_lights_transform->setTransform( lt_trans );
+ sgdVec3 dlt_trans;
+ sgdCopyVec3( dlt_trans, sgdTrans );
+ sgdVec3 dlift_vec;
+ sgdSetVec3( dlift_vec, lift_vec );
+ sgdAddVec3( dlt_trans, dlift_vec );
+ rwy_lights_transform->setTransform( dlt_trans );
// turn runway lights on/off based on sun angle and visibility
float sun_angle = l->get_sun_angle() * SGD_RADIANS_TO_DEGREES;
// we fudge agl by 30 meters so that the lifting function
// doesn't phase in until we are > 30m agl.
double agl;
- agl = globals->get_current_view()->getAltitudeASL_ft()
- * SG_FEET_TO_METER - globals->get_scenery()->get_cur_elev()
- - 30.0;
+ agl = globals->get_current_view()->getAltitudeASL_ft()*SG_FEET_TO_METER
+ - globals->get_current_view()->getSGLocation()->get_cur_elev_m()
+ - 30.0;
if ( agl < 0.0 ) {
agl = 0.0;
}
sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
}
- sgVec3 lt_trans;
- sgCopyVec3( lt_trans, sgTrans );
-
- sgAddVec3( lt_trans, lift_vec );
- taxi_lights_transform->setTransform( lt_trans );
+ sgdVec3 dlt_trans;
+ sgdCopyVec3( dlt_trans, sgdTrans );
+ sgdVec3 dlift_vec;
+ sgdSetVec3( dlift_vec, lift_vec );
+ sgdAddVec3( dlt_trans, dlift_vec );
+ taxi_lights_transform->setTransform( dlt_trans );
// turn taxi lights on/off based on sun angle and visibility
float sun_angle = l->get_sun_angle() * SGD_RADIANS_TO_DEGREES;
while ( ! in.eof() ) {
in >> token;
+ if ( token[0] == '#' ) {
+ in >> ::skipeol;
+ continue;
+ }
// Load only once (first found)
if ( token == "OBJECT_BASE" ) {
in >> name >> ::skipws;
terra_transform->addKid( terra_range );
// calculate initial tile offset
- SetOffset( globals->get_scenery()->get_center() );
- sgCoord sgcoord;
- sgSetCoord( &sgcoord,
- offset.x(), offset.y(), offset.z(),
- 0.0, 0.0, 0.0 );
- terra_transform->setTransform( &sgcoord );
- // terrain->addKid( terra_transform );
+ sgdVec3 sgdTrans;
+ sgdSetVec3( sgdTrans, center.x(), center.y(), center.z() );
+ terra_transform->setTransform( sgdTrans );
// Add ground lights to scene graph if any exist
gnd_lights_transform = NULL;
gnd_lights_range = NULL;
if ( light_pts->getNum() ) {
SG_LOG( SG_TERRAIN, SG_DEBUG, "generating lights" );
- gnd_lights_transform = new ssgTransform;
+ gnd_lights_transform = new ssgPlacementTransform;
gnd_lights_range = new ssgRangeSelector;
gnd_lights_brightness = new ssgSelector;
ssgLeaf *lights;
gnd_lights_range->addKid( gnd_lights_brightness );
gnd_lights_transform->addKid( gnd_lights_range );
- gnd_lights_transform->setTransform( &sgcoord );
+ gnd_lights_transform->setTransform( sgdTrans );
}
// Update vasi lights transform
if ( vasi_lights_transform->getNumKids() > 0 ) {
- vasi_lights_transform->setTransform( &sgcoord );
+ vasi_lights_transform->setTransform( sgdTrans );
}
// Update runway lights transform
if ( rwy_lights_transform->getNumKids() > 0 ) {
- rwy_lights_transform->setTransform( &sgcoord );
+ rwy_lights_transform->setTransform( sgdTrans );
}
// Update taxi lights transform
if ( taxi_lights_transform->getNumKids() > 0 ) {
- taxi_lights_transform->setTransform( &sgcoord );
+ taxi_lights_transform->setTransform( sgdTrans );
}
+
+ delete light_pts;
}
+void
+FGTileEntry::makeDList( ssgBranch *b )
+{
+ int nb = b->getNumKids();
+ for (int i = 0; i<nb; i++) {
+ ssgEntity *e = b->getKid(i);
+ if (e->isAKindOf(ssgTypeLeaf())) {
+ ((ssgLeaf*)e)->makeDList();
+ } else if (e->isAKindOf(ssgTypeBranch())) {
+ makeDList( (ssgBranch*)e );
+ }
+ }
+}
void
FGTileEntry::add_ssg_nodes( ssgBranch *terrain_branch,
{
// bump up the ref count so we can remove this later without
// having ssg try to free the memory.
+#if PLIB_VERSION > 183
+ if ( fgGetBool( "/sim/rendering/use-display-list", true ) ) {
+ makeDList( terra_transform );
+ }
+#endif
+
terra_transform->ref();
terrain_branch->addKid( terra_transform );
+ globals->get_scenery()->register_placement_transform(terra_transform);
SG_LOG( SG_TERRAIN, SG_DEBUG,
"connected a tile into scene graph. terra_transform = "
// having ssg try to free the memory.
gnd_lights_transform->ref();
gnd_lights_branch->addKid( gnd_lights_transform );
+ globals->get_scenery()->register_placement_transform(gnd_lights_transform);
}
if ( vasi_lights_transform != NULL ) {
// having ssg try to free the memory.
vasi_lights_selector->ref();
vasi_lights_selector->addKid( vasi_lights_transform );
+ globals->get_scenery()->register_placement_transform(vasi_lights_transform);
vasi_lights_branch->addKid( vasi_lights_selector );
}
// having ssg try to free the memory.
rwy_lights_selector->ref();
rwy_lights_selector->addKid( rwy_lights_transform );
+ globals->get_scenery()->register_placement_transform(rwy_lights_transform);
rwy_lights_branch->addKid( rwy_lights_selector );
}
// having ssg try to free the memory.
taxi_lights_selector->ref();
taxi_lights_selector->addKid( taxi_lights_transform );
+ globals->get_scenery()->register_placement_transform(taxi_lights_transform);
taxi_lights_branch->addKid( taxi_lights_selector );
}
SG_LOG( SG_TERRAIN, SG_DEBUG, "removing a fully loaded tile! terra_transform = " << terra_transform );
}
+ // Unregister that one at the scenery manager
+ globals->get_scenery()->unregister_placement_transform(terra_transform);
+
// find the terrain branch parent
int pcount = terra_transform->getNumParents();
if ( pcount > 0 ) {
// find the ground lighting branch
if ( gnd_lights_transform ) {
+ // Unregister that one at the scenery manager
+ globals->get_scenery()->unregister_placement_transform(gnd_lights_transform);
pcount = gnd_lights_transform->getNumParents();
if ( pcount > 0 ) {
// find the first parent (should only be one)
// find the vasi lighting branch
if ( vasi_lights_transform ) {
+ // Unregister that one at the scenery manager
+ globals->get_scenery()->unregister_placement_transform(vasi_lights_transform);
pcount = vasi_lights_transform->getNumParents();
if ( pcount > 0 ) {
// find the first parent (should only be one)
// find the runway lighting branch
if ( rwy_lights_transform ) {
+ // Unregister that one at the scenery manager
+ globals->get_scenery()->unregister_placement_transform(rwy_lights_transform);
pcount = rwy_lights_transform->getNumParents();
if ( pcount > 0 ) {
// find the first parent (should only be one)
// find the taxi lighting branch
if ( taxi_lights_transform ) {
+ // Unregister that one at the scenery manager
+ globals->get_scenery()->unregister_placement_transform(taxi_lights_transform);
pcount = taxi_lights_transform->getNumParents();
if ( pcount > 0 ) {
// find the first parent (should only be one)