96 lines
2.2 KiB
C++
96 lines
2.2 KiB
C++
// Copyright 2009-2020 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;
|
|
}
|
|
};
|
|
}
|