Path: blob/master/thirdparty/embree/kernels/geometry/plane.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../common/ray.h"67namespace embree8{9namespace isa10{11struct HalfPlane12{13const Vec3fa P; //!< plane origin14const Vec3fa N; //!< plane normal1516__forceinline HalfPlane(const Vec3fa& P, const Vec3fa& N)17: P(P), N(N) {}1819__forceinline BBox1f intersect(const Vec3fa& ray_org, const Vec3fa& ray_dir) const20{21Vec3fa O = Vec3fa(ray_org) - P;22Vec3fa D = Vec3fa(ray_dir);23float ON = dot(O,N);24float DN = dot(D,N);25bool eps = abs(DN) < min_rcp_input;26float t = -ON*rcp(DN);27float lower = select(eps || DN < 0.0f, float(neg_inf), t);28float upper = select(eps || DN > 0.0f, float(pos_inf), t);29return BBox1f(lower,upper);30}31};3233template<int M>34struct HalfPlaneN35{36const Vec3vf<M> P; //!< plane origin37const Vec3vf<M> N; //!< plane normal3839__forceinline HalfPlaneN(const Vec3vf<M>& P, const Vec3vf<M>& N)40: P(P), N(N) {}4142__forceinline BBox<vfloat<M>> intersect(const Vec3fa& ray_org, const Vec3fa& ray_dir) const43{44Vec3vf<M> O = Vec3vf<M>((Vec3fa)ray_org) - P;45Vec3vf<M> D = Vec3vf<M>((Vec3fa)ray_dir);46vfloat<M> ON = dot(O,N);47vfloat<M> DN = dot(D,N);48vbool<M> eps = abs(DN) < min_rcp_input;49vfloat<M> t = -ON*rcp(DN);50vfloat<M> lower = select(eps | DN < 0.0f, vfloat<M>(neg_inf), t);51vfloat<M> upper = select(eps | DN > 0.0f, vfloat<M>(pos_inf), t);52return BBox<vfloat<M>>(lower,upper);53}54};55}56}575859