1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
// 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;
}
};
}
|