rendering-in-cgi/Framework/include/ray.hpp
2024-04-23 10:14:24 +02:00

144 lines
No EOL
4.7 KiB
C++

// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <sys/platform.h>
#include <sys/ref.h>
#include <sys/intrinsics.h>
#include <sys/sysinfo.h>
#include <sys/atomic.h>
#include <sys/vector.h>
#include <sys/estring.h>
#include <math/emath.h>
#include <math/vec2.h>
#include <math/vec3.h>
#include <math/vec4.h>
#include <math/bbox.h>
#include <math/affinespace.h>
#include <simd/simd.h>
/*! Ray structure. */
struct __aligned(16) Ray
{
/*! Default construction does nothing. */
__forceinline Ray() {}
/*! Constructs a ray from origin, direction, and ray segment. Near
* has to be smaller than far. */
__forceinline Ray(const embree::Vec3fa& org,
const embree::Vec3fa& dir,
float tnear = 0.0f,
float tfar = embree::inf,
float time = 0.0f,
int mask = -1,
unsigned int geomID = RTC_INVALID_GEOMETRY_ID,
unsigned int primID = RTC_INVALID_GEOMETRY_ID)
: org(org,tnear), dir(dir,time), tfar(tfar), mask(mask), primID(primID), geomID(geomID)
{
instID[0] = RTC_INVALID_GEOMETRY_ID;
#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
instPrimID[0] = RTC_INVALID_GEOMETRY_ID;
#endif
}
/*! Tests if we hit something. */
__forceinline operator bool() const { return geomID != RTC_INVALID_GEOMETRY_ID; }
public:
embree::Vec3ff org; //!< Ray origin + tnear
//float tnear; //!< Start of ray segment
embree::Vec3ff dir; //!< Ray direction + tfar
//float time; //!< Time of this ray for motion blur.
float tfar; //!< End of ray segment
unsigned int mask; //!< used to mask out objects during traversal
unsigned int id; //!< ray ID
unsigned int flags; //!< ray flags
public:
embree::Vec3f Ng; //!< Not normalized geometry normal
float u; //!< Barycentric u coordinate of hit
float v; //!< Barycentric v coordinate of hit
unsigned int primID; //!< primitive ID
unsigned int geomID; //!< geometry ID
unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT]; //!< instance ID
#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
unsigned int instPrimID[RTC_MAX_INSTANCE_LEVEL_COUNT]; //!< instance primitive ID
#endif
__forceinline float &tnear() { return org.w; };
__forceinline float &time() { return dir.w; };
__forceinline float const &tnear() const { return org.w; };
__forceinline float const &time() const { return dir.w; };
};
__forceinline void init_Ray(Ray &ray,
const embree::Vec3fa& org,
const embree::Vec3fa& dir,
float tnear = 0.0f,
float tfar = embree::inf,
float time = 0.0f,
int mask = -1,
unsigned int geomID = RTC_INVALID_GEOMETRY_ID,
unsigned int primID = RTC_INVALID_GEOMETRY_ID)
{
ray = Ray(org,dir,tnear,tfar,time,mask,geomID,primID);
}
typedef Ray Ray1;
__forceinline RTCRayHit* RTCRayHit_(Ray& ray) {
return (RTCRayHit*)&ray;
}
__forceinline RTCRayHit* RTCRayHit1_(Ray& ray) {
return (RTCRayHit*)&ray;
}
__forceinline RTCRay* RTCRay_(Ray& ray) {
return (RTCRay*)&ray;
}
__forceinline RTCHit* RTCHit_(Ray& ray)
{
RTCHit* hit_ptr = (RTCHit*)&(ray.Ng.x);
return hit_ptr;
}
__forceinline RTCRay* RTCRay1_(Ray& ray) {
return (RTCRay*)&ray;
}
/*! Outputs ray to stream. */
__forceinline embree_ostream operator<<(embree_ostream cout, const Ray& ray)
{
cout << "{ " <<
"org = " << ray.org << ", dir = " << ray.dir << ", near = " << ray.tnear() << ", far = " << ray.tfar << ", time = " << ray.time() << ", ";
for (size_t i=0; i<RTC_MAX_INSTANCE_LEVEL_COUNT; i++)
cout << "instID" << i << " = " << ray.instID[i] << ", ";
#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
for (size_t i=0; i<RTC_MAX_INSTANCE_LEVEL_COUNT; i++)
cout << "instPrimID" << i << " = " << ray.instPrimID[i] << ", ";
#endif
return cout << "geomID = " << ray.geomID << ", primID = " << ray.primID << ", " << "u = " << ray.u << ", v = " << ray.v << ", Ng = " << ray.Ng << " }";
}
/*! ray query context passed to intersect/occluded calls */
struct RayQueryContext
{
RTCRayQueryContext context;
void* userRayExt; //!< can be used to pass extended ray data to callbacks
void* tutorialData;
};
__forceinline void InitIntersectionContext(struct RayQueryContext* context)
{
rtcInitRayQueryContext(&context->context);
context->userRayExt = NULL;
}