-
- skip_info->skip_count = (skip_info->skip_count + 1) % skip_info->skip_limit;
-
- if (skip_info->skip_count == 0)
- {
- osg::Matrix vm = state.getModelViewMatrix();
- bool sorted = true;
-
- // Transform the viewing direction, represented by the eye space vector (0,0,-1, 0), into model-space
- // (here we simply take the opposite direction and reverse the ordering when sorting)
- osg::Vec3f view_dir(vm(0, 2), vm(1, 2), vm(2, 2)); // Caveat: OpenSceneGraph matrices are transposed!
-
- float p = view_dir*_cloudsprites[0]->position.osg();
- // Do a single iteration of a bubble sort, sorting
- // back to front.
- for(int i = 0; i < _cloudsprites.size() - 1; i++)
- {
- float q = view_dir*_cloudsprites[i+1]->position.osg();
- if (p > q) {
- CloudSprite c = *_cloudsprites[i];
- *_cloudsprites[i] = *_cloudsprites[i+1];
- *_cloudsprites[i+1] = c;
-
- sorted = false;
- }
- else
- p = q;
+ if (frameNumber - sortData.skip_limit >= sortData.frameSorted) {
+ Matrix mvp = state.getModelViewMatrix() * state.getProjectionMatrix();
+ for (SortData::SortItemList::iterator itr = sortData.spriteIdx->begin(),
+ end = sortData.spriteIdx->end();
+ itr != end;
+ ++itr) {
+ Vec4f projPos
+ = Vec4f(toOsg(_cloudsprites[itr->idx].position), 1.0f) * mvp;
+ itr->depth = projPos.z() / projPos.w();