Revision control
Copy as Markdown
// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#ifndef __RTC_COMMON_ISPH__
#define __RTC_COMMON_ISPH__
#if !defined(RTC_API)
#define RTC_API extern "C" unmasked
#endif
#ifdef _WIN32
# define RTC_ALIGN(...) // FIXME: need to specify alignment
#else
# define RTC_ALIGN(...) // FIXME: need to specify alignment
#endif
#if !defined(RTC_DEPRECATED)
#define RTC_DEPRECATED // FIXME: deprecation not supported by ISPC
#endif
#if !defined(RTC_FORCEINLINE)
#define RTC_FORCEINLINE inline
#endif
/* Invalid geometry ID */
#define RTC_INVALID_GEOMETRY_ID ((uniform unsigned int)-1)
/* Maximum number of time steps */
#define RTC_MAX_TIME_STEP_COUNT 129
/* Formats of buffers and other data structures */
enum RTCFormat
{
RTC_FORMAT_UNDEFINED = 0,
/* 8-bit unsigned integer */
RTC_FORMAT_UCHAR = 0x1001,
RTC_FORMAT_UCHAR2,
RTC_FORMAT_UCHAR3,
RTC_FORMAT_UCHAR4,
/* 8-bit signed integer */
RTC_FORMAT_CHAR = 0x2001,
RTC_FORMAT_CHAR2,
RTC_FORMAT_CHAR3,
RTC_FORMAT_CHAR4,
/* 16-bit unsigned integer */
RTC_FORMAT_USHORT = 0x3001,
RTC_FORMAT_USHORT2,
RTC_FORMAT_USHORT3,
RTC_FORMAT_USHORT4,
/* 16-bit signed integer */
RTC_FORMAT_SHORT = 0x4001,
RTC_FORMAT_SHORT2,
RTC_FORMAT_SHORT3,
RTC_FORMAT_SHORT4,
/* 32-bit unsigned integer */
RTC_FORMAT_UINT = 0x5001,
RTC_FORMAT_UINT2,
RTC_FORMAT_UINT3,
RTC_FORMAT_UINT4,
/* 32-bit signed integer */
RTC_FORMAT_INT = 0x6001,
RTC_FORMAT_INT2,
RTC_FORMAT_INT3,
RTC_FORMAT_INT4,
/* 64-bit unsigned integer */
RTC_FORMAT_ULLONG = 0x7001,
RTC_FORMAT_ULLONG2,
RTC_FORMAT_ULLONG3,
RTC_FORMAT_ULLONG4,
/* 64-bit signed integer */
RTC_FORMAT_LLONG = 0x8001,
RTC_FORMAT_LLONG2,
RTC_FORMAT_LLONG3,
RTC_FORMAT_LLONG4,
/* 32-bit float */
RTC_FORMAT_FLOAT = 0x9001,
RTC_FORMAT_FLOAT2,
RTC_FORMAT_FLOAT3,
RTC_FORMAT_FLOAT4,
RTC_FORMAT_FLOAT5,
RTC_FORMAT_FLOAT6,
RTC_FORMAT_FLOAT7,
RTC_FORMAT_FLOAT8,
RTC_FORMAT_FLOAT9,
RTC_FORMAT_FLOAT10,
RTC_FORMAT_FLOAT11,
RTC_FORMAT_FLOAT12,
RTC_FORMAT_FLOAT13,
RTC_FORMAT_FLOAT14,
RTC_FORMAT_FLOAT15,
RTC_FORMAT_FLOAT16,
/* 32-bit float matrix (row-major order) */
RTC_FORMAT_FLOAT2X2_ROW_MAJOR = 0x9122,
RTC_FORMAT_FLOAT2X3_ROW_MAJOR = 0x9123,
RTC_FORMAT_FLOAT2X4_ROW_MAJOR = 0x9124,
RTC_FORMAT_FLOAT3X2_ROW_MAJOR = 0x9132,
RTC_FORMAT_FLOAT3X3_ROW_MAJOR = 0x9133,
RTC_FORMAT_FLOAT3X4_ROW_MAJOR = 0x9134,
RTC_FORMAT_FLOAT4X2_ROW_MAJOR = 0x9142,
RTC_FORMAT_FLOAT4X3_ROW_MAJOR = 0x9143,
RTC_FORMAT_FLOAT4X4_ROW_MAJOR = 0x9144,
/* 32-bit float matrix (column-major order) */
RTC_FORMAT_FLOAT2X2_COLUMN_MAJOR = 0x9222,
RTC_FORMAT_FLOAT2X3_COLUMN_MAJOR = 0x9223,
RTC_FORMAT_FLOAT2X4_COLUMN_MAJOR = 0x9224,
RTC_FORMAT_FLOAT3X2_COLUMN_MAJOR = 0x9232,
RTC_FORMAT_FLOAT3X3_COLUMN_MAJOR = 0x9233,
RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR = 0x9234,
RTC_FORMAT_FLOAT4X2_COLUMN_MAJOR = 0x9242,
RTC_FORMAT_FLOAT4X3_COLUMN_MAJOR = 0x9243,
RTC_FORMAT_FLOAT4X4_COLUMN_MAJOR = 0x9244,
/* special 12-byte format for grids */
RTC_FORMAT_GRID = 0xA001
};
/* Build quality levels */
enum RTCBuildQuality
{
RTC_BUILD_QUALITY_LOW = 0,
RTC_BUILD_QUALITY_MEDIUM = 1,
RTC_BUILD_QUALITY_HIGH = 2,
RTC_BUILD_QUALITY_REFIT = 3,
};
/* Axis-aligned bounding box representation */
struct RTC_ALIGN(16) RTCBounds
{
float lower_x, lower_y, lower_z, align0;
float upper_x, upper_y, upper_z, align1;
};
/* Linear axis-aligned bounding box representation */
struct RTC_ALIGN(16) RTCLinearBounds
{
RTCBounds bounds0;
RTCBounds bounds1;
};
/* Intersection context flags */
enum RTCIntersectContextFlags
{
RTC_INTERSECT_CONTEXT_FLAG_NONE = 0,
RTC_INTERSECT_CONTEXT_FLAG_INCOHERENT = (0 << 0), // optimize for incoherent rays
RTC_INTERSECT_CONTEXT_FLAG_COHERENT = (1 << 0) // optimize for coherent rays
};
/* Intersection context passed to intersect/occluded calls */
struct RTCIntersectContext
{
RTCIntersectContextFlags flags; // intersection flags
void* filter; // filter function to execute
#if RTC_MAX_INSTANCE_LEVEL_COUNT > 1
unsigned int instStackSize; // Number of instances currently on the stack.
#endif
unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT]; // The current stack of instance ids.
#if RTC_MIN_WIDTH
float minWidthDistanceFactor; // curve radius is set to this factor times distance to ray origin
#endif
};
/* Initializes an intersection context. */
RTC_FORCEINLINE void rtcInitIntersectContext(uniform RTCIntersectContext* uniform context)
{
uniform unsigned l = 0;
context->flags = RTC_INTERSECT_CONTEXT_FLAG_INCOHERENT;
context->filter = NULL;
#if RTC_MAX_INSTANCE_LEVEL_COUNT > 1
context->instStackSize = 0;
#endif
for (; l < RTC_MAX_INSTANCE_LEVEL_COUNT; ++l)
context->instID[l] = RTC_INVALID_GEOMETRY_ID;
#if RTC_MIN_WIDTH
context->minWidthDistanceFactor = 0.0f;
#endif
}
/* Arguments for RTCFilterFunctionN */
struct RTCFilterFunctionNArguments
{
uniform int* uniform valid;
void* uniform geometryUserPtr;
RTCIntersectContext* uniform context;
struct RTCRayN* uniform ray;
struct RTCHitN* uniform hit;
uniform unsigned int N;
};
/* Filter callback function */
typedef unmasked void (*uniform RTCFilterFunctionN)(const struct RTCFilterFunctionNArguments* uniform args);
/* Point query structure for closest point query */
struct RTC_ALIGN(16) RTCPointQuery
{
float x; // x coordinate of the query point
float y; // y coordinate of the query point
float z; // z coordinate of the query point
float time; // time for motion blur
float radius; // radius for the point query
};
/* Structure of a packet of 4 query points */
struct RTC_ALIGN(16) RTCPointQuery4
{
float x[4];
float y[4];
float z[4];
float time[4];
float radius[4];
};
/* Structure of a packet of 8 query points */
struct RTC_ALIGN(32) RTCPointQuery8
{
float x[8];
float y[8];
float z[8];
float time[8];
float radius[8];
};
/* Structure of a packet of 16 query points */
struct RTC_ALIGN(64) RTCPointQuery16
{
float x[16];
float y[16];
float z[16];
float time[16];
float radius[16];
};
struct RTCPointQueryN;
struct RTCPointQueryContext
{
// accumulated 4x4 column major matrices from world space to instance space.
// undefined if size == 0.
float world2inst[RTC_MAX_INSTANCE_LEVEL_COUNT][16];
// accumulated 4x4 column major matrices from instance space to world space.
// undefined if size == 0.
float inst2world[RTC_MAX_INSTANCE_LEVEL_COUNT][16];
// instance ids.
unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT];
// number of instances currently on the stack.
unsigned int instStackSize;
};
/* Initializes an intersection context. */
RTC_FORCEINLINE void rtcInitPointQueryContext(uniform RTCPointQueryContext* uniform context)
{
context->instStackSize = 0;
context->instID[0] = RTC_INVALID_GEOMETRY_ID;
}
struct RTCPointQueryFunctionArguments
{
// The query object that was passed as an argument of rtcPointQuery. The
// radius of the query can be decreased inside the callback to shrink the
// search domain. Increasing the radius or modifying the time or position of
// the query results in undefined behaviour.
RTCPointQuery* uniform query;
// Used for user input/output data. Will not be read or modified internally.
void* uniform userPtr;
// primitive and geometry ID of primitive
unsigned int primID;
unsigned int geomID;
// the context with transformation and instance ID stack
uniform RTCPointQueryContext* uniform context;
// If the current instance transform M (= context->world2inst[context->instStackSize])
// is a similarity matrix, i.e there is a constant factor similarityScale such that,
// for all x,y: dist(Mx, My) = similarityScale * dist(x, y),
// The similarity scale is 0, if the current instance transform is not a
// similarity transform and vice versa. The similarity scale allows to compute
// distance information in instance space and scale the distances into world
// space by dividing with the similarity scale, for example, to update the
// query radius. If the current instance transform is not a similarity
// transform (similarityScale = 0), the distance computation has to be
// performed in world space to ensure correctness. if there is no instance
// transform (context->instStackSize == 0), the similarity scale is 1.
float similarityScale;
};
typedef unmasked bool (*uniform RTCPointQueryFunction)(struct RTCPointQueryFunctionArguments* uniform args);
#endif