// Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 #pragma once #include "../common/default.h" namespace embree { struct __aligned(16) GridRange { unsigned int u_start; unsigned int u_end; unsigned int v_start; unsigned int v_end; __forceinline GridRange() {} __forceinline GridRange(unsigned int u_start, unsigned int u_end, unsigned int v_start, unsigned int v_end) : u_start(u_start), u_end(u_end), v_start(v_start), v_end(v_end) {} __forceinline unsigned int width() const { return u_end-u_start+1; } __forceinline unsigned int height() const { return v_end-v_start+1; } __forceinline bool hasLeafSize() const { const unsigned int u_size = u_end-u_start+1; const unsigned int v_size = v_end-v_start+1; assert(u_size >= 1); assert(v_size >= 1); return u_size <= 3 && v_size <= 3; } static __forceinline unsigned int split(unsigned int start,unsigned int end) { const unsigned int center = (start+end)/2; assert (center > start); assert (center < end); return center; } __forceinline void split(GridRange& r0, GridRange& r1) const { assert( hasLeafSize() == false ); const unsigned int u_size = u_end-u_start+1; const unsigned int v_size = v_end-v_start+1; r0 = *this; r1 = *this; if (u_size >= v_size) { const unsigned int u_mid = split(u_start,u_end); r0.u_end = u_mid; r1.u_start = u_mid; } else { const unsigned int v_mid = split(v_start,v_end); r0.v_end = v_mid; r1.v_start = v_mid; } } __forceinline unsigned int splitIntoSubRanges(GridRange r[4]) const { assert( !hasLeafSize() ); unsigned int children = 0; GridRange first,second; split(first,second); if (first.hasLeafSize()) { r[0] = first; children++; } else { first.split(r[0],r[1]); children += 2; } if (second.hasLeafSize()) { r[children] = second; children++; } else { second.split(r[children+0],r[children+1]); children += 2; } return children; } }; }