X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmaterial%2Fmat.hxx;h=9e2d06e432d58d7f490a85c4222040ab4f87ece2;hb=416fb94ae880d2f1ec1b16fbe621ae1219fb1b31;hp=62df39ecbb77e433de30d34fd623b5b67b75a5bd;hpb=72d20758284a87a19b734037513f08051ff3b962;p=simgear.git diff --git a/simgear/scene/material/mat.hxx b/simgear/scene/material/mat.hxx index 62df39ec..9e2d06e4 100644 --- a/simgear/scene/material/mat.hxx +++ b/simgear/scene/material/mat.hxx @@ -32,29 +32,34 @@ #include -#include STL_STRING // Standard C++ string library +#include // Standard C++ string library #include #include #include -#include -#include +#include +namespace osg +{ +class StateSet; +} + +#include #include -#include #include +#include #include "matmodel.hxx" -SG_USING_STD(string); -SG_USING_STD(vector); -SG_USING_STD(map); - +namespace simgear +{ +class Effect; +void reload_shaders(); +} class SGMaterialGlyph; - /** * A material in the scene graph. * @@ -80,29 +85,10 @@ public: * state information for the material. This node is usually * loaded from the $FG_ROOT/materials.xml file. */ - SGMaterial( const string &fg_root, const SGPropertyNode *props, const char *season ); - - - /** - * Construct a material from an absolute texture path. - * - * @param texture_path A string containing an absolute path - * to a texture file (usually RGB). - */ - SGMaterial( const string &texpath ); - - - /** - * Construct a material around an existing SSG 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. - */ - SGMaterial( ssgSimpleState *s ); + SGMaterial( const osgDB::ReaderWriter::Options*, const SGPropertyNode *props); + SGMaterial(const simgear::SGReaderWriterXMLOptions*, + const SGPropertyNode *props); /** * Destructor. */ @@ -114,20 +100,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; - + simgear::Effect *get_effect(int n = -1); /** * Get the number of textures assigned to this material. @@ -152,10 +128,68 @@ 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 wood coverage. + * + * A smaller number means more generated woods within the forest. + * + * @return The area (m^2) covered by each wood. + */ + inline double get_wood_coverage () const { return wood_coverage; } + + /** + * Get the density of the wood + * + * @return The area (m^2) covered by each tree in the wood. + */ + inline double get_tree_density () const { return tree_density; } + + /** + * Get the size of each wood + * + * @return the average area (m^2) of each wood + */ + inline double get_wood_size () const { return wood_size; } + + /** + * Get the tree height. + * + * @return The average height of the trees. + */ + inline double get_tree_height () const { return tree_height; } + + /** + * Get the tree 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 std::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,19 +212,19 @@ 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 */ - const vector& get_names() const { return _names; } + const std::vector& get_names() const { return _names; } /** * add the given name to the list of names this material is known */ - void add_name(const string& name) { _names.push_back(name); } + void add_name(const std::string& name) { _names.push_back(name); } /** * Get the number of randomly-placed objects defined 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 >::const_iterator it = glyphs.find(name); - return it != glyphs.end() ? it->second : 0; + SGMaterialGlyph * get_glyph (const std::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,11 +272,15 @@ protected: protected: struct _internal_state { - _internal_state( ssgSimpleState *s, const string &t, bool l ) - : state(s), texture_path(t), texture_loaded(l) {} - ssgSharedPtr state; - string texture_path; - bool texture_loaded; + _internal_state(simgear::Effect *e, bool l, + const simgear::SGReaderWriterXMLOptions *o); + _internal_state(simgear::Effect *e, const std::string &t, bool l, + const simgear::SGReaderWriterXMLOptions *o); + void add_texture(const std::string &t, int i); + osg::ref_ptr effect; + std::vector > texture_paths; + bool effect_realized; + osg::ref_ptr options; }; private: @@ -242,10 +291,10 @@ private: //////////////////////////////////////////////////////////////////// // texture status - vector<_internal_state> _status; + std::vector<_internal_state> _status; // Round-robin counter - unsigned int _current_ptr; + mutable unsigned int _current_ptr; // texture size double xsize, ysize; @@ -254,10 +303,31 @@ private: bool wrapu, wrapv; // use mipmapping? - int mipmap; + bool mipmap; // coverage of night lighting. double light_coverage; + + // coverage of woods + double wood_coverage; + + // The size of each wood + double wood_size; + + // Tree density within the wood + double tree_density; + + // 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,34 +341,34 @@ 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; double shininess; + // effect for this material + std::string effect; + // the list of names for this material. May be empty. - vector _names; + std::vector _names; - vector > object_groups; + std::vector > object_groups; // taxiway-/runway-sign texture elements - map > glyphs; - + std::map > glyphs; + + // Tree texture, typically a strip of applicable tree textures + std::string tree_texture; //////////////////////////////////////////////////////////////////// // 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 assignTexture( ssgSimpleState *state, string &fname, int _wrapu = TRUE, int _wrapv = TRUE, int _mipmap = TRUE ); - + void read_properties(const simgear::SGReaderWriterXMLOptions* options, + const SGPropertyNode *props); + void buildEffectProperties(const simgear::SGReaderWriterXMLOptions* options); }; @@ -314,7 +384,7 @@ protected: double _right; }; -class SGMaterialUserData : public ssgBase { +class SGMaterialUserData : public osg::Referenced { public: SGMaterialUserData(const SGMaterial* material) : mMaterial(material) @@ -322,7 +392,15 @@ public: const SGMaterial* getMaterial() const { return mMaterial; } private: - SGSharedPtr 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