mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	 767e374dce
			
		
	
	
		767e374dce
		
	
	
	
	
		
			
			Since Embree v3.13.0 supports AARCH64, switch back to the official repo instead of using Embree-aarch64. `thirdparty/embree/patches/godot-changes.patch` should now contain an accurate diff of the changes done to the library.
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // 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;      
 | |
|     }
 | |
|   };
 | |
| }
 |