1// Copyright 2009-2021 Intel Corporation
2// SPDX-License-Identifier: Apache-2.0
3
4#pragma once
5
6#include "rtcore_scene.h"
7
8RTC_NAMESPACE_BEGIN
9
10/* Opaque BVH type */
11typedef struct RTCBVHTy* RTCBVH;
12
13/* Input build primitives for the builder */
14struct RTC_ALIGN(32) RTCBuildPrimitive
15{
16 float lower_x, lower_y, lower_z;
17 unsigned int geomID;
18 float upper_x, upper_y, upper_z;
19 unsigned int primID;
20};
21
22/* Opaque thread local allocator type */
23typedef struct RTCThreadLocalAllocatorTy* RTCThreadLocalAllocator;
24
25/* Callback to create a node */
26typedef void* (*RTCCreateNodeFunction) (RTCThreadLocalAllocator allocator, unsigned int childCount, void* userPtr);
27
28/* Callback to set the pointer to all children */
29typedef void (*RTCSetNodeChildrenFunction) (void* nodePtr, void** children, unsigned int childCount, void* userPtr);
30
31/* Callback to set the bounds of all children */
32typedef void (*RTCSetNodeBoundsFunction) (void* nodePtr, const struct RTCBounds** bounds, unsigned int childCount, void* userPtr);
33
34/* Callback to create a leaf node */
35typedef void* (*RTCCreateLeafFunction) (RTCThreadLocalAllocator allocator, const struct RTCBuildPrimitive* primitives, size_t primitiveCount, void* userPtr);
36
37/* Callback to split a build primitive */
38typedef void (*RTCSplitPrimitiveFunction) (const struct RTCBuildPrimitive* primitive, unsigned int dimension, float position, struct RTCBounds* leftBounds, struct RTCBounds* rightBounds, void* userPtr);
39
40/* Build flags */
41enum RTCBuildFlags
42{
43 RTC_BUILD_FLAG_NONE = 0,
44 RTC_BUILD_FLAG_DYNAMIC = (1 << 0),
45};
46
47enum RTCBuildConstants
48{
49 RTC_BUILD_MAX_PRIMITIVES_PER_LEAF = 32
50};
51
52/* Input for builders */
53struct RTCBuildArguments
54{
55 size_t byteSize;
56
57 enum RTCBuildQuality buildQuality;
58 enum RTCBuildFlags buildFlags;
59 unsigned int maxBranchingFactor;
60 unsigned int maxDepth;
61 unsigned int sahBlockSize;
62 unsigned int minLeafSize;
63 unsigned int maxLeafSize;
64 float traversalCost;
65 float intersectionCost;
66
67 RTCBVH bvh;
68 struct RTCBuildPrimitive* primitives;
69 size_t primitiveCount;
70 size_t primitiveArrayCapacity;
71
72 RTCCreateNodeFunction createNode;
73 RTCSetNodeChildrenFunction setNodeChildren;
74 RTCSetNodeBoundsFunction setNodeBounds;
75 RTCCreateLeafFunction createLeaf;
76 RTCSplitPrimitiveFunction splitPrimitive;
77 RTCProgressMonitorFunction buildProgress;
78 void* userPtr;
79};
80
81/* Returns the default build settings. */
82RTC_FORCEINLINE struct RTCBuildArguments rtcDefaultBuildArguments()
83{
84 struct RTCBuildArguments args;
85 args.byteSize = sizeof(args);
86 args.buildQuality = RTC_BUILD_QUALITY_MEDIUM;
87 args.buildFlags = RTC_BUILD_FLAG_NONE;
88 args.maxBranchingFactor = 2;
89 args.maxDepth = 32;
90 args.sahBlockSize = 1;
91 args.minLeafSize = 1;
92 args.maxLeafSize = RTC_BUILD_MAX_PRIMITIVES_PER_LEAF;
93 args.traversalCost = 1.0f;
94 args.intersectionCost = 1.0f;
95 args.bvh = NULL;
96 args.primitives = NULL;
97 args.primitiveCount = 0;
98 args.primitiveArrayCapacity = 0;
99 args.createNode = NULL;
100 args.setNodeChildren = NULL;
101 args.setNodeBounds = NULL;
102 args.createLeaf = NULL;
103 args.splitPrimitive = NULL;
104 args.buildProgress = NULL;
105 args.userPtr = NULL;
106 return args;
107}
108
109/* Creates a new BVH. */
110RTC_API RTCBVH rtcNewBVH(RTCDevice device);
111
112/* Builds a BVH. */
113RTC_API void* rtcBuildBVH(const struct RTCBuildArguments* args);
114
115/* Allocates memory using the thread local allocator. */
116RTC_API void* rtcThreadLocalAlloc(RTCThreadLocalAllocator allocator, size_t bytes, size_t align);
117
118/* Retains the BVH (increments reference count). */
119RTC_API void rtcRetainBVH(RTCBVH bvh);
120
121/* Releases the BVH (decrements reference count). */
122RTC_API void rtcReleaseBVH(RTCBVH bvh);
123
124RTC_NAMESPACE_END
125
126