]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/material/mat.cxx
Work around apparent OSG 3.2.0 normal binding bug.
[simgear.git] / simgear / scene / material / mat.cxx
index 6152cc554fdf0cd1f26273e4db92046a3ebf2a9d..46af662b05166a22def634adb0e7a6821684dc20 100644 (file)
 #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"
@@ -198,7 +202,7 @@ SGMaterial::read_properties(const SGReaderWriterOptions* options,
         }
     }
 
-    if (textures.size() == 0 && texturesets.size() == 0) {
+    if (textures.empty() && texturesets.empty()) {
         SGPath tpath("Textures");
         tpath.append("Terrain");
         tpath.append("unknown.rgb");
@@ -235,7 +239,7 @@ SGMaterial::read_properties(const SGReaderWriterOptions* options,
 
                     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
@@ -316,6 +320,11 @@ SGMaterial::read_properties(const SGReaderWriterOptions* options,
     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);
@@ -323,6 +332,8 @@ SGMaterial::read_properties(const SGReaderWriterOptions* options,
     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");
     
@@ -343,11 +354,11 @@ SGMaterial::read_properties(const SGReaderWriterOptions* options,
     }
 
     // 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);
@@ -387,6 +398,13 @@ SGMaterial::read_properties(const SGReaderWriterOptions* options,
         if (name)
             glyphs[name] = new SGMaterialGlyph(glyph_nodes[i]);
     }
+    
+    // Read parameters entry, which is passed into the effect
+    if (props->hasChild("parameters")) {
+        parameters = props->getChild("parameters");
+    } else {
+        parameters = new SGPropertyNode();
+    }
 
     // Read conditions node
     const SGPropertyNode *conditionNode = props->getChild("condition");
@@ -414,12 +432,6 @@ SGMaterial::init ()
     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;
@@ -441,9 +453,9 @@ Effect* SGMaterial::get_effect(int i)
     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;
     }
@@ -458,9 +470,9 @@ Effect* SGMaterial::get_effect()
 }
 
 
-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;
     }
@@ -481,7 +493,10 @@ void SGMaterial::buildEffectProperties(const SGReaderWriterOptions* options)
     ref_ptr<SGMaterialUserData> user = new SGMaterialUserData(this);
     SGPropertyNode_ptr propRoot = new SGPropertyNode();
     makeChild(propRoot, "inherits-from")->setStringValue(effect);
+    
     SGPropertyNode* paramProp = makeChild(propRoot, "parameters");
+    copyProperties(parameters, paramProp);
+    
     SGPropertyNode* materialProp = makeChild(paramProp, "material");
     makeChild(materialProp, "ambient")->setValue(SGVec4d(ambient));
     makeChild(materialProp, "diffuse")->setValue(SGVec4d(diffuse));
@@ -506,9 +521,9 @@ void SGMaterial::buildEffectProperties(const SGReaderWriterOptions* options)
             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);
@@ -531,6 +546,15 @@ SGMaterialGlyph* SGMaterial::get_glyph (const string& name) const
     return it->second;
 }
 
+bool SGMaterial::valid() const
+{ 
+  if (condition) {
+    return condition->test();       
+  } else {
+    return true;
+  }
+}
+
 \f
 ////////////////////////////////////////////////////////////////////////
 // SGMaterialGlyph.