X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fsky%2FCloudShaderGeometry.hxx;h=cd00da8de7139c8c252563b66e67cd00e83b3f7a;hb=430c60ed1ac8d1c1ee79cdd45f6540d6dc8a5996;hp=57bd1720f8937e5a554bd157c628be6d48147db3;hpb=b601cdb6a5b132664f7d00bbfb44d0dadb7ec2d6;p=simgear.git diff --git a/simgear/scene/sky/CloudShaderGeometry.hxx b/simgear/scene/sky/CloudShaderGeometry.hxx index 57bd1720..cd00da8d 100755 --- a/simgear/scene/sky/CloudShaderGeometry.hxx +++ b/simgear/scene/sky/CloudShaderGeometry.hxx @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -43,24 +44,18 @@ class CloudShaderGeometry : public osg::Drawable { public: - const static unsigned int CLOUD_HEIGHT = 10; - const static unsigned int TEXTURE_INDEX_X = 11; - const static unsigned int TEXTURE_INDEX_Y = 12; - const static unsigned int WIDTH = 13; - const static unsigned int HEIGHT = 14; - const static unsigned int SHADE = 15; + const static unsigned int USR_ATTR_1 = 10; + const static unsigned int USR_ATTR_2 = 11; CloudShaderGeometry() { setUseDisplayList(false); - skip_info = new SkipInfo(); } CloudShaderGeometry(int vx, int vy, float width, float height) : varieties_x(vx), varieties_y(vy) { setUseDisplayList(false); - skip_info = new SkipInfo(); float x = width/2.0f; float z = height/2.0f; _bbox.expandBy(-x, -x, -z); @@ -73,16 +68,9 @@ class CloudShaderGeometry : public osg::Drawable META_Object(flightgear, CloudShaderGeometry); - struct SkipInfo { - SkipInfo() : skip_count(0), skip_limit(1) {} - int skip_count; - int skip_limit; - }; - - SkipInfo* skip_info; - struct CloudSprite { - CloudSprite(SGVec3f& p, int tx, int ty, float w, float h, float s, float ch) : + CloudSprite(const SGVec3f& p, int tx, int ty, float w, float h, + float s, float ch) : position(p), texture_index_x(tx), texture_index_y(ty), width(w), height(h), shade(s), cloud_height(ch) { } @@ -95,17 +83,17 @@ class CloudShaderGeometry : public osg::Drawable float cloud_height; }; - typedef std::vector CloudSpriteList; + typedef std::vector CloudSpriteList; CloudSpriteList _cloudsprites; - void insert(CloudSprite* t) + void insert(const CloudSprite& t) { _cloudsprites.push_back(t); } void insert(SGVec3f& p, int tx, int ty, float w, float h, float s, float ch) - { insert(new CloudSprite(p, tx, ty, w, h, s, ch)); } + { insert(CloudSprite(p, tx, ty, w, h, s, ch)); } unsigned getNumCloudSprite() const { return _cloudsprites.size(); } - CloudSprite* getCloudSprite(unsigned i) const + CloudSprite& getCloudSprite(unsigned i) { return _cloudsprites[i]; } virtual void drawImplementation(osg::RenderInfo& renderInfo) const; @@ -119,23 +107,9 @@ class CloudShaderGeometry : public osg::Drawable _geometry = geometry; } - void addSprite(SGVec3f& p, int tx, int ty, float w, float h, float s, float cull, float cloud_height) - { - // Only add the sprite if it is further than the cull distance to all other sprites - for (CloudShaderGeometry::CloudSpriteList::iterator iter = _cloudsprites.begin(); - iter != _cloudsprites.end(); - ++iter) - { - if (distSqr((*iter)->position, p) < cull) - { - // Too close - cull it - return; - } - } - - _cloudsprites.push_back(new CloudSprite(p, tx, ty, w, h, s, cloud_height)); - } - + void addSprite(const SGVec3f& p, int tx, int ty, float w, float h, + float s, float cull, float cloud_height); + osg::ref_ptr _geometry; int varieties_x; @@ -144,15 +118,30 @@ class CloudShaderGeometry : public osg::Drawable // Bounding box extents. osg::BoundingBox _bbox; - protected: + struct SortData + { + struct SortItem + { + SortItem(size_t idx_, float depth_) : idx(idx_), depth(depth_) {} + SortItem() : idx(0), depth(0.0f) {} + size_t idx; + float depth; + }; + SortData() : frameSorted(0), skip_limit(1), spriteIdx(0) {} + int frameSorted; + int skip_limit; + // This will be sorted by Z distance + typedef std::vector SortItemList; + SortItemList* spriteIdx; + }; +protected: + mutable osg::buffered_object _sortData; - virtual ~CloudShaderGeometry() { - delete skip_info; - for (int i = 0; i < _cloudsprites.size(); i++) - { - delete _cloudsprites[i]; - } - } + virtual ~CloudShaderGeometry() + { + for (unsigned int i = 0; i < _sortData.size(); ++i) + delete _sortData[i].spriteIdx; + } }; }