5353# include " util/util_logging.h"
5454# include " util/util_progress.h"
5555# include " util/util_stats.h"
56- # include " util/util_hash.h"
5756
5857CCL_NAMESPACE_BEGIN
5958
@@ -242,7 +241,8 @@ static void rtc_filter_func_thick_curve(const RTC_NAMESPACE::RTCFilterFunctionNA
242241 }
243242}
244243
245- static void rtc_filter_occluded_func_thick_curve (const RTC_NAMESPACE::RTCFilterFunctionNArguments *args)
244+ static void rtc_filter_occluded_func_thick_curve (
245+ const RTC_NAMESPACE::RTCFilterFunctionNArguments *args)
246246{
247247 const RTC_NAMESPACE::RTCRay *ray = (RTC_NAMESPACE::RTCRay *)args->ray ;
248248 RTC_NAMESPACE::RTCHit *hit = (RTC_NAMESPACE::RTCHit *)args->hit ;
@@ -257,11 +257,22 @@ static void rtc_filter_occluded_func_thick_curve(const RTC_NAMESPACE::RTCFilterF
257257 rtc_filter_occluded_func (args);
258258}
259259
260+ /* Base two radical inverse
261+ * https://www.pbr-book.org/3ed-2018/Sampling_and_Reconstruction/The_Halton_Sampler */
262+ inline uint reverse_bits_32 (uint n)
263+ {
264+ n = (n << 16 ) | (n >> 16 );
265+ n = ((n & 0x00ff00ff ) << 8 ) | ((n & 0xff00ff00 ) >> 8 );
266+ n = ((n & 0x0f0f0f0f ) << 4 ) | ((n & 0xf0f0f0f0 ) >> 4 );
267+ n = ((n & 0x33333333 ) << 2 ) | ((n & 0xcccccccc ) >> 2 );
268+ n = ((n & 0x55555555 ) << 1 ) | ((n & 0xaaaaaaaa ) >> 1 );
269+ return n;
270+ }
271+
260272/* Generate a pseudo random bit sequence trying to keep disjoint spans uncorrelated.
261- https://research.nvidia.com/publication/stratified-sampling-stochastic-transparency
262- */
263- inline float get_opacity_stratified (uint rng_pixel_sample, uint rng_surface) {
264- // pixel_id + sample * num_samples
273+ https://research.nvidia.com/publication/stratified-sampling-stochastic-transparency */
274+ inline float get_opacity_stratified (uint rng_pixel_sample, uint rng_surface)
275+ {
265276 uint x = reverse_bits_32 (rng_pixel_sample) + rng_surface;
266277 x = x ^ (x * 0x6C50B47Cu );
267278 x = x ^ (x * 0xB82F1E52u );
@@ -270,7 +281,8 @@ inline float get_opacity_stratified(uint rng_pixel_sample, uint rng_surface) {
270281 return (float )(x * 0x1p-32 );
271282}
272283
273- static void rtc_filter_func_transparent_points (const RTC_NAMESPACE::RTCFilterFunctionNArguments *args)
284+ static void rtc_filter_func_transparent_points (
285+ const RTC_NAMESPACE::RTCFilterFunctionNArguments *args)
274286{
275287 const RTC_NAMESPACE::RTCRay *ray = (RTC_NAMESPACE::RTCRay *)args->ray ;
276288 RTC_NAMESPACE::RTCHit *hit = (RTC_NAMESPACE::RTCHit *)args->hit ;
@@ -289,14 +301,14 @@ static void rtc_filter_func_transparent_points(const RTC_NAMESPACE::RTCFilterFun
289301 const float opacity = kernel_tex_fetch (__points_opacity, opacity_offset);
290302
291303 /* Unique random number per ray per geometry */
292- const float rand_opacity = cmj_randfloat (ctx->rng_transparent , cmj_hash (object, prim));
293-
304+ const float rand_opacity = get_opacity_stratified (ctx->rng_transparent , cmj_hash (object, prim));
294305 if (rand_opacity > opacity) {
295306 *args->valid = 0 ;
296307 }
297308}
298309
299- static void rtc_filter_occluded_func_transparent_points (const RTC_NAMESPACE::RTCFilterFunctionNArguments *args)
310+ static void rtc_filter_occluded_func_transparent_points (
311+ const RTC_NAMESPACE::RTCFilterFunctionNArguments *args)
300312{
301313 rtc_filter_func_transparent_points (args);
302314 if (*args->valid ) {
@@ -394,34 +406,39 @@ BVHEmbree::BVHEmbree(const BVHParams ¶ms_,
394406 if (rtc_shared_users == 0 ) {
395407 rtc_shared_device = RTC_NAMESPACE::rtcNewDevice (" verbose=0" );
396408 /* Check here if Embree was built with the correct flags. */
397- ssize_t ret = rtcGetDeviceProperty (rtc_shared_device, RTC_NAMESPACE::RTC_DEVICE_PROPERTY_RAY_MASK_SUPPORTED);
409+ ssize_t ret = rtcGetDeviceProperty (rtc_shared_device,
410+ RTC_NAMESPACE::RTC_DEVICE_PROPERTY_RAY_MASK_SUPPORTED);
398411 if (ret != 1 ) {
399412 assert (0 );
400413 VLOG (1 ) << " Embree is compiled without the RTC_DEVICE_PROPERTY_RAY_MASK_SUPPORTED flag."
401414 " Ray visibility will not work." ;
402415 }
403- ret = rtcGetDeviceProperty (rtc_shared_device, RTC_NAMESPACE::RTC_DEVICE_PROPERTY_FILTER_FUNCTION_SUPPORTED);
416+ ret = rtcGetDeviceProperty (rtc_shared_device,
417+ RTC_NAMESPACE::RTC_DEVICE_PROPERTY_FILTER_FUNCTION_SUPPORTED);
404418 if (ret != 1 ) {
405419 assert (0 );
406420 VLOG (1 )
407421 << " Embree is compiled without the RTC_DEVICE_PROPERTY_FILTER_FUNCTION_SUPPORTED flag."
408422 " Renders may not look as expected." ;
409423 }
410- ret = rtcGetDeviceProperty (rtc_shared_device, RTC_NAMESPACE::RTC_DEVICE_PROPERTY_CURVE_GEOMETRY_SUPPORTED);
424+ ret = rtcGetDeviceProperty (rtc_shared_device,
425+ RTC_NAMESPACE::RTC_DEVICE_PROPERTY_CURVE_GEOMETRY_SUPPORTED);
411426 if (ret != 1 ) {
412427 assert (0 );
413428 VLOG (1 )
414429 << " Embree is compiled without the RTC_DEVICE_PROPERTY_CURVE_GEOMETRY_SUPPORTED flag. "
415430 " Line primitives will not be rendered." ;
416431 }
417- ret = rtcGetDeviceProperty (rtc_shared_device, RTC_NAMESPACE::RTC_DEVICE_PROPERTY_TRIANGLE_GEOMETRY_SUPPORTED);
432+ ret = rtcGetDeviceProperty (rtc_shared_device,
433+ RTC_NAMESPACE::RTC_DEVICE_PROPERTY_TRIANGLE_GEOMETRY_SUPPORTED);
418434 if (ret != 1 ) {
419435 assert (0 );
420436 VLOG (1 ) << " Embree is compiled without the RTC_DEVICE_PROPERTY_TRIANGLE_GEOMETRY_SUPPORTED "
421437 " flag. "
422438 " Triangle primitives will not be rendered." ;
423439 }
424- ret = rtcGetDeviceProperty (rtc_shared_device, RTC_NAMESPACE::RTC_DEVICE_PROPERTY_BACKFACE_CULLING_ENABLED);
440+ ret = rtcGetDeviceProperty (rtc_shared_device,
441+ RTC_NAMESPACE::RTC_DEVICE_PROPERTY_BACKFACE_CULLING_ENABLED);
425442 if (ret != 0 ) {
426443 assert (0 );
427444 VLOG (1 ) << " Embree is compiled with the RTC_DEVICE_PROPERTY_BACKFACE_CULLING_ENABLED flag. "
@@ -493,12 +510,15 @@ void BVHEmbree::build(Progress &progress, Stats *stats_)
493510 const bool dynamic = params.bvh_type == SceneParams::BVH_DYNAMIC;
494511
495512 scene = rtcNewScene (rtc_shared_device);
496- const RTC_NAMESPACE::RTCSceneFlags scene_flags = (dynamic ? RTC_NAMESPACE::RTC_SCENE_FLAG_DYNAMIC : RTC_NAMESPACE::RTC_SCENE_FLAG_NONE) |
497- RTC_NAMESPACE::RTC_SCENE_FLAG_COMPACT | RTC_NAMESPACE::RTC_SCENE_FLAG_ROBUST;
513+ const RTC_NAMESPACE::RTCSceneFlags scene_flags = (dynamic ?
514+ RTC_NAMESPACE::RTC_SCENE_FLAG_DYNAMIC :
515+ RTC_NAMESPACE::RTC_SCENE_FLAG_NONE) |
516+ RTC_NAMESPACE::RTC_SCENE_FLAG_COMPACT |
517+ RTC_NAMESPACE::RTC_SCENE_FLAG_ROBUST;
498518 rtcSetSceneFlags (scene, scene_flags);
499519 build_quality = dynamic ? RTC_NAMESPACE::RTC_BUILD_QUALITY_LOW :
500520 (params.use_spatial_split ? RTC_NAMESPACE::RTC_BUILD_QUALITY_HIGH :
501- RTC_NAMESPACE::RTC_BUILD_QUALITY_MEDIUM);
521+ RTC_NAMESPACE::RTC_BUILD_QUALITY_MEDIUM);
502522 rtcSetSceneBuildQuality (scene, build_quality);
503523
504524 /* Count triangles and curves first, reserve arrays once. */
@@ -625,7 +645,8 @@ void BVHEmbree::add_instance(Object *ob, int i)
625645 const size_t num_motion_steps = min (num_object_motion_steps, RTC_MAX_TIME_STEP_COUNT);
626646 assert (num_object_motion_steps <= RTC_MAX_TIME_STEP_COUNT);
627647
628- RTC_NAMESPACE::RTCGeometry geom_id = rtcNewGeometry (rtc_shared_device, RTC_NAMESPACE::RTC_GEOMETRY_TYPE_INSTANCE);
648+ RTC_NAMESPACE::RTCGeometry geom_id = rtcNewGeometry (rtc_shared_device,
649+ RTC_NAMESPACE::RTC_GEOMETRY_TYPE_INSTANCE);
629650 rtcSetGeometryInstancedScene (geom_id, instance_bvh->scene );
630651 rtcSetGeometryTimeStepCount (geom_id, num_motion_steps);
631652
@@ -647,7 +668,8 @@ void BVHEmbree::add_instance(Object *ob, int i)
647668 }
648669 }
649670 else {
650- rtcSetGeometryTransform (geom_id, 0 , RTC_NAMESPACE::RTC_FORMAT_FLOAT3X4_ROW_MAJOR, (const float *)&ob->tfm );
671+ rtcSetGeometryTransform (
672+ geom_id, 0 , RTC_NAMESPACE::RTC_FORMAT_FLOAT3X4_ROW_MAJOR, (const float *)&ob->tfm );
651673 }
652674
653675 pack.prim_index .push_back_slow (-1 );
@@ -679,12 +701,17 @@ void BVHEmbree::add_triangles(const Object *ob, const Mesh *mesh, int i)
679701 assert (num_geometry_motion_steps <= RTC_MAX_TIME_STEP_COUNT);
680702
681703 const size_t num_triangles = mesh->num_triangles ();
682- RTC_NAMESPACE::RTCGeometry geom_id = RTC_NAMESPACE::rtcNewGeometry (rtc_shared_device, RTC_NAMESPACE::RTC_GEOMETRY_TYPE_TRIANGLE);
704+ RTC_NAMESPACE::RTCGeometry geom_id = RTC_NAMESPACE::rtcNewGeometry (
705+ rtc_shared_device, RTC_NAMESPACE::RTC_GEOMETRY_TYPE_TRIANGLE);
683706 rtcSetGeometryBuildQuality (geom_id, build_quality);
684707 rtcSetGeometryTimeStepCount (geom_id, num_motion_steps);
685708
686- unsigned *rtc_indices = (unsigned *)rtcSetNewGeometryBuffer (
687- geom_id, RTC_NAMESPACE::RTC_BUFFER_TYPE_INDEX, 0 , RTC_NAMESPACE::RTC_FORMAT_UINT3, sizeof (int ) * 3 , num_triangles);
709+ unsigned *rtc_indices = (unsigned *)rtcSetNewGeometryBuffer (geom_id,
710+ RTC_NAMESPACE::RTC_BUFFER_TYPE_INDEX,
711+ 0 ,
712+ RTC_NAMESPACE::RTC_FORMAT_UINT3,
713+ sizeof (int ) * 3 ,
714+ num_triangles);
688715 assert (rtc_indices);
689716 if (!rtc_indices) {
690717 VLOG (1 ) << " Embree could not create new geometry buffer for mesh " << mesh->name .c_str ()
@@ -725,7 +752,9 @@ void BVHEmbree::add_triangles(const Object *ob, const Mesh *mesh, int i)
725752 rtcReleaseGeometry (geom_id);
726753}
727754
728- void BVHEmbree::set_tri_vertex_buffer (RTC_NAMESPACE::RTCGeometry geom_id, const Mesh *mesh, const bool update)
755+ void BVHEmbree::set_tri_vertex_buffer (RTC_NAMESPACE::RTCGeometry geom_id,
756+ const Mesh *mesh,
757+ const bool update)
729758{
730759 const Attribute *attr_mP = NULL ;
731760 size_t num_motion_steps = 1 ;
@@ -754,7 +783,8 @@ void BVHEmbree::set_tri_vertex_buffer(RTC_NAMESPACE::RTCGeometry geom_id, const
754783 }
755784
756785 float *rtc_verts = (update) ?
757- (float *)rtcGetGeometryBufferData (geom_id, RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX, t) :
786+ (float *)rtcGetGeometryBufferData (
787+ geom_id, RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX, t) :
758788 (float *)rtcSetNewGeometryBuffer (geom_id,
759789 RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX,
760790 t,
@@ -778,7 +808,9 @@ void BVHEmbree::set_tri_vertex_buffer(RTC_NAMESPACE::RTCGeometry geom_id, const
778808 }
779809}
780810
781- void BVHEmbree::set_curve_vertex_buffer (RTC_NAMESPACE::RTCGeometry geom_id, const Hair *hair, const bool update)
811+ void BVHEmbree::set_curve_vertex_buffer (RTC_NAMESPACE::RTCGeometry geom_id,
812+ const Hair *hair,
813+ const bool update)
782814{
783815 const Attribute *attr_mP = NULL ;
784816 size_t num_motion_steps = 1 ;
@@ -815,12 +847,13 @@ void BVHEmbree::set_curve_vertex_buffer(RTC_NAMESPACE::RTCGeometry geom_id, cons
815847
816848 float4 *rtc_verts = (update) ? (float4 *)rtcGetGeometryBufferData (
817849 geom_id, RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX, t) :
818- (float4 *)rtcSetNewGeometryBuffer (geom_id,
819- RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX,
820- t,
821- RTC_NAMESPACE::RTC_FORMAT_FLOAT4,
822- sizeof (float ) * 4 ,
823- num_keys_embree);
850+ (float4 *)rtcSetNewGeometryBuffer (
851+ geom_id,
852+ RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX,
853+ t,
854+ RTC_NAMESPACE::RTC_FORMAT_FLOAT4,
855+ sizeof (float ) * 4 ,
856+ num_keys_embree);
824857
825858 assert (rtc_verts);
826859 if (rtc_verts) {
@@ -885,14 +918,19 @@ void BVHEmbree::add_curves(const Object *ob, const Hair *hair, int i)
885918 size_t prim_tri_index_size = pack.prim_index .size ();
886919 pack.prim_tri_index .resize (prim_tri_index_size + num_segments);
887920
888- enum RTC_NAMESPACE::RTCGeometryType type = (hair->curve_shape == CURVE_RIBBON ?
889- RTC_NAMESPACE::RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE :
890- RTC_NAMESPACE::RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE);
921+ enum RTC_NAMESPACE::RTCGeometryType type =
922+ (hair->curve_shape == CURVE_RIBBON ?
923+ RTC_NAMESPACE::RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE :
924+ RTC_NAMESPACE::RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE);
891925
892926 RTC_NAMESPACE::RTCGeometry geom_id = rtcNewGeometry (rtc_shared_device, type);
893927 rtcSetGeometryTessellationRate (geom_id, curve_subdivisions + 1 );
894- unsigned *rtc_indices = (unsigned *)rtcSetNewGeometryBuffer (
895- geom_id, RTC_NAMESPACE::RTC_BUFFER_TYPE_INDEX, 0 , RTC_NAMESPACE::RTC_FORMAT_UINT, sizeof (int ), num_segments);
928+ unsigned *rtc_indices = (unsigned *)rtcSetNewGeometryBuffer (geom_id,
929+ RTC_NAMESPACE::RTC_BUFFER_TYPE_INDEX,
930+ 0 ,
931+ RTC_NAMESPACE::RTC_FORMAT_UINT,
932+ sizeof (int ),
933+ num_segments);
896934 size_t rtc_index = 0 ;
897935 for (size_t j = 0 ; j < num_curves; ++j) {
898936 Hair::Curve c = hair->get_curve (j);
@@ -1090,12 +1128,13 @@ void BVHEmbree::set_point_vertex_buffer(RTC_NAMESPACE::RTCGeometry geom_id,
10901128
10911129 float4 *rtc_verts = (update) ? (float4 *)rtcGetGeometryBufferData (
10921130 geom_id, RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX, t) :
1093- (float4 *)rtcSetNewGeometryBuffer (geom_id,
1094- RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX,
1095- t,
1096- RTC_NAMESPACE::RTC_FORMAT_FLOAT4,
1097- sizeof (float ) * 4 ,
1098- num_points);
1131+ (float4 *)rtcSetNewGeometryBuffer (
1132+ geom_id,
1133+ RTC_NAMESPACE::RTC_BUFFER_TYPE_VERTEX,
1134+ t,
1135+ RTC_NAMESPACE::RTC_FORMAT_FLOAT4,
1136+ sizeof (float ) * 4 ,
1137+ num_points);
10991138
11001139 assert (rtc_verts);
11011140 if (rtc_verts) {
@@ -1120,12 +1159,13 @@ void BVHEmbree::set_point_vertex_buffer(RTC_NAMESPACE::RTCGeometry geom_id,
11201159
11211160 float *rtc_normals = (update) ? (float *)rtcGetGeometryBufferData (
11221161 geom_id, RTC_NAMESPACE::RTC_BUFFER_TYPE_NORMAL, t) :
1123- (float *)rtcSetNewGeometryBuffer (geom_id,
1124- RTC_NAMESPACE::RTC_BUFFER_TYPE_NORMAL,
1125- t,
1126- RTC_NAMESPACE::RTC_FORMAT_FLOAT3,
1127- sizeof (float ) * 3 ,
1128- num_points);
1162+ (float *)rtcSetNewGeometryBuffer (
1163+ geom_id,
1164+ RTC_NAMESPACE::RTC_BUFFER_TYPE_NORMAL,
1165+ t,
1166+ RTC_NAMESPACE::RTC_FORMAT_FLOAT3,
1167+ sizeof (float ) * 3 ,
1168+ num_points);
11291169 assert (rtc_normals);
11301170 if (rtc_normals) {
11311171 for (size_t j = 0 ; j < num_points; ++j) {
@@ -1217,7 +1257,8 @@ void BVHEmbree::add_points(const Object *ob, const PointCloud *pointcloud, int i
12171257 if (!pointcloud->opacity .empty ()) {
12181258 rtcSetGeometryIntersectFilterFunction (geom_id, rtc_filter_func_transparent_points);
12191259 rtcSetGeometryOccludedFilterFunction (geom_id, rtc_filter_occluded_func_transparent_points);
1220- } else {
1260+ }
1261+ else {
12211262 rtcSetGeometryOccludedFilterFunction (geom_id, rtc_filter_occluded_func);
12221263 }
12231264
0 commit comments