+}
+
+unsigned char fog(float z) {
+ unsigned int ret = (unsigned int) (((-(z - CAMERA_DISTANCE)) * 0.5f + 0.5f) * (255.0f - MIN_FOGGED)) + MIN_FOGGED;
+ if (ret > 255) ret = 255;
+ return (unsigned char)ret;
+}
+
+void sort(PointSprite *begin, PointSprite *end) {\r
+ PointSprite pivotValue;\r
+ size_t sz;\r
+ PointSprite *left, *right;\r
+ int leftCond, rightCond;\r
+ PointSprite tmp;\r
+\r
+ sz = end - begin;\r
+\r
+ if (sz < 2) return; /* already sorted */\r
+ if (sz == 2) {\r
+ /* trivial case */\r
+ if (begin[1] < begin[0]) {\r
+ tmp = begin[0];\r
+ begin[0] = begin[1];\r
+ begin[1] = tmp;\r
+ return;\r
+ }\r
+ }\r
+\r
+ /* minimum 3 elements from now on */\r
+\r
+ /* choose a pivot near the middle, since we frequently sort already sorted arrays */\r
+ pivotValue = begin[sz / 2];\r
+\r
+ left = begin;\r
+ right = end - 1;\r
+\r
+ while (right > left) {\r
+ /* check if left and right elements meet the conditions */\r
+ leftCond = pivotValue >= *left;\r
+ rightCond = pivotValue < *right;\r
+\r
+ if (!leftCond && !rightCond) {\r
+ tmp = *left;\r
+ *left = *right;\r
+ *right = tmp;\r
+ left++;\r
+ right--;\r
+ }\r
+ else if (leftCond && rightCond) {\r
+ left++;\r
+ right--;\r
+ }\r
+ else if (leftCond) {\r
+ left++;\r
+ }\r
+ else {\r
+ right--;\r
+ }\r
+ }\r
+\r
+ /* recursion */\r
+ sort(begin, left);\r
+ sort(left, end);\r
+}\r
+
+void sortPointSprites() {
+ sort(pointSprites, pointSprites + pointSpriteCount);
+}
+