123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- // Copyright 2009-2021 Intel Corporation
- // 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
- #if defined(_WIN32) && !defined(__MINGW32__)
- # 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
- #if defined(_WIN32)
- # 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 */
- 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 of the point query
- float radius; // radius of the point query
- };
- /* 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
- float radius[8]; // radius ofr the point query
- };
- /* 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.
- 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(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
- unsigned int primID;
- unsigned int geomID;
- // the context with transformation and instance ID stack
- struct RTCPointQueryContext* 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 bool (*RTCPointQueryFunction)(struct RTCPointQueryFunctionArguments* args);
-
- RTC_NAMESPACE_END
|