2021-05-20 10:49:33 +00:00
|
|
|
// Copyright 2009-2021 Intel Corporation
|
2020-12-19 13:50:20 +00:00
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
#include "rtcore_config.h"
|
|
|
|
|
|
|
|
RTC_NAMESPACE_BEGIN
|
|
|
|
|
|
|
|
#if defined(_WIN32)
|
|
|
|
#if defined(_M_X64)
|
|
|
|
typedef long long ssize_t;
|
|
|
|
#else
|
|
|
|
typedef int ssize_t;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2021-05-20 10:49:33 +00:00
|
|
|
// -- GODOT start --
|
|
|
|
#if defined(_WIN32) && defined(_MSC_VER)
|
|
|
|
// -- GODOT end --
|
2020-12-19 13:50:20 +00:00
|
|
|
# define RTC_ALIGN(...) __declspec(align(__VA_ARGS__))
|
|
|
|
#else
|
|
|
|
# define RTC_ALIGN(...) __attribute__((aligned(__VA_ARGS__)))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !defined (RTC_DEPRECATED)
|
|
|
|
#ifdef __GNUC__
|
|
|
|
#define RTC_DEPRECATED __attribute__((deprecated))
|
|
|
|
#elif defined(_MSC_VER)
|
|
|
|
#define RTC_DEPRECATED __declspec(deprecated)
|
|
|
|
#else
|
|
|
|
#define RTC_DEPRECATED
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2021-05-20 10:49:33 +00:00
|
|
|
#if defined(_WIN32)
|
2020-12-19 13:50:20 +00:00
|
|
|
# define RTC_FORCEINLINE __forceinline
|
|
|
|
#else
|
|
|
|
# define RTC_FORCEINLINE inline __attribute__((always_inline))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Invalid geometry ID */
|
|
|
|
#define RTC_INVALID_GEOMETRY_ID ((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
|
|
|
|
{
|
|
|
|
struct RTCBounds bounds0;
|
|
|
|
struct 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
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Arguments for RTCFilterFunctionN */
|
|
|
|
struct RTCFilterFunctionNArguments
|
|
|
|
{
|
|
|
|
int* valid;
|
|
|
|
void* geometryUserPtr;
|
|
|
|
struct RTCIntersectContext* context;
|
|
|
|
struct RTCRayN* ray;
|
|
|
|
struct RTCHitN* hit;
|
|
|
|
unsigned int N;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Filter callback function */
|
|
|
|
typedef void (*RTCFilterFunctionN)(const struct RTCFilterFunctionNArguments* args);
|
|
|
|
|
|
|
|
/* Intersection context passed to intersect/occluded calls */
|
|
|
|
struct RTCIntersectContext
|
|
|
|
{
|
|
|
|
enum RTCIntersectContextFlags flags; // intersection flags
|
|
|
|
RTCFilterFunctionN 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(struct RTCIntersectContext* context)
|
|
|
|
{
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Point query structure for closest point query */
|
2021-05-20 10:49:33 +00:00
|
|
|
struct RTC_ALIGN(16) RTCPointQuery
|
2020-12-19 13:50:20 +00:00
|
|
|
{
|
|
|
|
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 of the point query
|
2021-05-20 10:49:33 +00:00
|
|
|
float radius; // radius of the point query
|
2020-12-19 13:50:20 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Structure of a packet of 4 query points */
|
|
|
|
struct RTC_ALIGN(16) RTCPointQuery4
|
|
|
|
{
|
|
|
|
float x[4]; // x coordinate of the query point
|
|
|
|
float y[4]; // y coordinate of the query point
|
|
|
|
float z[4]; // z coordinate of the query point
|
|
|
|
float time[4]; // time of the point query
|
|
|
|
float radius[4]; // radius of the point query
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Structure of a packet of 8 query points */
|
|
|
|
struct RTC_ALIGN(32) RTCPointQuery8
|
|
|
|
{
|
|
|
|
float x[8]; // x coordinate of the query point
|
|
|
|
float y[8]; // y coordinate of the query point
|
|
|
|
float z[8]; // z coordinate of the query point
|
|
|
|
float time[8]; // time of the point query
|
2021-05-20 10:49:33 +00:00
|
|
|
float radius[8]; // radius ofr the point query
|
2020-12-19 13:50:20 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Structure of a packet of 16 query points */
|
|
|
|
struct RTC_ALIGN(64) RTCPointQuery16
|
|
|
|
{
|
|
|
|
float x[16]; // x coordinate of the query point
|
|
|
|
float y[16]; // y coordinate of the query point
|
|
|
|
float z[16]; // z coordinate of the query point
|
|
|
|
float time[16]; // time of the point quey
|
|
|
|
float radius[16]; // radius of the point query
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RTCPointQueryN;
|
|
|
|
|
|
|
|
struct RTC_ALIGN(16) RTCPointQueryContext
|
|
|
|
{
|
|
|
|
// accumulated 4x4 column major matrices from world space to instance space.
|
|
|
|
// undefined if size == 0.
|
2021-05-20 10:49:33 +00:00
|
|
|
float world2inst[RTC_MAX_INSTANCE_LEVEL_COUNT][16];
|
2020-12-19 13:50:20 +00:00
|
|
|
|
|
|
|
// accumulated 4x4 column major matrices from instance space to world space.
|
|
|
|
// undefined if size == 0.
|
2021-05-20 10:49:33 +00:00
|
|
|
float inst2world[RTC_MAX_INSTANCE_LEVEL_COUNT][16];
|
2020-12-19 13:50:20 +00:00
|
|
|
|
|
|
|
// 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(struct RTCPointQueryContext* context)
|
|
|
|
{
|
|
|
|
context->instStackSize = 0;
|
|
|
|
context->instID[0] = RTC_INVALID_GEOMETRY_ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct RTC_ALIGN(16) RTCPointQueryFunctionArguments
|
|
|
|
{
|
|
|
|
// The (world space) 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.
|
|
|
|
struct RTCPointQuery* query;
|
|
|
|
|
|
|
|
// Used for user input/output data. Will not be read or modified internally.
|
|
|
|
void* userPtr;
|
|
|
|
|
|
|
|
// primitive and geometry ID of primitive
|
2021-05-20 10:49:33 +00:00
|
|
|
unsigned int primID;
|
|
|
|
unsigned int geomID;
|
2020-12-19 13:50:20 +00:00
|
|
|
|
|
|
|
// the context with transformation and instance ID stack
|
|
|
|
struct RTCPointQueryContext* context;
|
|
|
|
|
2021-05-20 10:49:33 +00:00
|
|
|
// If the current instance transform M (= context->world2inst[context->instStackSize])
|
2020-12-19 13:50:20 +00:00
|
|
|
// 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 bool (*RTCPointQueryFunction)(struct RTCPointQueryFunctionArguments* args);
|
2021-05-20 10:49:33 +00:00
|
|
|
|
2020-12-19 13:50:20 +00:00
|
|
|
RTC_NAMESPACE_END
|