Make it possible to use a property reference for the solid property of a material. e.g.: <solid><property>/sim/ice</property></solid>

This commit is contained in:
Erik Hofman 2021-12-19 11:18:49 +01:00
parent 06ecfe1927
commit 33b0c39dbd
4 changed files with 26 additions and 48 deletions

View File

@ -1,37 +0,0 @@
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#include <simgear_config.h>
#include "BVHMaterial.hxx"
namespace simgear {
BVHMaterial::BVHMaterial() :
_solid(true),
_friction_factor(1),
_rolling_friction(0.02),
_bumpiness(0),
_load_resistance(1e30)
{
}
BVHMaterial::~BVHMaterial()
{
}
}

View File

@ -19,19 +19,24 @@
#define BVHMaterial_hxx
#include <simgear/structure/SGReferenced.hxx>
#include <simgear/props/props.hxx>
#include <cstdio>
namespace simgear {
class BVHMaterial : public SGReferenced {
public:
BVHMaterial();
virtual ~BVHMaterial();
BVHMaterial() = default;
virtual ~BVHMaterial() = default;
/**
* Return if the surface material is solid, if it is not solid, a fluid
* can be assumed, that is usually water.
*/
bool get_solid () const { return _solid; }
bool get_solid () const {
return _solid_is_prop ? _solid_property->getBoolValue() : _solid;
}
/**
* Get the friction factor for that material
@ -55,21 +60,26 @@ public:
protected:
// True if the material is solid, false if it is a fluid
bool _solid;
bool _solid = true;
// the friction factor of that surface material
double _friction_factor;
double _friction_factor = 1.0;
// the rolling friction of that surface material
double _rolling_friction;
double _rolling_friction = 0.02;
// the bumpiness of that surface material
double _bumpiness;
double _bumpiness = 0.0;
// the load resistance of that surface material
double _load_resistance;
double _load_resistance = 1e30;
// Placeholder for the solid property, if defined
SGPropertyNode_ptr _solid_property;
bool _solid_is_prop = false;
};
}
#endif
#,endif

View File

@ -39,7 +39,6 @@ set(SOURCES
BVHStaticNode.cxx
BVHStaticTriangle.cxx
BVHSubTreeCollector.cxx
BVHMaterial.cxx
BVHTransform.cxx
)

View File

@ -385,7 +385,13 @@ SGMaterial::read_properties(const SGReaderWriterOptions* options,
}
// surface values for use with ground reactions
_solid = props->getBoolValue("solid", _solid);
string propval = props->getStringValue("solid/property", "");
if (propval != "") {
_solid_property = prop_root->getNode(propval, true);
_solid_is_prop =true;
} else {
_solid = props->getBoolValue("solid", _solid);
}
_friction_factor = props->getDoubleValue("friction-factor", _friction_factor);
_rolling_friction = props->getDoubleValue("rolling-friction", _rolling_friction);
_bumpiness = props->getDoubleValue("bumpiness", _bumpiness);