WIP: Vulkan: Workbench #107886
|
@ -79,6 +79,7 @@ struct CCLShadowContext
|
|||
#endif
|
||||
IntegratorShadowState isect_s;
|
||||
float throughput;
|
||||
float max_t;
|
||||
bool opaque_hit;
|
||||
numhit_t max_hits;
|
||||
numhit_t num_hits;
|
||||
|
@ -314,7 +315,7 @@ ccl_device_forceinline void kernel_embree_filter_occluded_shadow_all_func_impl(
|
|||
/* Current implementation in Cycles assumes only single-ray intersection queries. */
|
||||
assert(args->N == 1);
|
||||
|
||||
RTCRay *ray = (RTCRay *)args->ray;
|
||||
const RTCRay *ray = (RTCRay *)args->ray;
|
||||
RTCHit *hit = (RTCHit *)args->hit;
|
||||
#if EMBREE_MAJOR_VERSION >= 4
|
||||
CCLShadowContext *ctx = (CCLShadowContext *)(args->context);
|
||||
|
@ -367,42 +368,51 @@ ccl_device_forceinline void kernel_embree_filter_occluded_shadow_all_func_impl(
|
|||
}
|
||||
}
|
||||
|
||||
/* Test if we need to record this transparent intersection. */
|
||||
const numhit_t max_record_hits = min(ctx->max_hits, numhit_t(INTEGRATOR_SHADOW_ISECT_SIZE));
|
||||
if (ctx->num_recorded_hits < max_record_hits) {
|
||||
/* If maximum number of hits was reached, replace the intersection with the
|
||||
* highest distance. We want to find the N closest intersections. */
|
||||
const numhit_t num_recorded_hits = min(ctx->num_recorded_hits, max_record_hits);
|
||||
numhit_t isect_index = num_recorded_hits;
|
||||
if (num_recorded_hits + 1 >= max_record_hits) {
|
||||
float max_t = INTEGRATOR_STATE_ARRAY(ctx->isect_s, shadow_isect, 0, t);
|
||||
numhit_t max_recorded_hit = numhit_t(0);
|
||||
|
||||
for (numhit_t i = numhit_t(1); i < num_recorded_hits; ++i) {
|
||||
const float isect_t = INTEGRATOR_STATE_ARRAY(ctx->isect_s, shadow_isect, i, t);
|
||||
if (isect_t > max_t) {
|
||||
max_recorded_hit = i;
|
||||
max_t = isect_t;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_recorded_hits >= max_record_hits) {
|
||||
isect_index = max_recorded_hit;
|
||||
}
|
||||
|
||||
/* Limit the ray distance and stop counting hits beyond this. */
|
||||
ray->tfar = max(current_isect.t, max_t);
|
||||
}
|
||||
|
||||
integrator_state_write_shadow_isect(ctx->isect_s, ¤t_isect, isect_index);
|
||||
}
|
||||
numhit_t isect_index = ctx->num_recorded_hits;
|
||||
|
||||
/* Always increase the number of recorded hits, even beyond the maximum,
|
||||
* so that we can detect this and trace another ray if needed. */
|
||||
* so that we can detect this and trace another ray if needed.
|
||||
* More details about the related logic can be found in implementation of
|
||||
* "shadow_intersections_has_remaining" and "integrate_transparent_shadow"
|
||||
* functions. */
|
||||
++ctx->num_recorded_hits;
|
||||
|
||||
/* This tells Embree to continue tracing. */
|
||||
*args->valid = 0;
|
||||
|
||||
const numhit_t max_record_hits = min(ctx->max_hits, numhit_t(INTEGRATOR_SHADOW_ISECT_SIZE));
|
||||
/* If the maximum number of hits was reached, replace the furthest intersection
|
||||
* with a closer one so we get the N closest intersections. */
|
||||
if (isect_index >= max_record_hits) {
|
||||
/* When recording only N closest hits, max_t will always only decrease.
|
||||
* So let's test if we are already not meeting criteria and can skip max_t recalculation. */
|
||||
if (current_isect.t >= ctx->max_t) {
|
||||
return;
|
||||
}
|
||||
|
||||
float max_t = INTEGRATOR_STATE_ARRAY(ctx->isect_s, shadow_isect, 0, t);
|
||||
numhit_t max_recorded_hit = numhit_t(0);
|
||||
|
||||
for (numhit_t i = numhit_t(1); i < max_record_hits; ++i) {
|
||||
const float isect_t = INTEGRATOR_STATE_ARRAY(ctx->isect_s, shadow_isect, i, t);
|
||||
if (isect_t > max_t) {
|
||||
max_recorded_hit = i;
|
||||
max_t = isect_t;
|
||||
}
|
||||
}
|
||||
|
||||
isect_index = max_recorded_hit;
|
||||
|
||||
/* Limit the ray distance and avoid processing hits beyond this. */
|
||||
ctx->max_t = max_t;
|
||||
|
||||
/* If it's further away than max_t, we don't record this transparent intersection. */
|
||||
if (current_isect.t >= max_t) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
integrator_state_write_shadow_isect(ctx->isect_s, ¤t_isect, isect_index);
|
||||
}
|
||||
|
||||
ccl_device_forceinline void kernel_embree_filter_occluded_local_func_impl(
|
||||
|
|
|
@ -2408,7 +2408,10 @@ void uiTemplateImage(uiLayout *layout,
|
|||
struct PointerRNA *userptr,
|
||||
bool compact,
|
||||
bool multiview);
|
||||
void uiTemplateImageSettings(uiLayout *layout, struct PointerRNA *imfptr, bool color_management);
|
||||
void uiTemplateImageSettings(uiLayout *layout,
|
||||
struct PointerRNA *imfptr,
|
||||
bool color_management,
|
||||
bool show_z_buffer);
|
||||
void uiTemplateImageStereo3d(uiLayout *layout, struct PointerRNA *stereo3d_format_ptr);
|
||||
void uiTemplateImageViews(uiLayout *layout, struct PointerRNA *imaptr);
|
||||
void uiTemplateImageFormatViews(uiLayout *layout,
|
||||
|
|
|
@ -218,7 +218,7 @@ static void screenshot_draw(bContext *UNUSED(C), wmOperator *op)
|
|||
/* image template */
|
||||
PointerRNA ptr;
|
||||
RNA_pointer_create(NULL, &RNA_ImageFormatSettings, &scd->im_format, &ptr);
|
||||
uiTemplateImageSettings(layout, &ptr, false);
|
||||
uiTemplateImageSettings(layout, &ptr, false, true);
|
||||
|
||||
/* main draw call */
|
||||
uiDefAutoButsRNA(
|
||||
|
|
|
@ -962,7 +962,10 @@ void uiTemplateImage(uiLayout *layout,
|
|||
UI_block_funcN_set(block, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void uiTemplateImageSettings(uiLayout *layout, PointerRNA *imfptr, bool color_management)
|
||||
void uiTemplateImageSettings(uiLayout *layout,
|
||||
PointerRNA *imfptr,
|
||||
bool color_management,
|
||||
bool show_z_buffer)
|
||||
{
|
||||
ImageFormatData *imf = imfptr->data;
|
||||
ID *id = imfptr->owner_id;
|
||||
|
@ -1014,7 +1017,7 @@ void uiTemplateImageSettings(uiLayout *layout, PointerRNA *imfptr, bool color_ma
|
|||
uiItemR(col, imfptr, "exr_codec", 0, NULL, ICON_NONE);
|
||||
}
|
||||
|
||||
if (BKE_imtype_supports_zbuf(imf->imtype)) {
|
||||
if (BKE_imtype_supports_zbuf(imf->imtype) && show_z_buffer) {
|
||||
uiItemR(col, imfptr, "use_zbuffer", 0, NULL, ICON_NONE);
|
||||
}
|
||||
|
||||
|
|
|
@ -2007,7 +2007,7 @@ static void image_save_as_draw(bContext *UNUSED(C), wmOperator *op)
|
|||
|
||||
/* Image format settings. */
|
||||
RNA_pointer_create(NULL, &RNA_ImageFormatSettings, &isd->opts.im_format, &imf_ptr);
|
||||
uiTemplateImageSettings(layout, &imf_ptr, save_as_render);
|
||||
uiTemplateImageSettings(layout, &imf_ptr, save_as_render, true);
|
||||
|
||||
if (!save_as_render) {
|
||||
PointerRNA linear_settings_ptr = RNA_pointer_get(&imf_ptr, "linear_colorspace_settings");
|
||||
|
|
|
@ -1637,6 +1637,7 @@ void RNA_api_ui_layout(StructRNA *srna)
|
|||
parm = RNA_def_pointer(func, "image_settings", "ImageFormatSettings", "", "");
|
||||
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
|
||||
RNA_def_boolean(func, "color_management", false, "", "Show color management settings");
|
||||
RNA_def_boolean(func, "show_z_buffer", true, "", "Show option to save z-buffer");
|
||||
|
||||
func = RNA_def_function(srna, "template_image_stereo_3d", "uiTemplateImageStereo3d");
|
||||
RNA_def_function_ui_description(func, "User interface for setting image stereo 3d options");
|
||||
|
|
|
@ -305,9 +305,11 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi
|
|||
const bool multilayer = RNA_enum_get(&imfptr, "file_format") == R_IMF_IMTYPE_MULTILAYER;
|
||||
const bool is_exr = RNA_enum_get(&imfptr, "file_format") == R_IMF_IMTYPE_OPENEXR;
|
||||
const bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0;
|
||||
/* Unclear where to get z-information from, so deactivate it. */
|
||||
const bool show_z_buffer = false;
|
||||
|
||||
node_composit_buts_file_output(layout, C, ptr);
|
||||
uiTemplateImageSettings(layout, &imfptr, true);
|
||||
uiTemplateImageSettings(layout, &imfptr, true, show_z_buffer);
|
||||
|
||||
/* disable stereo output for multilayer, too much work for something that no one will use */
|
||||
/* if someone asks for that we can implement it */
|
||||
|
@ -430,7 +432,7 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi
|
|||
const bool use_color_management = RNA_boolean_get(&active_input_ptr, "save_as_render");
|
||||
|
||||
col = uiLayoutColumn(layout, false);
|
||||
uiTemplateImageSettings(col, &imfptr, use_color_management);
|
||||
uiTemplateImageSettings(col, &imfptr, use_color_management, show_z_buffer);
|
||||
|
||||
if (is_multiview) {
|
||||
col = uiLayoutColumn(layout, false);
|
||||
|
|
Loading…
Reference in New Issue