Path: blob/master/thirdparty/embree/kernels/common/context.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "default.h"6#include "rtcore.h"7#include "point_query.h"89namespace embree10{11class Scene;1213struct RayQueryContext14{15public:1617__forceinline RayQueryContext(Scene* scene, RTCRayQueryContext* user_context, RTCIntersectArguments* args)18: scene(scene), user(user_context), args(args) {}1920__forceinline RayQueryContext(Scene* scene, RTCRayQueryContext* user_context, RTCOccludedArguments* args)21: scene(scene), user(user_context), args((RTCIntersectArguments*)args) {}2223__forceinline bool hasContextFilter() const {24return args->filter != nullptr;25}2627RTCFilterFunctionN getFilter() const {28return args->filter;29}3031RTCIntersectFunctionN getIntersectFunction() const {32return args->intersect;33}3435RTCOccludedFunctionN getOccludedFunction() const {36return (RTCOccludedFunctionN) args->intersect;37}3839__forceinline bool isCoherent() const {40return embree::isCoherent(args->flags);41}4243__forceinline bool isIncoherent() const {44return embree::isIncoherent(args->flags);45}4647__forceinline bool enforceArgumentFilterFunction() const {48return args->flags & RTC_RAY_QUERY_FLAG_INVOKE_ARGUMENT_FILTER;49}5051#if RTC_MIN_WIDTH52__forceinline float getMinWidthDistanceFactor() const {53return args->minWidthDistanceFactor;54}55#endif5657public:58Scene* scene = nullptr;59RTCRayQueryContext* user = nullptr;60RTCIntersectArguments* args = nullptr;61};6263template<int M, typename Geometry>64__forceinline Vec4vf<M> enlargeRadiusToMinWidth(const RayQueryContext* context, const Geometry* geom, const Vec3vf<M>& ray_org, const Vec4vf<M>& v)65{66#if RTC_MIN_WIDTH67const vfloat<M> d = length(Vec3vf<M>(v) - ray_org);68const vfloat<M> r = clamp(context->getMinWidthDistanceFactor()*d, v.w, geom->maxRadiusScale*v.w);69return Vec4vf<M>(v.x,v.y,v.z,r);70#else71return v;72#endif73}7475template<typename Geometry>76__forceinline Vec3ff enlargeRadiusToMinWidth(const RayQueryContext* context, const Geometry* geom, const Vec3fa& ray_org, const Vec3ff& v)77{78#if RTC_MIN_WIDTH79const float d = length(Vec3fa(v) - ray_org);80const float r = clamp(context->getMinWidthDistanceFactor()*d, v.w, geom->maxRadiusScale*v.w);81return Vec3ff(v.x,v.y,v.z,r);82#else83return v;84#endif85}8687template<typename Geometry>88__forceinline Vec3ff enlargeRadiusToMinWidth(const RayQueryContext* context, const Geometry* geom, const Vec3fa& ray_org, const Vec4f& v) {89return enlargeRadiusToMinWidth(context,geom,ray_org,Vec3ff(v.x,v.y,v.z,v.w));90}9192enum PointQueryType93{94POINT_QUERY_TYPE_UNDEFINED = 0,95POINT_QUERY_TYPE_SPHERE = 1,96POINT_QUERY_TYPE_AABB = 2,97};9899typedef bool (*PointQueryFunction)(struct RTCPointQueryFunctionArguments* args);100101struct PointQueryContext102{103public:104__forceinline PointQueryContext(Scene* scene,105PointQuery* query_ws,106PointQueryType query_type,107PointQueryFunction func,108RTCPointQueryContext* userContext,109float similarityScale,110void* userPtr)111: scene(scene)112, tstate(nullptr)113, query_ws(query_ws)114, query_type(query_type)115, func(func)116, userContext(userContext)117, similarityScale(similarityScale)118, userPtr(userPtr)119, primID(RTC_INVALID_GEOMETRY_ID)120, geomID(RTC_INVALID_GEOMETRY_ID)121, query_radius(query_ws->radius)122{123update();124}125126public:127__forceinline void update()128{129if (query_type == POINT_QUERY_TYPE_AABB) {130assert(similarityScale == 0.f);131updateAABB();132}133else{134query_radius = Vec3fa(query_ws->radius * similarityScale);135}136if (userContext->instStackSize == 0) {137assert(similarityScale == 1.f);138}139}140141__forceinline void updateAABB()142{143if (likely(query_ws->radius == (float)inf || userContext->instStackSize == 0)) {144query_radius = Vec3fa(query_ws->radius);145return;146}147148const AffineSpace3fa m = AffineSpace3fa_load_unaligned((AffineSpace3fa*)userContext->world2inst[userContext->instStackSize-1]);149BBox3fa bbox(Vec3fa(-query_ws->radius), Vec3fa(query_ws->radius));150bbox = xfmBounds(m, bbox);151query_radius = 0.5f * (bbox.upper - bbox.lower);152}153154public:155Scene* scene;156void* tstate;157158PointQuery* query_ws; // the original world space point query159PointQueryType query_type;160PointQueryFunction func;161RTCPointQueryContext* userContext;162float similarityScale;163164void* userPtr;165166unsigned int primID;167unsigned int geomID;168169Vec3fa query_radius; // used if the query is converted to an AABB internally170};171}172173174175