]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/material/mat.hxx
model paging patch from Till Busch
[simgear.git] / simgear / scene / material / mat.hxx
index 62df39ecbb77e433de30d34fd623b5b67b75a5bd..96a33a3aba006efc28df33c34e5aa795833130ce 100644 (file)
 
 #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"
 
@@ -54,7 +54,6 @@ SG_USING_STD(map);
 
 class SGMaterialGlyph;
 
-
 /**
  * A material in the scene graph.
  *
@@ -93,15 +92,15 @@ public:
 
 
   /**
-   * 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.
@@ -114,19 +113,10 @@ public:
   // 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);
 
 
   /**
@@ -152,10 +142,54 @@ public:
    *
    * 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.
@@ -178,9 +212,9 @@ public:
   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
@@ -207,9 +241,20 @@ public:
   /**
    * 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:
@@ -227,9 +272,9 @@ 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;
   };
@@ -245,7 +290,7 @@ private:
   vector<_internal_state> _status;
 
   // Round-robin counter
-  unsigned int _current_ptr;
+  mutable unsigned int _current_ptr;
 
   // texture size
   double xsize, ysize;
@@ -258,6 +303,21 @@ private:
 
   // 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;
@@ -271,8 +331,8 @@ private:
   // 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;
@@ -285,7 +345,9 @@ private:
 
   // 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.
@@ -294,10 +356,10 @@ private:
   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 );
 
 };
 
@@ -314,7 +376,7 @@ protected:
   double _right;
 };
 
-class SGMaterialUserData : public ssgBase {
+class SGMaterialUserData : public osg::Referenced {
 public:
   SGMaterialUserData(const SGMaterial* material) :
     mMaterial(material)
@@ -322,7 +384,15 @@ public:
   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