Added support for specifying light coverage on a per material basis in the
materials file (contributed by David Megginson.)
This commit is contained in:
parent
3ec542d18f
commit
84440e9b5e
3 changed files with 64 additions and 34 deletions
|
@ -42,6 +42,7 @@
|
||||||
FGNewMat::FGNewMat ( void ) {
|
FGNewMat::FGNewMat ( void ) {
|
||||||
wrapu = wrapv = 1;
|
wrapu = wrapv = 1;
|
||||||
mipmap = 1;
|
mipmap = 1;
|
||||||
|
light_coverage = -1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,6 +66,7 @@ FGNewMat::FGNewMat ( const string &mat_name, const string &tex_name )
|
||||||
diffuse[0] = diffuse[1] = diffuse[2] = diffuse[3] = 1.0;
|
diffuse[0] = diffuse[1] = diffuse[2] = diffuse[3] = 1.0;
|
||||||
specular[0] = specular[1] = specular[2] = specular[3] = 1.0;
|
specular[0] = specular[1] = specular[2] = specular[3] = 1.0;
|
||||||
emission[0] = emission[1] = emission[2] = emission[3] = 1.0;
|
emission[0] = emission[1] = emission[2] = emission[3] = 1.0;
|
||||||
|
light_coverage = -1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -237,6 +239,8 @@ operator >> ( istream& in, FGNewMat& m )
|
||||||
} else {
|
} else {
|
||||||
FG_LOG( FG_TERRAIN, FG_INFO, "Bad alpha value " << token );
|
FG_LOG( FG_TERRAIN, FG_INFO, "Bad alpha value " << token );
|
||||||
}
|
}
|
||||||
|
} else if ( token == "light-coverage" ) {
|
||||||
|
in >> token >> m.light_coverage;
|
||||||
} else if ( token[0] == '}' ) {
|
} else if ( token[0] == '}' ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,13 @@ private:
|
||||||
// use mipmapping?
|
// use mipmapping?
|
||||||
int mipmap;
|
int mipmap;
|
||||||
|
|
||||||
|
// coverage of night lighting. This number is specifically the
|
||||||
|
// amount of area coverage we give a single light. The size of a
|
||||||
|
// triangle is divided by this number and that is the number of
|
||||||
|
// lights assigned to that triangle. Lower numbers mean more
|
||||||
|
// dense light ocverage.
|
||||||
|
double light_coverage;
|
||||||
|
|
||||||
// material properties
|
// material properties
|
||||||
sgVec4 ambient, diffuse, specular, emission;
|
sgVec4 ambient, diffuse, specular, emission;
|
||||||
|
|
||||||
|
@ -119,6 +126,11 @@ public:
|
||||||
inline void set_specular( sgVec4 s ) { sgCopyVec4( specular, s ); }
|
inline void set_specular( sgVec4 s ) { sgCopyVec4( specular, s ); }
|
||||||
inline void set_emission( sgVec4 e ) { sgCopyVec4( emission, e ); }
|
inline void set_emission( sgVec4 e ) { sgCopyVec4( emission, e ); }
|
||||||
|
|
||||||
|
inline double get_light_coverage () const { return light_coverage; }
|
||||||
|
inline void set_light_coverage (double coverage) {
|
||||||
|
light_coverage = coverage;
|
||||||
|
}
|
||||||
|
|
||||||
inline ssgStateSelector *get_state() const { return state; }
|
inline ssgStateSelector *get_state() const { return state; }
|
||||||
|
|
||||||
void dump_info();
|
void dump_info();
|
||||||
|
|
|
@ -373,8 +373,9 @@ static void gen_random_surface_points( ssgLeaf *leaf, ssgVertexArray *lights,
|
||||||
ssgBranch *fgObjLoad( const string& path, FGTileEntry *t,
|
ssgBranch *fgObjLoad( const string& path, FGTileEntry *t,
|
||||||
ssgVertexArray *lights, const bool is_base)
|
ssgVertexArray *lights, const bool is_base)
|
||||||
{
|
{
|
||||||
FGNewMat *newmat;
|
FGNewMat *newmat = NULL;
|
||||||
string material;
|
string material;
|
||||||
|
float coverage = -1;
|
||||||
Point3D pp;
|
Point3D pp;
|
||||||
// sgVec3 approx_normal;
|
// sgVec3 approx_normal;
|
||||||
// double normal[3], scale = 0.0;
|
// double normal[3], scale = 0.0;
|
||||||
|
@ -560,11 +561,14 @@ ssgBranch *fgObjLoad( const string& path, FGTileEntry *t,
|
||||||
tex_width = newmat->get_xsize();
|
tex_width = newmat->get_xsize();
|
||||||
tex_height = newmat->get_ysize();
|
tex_height = newmat->get_ysize();
|
||||||
state = newmat->get_state();
|
state = newmat->get_state();
|
||||||
|
coverage = newmat->get_light_coverage();
|
||||||
// cout << "(w) = " << tex_width << " (h) = "
|
// cout << "(w) = " << tex_width << " (h) = "
|
||||||
// << tex_width << endl;
|
// << tex_width << endl;
|
||||||
|
} else {
|
||||||
|
coverage = -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// unknown comment, just gobble the input untill the
|
// unknown comment, just gobble the input until the
|
||||||
// end of line
|
// end of line
|
||||||
|
|
||||||
in >> skipeol;
|
in >> skipeol;
|
||||||
|
@ -773,39 +777,49 @@ ssgBranch *fgObjLoad( const string& path, FGTileEntry *t,
|
||||||
tile->addKid( leaf );
|
tile->addKid( leaf );
|
||||||
|
|
||||||
if ( is_base ) {
|
if ( is_base ) {
|
||||||
// generate lighting
|
if ( coverage > 0.0 ) {
|
||||||
if ( material == "Urban" || material == "BuiltUpCover" ) {
|
if ( coverage < 10000.0 ) {
|
||||||
gen_random_surface_points( leaf, lights, 100000.0 );
|
FG_LOG(FG_INPUT, FG_ALERT, "Light coverage is "
|
||||||
} else if ( material == "EvergreenBroadCover" ||
|
<< coverage << ", pushing up to 10000");
|
||||||
material == "Default" || material == "Island" ||
|
coverage = 10000;
|
||||||
material == "SomeSort" ||
|
}
|
||||||
material == "DeciduousBroadCover" ||
|
gen_random_surface_points(leaf, lights, coverage);
|
||||||
material == "EvergreenNeedleCover" ||
|
|
||||||
material == "DeciduousNeedleCover" ) {
|
|
||||||
gen_random_surface_points( leaf, lights, 10000000.0 );
|
|
||||||
} else if ( material == "MixedForestCover" ) {
|
|
||||||
gen_random_surface_points( leaf, lights, 5000000.0 );
|
|
||||||
} else if ( material == "WoodedTundraCover" ||
|
|
||||||
material == "BareTundraCover" ||
|
|
||||||
material == "HerbTundraCover" ||
|
|
||||||
material == "MixedTundraCover" ||
|
|
||||||
material == "Marsh" ||
|
|
||||||
material == "HerbWetlandCover" ||
|
|
||||||
material == "WoodedWetlandCover" ) {
|
|
||||||
gen_random_surface_points( leaf, lights, 20000000.0 );
|
|
||||||
} else if ( material == "ShrubCover" ||
|
|
||||||
material == "ShrubGrassCover" ) {
|
|
||||||
gen_random_surface_points( leaf, lights, 4000000.0 );
|
|
||||||
} else if ( material == "GrassCover" ||
|
|
||||||
material == "SavannaCover" ) {
|
|
||||||
gen_random_surface_points( leaf, lights, 4000000.0 );
|
|
||||||
} else if ( material == "MixedCropPastureCover" ||
|
|
||||||
material == "IrrCropPastureCover" ||
|
|
||||||
material == "DryCropPastureCover" ||
|
|
||||||
material == "CropGrassCover" ||
|
|
||||||
material == "CropWoodCover" ) {
|
|
||||||
gen_random_surface_points( leaf, lights, 2000000.0 );
|
|
||||||
}
|
}
|
||||||
|
// // generate lighting
|
||||||
|
// if ( material == "Urban" || material == "BuiltUpCover" ) {
|
||||||
|
// gen_random_surface_points( leaf, lights, 100000.0 );
|
||||||
|
// } else if ( material == "EvergreenBroadCover" ||
|
||||||
|
// material == "Default" || material == "Island" ||
|
||||||
|
// material == "SomeSort" ||
|
||||||
|
// material == "DeciduousBroadCover" ||
|
||||||
|
// material == "EvergreenNeedleCover" ||
|
||||||
|
// material == "DeciduousNeedleCover" ) {
|
||||||
|
// gen_random_surface_points( leaf, lights, 10000000.0 );
|
||||||
|
// } else if ( material == "Road") {
|
||||||
|
// gen_random_surface_points( leaf, lights, 10000.0);
|
||||||
|
// } else if ( material == "MixedForestCover" ) {
|
||||||
|
// gen_random_surface_points( leaf, lights, 5000000.0 );
|
||||||
|
// } else if ( material == "WoodedTundraCover" ||
|
||||||
|
// material == "BareTundraCover" ||
|
||||||
|
// material == "HerbTundraCover" ||
|
||||||
|
// material == "MixedTundraCover" ||
|
||||||
|
// material == "Marsh" ||
|
||||||
|
// material == "HerbWetlandCover" ||
|
||||||
|
// material == "WoodedWetlandCover" ) {
|
||||||
|
// gen_random_surface_points( leaf, lights, 20000000.0 );
|
||||||
|
// } else if ( material == "ShrubCover" ||
|
||||||
|
// material == "ShrubGrassCover" ) {
|
||||||
|
// gen_random_surface_points( leaf, lights, 4000000.0 );
|
||||||
|
// } else if ( material == "GrassCover" ||
|
||||||
|
// material == "SavannaCover" ) {
|
||||||
|
// gen_random_surface_points( leaf, lights, 4000000.0 );
|
||||||
|
// } else if ( material == "MixedCropPastureCover" ||
|
||||||
|
// material == "IrrCropPastureCover" ||
|
||||||
|
// material == "DryCropPastureCover" ||
|
||||||
|
// material == "CropGrassCover" ||
|
||||||
|
// material == "CropWoodCover" ) {
|
||||||
|
// gen_random_surface_points( leaf, lights, 2000000.0 );
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
FG_LOG( FG_TERRAIN, FG_WARN, "Unknown token in "
|
FG_LOG( FG_TERRAIN, FG_WARN, "Unknown token in "
|
||||||
|
|
Loading…
Reference in a new issue