mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-26 03:04:31 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			156 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2009-2021 Intel Corporation
 | |
| // SPDX-License-Identifier: Apache-2.0
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include "intersector_epilog.h"
 | |
| #include "pointi.h"
 | |
| #include "sphere_intersector.h"
 | |
| 
 | |
| namespace embree
 | |
| {
 | |
|   namespace isa
 | |
|   {
 | |
|     template<int M, bool filter>
 | |
|     struct SphereMiIntersector1
 | |
|     {
 | |
|       typedef PointMi<M> Primitive;
 | |
|       typedef CurvePrecalculations1 Precalculations;
 | |
| 
 | |
|       static __forceinline void intersect(const Precalculations& pre,
 | |
|                                           RayHit& ray,
 | |
|                                           RayQueryContext* context,
 | |
|                                           const Primitive& sphere)
 | |
|       {
 | |
|         STAT3(normal.trav_prims, 1, 1, 1);
 | |
|         const Points* geom = context->scene->get<Points>(sphere.geomID());
 | |
|         Vec4vf<M> v0; sphere.gather(v0, geom);
 | |
|         const vbool<M> valid = sphere.valid();
 | |
|         SphereIntersector1<M>::intersect(
 | |
|           valid, ray, context, geom, pre, v0, Intersect1EpilogM<M, filter>(ray, context, sphere.geomID(), sphere.primID()));
 | |
|       }
 | |
| 
 | |
|       static __forceinline bool occluded(const Precalculations& pre,
 | |
|                                          Ray& ray,
 | |
|                                          RayQueryContext* context,
 | |
|                                          const Primitive& sphere)
 | |
|       {
 | |
|         STAT3(shadow.trav_prims, 1, 1, 1);
 | |
|         const Points* geom = context->scene->get<Points>(sphere.geomID());
 | |
|         Vec4vf<M> v0; sphere.gather(v0, geom);
 | |
|         const vbool<M> valid = sphere.valid();
 | |
|         return SphereIntersector1<M>::intersect(
 | |
|           valid, ray, context, geom, pre, v0, Occluded1EpilogM<M, filter>(ray, context, sphere.geomID(), sphere.primID()));
 | |
|       }
 | |
|       
 | |
|       static __forceinline bool pointQuery(PointQuery* query,
 | |
|                                            PointQueryContext* context,
 | |
|                                            const Primitive& sphere)
 | |
|       {
 | |
|         return PrimitivePointQuery1<Primitive>::pointQuery(query, context, sphere);
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     template<int M, bool filter>
 | |
|     struct SphereMiMBIntersector1
 | |
|     {
 | |
|       typedef PointMi<M> Primitive;
 | |
|       typedef CurvePrecalculations1 Precalculations;
 | |
| 
 | |
|       static __forceinline void intersect(const Precalculations& pre,
 | |
|                                           RayHit& ray,
 | |
|                                           RayQueryContext* context,
 | |
|                                           const Primitive& sphere)
 | |
|       {
 | |
|         STAT3(normal.trav_prims, 1, 1, 1);
 | |
|         const Points* geom = context->scene->get<Points>(sphere.geomID());
 | |
|         Vec4vf<M> v0; sphere.gather(v0, geom, ray.time());
 | |
|         const vbool<M> valid = sphere.valid();
 | |
|         SphereIntersector1<M>::intersect(
 | |
|           valid, ray, context, geom, pre, v0, Intersect1EpilogM<M, filter>(ray, context, sphere.geomID(), sphere.primID()));
 | |
|       }
 | |
| 
 | |
|       static __forceinline bool occluded(const Precalculations& pre,
 | |
|                                          Ray& ray,
 | |
|                                          RayQueryContext* context,
 | |
|                                          const Primitive& sphere)
 | |
|       {
 | |
|         STAT3(shadow.trav_prims, 1, 1, 1);
 | |
|         const Points* geom = context->scene->get<Points>(sphere.geomID());
 | |
|         Vec4vf<M> v0; sphere.gather(v0, geom, ray.time());
 | |
|         const vbool<M> valid = sphere.valid();
 | |
|         return SphereIntersector1<M>::intersect(
 | |
|           valid, ray, context, geom, pre, v0, Occluded1EpilogM<M, filter>(ray, context, sphere.geomID(), sphere.primID()));
 | |
|       }
 | |
| 
 | |
|       static __forceinline bool pointQuery(PointQuery* query,
 | |
|                                            PointQueryContext* context,
 | |
|                                            const Primitive& sphere)
 | |
|       {
 | |
|         return PrimitivePointQuery1<Primitive>::pointQuery(query, context, sphere);
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     template<int M, int K, bool filter>
 | |
|     struct SphereMiIntersectorK
 | |
|     {
 | |
|       typedef PointMi<M> Primitive;
 | |
|       typedef CurvePrecalculationsK<K> Precalculations;
 | |
| 
 | |
|       static __forceinline void intersect(
 | |
|           const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
 | |
|       {
 | |
|         STAT3(normal.trav_prims, 1, 1, 1);
 | |
|         const Points* geom = context->scene->get<Points>(sphere.geomID());
 | |
|         Vec4vf<M> v0; sphere.gather(v0, geom);
 | |
|         const vbool<M> valid = sphere.valid();
 | |
|         SphereIntersectorK<M, K>::intersect(
 | |
|           valid, ray, k, context, geom, pre, v0,
 | |
|           Intersect1KEpilogM<M, K, filter>(ray, k, context, sphere.geomID(), sphere.primID()));
 | |
|       }
 | |
| 
 | |
|       static __forceinline bool occluded(
 | |
|           const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
 | |
|       {
 | |
|         STAT3(shadow.trav_prims, 1, 1, 1);
 | |
|         const Points* geom = context->scene->get<Points>(sphere.geomID());
 | |
|         Vec4vf<M> v0; sphere.gather(v0, geom);
 | |
|         const vbool<M> valid = sphere.valid();
 | |
|         return SphereIntersectorK<M, K>::intersect(
 | |
|           valid, ray, k, context, geom, pre, v0,
 | |
|           Occluded1KEpilogM<M, K, filter>(ray, k, context, sphere.geomID(), sphere.primID()));
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     template<int M, int K, bool filter>
 | |
|     struct SphereMiMBIntersectorK
 | |
|     {
 | |
|       typedef PointMi<M> Primitive;
 | |
|       typedef CurvePrecalculationsK<K> Precalculations;
 | |
| 
 | |
|       static __forceinline void intersect(
 | |
|           const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
 | |
|       {
 | |
|         STAT3(normal.trav_prims, 1, 1, 1);
 | |
|         const Points* geom = context->scene->get<Points>(sphere.geomID());
 | |
|         Vec4vf<M> v0; sphere.gather(v0, geom, ray.time()[k]);
 | |
|         const vbool<M> valid = sphere.valid();
 | |
|         SphereIntersectorK<M, K>::intersect(
 | |
|           valid, ray, k, context, geom, pre, v0,
 | |
|           Intersect1KEpilogM<M, K, filter>(ray, k, context, sphere.geomID(), sphere.primID()));
 | |
|       }
 | |
| 
 | |
|       static __forceinline bool occluded(
 | |
|           const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
 | |
|       {
 | |
|         STAT3(shadow.trav_prims, 1, 1, 1);
 | |
|         const Points* geom = context->scene->get<Points>(sphere.geomID());
 | |
|         Vec4vf<M> v0; sphere.gather(v0, geom, ray.time()[k]);
 | |
|         const vbool<M> valid = sphere.valid();
 | |
|         return SphereIntersectorK<M, K>::intersect(
 | |
|           valid, ray, k, context, geom, pre, v0,
 | |
|           Occluded1KEpilogM<M, K, filter>(ray, k, context, sphere.geomID(), sphere.primID()));
 | |
|       }
 | |
|     };
 | |
|   }  // namespace isa
 | |
| }  // namespace embree
 | 
