#include <simgear/math/SGMath.hxx>
-#include <plib/sg.h>
-#include <plib/ssg.h>
+#include <osg/ref_ptr>
+#include <osg/StateSet>
#include <simgear/props/props.hxx>
-#include <simgear/structure/ssgSharedPtr.hxx>
#include <simgear/structure/SGSharedPtr.hxx>
+#include <simgear/scene/util/SGSceneFeatures.hxx>
#include "matmodel.hxx"
class SGMaterialGlyph;
-
/**
* A material in the scene graph.
*
/**
- * Construct a material around an existing SSG state.
+ * Construct a material around an existing state.
*
* This constructor allows the application to create a custom,
* low-level state for the scene graph and wrap a material around
* it. Note: the pointer ownership is transferred to the material.
*
- * @param s The SSG state for this material.
+ * @param s The state for this material.
*/
- SGMaterial( ssgSimpleState *s );
+ SGMaterial( osg::StateSet *s );
/**
* Destructor.
// Public methods.
////////////////////////////////////////////////////////////////////
- /**
- * Force the texture to load if it hasn't already.
- *
- * @return true if the texture loaded, false if it was loaded
- * already.
- */
- bool load_texture (int n = -1);
-
-
/**
* Get the textured state.
*/
- ssgSimpleState *get_state (int n = -1) const;
+ osg::StateSet *get_state (int n = -1);
/**
*
* A smaller number means more generated night lighting.
*
- * @return The area (m^2?) covered by each light.
+ * @return The area (m^2) covered by each light.
*/
inline double get_light_coverage () const { return light_coverage; }
+ /**
+ * Get the forest coverage.
+ *
+ * A smaller number means more generated forest canopy.
+ *
+ * @return The area (m^2) covered by each canopy.
+ */
+ inline double get_tree_coverage () const { return tree_coverage; }
+
+ /**
+ * Get the forest height.
+ *
+ * @return The average height of the trees.
+ */
+ inline double get_tree_height () const { return tree_height; }
+
+ /**
+ * Get the forest width.
+ *
+ * @return The average width of the trees.
+ */
+ inline double get_tree_width () const { return tree_width; }
+
+ /**
+ * Get the forest LoD range.
+ *
+ * @return The LoD range for the trees.
+ */
+ inline double get_tree_range () const { return tree_range; }
+
+ /**
+ * Get the number of tree varieties available
+ *
+ * @return the number of different trees defined in the texture strip
+ */
+ inline int get_tree_varieties () const { return tree_varieties; }
+
+ /**
+ * Get the texture strip to use for trees
+ *
+ * @return the texture to use for trees.
+ */
+ inline string get_tree_texture () const { return tree_texture; }
+
/**
* Return if the surface material is solid, if it is not solid, a fluid
* can be assumed, that is usually water.
double get_bumpiness () const { return bumpiness; }
/**
- * Get the load resistence
+ * Get the load resistance
*/
- double get_load_resistence () const { return load_resistence; }
+ double get_load_resistance () const { return load_resistance; }
/**
* Get the list of names for this material
/**
* Return pointer to glyph class, or 0 if it doesn't exist.
*/
- SGMaterialGlyph * get_glyph (const string& name) const {
- map<string, SGSharedPtr<SGMaterialGlyph> >::const_iterator it = glyphs.find(name);
- return it != glyphs.end() ? it->second : 0;
+ SGMaterialGlyph * get_glyph (const string& name) const;
+
+ void set_light_color(const SGVec4f& color)
+ { emission = color; }
+ const SGVec4f& get_light_color() const
+ { return emission; }
+
+ SGVec2f get_tex_coord_scale() const
+ {
+ float tex_width = get_xsize();
+ float tex_height = get_ysize();
+
+ return SGVec2f((0 < tex_width) ? 1000.0f/tex_width : 1.0f,
+ (0 < tex_height) ? 1000.0f/tex_height : 1.0f);
}
protected:
protected:
struct _internal_state {
- _internal_state( ssgSimpleState *s, const string &t, bool l )
+ _internal_state( osg::StateSet *s, const string &t, bool l )
: state(s), texture_path(t), texture_loaded(l) {}
- ssgSharedPtr<ssgSimpleState> state;
+ osg::ref_ptr<osg::StateSet> state;
string texture_path;
bool texture_loaded;
};
vector<_internal_state> _status;
// Round-robin counter
- unsigned int _current_ptr;
+ mutable unsigned int _current_ptr;
// texture size
double xsize, ysize;
// coverage of night lighting.
double light_coverage;
+
+ // coverage of trees
+ double tree_coverage;
+
+ // Range at which trees become visible
+ double tree_range;
+
+ // Height of the tree
+ double tree_height;
+
+ // Width of the tree
+ double tree_width;
+
+ // Number of varieties of tree texture
+ int tree_varieties;
// True if the material is solid, false if it is a fluid
bool solid;
// the bumpiness of that surface material
double bumpiness;
- // the load resistence of that surface material
- double load_resistence;
+ // the load resistance of that surface material
+ double load_resistance;
// material properties
SGVec4f ambient, diffuse, specular, emission;
// taxiway-/runway-sign texture elements
map<string, SGSharedPtr<SGMaterialGlyph> > glyphs;
-
+
+ // Tree texture, typically a strip of applicable tree textures
+ string tree_texture;
\f
////////////////////////////////////////////////////////////////////
// Internal constructors and methods.
SGMaterial( const string &fg_root, const SGMaterial &mat ); // unimplemented
void read_properties( const string &fg_root, const SGPropertyNode *props, const char *season );
- void build_ssg_state( bool defer_tex_load );
- void set_ssg_state( ssgSimpleState *s );
+ void build_state( bool defer_tex_load );
+ void set_state( osg::StateSet *s );
- void assignTexture( ssgSimpleState *state, string &fname, int _wrapu = TRUE, int _wrapv = TRUE, int _mipmap = TRUE );
+ void assignTexture( osg::StateSet *state, const std::string &fname, int _wrapu = TRUE, int _wrapv = TRUE, int _mipmap = TRUE );
};
double _right;
};
-class SGMaterialUserData : public ssgBase {
+class SGMaterialUserData : public osg::Referenced {
public:
SGMaterialUserData(const SGMaterial* material) :
mMaterial(material)
const SGMaterial* getMaterial() const
{ return mMaterial; }
private:
- SGSharedPtr<const SGMaterial> mMaterial;
+ // this cannot be an SGSharedPtr since that would create a cicrular reference
+ // making it impossible to ever free the space needed by SGMaterial
+ const SGMaterial* mMaterial;
};
+void
+SGSetTextureFilter( int max);
+
+int
+SGGetTextureFilter();
+
#endif // _SG_MAT_HXX