125 lines
3.6 KiB
C++
125 lines
3.6 KiB
C++
// Copyright 2009-2021 Intel Corporation
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
#pragma once
|
|
|
|
#include "rtcore_scene.h"
|
|
|
|
RTC_NAMESPACE_BEGIN
|
|
|
|
/* Opaque BVH type */
|
|
typedef struct RTCBVHTy* RTCBVH;
|
|
|
|
/* Input build primitives for the builder */
|
|
struct RTC_ALIGN(32) RTCBuildPrimitive
|
|
{
|
|
float lower_x, lower_y, lower_z;
|
|
unsigned int geomID;
|
|
float upper_x, upper_y, upper_z;
|
|
unsigned int primID;
|
|
};
|
|
|
|
/* Opaque thread local allocator type */
|
|
typedef struct RTCThreadLocalAllocatorTy* RTCThreadLocalAllocator;
|
|
|
|
/* Callback to create a node */
|
|
typedef void* (*RTCCreateNodeFunction) (RTCThreadLocalAllocator allocator, unsigned int childCount, void* userPtr);
|
|
|
|
/* Callback to set the pointer to all children */
|
|
typedef void (*RTCSetNodeChildrenFunction) (void* nodePtr, void** children, unsigned int childCount, void* userPtr);
|
|
|
|
/* Callback to set the bounds of all children */
|
|
typedef void (*RTCSetNodeBoundsFunction) (void* nodePtr, const struct RTCBounds** bounds, unsigned int childCount, void* userPtr);
|
|
|
|
/* Callback to create a leaf node */
|
|
typedef void* (*RTCCreateLeafFunction) (RTCThreadLocalAllocator allocator, const struct RTCBuildPrimitive* primitives, size_t primitiveCount, void* userPtr);
|
|
|
|
/* Callback to split a build primitive */
|
|
typedef void (*RTCSplitPrimitiveFunction) (const struct RTCBuildPrimitive* primitive, unsigned int dimension, float position, struct RTCBounds* leftBounds, struct RTCBounds* rightBounds, void* userPtr);
|
|
|
|
/* Build flags */
|
|
enum RTCBuildFlags
|
|
{
|
|
RTC_BUILD_FLAG_NONE = 0,
|
|
RTC_BUILD_FLAG_DYNAMIC = (1 << 0),
|
|
};
|
|
|
|
enum RTCBuildConstants
|
|
{
|
|
RTC_BUILD_MAX_PRIMITIVES_PER_LEAF = 32
|
|
};
|
|
|
|
/* Input for builders */
|
|
struct RTCBuildArguments
|
|
{
|
|
size_t byteSize;
|
|
|
|
enum RTCBuildQuality buildQuality;
|
|
enum RTCBuildFlags buildFlags;
|
|
unsigned int maxBranchingFactor;
|
|
unsigned int maxDepth;
|
|
unsigned int sahBlockSize;
|
|
unsigned int minLeafSize;
|
|
unsigned int maxLeafSize;
|
|
float traversalCost;
|
|
float intersectionCost;
|
|
|
|
RTCBVH bvh;
|
|
struct RTCBuildPrimitive* primitives;
|
|
size_t primitiveCount;
|
|
size_t primitiveArrayCapacity;
|
|
|
|
RTCCreateNodeFunction createNode;
|
|
RTCSetNodeChildrenFunction setNodeChildren;
|
|
RTCSetNodeBoundsFunction setNodeBounds;
|
|
RTCCreateLeafFunction createLeaf;
|
|
RTCSplitPrimitiveFunction splitPrimitive;
|
|
RTCProgressMonitorFunction buildProgress;
|
|
void* userPtr;
|
|
};
|
|
|
|
/* Returns the default build settings. */
|
|
RTC_FORCEINLINE struct RTCBuildArguments rtcDefaultBuildArguments()
|
|
{
|
|
struct RTCBuildArguments args;
|
|
args.byteSize = sizeof(args);
|
|
args.buildQuality = RTC_BUILD_QUALITY_MEDIUM;
|
|
args.buildFlags = RTC_BUILD_FLAG_NONE;
|
|
args.maxBranchingFactor = 2;
|
|
args.maxDepth = 32;
|
|
args.sahBlockSize = 1;
|
|
args.minLeafSize = 1;
|
|
args.maxLeafSize = RTC_BUILD_MAX_PRIMITIVES_PER_LEAF;
|
|
args.traversalCost = 1.0f;
|
|
args.intersectionCost = 1.0f;
|
|
args.bvh = NULL;
|
|
args.primitives = NULL;
|
|
args.primitiveCount = 0;
|
|
args.primitiveArrayCapacity = 0;
|
|
args.createNode = NULL;
|
|
args.setNodeChildren = NULL;
|
|
args.setNodeBounds = NULL;
|
|
args.createLeaf = NULL;
|
|
args.splitPrimitive = NULL;
|
|
args.buildProgress = NULL;
|
|
args.userPtr = NULL;
|
|
return args;
|
|
}
|
|
|
|
/* Creates a new BVH. */
|
|
RTC_API RTCBVH rtcNewBVH(RTCDevice device);
|
|
|
|
/* Builds a BVH. */
|
|
RTC_API void* rtcBuildBVH(const struct RTCBuildArguments* args);
|
|
|
|
/* Allocates memory using the thread local allocator. */
|
|
RTC_API void* rtcThreadLocalAlloc(RTCThreadLocalAllocator allocator, size_t bytes, size_t align);
|
|
|
|
/* Retains the BVH (increments reference count). */
|
|
RTC_API void rtcRetainBVH(RTCBVH bvh);
|
|
|
|
/* Releases the BVH (decrements reference count). */
|
|
RTC_API void rtcReleaseBVH(RTCBVH bvh);
|
|
|
|
RTC_NAMESPACE_END
|
|
|