bool operator() (const CloudShaderGeometry::SortData::SortItem& lhs,
const CloudShaderGeometry::SortData::SortItem& rhs) const
{
- return lhs.depth < rhs.depth;
+ return lhs.depth > rhs.depth;
}
};
}
if (!sortData.spriteIdx)
sortData.spriteIdx = new SortData::SortItemList;
if (sortData.spriteIdx->size() < _cloudsprites.size()) {
- for (int i = sortData.spriteIdx->size(); i < _cloudsprites.size(); ++i)
+ for (unsigned i = sortData.spriteIdx->size(); i < (unsigned)_cloudsprites.size(); ++i)
sortData.spriteIdx->push_back(SortData::SortItem(i, 0.0f));
sortData.frameSorted = frameNumber - (sortData.skip_limit + 1);
}
itr != end;
++itr) {
Vec4f projPos
- = Vec4f(_cloudsprites[itr->idx].position.osg(), 1.0f) * mvp;
+ = Vec4f(toOsg(_cloudsprites[itr->idx].position), 1.0f) * mvp;
itr->depth = projPos.z() / projPos.w();
}
// Already sorted?
itr != end;
++itr) {
const CloudSprite& t = _cloudsprites[itr->idx];
- GLfloat ua1[3] = { (GLfloat)t.texture_index_x/varieties_x,
- (GLfloat)t.texture_index_y/varieties_y,
- t.width };
- GLfloat ua2[3] = { (GLfloat)t.height,
- t.shade,
+ GLfloat ua1[3] = { (GLfloat) t.texture_index_x/varieties_x,
+ (GLfloat) t.texture_index_y/varieties_y,
+ (GLfloat) t.width };
+ GLfloat ua2[3] = { (GLfloat) t.height,
+ (GLfloat) t.shade,
(GLfloat) t.cloud_height };
extensions->glVertexAttrib3fv(USR_ATTR_1, ua1 );
extensions->glVertexAttrib3fv(USR_ATTR_2, ua2 );
- glColor4f(t.position.x(), t.position.y(), t.position.z(), 1.0);
+ glColor4f(t.position.x(), t.position.y(), t.position.z(), zscale);
_geometry->draw(renderInfo);
}
}
-void CloudShaderGeometry::addSprite(SGVec3f& p, int tx, int ty,
+void CloudShaderGeometry::addSprite(const 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
+ // except for the center sprite.
for (CloudShaderGeometry::CloudSpriteList::iterator iter = _cloudsprites.begin();
iter != _cloudsprites.end();
++iter)
{
- if (distSqr(iter->position, p) < cull) {
+ if ((iter != _cloudsprites.begin()) &&
+ (distSqr(iter->position, p) < cull)) {
// Too close - cull it
return;
}
}
+
_cloudsprites.push_back(CloudSprite(p, tx, ty, w, h, s, cloud_height));
}