3 * Provides a class to model a single cloud layer
6 // Written by Curtis Olson, started June 2000.
8 // Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
10 // This library is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU Library General Public
12 // License as published by the Free Software Foundation; either
13 // version 2 of the License, or (at your option) any later version.
15 // This library is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // Library General Public License for more details.
20 // You should have received a copy of the GNU Library General Public
21 // License along with this library; if not, write to the
22 // Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 // Boston, MA 02111-1307, USA.
28 #ifndef _SG_CLOUD_HXX_
29 #define _SG_CLOUD_HXX_
31 #include <simgear/compiler.h>
40 * A class layer to model a single cloud layer
46 * This is the list of available cloud coverages/textures
49 SG_CLOUD_OVERCAST = 0,
55 SG_MAX_CLOUD_COVERAGES
60 * @param tex_path the path to the set of cloud textures
62 SGCloudLayer( const string &tex_path );
67 ~SGCloudLayer( void );
69 /** get the cloud span (in meters) */
70 float getSpan_m () const;
73 * @param span_m the cloud span in meters
75 void setSpan_m (float span_m);
77 /** get the layer elevation (in meters) */
78 float getElevation_m () const;
80 * set the layer elevation. Note that this specifies the bottom
81 * of the cloud layer. The elevation of the top of the layer is
82 * elevation_m + thickness_m.
83 * @param elevation_m the layer elevation in meters
84 * @param set_span defines whether it is allowed to adjust the span
86 void setElevation_m (float elevation_m, bool set_span = true);
88 /** get the layer thickness */
89 float getThickness_m () const;
91 * set the layer thickness.
92 * @param thickness_m the layer thickness in meters.
94 void setThickness_m (float thickness_m);
97 * get the transition/boundary layer depth in meters. This
98 * allows gradual entry/exit from the cloud layer via adjusting
101 float getTransition_m () const;
104 * set the transition layer size in meters
105 * @param transition_m the transition layer size in meters
107 void setTransition_m (float transition_m);
109 /** get coverage type */
110 Coverage getCoverage () const;
114 * @param coverage the coverage type
116 void setCoverage (Coverage coverage);
119 * set the cloud movement direction
120 * @param dir the cloud movement direction
122 inline void setDirection(float dir) { direction = dir; }
124 /** get the cloud movement direction */
125 inline float getDirection() { return direction; }
128 * set the cloud movement speed
129 * @param sp the cloud movement speed
131 inline void setSpeed(float sp) { speed = sp; }
133 /** get the cloud movement speed */
134 inline float getSpeed() { return speed; }
136 /** build the cloud object */
140 * repaint the cloud colors based on the specified fog_color
141 * @param fog_color the fog color
143 bool repaint( sgVec3 fog_color );
146 * reposition the cloud layer at the specified origin and
148 * @param p position vector
149 * @param up the local up vector
150 * @param lon specifies a rotation about the Z axis
151 * @param lat specifies a rotation about the new Y axis
152 * @param spin specifies a rotation about the new Z axis
153 * (and orients the sunrise/set effects)
154 * @param dt the time elapsed since the last call
156 bool reposition( sgVec3 p, sgVec3 up, double lon, double lat, double alt,
159 /** draw the cloud layer */
165 ssgTransform *layer_transform;
168 ssgColourArray *cl[4];
169 ssgVertexArray *vl[4];
170 ssgTexCoordArray *tl[4];
172 // height above sea level (meters)
176 float layer_thickness;
177 float layer_transition;
178 Coverage layer_coverage;
183 // for handling texture coordinates to simulate cloud movement
184 // from winds, and to simulate the clouds being tied to ground
185 // position, not view position
186 // double xoff, yoff;
187 double last_lon, last_lat;
192 // make an ssgSimpleState for a cloud layer given the named texture
193 ssgSimpleState *sgCloudMakeState( const string &path );
196 #endif // _SG_CLOUD_HXX_