]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/model.hxx
Improved tile cache priority scheme.
[simgear.git] / simgear / scene / model / model.hxx
index 8cf417b5ddd0796d3c8740dc609690f18348f934..c2097fdcd52930cab553b80cd5cae13b53cc4ea7 100644 (file)
 # error This library requires C++
 #endif
 
-#include <vector>
+#include <simgear/compiler.h>
 
-SG_USING_STD(vector);
+#include <vector>
+#include <set>
 
-#include <plib/sg.h>
-#include <plib/ssg.h>
+#include <osg/Node>
+#include <osg/Texture2D>
+#include <osgDB/ReaderWriter>
 
+#include <simgear/misc/sg_path.hxx>
 #include <simgear/props/props.hxx>
+#include <simgear/scene/util/NodeAndDrawableVisitor.hxx>
 
+namespace simgear
+{
+class SGReaderWriterXMLOptions;
+}
 
-// Has anyone done anything *really* stupid, like making min and max macros?
-#ifdef min
-#undef min
-#endif
-#ifdef max
-#undef max
-#endif
+osg::Texture2D*
+SGLoadTexture2D(bool staticTexture, const std::string& path,
+                const osgDB::ReaderWriter::Options* options = 0,
+                bool wrapu = true, bool wrapv = true, int mipmaplevels = -1);
 
+inline osg::Texture2D*
+SGLoadTexture2D(const std::string& path,
+                const osgDB::ReaderWriter::Options* options = 0,
+                bool wrapu = true, bool wrapv = true, int mipmaplevels = -1)
+{
+    return SGLoadTexture2D(true, path, options, wrapu, wrapv, mipmaplevels);
+}
 
-/**
- * Load a 3D model with or without XML wrapper.  Note, this version
- * Does not know about or load the panel/cockpit information.  Use the
- * "model_panel.hxx" version if you want to load an aircraft
- * (i.e. ownship) with a panel.
- *
- * If the path ends in ".xml", then it will be used as a property-
- * list wrapper to add animations to the model.
- *
- * Subsystems should not normally invoke this function directly;
- * instead, they should use the FGModelLoader declared in loader.hxx.
- */
-ssgBranch *
-sgLoad3DModel( const string& fg_root, const string &path,
-                          SGPropertyNode *prop_root, double sim_time_sec );
+inline osg::Texture2D*
+SGLoadTexture2D(const SGPath& path,
+                const osgDB::ReaderWriter::Options* options = 0,
+                bool wrapu = true, bool wrapv = true,
+                int mipmaplevels = -1)
+{
+    return SGLoadTexture2D(true, path.str(), options, wrapu, wrapv,
+                           mipmaplevels);
+}
 
+inline osg::Texture2D*
+SGLoadTexture2D(bool staticTexture, const SGPath& path,
+                const osgDB::ReaderWriter::Options* options = 0,
+                bool wrapu = true, bool wrapv = true,
+                int mipmaplevels = -1)
+{
+    return SGLoadTexture2D(staticTexture, path.str(), options, wrapu, wrapv,
+                           mipmaplevels);
+}
+
+namespace simgear
+{
+osg::Node* copyModel(osg::Node* model);
+
+// Change the StateSets of a model to hold different textures based on
+// a livery path.
+
+class TextureUpdateVisitor : public NodeAndDrawableVisitor
+{
+public:
+    TextureUpdateVisitor(const osgDB::FilePathList& pathList);
+    virtual void apply(osg::Node& node);
+    virtual void apply(osg::Drawable& drawable);
+    // Copied from Mathias' earlier SGTextureUpdateVisitor
+protected:
+    osg::Texture2D* textureReplace(int unit, const osg::StateAttribute* attr);
+    osg::StateSet* cloneStateSet(const osg::StateSet* stateSet);
+private:
+    osgDB::FilePathList _pathList;
+};
+
+// Create new userdata structs in a copied model.
+// The BVH trees are shared with the original model, but the velocity fields
+// should usually be distinct fields for distinct models.
+class UserDataCopyVisitor : public osg::NodeVisitor
+{
+public:
+    UserDataCopyVisitor();
+    virtual void apply(osg::Node& node);
+};
 
 /**
- * Make an offset matrix from rotations and position offset.
+ * Transform an OSG subgraph by substituting Effects and EffectGeodes
+ * for osg::Geodes with osg::StateSets. This is only guaranteed to
+ * work for models prouced by the .ac loader.
+ *
+ * returns a copy if any nodes are changed
  */
-void
-sgMakeOffsetsMatrix( sgMat4 * result, double h_rot, double p_rot, double r_rot,
-                     double x_off, double y_off, double z_off );
+osg::ref_ptr<osg::Node>
+instantiateEffects(osg::Node* model,
+                   PropertyList& effectProps,
+                   const SGReaderWriterXMLOptions* options);
 
 /**
- * Make the animation
+ * Transform an OSG subgraph by substituting the Effects and
+ * EffectGeodes for osg::Geodes with osg::StateSets, inheriting from
+ * the default model effect. This is only guaranteed to work for
+ * models prouced by the .ac loader.
+ *
+ * returns a copy if any nodes are changed
  */
-void
-sgMakeAnimation( ssgBranch * model,
-                 const char * name,
-                 vector<SGPropertyNode_ptr> &name_nodes,
-                 SGPropertyNode *prop_root,
-                 SGPropertyNode_ptr node,
-                 double sim_time_sec );
-
 
+inline osg::ref_ptr<osg::Node>
+instantiateEffects(osg::Node* model,
+                   const SGReaderWriterXMLOptions* options)
+{
+    PropertyList effectProps;
+    return instantiateEffects(model, effectProps, options);
+}
+}
 #endif // __MODEL_HXX