diff options
author | Antonio Vazquez <blendergit@gmail.com> | 2021-05-26 13:43:03 +0300 |
---|---|---|
committer | Antonio Vazquez <blendergit@gmail.com> | 2021-05-26 13:43:03 +0300 |
commit | 8a6604f253e22bbade3dcf60b9a1c437ace44151 (patch) | |
tree | fee875d0a0b09fbe0df52aa83094159144048205 /intern/cycles/render/hair.cpp | |
parent | edf1b833674a6e54df7a16c14f0c6193fbbb482e (diff) | |
parent | afec66c024dc2b75447537d45406c06342ec201e (diff) |
Merge branch 'master' into temp-gpencil-maskingtemp-gpencil-masking
Conflicts:
source/blender/blenloader/intern/versioning_300.c
Diffstat (limited to 'intern/cycles/render/hair.cpp')
-rw-r--r-- | intern/cycles/render/hair.cpp | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/intern/cycles/render/hair.cpp b/intern/cycles/render/hair.cpp index dad235aa340..72fc612c0c0 100644 --- a/intern/cycles/render/hair.cpp +++ b/intern/cycles/render/hair.cpp @@ -494,38 +494,47 @@ void Hair::pack_curves(Scene *scene, } } -void Hair::pack_primitives(PackedBVH *pack, int object, uint visibility, bool pack_all) +void Hair::pack_primitives(PackedBVH *pack, int object, uint visibility, PackFlags pack_flags) { if (curve_first_key.empty()) return; - /* If the BVH does not have to be recreated, we can bail out. */ - if (!pack_all) { - return; + /* Separate loop as other arrays are not initialized if their packing is not required. */ + if ((pack_flags & PACK_VISIBILITY) != 0) { + unsigned int *prim_visibility = &pack->prim_visibility[optix_prim_offset]; + + size_t index = 0; + for (size_t j = 0; j < num_curves(); ++j) { + Curve curve = get_curve(j); + for (size_t k = 0; k < curve.num_segments(); ++k, ++index) { + prim_visibility[index] = visibility; + } + } } - unsigned int *prim_tri_index = &pack->prim_tri_index[optix_prim_offset]; - int *prim_type = &pack->prim_type[optix_prim_offset]; - unsigned int *prim_visibility = &pack->prim_visibility[optix_prim_offset]; - int *prim_index = &pack->prim_index[optix_prim_offset]; - int *prim_object = &pack->prim_object[optix_prim_offset]; - // 'pack->prim_time' is unused by Embree and OptiX - - uint type = has_motion_blur() ? - ((curve_shape == CURVE_RIBBON) ? PRIMITIVE_MOTION_CURVE_RIBBON : - PRIMITIVE_MOTION_CURVE_THICK) : - ((curve_shape == CURVE_RIBBON) ? PRIMITIVE_CURVE_RIBBON : PRIMITIVE_CURVE_THICK); - - size_t index = 0; - for (size_t j = 0; j < num_curves(); ++j) { - Curve curve = get_curve(j); - for (size_t k = 0; k < curve.num_segments(); ++k, ++index) { - prim_tri_index[index] = -1; - prim_type[index] = PRIMITIVE_PACK_SEGMENT(type, k); - prim_visibility[index] = visibility; - // Each curve segment points back to its curve index - prim_index[index] = j + prim_offset; - prim_object[index] = object; + if ((pack_flags & PACK_GEOMETRY) != 0) { + unsigned int *prim_tri_index = &pack->prim_tri_index[optix_prim_offset]; + int *prim_type = &pack->prim_type[optix_prim_offset]; + int *prim_index = &pack->prim_index[optix_prim_offset]; + int *prim_object = &pack->prim_object[optix_prim_offset]; + // 'pack->prim_time' is unused by Embree and OptiX + + uint type = has_motion_blur() ? + ((curve_shape == CURVE_RIBBON) ? PRIMITIVE_MOTION_CURVE_RIBBON : + PRIMITIVE_MOTION_CURVE_THICK) : + ((curve_shape == CURVE_RIBBON) ? PRIMITIVE_CURVE_RIBBON : + PRIMITIVE_CURVE_THICK); + + size_t index = 0; + for (size_t j = 0; j < num_curves(); ++j) { + Curve curve = get_curve(j); + for (size_t k = 0; k < curve.num_segments(); ++k, ++index) { + prim_tri_index[index] = -1; + prim_type[index] = PRIMITIVE_PACK_SEGMENT(type, k); + // Each curve segment points back to its curve index + prim_index[index] = j + prim_offset; + prim_object[index] = object; + } } } } |