Path: blob/master/thirdparty/embree/kernels/subdiv/gridrange.h
9913 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../common/default.h"67namespace embree8{9struct __aligned(16) GridRange10{11unsigned int u_start;12unsigned int u_end;13unsigned int v_start;14unsigned int v_end;1516__forceinline GridRange() {}1718__forceinline GridRange(unsigned int u_start, unsigned int u_end, unsigned int v_start, unsigned int v_end)19: u_start(u_start), u_end(u_end), v_start(v_start), v_end(v_end) {}2021__forceinline unsigned int width() const {22return u_end-u_start+1;23}2425__forceinline unsigned int height() const {26return v_end-v_start+1;27}2829__forceinline bool hasLeafSize() const30{31const unsigned int u_size = u_end-u_start+1;32const unsigned int v_size = v_end-v_start+1;33assert(u_size >= 1);34assert(v_size >= 1);35return u_size <= 3 && v_size <= 3;36}3738static __forceinline unsigned int split(unsigned int start,unsigned int end)39{40const unsigned int center = (start+end)/2;41assert (center > start);42assert (center < end);43return center;44}4546__forceinline void split(GridRange& r0, GridRange& r1) const47{48assert( hasLeafSize() == false );49const unsigned int u_size = u_end-u_start+1;50const unsigned int v_size = v_end-v_start+1;51r0 = *this;52r1 = *this;5354if (u_size >= v_size)55{56const unsigned int u_mid = split(u_start,u_end);57r0.u_end = u_mid;58r1.u_start = u_mid;59}60else61{62const unsigned int v_mid = split(v_start,v_end);63r0.v_end = v_mid;64r1.v_start = v_mid;65}66}6768__forceinline unsigned int splitIntoSubRanges(GridRange r[4]) const69{70assert( !hasLeafSize() );71unsigned int children = 0;72GridRange first,second;73split(first,second);7475if (first.hasLeafSize()) {76r[0] = first;77children++;78}79else {80first.split(r[0],r[1]);81children += 2;82}8384if (second.hasLeafSize()) {85r[children] = second;86children++;87}88else {89second.split(r[children+0],r[children+1]);90children += 2;91}92return children;93}94};95}969798