Path: blob/master/thirdparty/embree/kernels/geometry/grid_intersector.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "grid_soa.h"6#include "grid_soa_intersector1.h"7#include "grid_soa_intersector_packet.h"8#include "../common/ray.h"910namespace embree11{12namespace isa13{14template<typename T>15class SubdivPatch1Precalculations : public T16{17public:18__forceinline SubdivPatch1Precalculations (const Ray& ray, const void* ptr)19: T(ray,ptr) {}20};2122template<int K, typename T>23class SubdivPatch1PrecalculationsK : public T24{25public:26__forceinline SubdivPatch1PrecalculationsK (const vbool<K>& valid, RayK<K>& ray)27: T(valid,ray) {}28};2930class Grid1Intersector131{32public:33typedef GridSOA Primitive;34typedef Grid1Precalculations<GridSOAIntersector1::Precalculations> Precalculations;3536/*! Intersect a ray with the primitive. */37static __forceinline void intersect(Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)38{39GridSOAIntersector1::intersect(pre,ray,context,prim,lazy_node);40}41static __forceinline void intersect(Precalculations& pre, RayHit& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {42intersect(pre,ray,context,prim,ty,lazy_node);43}4445/*! Test if the ray is occluded by the primitive */46static __forceinline bool occluded(Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)47{48GridSOAIntersector1::occluded(pre,ray,context,prim,lazy_node);49}50static __forceinline bool occluded(Precalculations& pre, Ray& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {51return occluded(pre,ray,context,prim,ty,lazy_node);52}5354static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node) {55assert(false && "not implemented");56return false;57}5859static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {60assert(false && "not implemented");61return false;62}63};6465template <int K>66struct GridIntersectorK67{68typedef GridSOA Primitive;69typedef SubdivPatch1PrecalculationsK<K,typename GridSOAIntersectorK<K>::Precalculations> Precalculations;707172static __forceinline void intersect(const vbool<K>& valid, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)73{74GridSOAIntersectorK<K>::intersect(valid,pre,ray,context,prim,lazy_node);75}7677static __forceinline vbool<K> occluded(const vbool<K>& valid, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)78{79GridSOAIntersectorK<K>::occluded(valid,pre,ray,context,prim,lazy_node);80}8182static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)83{84GridSOAIntersectorK<K>::intersect(pre,ray,k,context,prim,lazy_node);85}8687static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)88{89GridSOAIntersectorK<K>::occluded(pre,ray,k,context,prim,lazy_node);90}91};9293typedef Grid1IntersectorK<4> SubdivPatch1Intersector4;94typedef Grid1IntersectorK<8> SubdivPatch1Intersector8;95typedef Grid1IntersectorK<16> SubdivPatch1Intersector16;9697}98}99100101