X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fsky%2Fcloud.hxx;h=81c9e038b624622ae3fa8a6c61e45cf834197ea1;hb=813b518b6f0c3e772fbd521d75106a650e69a084;hp=92463f1db07b5e9d2f62952777510f2aae9f35bf;hpb=b6a683eb6e3a3a7e886aefa705fa4d18f128a523;p=simgear.git diff --git a/simgear/scene/sky/cloud.hxx b/simgear/scene/sky/cloud.hxx index 92463f1d..81c9e038 100644 --- a/simgear/scene/sky/cloud.hxx +++ b/simgear/scene/sky/cloud.hxx @@ -1,8 +1,11 @@ -// cloud.hxx -- model a single cloud layer -// +/** + * \file cloud.hxx + * Provides a class to model a single cloud layer + */ + // Written by Curtis Olson, started June 2000. // -// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public @@ -14,10 +17,9 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -26,17 +28,31 @@ #define _SG_CLOUD_HXX_ #include - -#include +#include +#include +#include #include STL_STRING SG_USING_STD(string); +#include +#include +#include +#include +#include +#include -class SGCloudLayer { +class SGCloudField; +/** + * A class layer to model a single cloud layer + */ +class SGCloudLayer : public SGReferenced { public: + /** + * This is the list of available cloud coverages/textures + */ enum Coverage { SG_CLOUD_OVERCAST = 0, SG_CLOUD_BROKEN, @@ -47,59 +63,147 @@ public: SG_MAX_CLOUD_COVERAGES }; - // Constructors + /** + * Constructor + * @param tex_path the path to the set of cloud textures + */ SGCloudLayer( const string &tex_path ); - // Destructor + /** + * Destructor + */ ~SGCloudLayer( void ); + /** get the cloud span (in meters) */ float getSpan_m () const; + /** + * set the cloud span + * @param span_m the cloud span in meters + */ void setSpan_m (float span_m); + /** get the layer elevation (in meters) */ float getElevation_m () const; - void setElevation_m (float elevation_m); - + /** + * set the layer elevation. Note that this specifies the bottom + * of the cloud layer. The elevation of the top of the layer is + * elevation_m + thickness_m. + * @param elevation_m the layer elevation in meters + * @param set_span defines whether it is allowed to adjust the span + */ + void setElevation_m (float elevation_m, bool set_span = true); + + /** get the layer thickness */ float getThickness_m () const; + /** + * set the layer thickness. + * @param thickness_m the layer thickness in meters. + */ void setThickness_m (float thickness_m); + /** + * get the transition/boundary layer depth in meters. This + * allows gradual entry/exit from the cloud layer via adjusting + * visibility. + */ float getTransition_m () const; + + /** + * set the transition layer size in meters + * @param transition_m the transition layer size in meters + */ void setTransition_m (float transition_m); + /** get coverage type */ Coverage getCoverage () const; + + /** + * set coverage type + * @param coverage the coverage type + */ void setCoverage (Coverage coverage); - // build the cloud object + /** + * set the cloud movement direction + * @param dir the cloud movement direction + */ + inline void setDirection(float dir) { + // cout << "cloud dir = " << dir << endl; + direction = dir; + } + + /** get the cloud movement direction */ + inline float getDirection() { return direction; } + + /** + * set the cloud movement speed + * @param sp the cloud movement speed + */ + inline void setSpeed(float sp) { + // cout << "cloud speed = " << sp << endl; + speed = sp; + } + + /** get the cloud movement speed */ + inline float getSpeed() { return speed; } + + /** + * set the alpha component of the cloud base color. Normally this + * should be 1.0, but you can set it anywhere in the range of 0.0 + * to 1.0 to fade a cloud layer in or out. + * @param alpha cloud alpha value (0.0 to 1.0) + */ + inline void setAlpha( float alpha ) { + if ( alpha < 0.0 ) { alpha = 0.0; } + if ( alpha > 1.0 ) { alpha = 1.0; } + cloud_alpha = alpha; + } + + /** build the cloud object */ void rebuild(); - // repaint the cloud colors based on current value of sun_angle, - // sky, and fog colors. This updates the color arrays for - // ssgVtxTable. - // sun angle in degrees relative to verticle - // 0 degrees = high noon - // 90 degrees = sun rise/set - // 180 degrees = darkest midnight - bool repaint( sgVec3 fog_color ); - - // reposition the cloud layer at the specified origin and - // orientation - // lon specifies a rotation about the Z axis - // lat specifies a rotation about the new Y axis - // spin specifies a rotation about the new Z axis (and orients the - // sunrise/set effects - bool reposition( sgVec3 p, sgVec3 up, double lon, double lat, double alt ); - - // draw the cloud layer - void draw(); - + /** + * repaint the cloud colors based on the specified fog_color + * @param fog_color the fog color + */ + bool repaint( const SGVec3f& fog_color ); + + /** + * reposition the cloud layer at the specified origin and + * orientation. + * @param p position vector + * @param up the local up vector + * @param lon specifies a rotation about the Z axis + * @param lat specifies a rotation about the new Y axis + * @param spin specifies a rotation about the new Z axis + * (and orients the sunrise/set effects) + * @param dt the time elapsed since the last call + */ + bool reposition( const SGVec3f& p, const SGVec3f& up, + double lon, double lat, double alt, + double dt = 0.0 ); + + osg::Switch* getNode() { return layer_root.get(); } + + static bool enable_bump_mapping; + + /** return the 3D layer cloud associated with this 2D layer */ + SGCloudField *get_layer3D(void) { return layer3D; } +protected: + void setTextureOffset(const osg::Vec2& offset); private: - ssgRoot *layer_root; - ssgTransform *layer_transform; - ssgLeaf *layer[4]; + osg::ref_ptr layer_root; + osg::ref_ptr group_top, group_bottom; + osg::ref_ptr layer_transform; + osg::ref_ptr layer[4]; + + float cloud_alpha; // 1.0 = drawn fully, 0.0 faded out completely - ssgColourArray *cl[4]; - ssgVertexArray *vl[4]; - ssgTexCoordArray *tl[4]; + osg::ref_ptr cl[4]; + osg::ref_ptr vl[4]; + osg::ref_ptr tl[4]; + osg::ref_ptr tl2[4]; // height above sea level (meters) SGPath texture_path; @@ -109,18 +213,18 @@ private: float layer_transition; Coverage layer_coverage; float scale; + float speed; + float direction; // for handling texture coordinates to simulate cloud movement // from winds, and to simulate the clouds being tied to ground // position, not view position // double xoff, yoff; - double last_lon, last_lat; - -}; - + double last_lon, last_lat, last_course; -// make an ssgSimpleState for a cloud layer given the named texture -ssgSimpleState *sgCloudMakeState( const string &path ); + osg::Vec2 base; + SGCloudField *layer3D; +}; #endif // _SG_CLOUD_HXX_