00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef CLOUD_SHADER_GEOMETRY_HXX
00023 #define CLOUD_SHADER_GEOMETRY_HXX 1
00024
00025 #include <vector>
00026
00027 #include <osg/BoundingBox>
00028 #include <osg/CopyOp>
00029 #include <osg/Drawable>
00030 #include <osg/Geometry>
00031 #include <osg/RenderInfo>
00032 #include <osg/Vec3>
00033 #include <osg/Vec4>
00034 #include <osg/buffered_value>
00035
00036 #include <simgear/math/SGMath.hxx>
00037 #include <simgear/math/sg_random.h>
00038
00039
00040 namespace simgear
00041 {
00042
00043 class CloudShaderGeometry : public osg::Drawable
00044 {
00045 public:
00046
00047 const static unsigned int USR_ATTR_1 = 10;
00048 const static unsigned int USR_ATTR_2 = 11;
00049
00050 CloudShaderGeometry()
00051 {
00052 setUseDisplayList(false);
00053 }
00054
00055 CloudShaderGeometry(int vx, int vy, float width, float height) :
00056 varieties_x(vx), varieties_y(vy)
00057 {
00058 setUseDisplayList(false);
00059 float x = width/2.0f;
00060 float z = height/2.0f;
00061 _bbox.expandBy(-x, -x, -z);
00062 _bbox.expandBy(x, x, z);
00063 }
00064
00066 CloudShaderGeometry(const CloudShaderGeometry& CloudShaderGeometry,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
00067 osg::Drawable(CloudShaderGeometry,copyop) {}
00068
00069 META_Object(flightgear, CloudShaderGeometry);
00070
00071 struct CloudSprite {
00072 CloudSprite(const SGVec3f& p, int tx, int ty, float w, float h,
00073 float s, float ch) :
00074 position(p), texture_index_x(tx), texture_index_y(ty), width(w), height(h), shade(s), cloud_height(ch)
00075 { }
00076
00077 SGVec3f position;
00078 int texture_index_x;
00079 int texture_index_y;
00080 float width;
00081 float height;
00082 float shade;
00083 float cloud_height;
00084 };
00085
00086 typedef std::vector<CloudSprite> CloudSpriteList;
00087 CloudSpriteList _cloudsprites;
00088
00089 void insert(const CloudSprite& t)
00090 { _cloudsprites.push_back(t); }
00091 void insert(SGVec3f& p, int tx, int ty, float w, float h, float s, float ch)
00092 { insert(CloudSprite(p, tx, ty, w, h, s, ch)); }
00093
00094 unsigned getNumCloudSprite() const
00095 { return _cloudsprites.size(); }
00096 CloudSprite& getCloudSprite(unsigned i)
00097 { return _cloudsprites[i]; }
00098
00099 virtual void drawImplementation(osg::RenderInfo& renderInfo) const;
00100 virtual osg::BoundingBox computeBound() const
00101 {
00102 return _bbox;
00103 }
00104
00105 void setGeometry(osg::Drawable* geometry)
00106 {
00107 _geometry = geometry;
00108 }
00109
00110 void addSprite(const SGVec3f& p, int tx, int ty, float w, float h,
00111 float s, float cull, float cloud_height);
00112
00113 osg::ref_ptr<osg::Drawable> _geometry;
00114
00115 int varieties_x;
00116 int varieties_y;
00117
00118
00119 osg::BoundingBox _bbox;
00120
00121 struct SortData
00122 {
00123 struct SortItem
00124 {
00125 SortItem(size_t idx_, float depth_) : idx(idx_), depth(depth_) {}
00126 SortItem() : idx(0), depth(0.0f) {}
00127 size_t idx;
00128 float depth;
00129 };
00130 SortData() : frameSorted(0), skip_limit(1), spriteIdx(0) {}
00131 int frameSorted;
00132 int skip_limit;
00133
00134 typedef std::vector<SortItem> SortItemList;
00135 SortItemList* spriteIdx;
00136 };
00137 protected:
00138 mutable osg::buffered_object<SortData> _sortData;
00139
00140 virtual ~CloudShaderGeometry()
00141 {
00142 for (unsigned int i = 0; i < _sortData.size(); ++i)
00143 delete _sortData[i].spriteIdx;
00144 }
00145 };
00146
00147 }
00148 #endif