2000-06-23 02:59:03 +00:00
|
|
|
|
// newmat.cxx -- class to handle material properties
|
|
|
|
|
//
|
|
|
|
|
// Written by Curtis Olson, started May 1998.
|
|
|
|
|
//
|
|
|
|
|
// Copyright (C) 1998 - 2000 Curtis L. Olson - curt@flightgear.org
|
|
|
|
|
//
|
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
// General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
//
|
|
|
|
|
// $Id$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
# include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
2002-07-18 01:04:08 +00:00
|
|
|
|
#include <map>
|
|
|
|
|
SG_USING_STD(map);
|
|
|
|
|
|
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
2001-03-23 22:42:49 +00:00
|
|
|
|
#ifdef SG_MATH_EXCEPTION_CLASH
|
2000-06-23 02:59:03 +00:00
|
|
|
|
# include <math.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include <simgear/debug/logstream.hxx>
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
#include <simgear/math/sg_random.h>
|
2001-03-25 14:20:12 +00:00
|
|
|
|
#include <simgear/misc/sg_path.hxx>
|
|
|
|
|
#include <simgear/misc/sgstream.hxx>
|
2000-06-23 02:59:03 +00:00
|
|
|
|
|
2001-12-28 23:33:32 +00:00
|
|
|
|
#include <Main/globals.hxx>
|
|
|
|
|
#include <Main/fg_props.hxx>
|
|
|
|
|
|
2000-06-23 02:59:03 +00:00
|
|
|
|
#include "newmat.hxx"
|
|
|
|
|
|
2002-07-18 01:04:08 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Local static variables.
|
|
|
|
|
// FIXME: write a proper manager.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
// Objects already loaded (that can be reused).
|
|
|
|
|
map<string,ssgEntity *> object_map;
|
|
|
|
|
|
2000-06-23 02:59:03 +00:00
|
|
|
|
|
2001-12-30 03:04:39 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Local static functions.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2002-07-18 01:04:08 +00:00
|
|
|
|
// FIXME: this is totally evil and non-robust: it assumes that
|
|
|
|
|
// entities will never be refcounted to 0 (which is safe for now).
|
|
|
|
|
static ssgEntity *
|
|
|
|
|
load_object (char * path)
|
|
|
|
|
{
|
|
|
|
|
ssgEntity * object = object_map[path];
|
|
|
|
|
if (object == 0) {
|
|
|
|
|
object = ssgLoad(path);
|
|
|
|
|
object_map[path] = object;
|
|
|
|
|
}
|
|
|
|
|
return object;
|
|
|
|
|
}
|
|
|
|
|
|
2001-12-30 03:04:39 +00:00
|
|
|
|
/**
|
|
|
|
|
* Internal method to test whether a file exists.
|
|
|
|
|
*
|
|
|
|
|
* TODO: this should be moved to a SimGear library of local file
|
|
|
|
|
* functions.
|
|
|
|
|
*/
|
|
|
|
|
static inline bool
|
2001-12-28 23:33:32 +00:00
|
|
|
|
local_file_exists( const string& path ) {
|
|
|
|
|
sg_gzifstream in( path );
|
|
|
|
|
if ( ! in.is_open() ) {
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2000-06-23 02:59:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-07-20 01:51:27 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGNewMat::Object.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
FGNewMat::Object::Object (const SGPropertyNode * node, double range_m)
|
|
|
|
|
: _models_loaded(false),
|
2002-07-20 18:41:17 +00:00
|
|
|
|
_coverage_m2(node->getDoubleValue("coverage-m2", 1000000)),
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
_range_m(range_m)
|
2002-07-20 01:51:27 +00:00
|
|
|
|
{
|
2002-07-20 18:41:17 +00:00
|
|
|
|
// Sanity check
|
|
|
|
|
if (_coverage_m2 < 1000) {
|
|
|
|
|
SG_LOG(SG_INPUT, SG_ALERT, "Random object coverage " << _coverage_m2
|
|
|
|
|
<< " is too small, forcing, to 1000");
|
|
|
|
|
_coverage_m2 = 1000;
|
|
|
|
|
}
|
|
|
|
|
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
// Note all the model paths
|
|
|
|
|
vector <SGPropertyNode_ptr> path_nodes = node->getChildren("path");
|
2002-07-26 16:54:40 +00:00
|
|
|
|
for (unsigned int i = 0; i < path_nodes.size(); i++)
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
_paths.push_back(path_nodes[i]->getStringValue());
|
|
|
|
|
|
|
|
|
|
// Note the heading type
|
2002-07-20 01:51:27 +00:00
|
|
|
|
string hdg = node->getStringValue("heading-type", "fixed");
|
|
|
|
|
if (hdg == "fixed") {
|
|
|
|
|
_heading_type = HEADING_FIXED;
|
|
|
|
|
} else if (hdg == "billboard") {
|
|
|
|
|
_heading_type = HEADING_BILLBOARD;
|
|
|
|
|
} else if (hdg == "random") {
|
|
|
|
|
_heading_type = HEADING_RANDOM;
|
|
|
|
|
} else {
|
|
|
|
|
_heading_type = HEADING_FIXED;
|
|
|
|
|
SG_LOG(SG_INPUT, SG_ALERT, "Unknown heading type: " << hdg
|
|
|
|
|
<< "; using 'fixed' instead.");
|
|
|
|
|
}
|
2002-07-26 16:54:40 +00:00
|
|
|
|
|
|
|
|
|
// uncomment to preload models
|
|
|
|
|
// load_models();
|
2002-07-20 01:51:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGNewMat::Object::~Object ()
|
|
|
|
|
{
|
2002-07-26 16:54:40 +00:00
|
|
|
|
for (unsigned int i = 0; i < _models.size(); i++) {
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
if (_models[i] != 0) {
|
|
|
|
|
_models[i]->deRef();
|
|
|
|
|
_models[i] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-07-20 01:51:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
int
|
|
|
|
|
FGNewMat::Object::get_model_count () const
|
2002-07-20 01:51:27 +00:00
|
|
|
|
{
|
2002-07-26 19:04:40 +00:00
|
|
|
|
load_models();
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
return _models.size();
|
2002-07-20 01:51:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
inline void
|
|
|
|
|
FGNewMat::Object::load_models () const
|
2002-07-20 01:51:27 +00:00
|
|
|
|
{
|
|
|
|
|
// Load model only on demand
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
if (!_models_loaded) {
|
2002-07-31 18:44:30 +00:00
|
|
|
|
for (int i = 0; i < _paths.size(); i++) {
|
|
|
|
|
|
|
|
|
|
// Original
|
|
|
|
|
// SGPath path = globals->get_fg_root();
|
|
|
|
|
// path.append(_paths[i]);
|
|
|
|
|
// ssgTexturePath((char *)path.dir().c_str());
|
|
|
|
|
// ssgEntity * entity = load_object((char *)path.c_str());
|
|
|
|
|
|
|
|
|
|
// DCL
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
SGPath path = globals->get_fg_root();
|
2002-07-31 18:44:30 +00:00
|
|
|
|
SGPath modelPath = _paths[i];
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
path.append(_paths[i]);
|
|
|
|
|
ssgTexturePath((char *)path.dir().c_str());
|
2002-07-31 18:44:30 +00:00
|
|
|
|
ssgEntity * entity = load_object((char *)modelPath.c_str());
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
if (entity != 0) {
|
2002-07-26 23:27:53 +00:00
|
|
|
|
// entity->ref();
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
float ranges[] = {0, _range_m};
|
|
|
|
|
ssgRangeSelector * lod = new ssgRangeSelector;
|
2002-07-26 23:27:53 +00:00
|
|
|
|
lod->ref();
|
|
|
|
|
lod->setRanges(ranges, 2);
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
if (_heading_type == HEADING_BILLBOARD) {
|
|
|
|
|
ssgCutout * cutout = new ssgCutout(false);
|
2002-07-26 23:27:53 +00:00
|
|
|
|
// cutout->ref();
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
cutout->addKid(entity);
|
|
|
|
|
lod->addKid(cutout);
|
|
|
|
|
} else {
|
|
|
|
|
lod->addKid(entity);
|
|
|
|
|
}
|
|
|
|
|
_models.push_back(lod);
|
2002-07-20 01:51:27 +00:00
|
|
|
|
} else {
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_ALERT, "Failed to load object " << path.str());
|
2002-07-20 01:51:27 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
_models_loaded = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ssgEntity *
|
|
|
|
|
FGNewMat::Object::get_model (int index) const
|
|
|
|
|
{
|
2002-07-26 16:54:40 +00:00
|
|
|
|
load_models(); // comment this out if preloading models
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
return _models[index];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ssgEntity *
|
|
|
|
|
FGNewMat::Object::get_random_model () const
|
|
|
|
|
{
|
2002-07-26 16:54:40 +00:00
|
|
|
|
load_models(); // comment this out if preloading models
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
int nModels = _models.size();
|
|
|
|
|
int index = int(sg_random() * nModels);
|
|
|
|
|
if (index >= nModels)
|
|
|
|
|
index = 0;
|
|
|
|
|
return _models[index];
|
2002-07-20 01:51:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double
|
|
|
|
|
FGNewMat::Object::get_coverage_m2 () const
|
|
|
|
|
{
|
|
|
|
|
return _coverage_m2;
|
|
|
|
|
}
|
|
|
|
|
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
FGNewMat::Object::HeadingType
|
|
|
|
|
FGNewMat::Object::get_heading_type () const
|
|
|
|
|
{
|
|
|
|
|
return _heading_type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGNewMat::ObjectGroup.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGNewMat::ObjectGroup::ObjectGroup (SGPropertyNode * node)
|
|
|
|
|
: _range_m(node->getDoubleValue("range-m", 2000))
|
|
|
|
|
{
|
|
|
|
|
// Load the object subnodes
|
|
|
|
|
vector<SGPropertyNode_ptr> object_nodes =
|
|
|
|
|
((SGPropertyNode *)node)->getChildren("object");
|
|
|
|
|
for (unsigned int i = 0; i < object_nodes.size(); i++) {
|
|
|
|
|
const SGPropertyNode * object_node = object_nodes[i];
|
|
|
|
|
if (object_node->hasChild("path"))
|
|
|
|
|
_objects.push_back(new Object(object_node, _range_m));
|
|
|
|
|
else
|
|
|
|
|
SG_LOG(SG_INPUT, SG_ALERT, "No path supplied for object");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGNewMat::ObjectGroup::~ObjectGroup ()
|
|
|
|
|
{
|
2002-07-26 16:54:40 +00:00
|
|
|
|
for (unsigned int i = 0; i < _objects.size(); i++) {
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
delete _objects[i];
|
|
|
|
|
_objects[i] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-07-20 01:51:27 +00:00
|
|
|
|
double
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
FGNewMat::ObjectGroup::get_range_m () const
|
2002-07-20 01:51:27 +00:00
|
|
|
|
{
|
|
|
|
|
return _range_m;
|
|
|
|
|
}
|
|
|
|
|
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
int
|
|
|
|
|
FGNewMat::ObjectGroup::get_object_count () const
|
|
|
|
|
{
|
|
|
|
|
return _objects.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGNewMat::Object *
|
|
|
|
|
FGNewMat::ObjectGroup::get_object (int index) const
|
|
|
|
|
{
|
|
|
|
|
return _objects[index];
|
|
|
|
|
}
|
|
|
|
|
|
2002-07-20 01:51:27 +00:00
|
|
|
|
|
2001-12-30 03:04:39 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Constructors and destructor.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2001-12-28 23:33:32 +00:00
|
|
|
|
|
|
|
|
|
FGNewMat::FGNewMat (const SGPropertyNode * props)
|
2000-06-23 02:59:03 +00:00
|
|
|
|
{
|
2001-12-29 13:19:09 +00:00
|
|
|
|
init();
|
2001-12-28 23:33:32 +00:00
|
|
|
|
read_properties(props);
|
|
|
|
|
build_ssg_state(false);
|
2000-06-23 04:55:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-03-12 05:37:55 +00:00
|
|
|
|
FGNewMat::FGNewMat (const string &texpath)
|
2001-12-28 23:33:32 +00:00
|
|
|
|
{
|
2001-12-29 13:19:09 +00:00
|
|
|
|
init();
|
2002-03-12 05:37:55 +00:00
|
|
|
|
texture_path = texpath;
|
2001-12-28 23:33:32 +00:00
|
|
|
|
build_ssg_state(true);
|
|
|
|
|
}
|
2000-06-23 04:55:55 +00:00
|
|
|
|
|
2001-12-28 23:33:32 +00:00
|
|
|
|
FGNewMat::FGNewMat (ssgSimpleState * s)
|
|
|
|
|
{
|
2001-12-29 13:19:09 +00:00
|
|
|
|
init();
|
2001-12-28 23:33:32 +00:00
|
|
|
|
set_ssg_state(s);
|
|
|
|
|
}
|
|
|
|
|
|
2001-12-30 03:04:39 +00:00
|
|
|
|
FGNewMat::~FGNewMat (void)
|
|
|
|
|
{
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
for (unsigned int i = 0; i < object_groups.size(); i++) {
|
|
|
|
|
delete object_groups[i];
|
|
|
|
|
object_groups[i] = 0;
|
2002-07-20 01:51:27 +00:00
|
|
|
|
}
|
2001-12-30 03:04:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Public methods.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGNewMat::read_properties (const SGPropertyNode * props)
|
|
|
|
|
{
|
|
|
|
|
// Get the path to the texture
|
|
|
|
|
string tname = props->getStringValue("texture", "unknown.rgb");
|
|
|
|
|
SGPath tpath(globals->get_fg_root());
|
|
|
|
|
tpath.append("Textures.high");
|
|
|
|
|
tpath.append(tname);
|
|
|
|
|
if (!local_file_exists(tpath.str())) {
|
|
|
|
|
tpath = SGPath(globals->get_fg_root());
|
|
|
|
|
tpath.append("Textures");
|
|
|
|
|
tpath.append(tname);
|
|
|
|
|
}
|
|
|
|
|
texture_path = tpath.str();
|
|
|
|
|
|
|
|
|
|
xsize = props->getDoubleValue("xsize", 0.0);
|
|
|
|
|
ysize = props->getDoubleValue("ysize", 0.0);
|
|
|
|
|
wrapu = props->getBoolValue("wrapu", true);
|
|
|
|
|
wrapv = props->getBoolValue("wrapv", true);
|
|
|
|
|
mipmap = props->getBoolValue("mipmap", true);
|
2002-03-26 16:10:53 +00:00
|
|
|
|
light_coverage = props->getDoubleValue("light-coverage", 0.0);
|
2001-12-30 03:04:39 +00:00
|
|
|
|
|
|
|
|
|
ambient[0] = props->getDoubleValue("ambient/r", 0.0);
|
|
|
|
|
ambient[1] = props->getDoubleValue("ambient/g", 0.0);
|
|
|
|
|
ambient[2] = props->getDoubleValue("ambient/b", 0.0);
|
|
|
|
|
ambient[3] = props->getDoubleValue("ambient/a", 0.0);
|
|
|
|
|
|
|
|
|
|
diffuse[0] = props->getDoubleValue("diffuse/r", 0.0);
|
|
|
|
|
diffuse[1] = props->getDoubleValue("diffuse/g", 0.0);
|
|
|
|
|
diffuse[2] = props->getDoubleValue("diffuse/b", 0.0);
|
|
|
|
|
diffuse[3] = props->getDoubleValue("diffuse/a", 0.0);
|
|
|
|
|
|
|
|
|
|
specular[0] = props->getDoubleValue("specular/r", 0.0);
|
|
|
|
|
specular[1] = props->getDoubleValue("specular/g", 0.0);
|
|
|
|
|
specular[2] = props->getDoubleValue("specular/b", 0.0);
|
|
|
|
|
specular[3] = props->getDoubleValue("specular/a", 0.0);
|
|
|
|
|
|
|
|
|
|
emission[0] = props->getDoubleValue("emissive/r", 0.0);
|
|
|
|
|
emission[1] = props->getDoubleValue("emissive/g", 0.0);
|
|
|
|
|
emission[2] = props->getDoubleValue("emissive/b", 0.0);
|
|
|
|
|
emission[3] = props->getDoubleValue("emissive/a", 0.0);
|
2002-07-15 18:16:20 +00:00
|
|
|
|
|
Randomly-place object overhaul and enhancements
-----------------------------------------------
Fixed a segfault on exit.
Changed the radius of the dummy bounding sphere from 10m to 1000m to
ensure that FOV culling doesn't leave anything out.
Allow an object to have more than one variant model, which will be
chosen randomly. Simply repeat the <path>...</path> property.
Removed the <billboard> property and replaced it with <heading-type>,
which can be set to "fixed" (leave the model oriented as it is),
"random" (give the model a random heading between 0 and 359 deg), or
"billboard" (always turn the model to face the camera). The default
is "fixed". Models look much better when they are not all facing the
same direction.
Allow the user to group models with the same visual range, so that
there can be *many* fewer nodes in the scene graph when the models are
not visible. This causes an XML-format change, so that instead of
<object>
<range-m>...</range-m>
...
</object>
<object>
<range-m>...</range-m>
...
</object>
...
we now have
<object-group>
<range-m>...</range-m>
<object>
...
</object>
<object>
...
</object>
...
</object-group>
Every object in a group can still have its own model(s), coverage, and
heading-type, but they all share the same range selector.
This change should already help users with tight memory constraints,
but it will matter much more when we add more object types -- for
example, we can now add dozens of different urban building types
without bloating the scene graph or slowing down the LOD tests for
tris that are out of range (i.e. most of them).
2002-07-20 14:56:37 +00:00
|
|
|
|
vector<SGPropertyNode_ptr> object_group_nodes =
|
|
|
|
|
((SGPropertyNode *)props)->getChildren("object-group");
|
|
|
|
|
for (unsigned int i = 0; i < object_group_nodes.size(); i++)
|
|
|
|
|
object_groups.push_back(new ObjectGroup(object_group_nodes[i]));
|
2001-12-30 03:04:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Private methods.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGNewMat::init ()
|
|
|
|
|
{
|
|
|
|
|
texture_path = "";
|
|
|
|
|
state = 0;
|
|
|
|
|
textured = 0;
|
|
|
|
|
nontextured = 0;
|
|
|
|
|
xsize = 0;
|
|
|
|
|
ysize = 0;
|
|
|
|
|
wrapu = true;
|
|
|
|
|
wrapv = true;
|
|
|
|
|
mipmap = true;
|
2002-03-26 16:10:53 +00:00
|
|
|
|
light_coverage = 0.0;
|
2001-12-30 03:04:39 +00:00
|
|
|
|
texture_loaded = false;
|
|
|
|
|
refcount = 0;
|
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
|
|
|
ambient[i] = diffuse[i] = specular[i] = emission[i] = 0.0;
|
|
|
|
|
}
|
2001-12-28 23:33:32 +00:00
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
FGNewMat::load_texture ()
|
2000-06-23 04:55:55 +00:00
|
|
|
|
{
|
2001-12-28 23:33:32 +00:00
|
|
|
|
if (texture_loaded) {
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, "Loading deferred texture " << texture_path );
|
|
|
|
|
textured->setTexture((char *)texture_path.c_str(), wrapu, wrapv, mipmap );
|
|
|
|
|
texture_loaded = true;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2000-06-23 02:59:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-12-30 03:04:39 +00:00
|
|
|
|
void
|
|
|
|
|
FGNewMat::build_ssg_state (bool defer_tex_load)
|
2000-06-23 02:59:03 +00:00
|
|
|
|
{
|
2001-12-28 23:33:32 +00:00
|
|
|
|
GLenum shade_model =
|
|
|
|
|
(fgGetBool("/sim/rendering/shading") ? GL_SMOOTH : GL_FLAT);
|
|
|
|
|
bool texture_default = fgGetBool("/sim/rendering/textures");
|
|
|
|
|
|
2000-06-23 02:59:03 +00:00
|
|
|
|
state = new ssgStateSelector(2);
|
2000-10-18 07:03:49 +00:00
|
|
|
|
state->ref();
|
2000-10-18 00:48:12 +00:00
|
|
|
|
|
2000-06-23 02:59:03 +00:00
|
|
|
|
textured = new ssgSimpleState();
|
2000-10-18 00:48:12 +00:00
|
|
|
|
textured->ref();
|
|
|
|
|
|
2000-06-23 02:59:03 +00:00
|
|
|
|
nontextured = new ssgSimpleState();
|
2000-10-18 00:48:12 +00:00
|
|
|
|
nontextured->ref();
|
2000-06-23 02:59:03 +00:00
|
|
|
|
|
|
|
|
|
// Set up the textured state
|
|
|
|
|
textured->setShadeModel( shade_model );
|
2000-12-04 05:23:06 +00:00
|
|
|
|
textured->enable( GL_LIGHTING );
|
2000-06-23 02:59:03 +00:00
|
|
|
|
textured->enable ( GL_CULL_FACE ) ;
|
|
|
|
|
textured->enable( GL_TEXTURE_2D );
|
|
|
|
|
textured->disable( GL_BLEND );
|
|
|
|
|
textured->disable( GL_ALPHA_TEST );
|
2002-01-20 03:52:36 +00:00
|
|
|
|
#if 0
|
|
|
|
|
# ifdef GL_EXT_texture_filter_anisotropic
|
|
|
|
|
float max_anisotropy;
|
|
|
|
|
glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropy );
|
|
|
|
|
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
|
|
|
|
max_anisotropy );
|
|
|
|
|
cout << "Max anisotropy = " << max_anisotropy << endl;
|
|
|
|
|
# endif
|
|
|
|
|
#endif
|
2001-04-11 02:47:15 +00:00
|
|
|
|
if ( !defer_tex_load ) {
|
2001-12-28 23:33:32 +00:00
|
|
|
|
textured->setTexture( (char *)texture_path.c_str(), wrapu, wrapv );
|
2001-04-11 02:47:15 +00:00
|
|
|
|
texture_loaded = true;
|
|
|
|
|
} else {
|
|
|
|
|
texture_loaded = false;
|
|
|
|
|
}
|
2000-06-23 02:59:03 +00:00
|
|
|
|
textured->enable( GL_COLOR_MATERIAL );
|
2002-07-31 17:57:59 +00:00
|
|
|
|
#if 0
|
2000-06-23 02:59:03 +00:00
|
|
|
|
textured->setColourMaterial( GL_AMBIENT_AND_DIFFUSE );
|
|
|
|
|
textured->setMaterial( GL_EMISSION, 0, 0, 0, 1 );
|
|
|
|
|
textured->setMaterial( GL_SPECULAR, 0, 0, 0, 1 );
|
2002-07-31 17:57:59 +00:00
|
|
|
|
#else
|
|
|
|
|
textured->setMaterial ( GL_AMBIENT,
|
|
|
|
|
ambient[0], ambient[1],
|
|
|
|
|
ambient[2], ambient[3] ) ;
|
|
|
|
|
textured->setMaterial ( GL_DIFFUSE,
|
|
|
|
|
diffuse[0], diffuse[1],
|
|
|
|
|
diffuse[2], diffuse[3] ) ;
|
|
|
|
|
textured->setMaterial ( GL_SPECULAR,
|
|
|
|
|
specular[0], specular[1],
|
|
|
|
|
specular[2], specular[3] ) ;
|
|
|
|
|
textured->setMaterial ( GL_EMISSION,
|
|
|
|
|
emission[0], emission[1],
|
|
|
|
|
emission[2], emission[3] ) ;
|
|
|
|
|
#endif
|
2000-06-23 02:59:03 +00:00
|
|
|
|
|
|
|
|
|
// Set up the coloured state
|
|
|
|
|
nontextured->enable( GL_LIGHTING );
|
|
|
|
|
nontextured->setShadeModel( shade_model );
|
|
|
|
|
nontextured->enable ( GL_CULL_FACE ) ;
|
|
|
|
|
nontextured->disable( GL_TEXTURE_2D );
|
|
|
|
|
nontextured->disable( GL_BLEND );
|
|
|
|
|
nontextured->disable( GL_ALPHA_TEST );
|
|
|
|
|
nontextured->disable( GL_COLOR_MATERIAL );
|
|
|
|
|
|
|
|
|
|
nontextured->setMaterial ( GL_AMBIENT,
|
|
|
|
|
ambient[0], ambient[1],
|
|
|
|
|
ambient[2], ambient[3] ) ;
|
|
|
|
|
nontextured->setMaterial ( GL_DIFFUSE,
|
|
|
|
|
diffuse[0], diffuse[1],
|
|
|
|
|
diffuse[2], diffuse[3] ) ;
|
|
|
|
|
nontextured->setMaterial ( GL_SPECULAR,
|
|
|
|
|
specular[0], specular[1],
|
|
|
|
|
specular[2], specular[3] ) ;
|
|
|
|
|
nontextured->setMaterial ( GL_EMISSION,
|
|
|
|
|
emission[0], emission[1],
|
|
|
|
|
emission[2], emission[3] ) ;
|
|
|
|
|
|
|
|
|
|
state->setStep( 0, textured ); // textured
|
|
|
|
|
state->setStep( 1, nontextured ); // untextured
|
|
|
|
|
|
|
|
|
|
// Choose the appropriate starting state.
|
|
|
|
|
if ( texture_default ) {
|
|
|
|
|
state->selectStep(0);
|
|
|
|
|
} else {
|
|
|
|
|
state->selectStep(1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-12-30 03:04:39 +00:00
|
|
|
|
void FGNewMat::set_ssg_state( ssgSimpleState *s )
|
|
|
|
|
{
|
2000-06-23 04:55:55 +00:00
|
|
|
|
state = new ssgStateSelector(2);
|
2000-10-18 07:03:49 +00:00
|
|
|
|
state->ref();
|
|
|
|
|
|
2000-06-23 04:55:55 +00:00
|
|
|
|
textured = s;
|
2000-10-18 00:48:12 +00:00
|
|
|
|
|
2000-06-23 04:55:55 +00:00
|
|
|
|
nontextured = new ssgSimpleState();
|
2000-10-18 00:48:12 +00:00
|
|
|
|
nontextured->ref();
|
2000-06-23 04:55:55 +00:00
|
|
|
|
|
|
|
|
|
// Set up the coloured state
|
|
|
|
|
nontextured->enable( GL_LIGHTING );
|
|
|
|
|
nontextured->setShadeModel( GL_FLAT );
|
|
|
|
|
nontextured->enable ( GL_CULL_FACE ) ;
|
|
|
|
|
nontextured->disable( GL_TEXTURE_2D );
|
|
|
|
|
nontextured->disable( GL_BLEND );
|
|
|
|
|
nontextured->disable( GL_ALPHA_TEST );
|
|
|
|
|
nontextured->disable( GL_COLOR_MATERIAL );
|
|
|
|
|
|
|
|
|
|
/* cout << "ambient = " << ambient[0] << "," << ambient[1]
|
|
|
|
|
<< "," << ambient[2] << endl; */
|
|
|
|
|
nontextured->setMaterial ( GL_AMBIENT,
|
|
|
|
|
ambient[0], ambient[1],
|
|
|
|
|
ambient[2], ambient[3] ) ;
|
|
|
|
|
nontextured->setMaterial ( GL_DIFFUSE,
|
|
|
|
|
diffuse[0], diffuse[1],
|
|
|
|
|
diffuse[2], diffuse[3] ) ;
|
|
|
|
|
nontextured->setMaterial ( GL_SPECULAR,
|
|
|
|
|
specular[0], specular[1],
|
|
|
|
|
specular[2], specular[3] ) ;
|
|
|
|
|
nontextured->setMaterial ( GL_EMISSION,
|
|
|
|
|
emission[0], emission[1],
|
|
|
|
|
emission[2], emission[3] ) ;
|
|
|
|
|
|
|
|
|
|
state->setStep( 0, textured ); // textured
|
|
|
|
|
state->setStep( 1, nontextured ); // untextured
|
|
|
|
|
|
|
|
|
|
// Choose the appropriate starting state.
|
|
|
|
|
state->selectStep(0);
|
|
|
|
|
}
|
|
|
|
|
|
2001-12-30 03:04:39 +00:00
|
|
|
|
// end of newmat.cxx
|