Path: blob/master/thirdparty/embree/kernels/geometry/object_intersector.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "object.h"6#include "../common/ray.h"78namespace embree9{10namespace isa11{12template<bool mblur>13struct ObjectIntersector114{15typedef Object Primitive;1617static const bool validIntersectorK = false;1819struct Precalculations {20__forceinline Precalculations() {}21__forceinline Precalculations (const Ray& ray, const void *ptr) {}22};2324static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)25{26AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());2728/* perform ray mask test */29#if defined(EMBREE_RAY_MASK)30if ((ray.mask & accel->mask) == 0)31return;32#endif3334accel->intersect(ray,prim.geomID(),prim.primID(),context);35}3637static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)38{39AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());40/* perform ray mask test */41#if defined(EMBREE_RAY_MASK)42if ((ray.mask & accel->mask) == 0)43return false;44#endif4546accel->occluded(ray,prim.geomID(),prim.primID(),context);47return ray.tfar < 0.0f;48}4950static __forceinline bool intersect(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim) {51return occluded(pre,ray,context,prim);52}5354static __forceinline void intersect(unsigned int k, const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)55{56AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());5758/* perform ray mask test */59#if defined(EMBREE_RAY_MASK)60if ((ray.mask & accel->mask) == 0)61return;62#endif6364accel->intersect(k,ray,prim.geomID(),prim.primID(),context);65}6667static __forceinline bool occluded(unsigned int k, const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)68{69AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());70/* perform ray mask test */71#if defined(EMBREE_RAY_MASK)72if ((ray.mask & accel->mask) == 0)73return false;74#endif7576accel->occluded(k, ray,prim.geomID(),prim.primID(),context);77return ray.tfar < 0.0f;78}7980static __forceinline bool intersect(unsigned int k, const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim) {81return occluded(k,pre,ray,context,prim);82}8384static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim)85{86AccelSet* accel = (AccelSet*)context->scene->get(prim.geomID());87context->geomID = prim.geomID();88context->primID = prim.primID();89return accel->pointQuery(query, context);90}9192template<int K>93static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)94{95assert(false);96}9798template<int K>99static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)100{101assert(false);102return valid;103}104};105106template<int K, bool mblur>107struct ObjectIntersectorK108{109typedef Object Primitive;110111struct Precalculations {112__forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}113};114115static __forceinline void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim)116{117vbool<K> valid = valid_i;118AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());119120/* perform ray mask test */121#if defined(EMBREE_RAY_MASK)122valid &= (ray.mask & accel->mask) != 0;123if (none(valid)) return;124#endif125accel->intersect(valid,ray,prim.geomID(),prim.primID(),context);126}127128static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim)129{130vbool<K> valid = valid_i;131AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());132133/* perform ray mask test */134#if defined(EMBREE_RAY_MASK)135valid &= (ray.mask & accel->mask) != 0;136if (none(valid)) return false;137#endif138accel->occluded(valid,ray,prim.geomID(),prim.primID(),context);139return ray.tfar < 0.0f;140}141142static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {143intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);144}145146static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {147occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);148return ray.tfar[k] < 0.0f;149}150};151152typedef ObjectIntersectorK<4,false> ObjectIntersector4;153typedef ObjectIntersectorK<8,false> ObjectIntersector8;154typedef ObjectIntersectorK<16,false> ObjectIntersector16;155156typedef ObjectIntersectorK<4,true> ObjectIntersector4MB;157typedef ObjectIntersectorK<8,true> ObjectIntersector8MB;158typedef ObjectIntersectorK<16,true> ObjectIntersector16MB;159}160}161162163