// 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