#include <osgDB/ReadFile>
#include <osgDB/SharedStateManager>
+#include <simgear/math/SGMath.hxx>
+ #include <simgear/scene/material/Effect.hxx>
+ #include <simgear/scene/material/EffectGeode.hxx>
#include <simgear/scene/util/SGSceneFeatures.hxx>
+ #include <simgear/scene/util/SGSceneUserData.hxx>
+ #include <simgear/scene/util/CopyOp.hxx>
+ #include <simgear/scene/util/SplicingVisitor.hxx>
+
#include <simgear/structure/exception.hxx>
+ #include <simgear/structure/Singleton.hxx>
#include <simgear/props/props.hxx>
#include <simgear/props/props_io.hxx>
#include <simgear/props/condition.hxx>
double elev = sg_random() * SGD_PI;
x = width * cos(theta) * 0.5f * sin(elev);
y = width * sin(theta) * 0.5f * sin(elev);
- z = height * cos(elev) * 0.5f;
+ z = height * cos(elev) * 0.5f;
}
- SGVec3f *pos = new SGVec3f(x, y, z);
-
- // Determine the height and width as scaling factors on the minimum size (used to create the quad).
+ // Determine the height and width as scaling factors on the minimum size (used to create the quad)
float sprite_width = 1.0f + sg_random() * (max_sprite_width - min_sprite_width) / min_sprite_width;
float sprite_height = 1.0f + sg_random() * (max_sprite_height - min_sprite_height) / min_sprite_height;
-
- if (i == 2) {
+
+ // Sprites are never taller than square.
+ if (sprite_height * min_sprite_height > sprite_width * min_sprite_width)
+ {
+ sprite_height = sprite_width * min_sprite_width / min_sprite_height;
+ }
+
+ if (i == 0) {
// The center sprite is always maximum size to fill up any holes.
sprite_width = 1.0f + (max_sprite_width - min_sprite_width) / min_sprite_width;
sprite_height = 1.0f + (max_sprite_height - min_sprite_height) / min_sprite_height;
}
-
- // Determine the sprite texture indexes;
+
+ // Determine the sprite texture indexes.
int index_x = (int) floor(sg_random() * num_textures_x);
if (index_x == num_textures_x) { index_x--; }
-
- int index_y = (int) floor(sg_random() * num_textures_y);
+
+ // The y index depends on the positing of the sprite within the cloud.
+ // This allows cloud designers to have particular sprites for the base
+ // and tops of the cloud.
+ int index_y = (int) floor((z / height + 0.5f) * num_textures_y);
if (index_y == num_textures_y) { index_y--; }
- sg->addSprite(*pos,
+ sg->addSprite(SGVec3f(x, y, z),
index_x,
index_y,
sprite_width,