#include <simgear/props/props_io.hxx>
#include <simgear/props/vectorPropTemplates.hxx>
#include <simgear/scene/model/model.hxx>
+#include <simgear/scene/material/matmodel.hxx>
#include <simgear/scene/util/RenderConstants.hxx>
#include <simgear/scene/util/StateAttributeFactory.hxx>
+#include <simgear/props/condition.hxx>
+#include <simgear/scene/util/SGSceneFeatures.hxx>
+#include <simgear/scene/tgdb/SGTexturedTriangleBin.hxx>
#include "Effect.hxx"
#include "Technique.hxx"
}
}
- if (textures.size() == 0 && texturesets.size() == 0) {
+ if (textures.empty() && texturesets.empty()) {
SGPath tpath("Textures");
tpath.append("Terrain");
tpath.append("unknown.rgb");
bool dds_mask = (ompath.lower_extension() == "dds");
- if (dds[i] != dds_mask) {
+ if (i < dds.size() && dds[i] != dds_mask) {
// Texture format does not match mask format. This is relevant for
// the object mask, as DDS textures have an origin at the bottom
// left rather than top left. Therefore we flip a copy of the image
building_large_max_width = props->getFloatValue("building-large-max-width-m", 75.0);
building_large_min_depth = props->getFloatValue("building-large-min-depth-m", 50.0);
building_large_max_depth = props->getFloatValue("building-large-max-depth-m", 75.0);
+
+ building_range = props->getDoubleValue("building-range-m", 10000.0);
+
+ cos_object_max_density_slope_angle = cos(props->getFloatValue("object-max-density-angle-deg", 20.0) * osg::PI/180.0);
+ cos_object_zero_density_slope_angle = cos(props->getFloatValue("object-zero-density-angle-deg", 30.0) * osg::PI/180.0);
// Random vegetation properties
wood_coverage = props->getDoubleValue("wood-coverage", 0.0);
tree_width = props->getDoubleValue("tree-width-m", 0.0);
tree_range = props->getDoubleValue("tree-range-m", 0.0);
tree_varieties = props->getIntValue("tree-varieties", 1);
+ cos_tree_max_density_slope_angle = cos(props->getFloatValue("tree-max-density-angle-deg", 30.0) * osg::PI/180.0);
+ cos_tree_zero_density_slope_angle = cos(props->getFloatValue("tree-zero-density-angle-deg", 45.0) * osg::PI/180.0);
const SGPropertyNode* treeTexNode = props->getChild("tree-texture");
}
// surface values for use with ground reactions
- solid = props->getBoolValue("solid", true);
- friction_factor = props->getDoubleValue("friction-factor", 1.0);
- rolling_friction = props->getDoubleValue("rolling-friction", 0.02);
- bumpiness = props->getDoubleValue("bumpiness", 0.0);
- load_resistance = props->getDoubleValue("load-resistance", 1e30);
+ _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);
+ _load_resistance = props->getDoubleValue("load-resistance", _load_resistance);
// Taken from default values as used in ac3d
ambient[0] = props->getDoubleValue("ambient/r", 0.2);
light_coverage = 0.0;
building_coverage = 0.0;
- solid = true;
- friction_factor = 1;
- rolling_friction = 0.02;
- bumpiness = 0;
- load_resistance = 1e30;
-
shininess = 1.0;
for (int i = 0; i < 4; i++) {
ambient[i] = (i < 3) ? 0.2 : 1.0;
return _status[i].effect.get();
}
-Effect* SGMaterial::get_effect(SGTexturedTriangleBin triangleBin)
+Effect* SGMaterial::get_effect(const SGTexturedTriangleBin& triangleBin)
{
- if (_status.size() == 0) {
+ if (_status.empty()) {
SG_LOG( SG_GENERAL, SG_WARN, "No effect available.");
return 0;
}
}
-osg::Texture2D* SGMaterial::get_object_mask(SGTexturedTriangleBin triangleBin)
+osg::Texture2D* SGMaterial::get_object_mask(const SGTexturedTriangleBin& triangleBin)
{
- if (_status.size() == 0) {
+ if (_status.empty()) {
SG_LOG( SG_GENERAL, SG_WARN, "No mask available.");
return 0;
}
makeChild(texProp, "filter")
->setStringValue(mipmap ? "linear-mipmap-linear" : "nearest");
makeChild(texProp, "wrap-s")
- ->setStringValue(wrapu ? "repeat" : "clamp");
+ ->setStringValue(wrapu ? "repeat" : "clamp-to-edge");
makeChild(texProp, "wrap-t")
- ->setStringValue(wrapv ? "repeat" : "clamp");
+ ->setStringValue(wrapv ? "repeat" : "clamp-to-edge");
}
makeChild(effectParamProp, "xsize")->setDoubleValue(xsize);
makeChild(effectParamProp, "ysize")->setDoubleValue(ysize);
return it->second;
}
+bool SGMaterial::valid() const
+{
+ if (condition) {
+ return condition->test();
+ } else {
+ return true;
+ }
+}
+
\f
////////////////////////////////////////////////////////////////////////
// SGMaterialGlyph.