|
@@ -502,7 +502,8 @@ public:
|
|
|
enum {
|
|
|
MAX_LIGHTS = 255,
|
|
|
MAX_REFLECTION_PROBES = 255,
|
|
|
- DEFAULT_MAX_ELEMENTS = 65536
|
|
|
+ DEFAULT_MAX_ELEMENTS = 65536,
|
|
|
+ SORT_KEY_PRIORITY_SHIFT = 56
|
|
|
};
|
|
|
|
|
|
int max_elements;
|
|
@@ -598,6 +599,29 @@ public:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ struct SortByReverseDepthAndPriority {
|
|
|
+
|
|
|
+ _FORCE_INLINE_ bool operator()(const Element *A, const Element *B) const {
|
|
|
+ uint32_t layer_A = uint32_t(A->sort_key >> SORT_KEY_PRIORITY_SHIFT);
|
|
|
+ uint32_t layer_B = uint32_t(B->sort_key >> SORT_KEY_PRIORITY_SHIFT);
|
|
|
+ if (layer_A == layer_B) {
|
|
|
+ return A->instance->depth > B->instance->depth;
|
|
|
+ } else {
|
|
|
+ return layer_A < layer_B;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ void sort_by_reverse_depth_and_priority(bool p_alpha) { //used for alpha
|
|
|
+
|
|
|
+ SortArray<Element *, SortByReverseDepthAndPriority> sorter;
|
|
|
+ if (p_alpha) {
|
|
|
+ sorter.sort(&elements[max_elements - alpha_element_count], alpha_element_count);
|
|
|
+ } else {
|
|
|
+ sorter.sort(elements, element_count);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// element adding and stuff
|
|
|
|
|
|
_FORCE_INLINE_ Element *add_element() {
|