Compare commits
22 Commits
temp-noise
...
studio-spr
Author | SHA1 | Date | |
---|---|---|---|
082b0253a2 | |||
ebb81050c5 | |||
02fd9c2ea4 | |||
feca8c8a2a | |||
c666698479 | |||
315246b7ce | |||
3172aa9ac5 | |||
e7bf9301ac | |||
4e5bf6718e | |||
e640664cf8 | |||
7d291fae0f | |||
013d181dca | |||
19c9d18f4b | |||
5283b647b7 | |||
960bdc8f76 | |||
ee9154fd28 | |||
b08b0e1055 | |||
431018c888 | |||
d2d21a3d9d | |||
c7106d5b7f | |||
4f2bd2f2f3 | |||
b2e5ac0ab7 |
@@ -5,42 +5,42 @@
|
||||
update-code:
|
||||
git:
|
||||
submodules:
|
||||
- branch: master
|
||||
- branch: studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: release/scripts/addons
|
||||
- branch: master
|
||||
- branch: studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: release/scripts/addons_contrib
|
||||
- branch: master
|
||||
- branch: studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: release/datafiles/locale
|
||||
- branch: master
|
||||
- branch: studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: source/tools
|
||||
svn:
|
||||
libraries:
|
||||
darwin-arm64:
|
||||
branch: trunk
|
||||
branch: branches/studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: lib/darwin_arm64
|
||||
darwin-x86_64:
|
||||
branch: trunk
|
||||
branch: branches/studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: lib/darwin
|
||||
linux-x86_64:
|
||||
branch: trunk
|
||||
branch: branches/studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: lib/linux_centos7_x86_64
|
||||
windows-amd64:
|
||||
branch: trunk
|
||||
branch: branches/studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: lib/win64_vc15
|
||||
tests:
|
||||
branch: trunk
|
||||
branch: branches/studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: lib/tests
|
||||
benchmarks:
|
||||
branch: trunk
|
||||
branch: branches/studio-sprite-fright
|
||||
commit_id: HEAD
|
||||
path: lib/benchmarks
|
||||
|
||||
|
@@ -81,7 +81,7 @@ static void rtc_filter_occluded_func(const RTCFilterFunctionNArguments *args)
|
||||
if (ctx->num_hits < ctx->max_hits) {
|
||||
Intersection current_isect;
|
||||
kernel_embree_convert_hit(kg, ray, hit, ¤t_isect);
|
||||
for (size_t i = 0; i < ctx->max_hits; ++i) {
|
||||
for (size_t i = 0; i < ctx->num_hits; ++i) {
|
||||
if (current_isect.object == ctx->isect_s[i].object &&
|
||||
current_isect.prim == ctx->isect_s[i].prim && current_isect.t == ctx->isect_s[i].t) {
|
||||
/* This intersection was already recorded, skip it. */
|
||||
@@ -190,7 +190,7 @@ static void rtc_filter_occluded_func(const RTCFilterFunctionNArguments *args)
|
||||
if (ctx->num_hits < ctx->max_hits) {
|
||||
Intersection current_isect;
|
||||
kernel_embree_convert_hit(kg, ray, hit, ¤t_isect);
|
||||
for (size_t i = 0; i < ctx->max_hits; ++i) {
|
||||
for (size_t i = 0; i < ctx->num_hits; ++i) {
|
||||
if (current_isect.object == ctx->isect_s[i].object &&
|
||||
current_isect.prim == ctx->isect_s[i].prim && current_isect.t == ctx->isect_s[i].t) {
|
||||
/* This intersection was already recorded, skip it. */
|
||||
|
@@ -711,7 +711,7 @@ ccl_device_inline void curve_shader_setup(KernelGlobals *kg,
|
||||
|
||||
P = transform_point(&tfm, P);
|
||||
D = transform_direction(&tfm, D * t);
|
||||
D = normalize_len(D, &t);
|
||||
D = safe_normalize_len(D, &t);
|
||||
}
|
||||
|
||||
int prim = kernel_tex_fetch(__prim_index, isect->prim);
|
||||
@@ -765,8 +765,10 @@ ccl_device_inline void curve_shader_setup(KernelGlobals *kg,
|
||||
/* Thick curves, compute normal using direction from inside the curve.
|
||||
* This could be optimized by recording the normal in the intersection,
|
||||
* however for Optix this would go beyond the size of the payload. */
|
||||
/* NOTE: It is possible that P will be the same as P_inside (precision issues, or very small
|
||||
* radius). In this case use the view direction to approximate the normal. */
|
||||
const float3 P_inside = float4_to_float3(catmull_rom_basis_eval(P_curve, isect->u));
|
||||
const float3 Ng = normalize(P - P_inside);
|
||||
const float3 Ng = (!isequal_float3(P, P_inside)) ? normalize(P - P_inside) : -sd->I;
|
||||
|
||||
sd->N = Ng;
|
||||
sd->Ng = Ng;
|
||||
|
@@ -470,6 +470,16 @@ ccl_device void kernel_displace_evaluate(KernelGlobals *kg,
|
||||
|
||||
object_inverse_dir_transform(kg, &sd, &D);
|
||||
|
||||
#ifdef __KERNEL_DEBUG_NAN__
|
||||
if (!isfinite3_safe(D)) {
|
||||
kernel_assert(!"Cycles displacement with non-finite value detected");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Ensure finite displacement, preventing BVH from becoming degenerate and avoiding possible
|
||||
* traversal issues caused by non-finite math. */
|
||||
D = ensure_finite3(D);
|
||||
|
||||
/* write output */
|
||||
output[i] += make_float4(D.x, D.y, D.z, 0.0f);
|
||||
}
|
||||
@@ -508,6 +518,15 @@ ccl_device void kernel_background_evaluate(KernelGlobals *kg,
|
||||
shader_eval_surface(kg, &sd, &state, NULL, path_flag | PATH_RAY_EMISSION);
|
||||
float3 color = shader_background_eval(&sd);
|
||||
|
||||
#ifdef __KERNEL_DEBUG_NAN__
|
||||
if (!isfinite3_safe(color)) {
|
||||
kernel_assert(!"Cycles background with non-finite value detected");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Ensure finite color, avoiding possible numerical instabilities in the path tracing kernels. */
|
||||
color = ensure_finite3(color);
|
||||
|
||||
/* write output */
|
||||
output[i] += make_float4(color.x, color.y, color.z, 0.0f);
|
||||
}
|
||||
|
@@ -59,12 +59,13 @@ displays:
|
||||
XYZ:
|
||||
- !<View> {name: Standard, colorspace: XYZ}
|
||||
- !<View> {name: DCI, colorspace: dci_xyz}
|
||||
- !<View> {name: DCI Filmic, colorspace: dci_xyz_filmic}
|
||||
- !<View> {name: Raw, colorspace: Raw}
|
||||
None:
|
||||
- !<View> {name: Standard, colorspace: Raw}
|
||||
|
||||
active_displays: [sRGB, XYZ, None]
|
||||
active_views: [Standard, Filmic, Filmic Log, Raw, False Color]
|
||||
active_views: [Standard, Filmic, Filmic Log, Raw, False Color, DCI, DCI Filmic]
|
||||
|
||||
colorspaces:
|
||||
- !<ColorSpace>
|
||||
@@ -141,6 +142,26 @@ colorspaces:
|
||||
allocationvars: [0, 1]
|
||||
from_reference: !<GroupTransform>
|
||||
children:
|
||||
- !<FileTransform> {src: srgb_inv.spi1d, interpolation: linear}
|
||||
- !<FileTransform> {src: dcp_in.spi1d, interpolation: linear}
|
||||
- !<FileTransform> {src: srgb_to_xyz.spimtx, interpolation: linear}
|
||||
- !<FileTransform> {src: dci_xyz.spi1d, interpolation: linear}
|
||||
|
||||
- !<ColorSpace>
|
||||
name: dci_xyz_filmic
|
||||
family: display
|
||||
equalitygroup:
|
||||
bitdepth: 16f
|
||||
description: |
|
||||
OpenDCP output LUT with DCI reference white and Gamma 2.6
|
||||
isdata: false
|
||||
allocation: uniform
|
||||
allocationvars: [0, 1]
|
||||
from_reference: !<GroupTransform>
|
||||
children:
|
||||
- !<ColorSpaceTransform> {src: Linear, dst: Filmic Log}
|
||||
- !<FileTransform> {src: filmic_to_0-70_1-03.spi1d, interpolation: linear}
|
||||
- !<FileTransform> {src: dcp_in.spi1d, interpolation: linear}
|
||||
- !<FileTransform> {src: srgb_to_xyz.spimtx, interpolation: linear}
|
||||
- !<FileTransform> {src: dci_xyz.spi1d, interpolation: linear}
|
||||
|
||||
|
4102
release/datafiles/colormanagement/luts/dcp_in.spi1d
Normal file
4102
release/datafiles/colormanagement/luts/dcp_in.spi1d
Normal file
File diff suppressed because it is too large
Load Diff
@@ -39,13 +39,13 @@ extern "C" {
|
||||
|
||||
/* Blender file format version. */
|
||||
#define BLENDER_FILE_VERSION BLENDER_VERSION
|
||||
#define BLENDER_FILE_SUBVERSION 21
|
||||
#define BLENDER_FILE_SUBVERSION 26
|
||||
|
||||
/* Minimum Blender version that supports reading file written with the current
|
||||
* version. Older Blender versions will test this and show a warning if the file
|
||||
* was written with too new a version. */
|
||||
#define BLENDER_FILE_MIN_VERSION 300
|
||||
#define BLENDER_FILE_MIN_SUBVERSION 11
|
||||
#define BLENDER_FILE_MIN_SUBVERSION 26
|
||||
|
||||
/** User readable version string. */
|
||||
const char *BKE_blender_version_string(void);
|
||||
|
@@ -217,8 +217,6 @@ static void animchan_sync_fcurve_scene(bAnimListElem *ale)
|
||||
/* Check if this strip is selected. */
|
||||
Editing *ed = SEQ_editing_get(scene);
|
||||
seq = SEQ_get_sequence_by_name(ed->seqbasep, seq_name, false);
|
||||
MEM_freeN(seq_name);
|
||||
|
||||
if (seq == NULL) {
|
||||
return;
|
||||
}
|
||||
|
@@ -503,7 +503,7 @@ void FRS_composite_result(Render *re, ViewLayer *view_layer, Render *freestyle_r
|
||||
if (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS) {
|
||||
// Create a blank render pass output.
|
||||
RE_create_render_pass(
|
||||
re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname);
|
||||
re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname, true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -539,7 +539,7 @@ void FRS_composite_result(Render *re, ViewLayer *view_layer, Render *freestyle_r
|
||||
|
||||
if (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS) {
|
||||
RE_create_render_pass(
|
||||
re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname);
|
||||
re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname, true);
|
||||
dest = RE_RenderLayerGetPass(rl, RE_PASSNAME_FREESTYLE, re->viewname);
|
||||
}
|
||||
else {
|
||||
|
@@ -484,7 +484,7 @@ typedef struct SequencerScopes {
|
||||
struct ImBuf *histogram_ibuf;
|
||||
} SequencerScopes;
|
||||
|
||||
#define MAXSEQ 32
|
||||
#define MAXSEQ 128
|
||||
|
||||
#define SELECT 1
|
||||
|
||||
|
@@ -199,6 +199,20 @@ template<typename Subtype> class IDSocketDeclaration : public SocketDeclaration
|
||||
{
|
||||
return matches_id_socket(socket, data_, name_, identifier_);
|
||||
}
|
||||
|
||||
bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
|
||||
{
|
||||
if (StringRef(socket.idname) != data_.idname) {
|
||||
return this->build(ntree, node, (eNodeSocketInOut)socket.in_out);
|
||||
}
|
||||
if (data_.hide_label) {
|
||||
socket.flag |= SOCK_HIDE_LABEL;
|
||||
}
|
||||
else {
|
||||
socket.flag &= ~SOCK_HIDE_LABEL;
|
||||
}
|
||||
return socket;
|
||||
}
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@@ -31,7 +31,11 @@ static void geo_node_mix_attribute_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>("Geometry");
|
||||
b.add_input<decl::String>("Factor");
|
||||
b.add_input<decl::Float>("Factor").default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
|
||||
b.add_input<decl::Float>("Factor", "Factor_001")
|
||||
.default_value(0.5f)
|
||||
.min(0.0f)
|
||||
.max(1.0f)
|
||||
.subtype(PROP_FACTOR);
|
||||
b.add_input<decl::String>("A");
|
||||
b.add_input<decl::Float>("A", "A_001");
|
||||
b.add_input<decl::Vector>("A", "A_002");
|
||||
|
@@ -468,7 +468,7 @@ static void idprop_ui_data_to_dict_int(IDProperty *property, PyObject *dict)
|
||||
Py_DECREF(list);
|
||||
}
|
||||
else {
|
||||
PyDict_SetItemString(dict, "default", item = PyLong_FromLong(ui_data->step));
|
||||
PyDict_SetItemString(dict, "default", item = PyLong_FromLong(ui_data->default_value));
|
||||
Py_DECREF(item);
|
||||
}
|
||||
}
|
||||
@@ -499,7 +499,7 @@ static void idprop_ui_data_to_dict_float(IDProperty *property, PyObject *dict)
|
||||
Py_DECREF(list);
|
||||
}
|
||||
else {
|
||||
PyDict_SetItemString(dict, "default", item = PyFloat_FromDouble(ui_data->step));
|
||||
PyDict_SetItemString(dict, "default", item = PyFloat_FromDouble(ui_data->default_value));
|
||||
Py_DECREF(item);
|
||||
}
|
||||
}
|
||||
|
@@ -236,7 +236,8 @@ void RE_create_render_pass(struct RenderResult *rr,
|
||||
int channels,
|
||||
const char *chan_id,
|
||||
const char *layername,
|
||||
const char *viewname);
|
||||
const char *viewname,
|
||||
const bool allocate);
|
||||
|
||||
/* obligatory initialize call, disprect is optional */
|
||||
void RE_InitState(struct Render *re,
|
||||
|
@@ -208,11 +208,10 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
|
||||
|
||||
/* Add render passes. */
|
||||
RenderPass *result_pass = render_layer_add_pass(
|
||||
rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA");
|
||||
RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA");
|
||||
RenderPass *differential_pass = render_layer_add_pass(rr, rl, 4, "BakeDifferential", "", "RGBA");
|
||||
|
||||
render_result_passes_allocated_ensure(rr);
|
||||
rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA", true);
|
||||
RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA", true);
|
||||
RenderPass *differential_pass = render_layer_add_pass(
|
||||
rr, rl, 4, "BakeDifferential", "", "RGBA", true);
|
||||
|
||||
/* Fill render passes from bake pixel array, to be read by the render engine. */
|
||||
for (int ty = 0; ty < h; ty++) {
|
||||
@@ -405,7 +404,7 @@ void RE_engine_add_pass(RenderEngine *engine,
|
||||
return;
|
||||
}
|
||||
|
||||
RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL);
|
||||
RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL, false);
|
||||
}
|
||||
|
||||
void RE_engine_end_result(
|
||||
|
@@ -1041,10 +1041,10 @@ static void render_result_uncrop(Render *re)
|
||||
render_result_disprect_to_full_resolution(re);
|
||||
|
||||
rres = render_result_new(re, &re->disprect, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS);
|
||||
render_result_passes_allocated_ensure(rres);
|
||||
rres->stamp_data = BKE_stamp_data_copy(re->result->stamp_data);
|
||||
|
||||
render_result_clone_passes(re, rres, NULL);
|
||||
render_result_passes_allocated_ensure(rres);
|
||||
|
||||
render_result_merge(rres, re->result);
|
||||
render_result_free(re->result);
|
||||
@@ -1466,7 +1466,7 @@ static void do_render_full_pipeline(Render *re)
|
||||
|
||||
/* ensure no images are in memory from previous animated sequences */
|
||||
BKE_image_all_free_anim_ibufs(re->main, re->r.cfra);
|
||||
SEQ_relations_free_all_anim_ibufs(re->scene, re->r.cfra);
|
||||
SEQ_cache_cleanup(re->scene);
|
||||
|
||||
if (RE_engine_render(re, true)) {
|
||||
/* in this case external render overrides all */
|
||||
@@ -2871,7 +2871,7 @@ RenderPass *RE_create_gp_pass(RenderResult *rr, const char *layername, const cha
|
||||
BLI_freelinkN(&rl->passes, rp);
|
||||
}
|
||||
/* create a totally new pass */
|
||||
return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA");
|
||||
return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA", true);
|
||||
}
|
||||
|
||||
bool RE_allow_render_generic_object(Object *ob)
|
||||
|
@@ -213,12 +213,37 @@ static void set_pass_full_name(
|
||||
|
||||
/********************************** New **************************************/
|
||||
|
||||
static void render_layer_allocate_pass(RenderResult *rr, RenderPass *rp)
|
||||
{
|
||||
if (rp->rect != NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels;
|
||||
rp->rect = MEM_callocN(sizeof(float) * rectsize, rp->name);
|
||||
|
||||
if (STREQ(rp->name, RE_PASSNAME_VECTOR)) {
|
||||
/* initialize to max speed */
|
||||
float *rect = rp->rect;
|
||||
for (int x = rectsize - 1; x >= 0; x--) {
|
||||
rect[x] = PASS_VECTOR_MAX;
|
||||
}
|
||||
}
|
||||
else if (STREQ(rp->name, RE_PASSNAME_Z)) {
|
||||
float *rect = rp->rect;
|
||||
for (int x = rectsize - 1; x >= 0; x--) {
|
||||
rect[x] = 10e10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RenderPass *render_layer_add_pass(RenderResult *rr,
|
||||
RenderLayer *rl,
|
||||
int channels,
|
||||
const char *name,
|
||||
const char *viewname,
|
||||
const char *chan_id)
|
||||
const char *chan_id,
|
||||
const bool allocate)
|
||||
{
|
||||
const int view_id = BLI_findstringindex(&rr->views, viewname, offsetof(RenderView, name));
|
||||
RenderPass *rpass = MEM_callocN(sizeof(RenderPass), name);
|
||||
@@ -250,6 +275,14 @@ RenderPass *render_layer_add_pass(RenderResult *rr,
|
||||
|
||||
BLI_addtail(&rl->passes, rpass);
|
||||
|
||||
if (allocate) {
|
||||
render_layer_allocate_pass(rr, rpass);
|
||||
}
|
||||
else {
|
||||
/* The result contains non-allocated pass now, so tag it as such. */
|
||||
rr->passes_allocated = false;
|
||||
}
|
||||
|
||||
return rpass;
|
||||
}
|
||||
|
||||
@@ -330,14 +363,14 @@ RenderResult *render_result_new(
|
||||
|
||||
#define RENDER_LAYER_ADD_PASS_SAFE(rr, rl, channels, name, viewname, chan_id) \
|
||||
do { \
|
||||
if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id) == NULL) { \
|
||||
if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id, false) == NULL) { \
|
||||
render_result_free(rr); \
|
||||
return NULL; \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
/* A renderlayer should always have a Combined pass. */
|
||||
render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA");
|
||||
render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA", false);
|
||||
|
||||
if (view_layer->passflag & SCE_PASS_Z) {
|
||||
RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_Z, view, "Z");
|
||||
@@ -440,7 +473,7 @@ RenderResult *render_result_new(
|
||||
}
|
||||
|
||||
/* a renderlayer should always have a Combined pass */
|
||||
render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, view, "RGBA");
|
||||
render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, view, "RGBA", false);
|
||||
}
|
||||
|
||||
/* NOTE: this has to be in sync with `scene.c`. */
|
||||
@@ -466,26 +499,7 @@ void render_result_passes_allocated_ensure(RenderResult *rr)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rp->rect != NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels;
|
||||
rp->rect = MEM_callocN(sizeof(float) * rectsize, rp->name);
|
||||
|
||||
if (STREQ(rp->name, RE_PASSNAME_VECTOR)) {
|
||||
/* initialize to max speed */
|
||||
float *rect = rp->rect;
|
||||
for (int x = rectsize - 1; x >= 0; x--) {
|
||||
rect[x] = PASS_VECTOR_MAX;
|
||||
}
|
||||
}
|
||||
else if (STREQ(rp->name, RE_PASSNAME_Z)) {
|
||||
float *rect = rp->rect;
|
||||
for (int x = rectsize - 1; x >= 0; x--) {
|
||||
rect[x] = 10e10;
|
||||
}
|
||||
}
|
||||
render_layer_allocate_pass(rr, rp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -514,7 +528,7 @@ void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewna
|
||||
&rl->passes, main_rp->fullname, offsetof(RenderPass, fullname));
|
||||
if (!rp) {
|
||||
render_layer_add_pass(
|
||||
rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id);
|
||||
rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -525,7 +539,8 @@ void RE_create_render_pass(RenderResult *rr,
|
||||
int channels,
|
||||
const char *chan_id,
|
||||
const char *layername,
|
||||
const char *viewname)
|
||||
const char *viewname,
|
||||
const bool allocate)
|
||||
{
|
||||
RenderLayer *rl;
|
||||
RenderPass *rp;
|
||||
@@ -555,7 +570,7 @@ void RE_create_render_pass(RenderResult *rr,
|
||||
}
|
||||
|
||||
if (!rp) {
|
||||
render_layer_add_pass(rr, rl, channels, name, view, chan_id);
|
||||
render_layer_add_pass(rr, rl, channels, name, view, chan_id, allocate);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1215,7 +1230,7 @@ void render_result_exr_file_begin(Render *re, RenderEngine *engine)
|
||||
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
|
||||
LISTBASE_FOREACH (RenderPass *, pass, &templates) {
|
||||
RE_create_render_pass(
|
||||
re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL);
|
||||
re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL, false);
|
||||
}
|
||||
BLI_rw_mutex_unlock(&re->resultmutex);
|
||||
|
||||
@@ -1263,7 +1278,8 @@ void render_result_exr_file_end(Render *re, RenderEngine *engine)
|
||||
* mutex locked to avoid deadlock with Python GIL. */
|
||||
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
|
||||
LISTBASE_FOREACH (RenderPass *, pass, &templates) {
|
||||
RE_create_render_pass(re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL);
|
||||
RE_create_render_pass(
|
||||
re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL, true);
|
||||
}
|
||||
|
||||
BLI_freelistN(&templates);
|
||||
|
@@ -93,7 +93,8 @@ struct RenderPass *render_layer_add_pass(struct RenderResult *rr,
|
||||
int channels,
|
||||
const char *name,
|
||||
const char *viewname,
|
||||
const char *chan_id);
|
||||
const char *chan_id,
|
||||
const bool allocate);
|
||||
|
||||
void render_result_exr_file_merge(struct RenderResult *rr,
|
||||
struct RenderResult *rrpart,
|
||||
|
@@ -69,6 +69,7 @@
|
||||
#include "SEQ_iterator.h"
|
||||
#include "SEQ_modifier.h"
|
||||
#include "SEQ_proxy.h"
|
||||
#include "SEQ_relations.h"
|
||||
#include "SEQ_render.h"
|
||||
#include "SEQ_sequencer.h"
|
||||
#include "SEQ_time.h"
|
||||
@@ -1950,6 +1951,8 @@ ImBuf *SEQ_render_give_ibuf(const SeqRenderData *context, float timeline_frame,
|
||||
}
|
||||
|
||||
seq_cache_free_temp_cache(context->scene, context->task_id, timeline_frame);
|
||||
/* Make sure we only keep the `anim` data for strips that are in view. */
|
||||
SEQ_relations_free_all_anim_ibufs(context->scene, timeline_frame);
|
||||
|
||||
if (count && !out) {
|
||||
BLI_mutex_lock(&seq_render_mutex);
|
||||
|
@@ -354,7 +354,6 @@ void SEQ_relations_update_changed_seq_and_deps(Scene *scene,
|
||||
}
|
||||
}
|
||||
|
||||
/* Unused */
|
||||
static void sequencer_all_free_anim_ibufs(ListBase *seqbase, int timeline_frame)
|
||||
{
|
||||
for (Sequence *seq = seqbase->first; seq != NULL; seq = seq->next) {
|
||||
@@ -367,7 +366,6 @@ static void sequencer_all_free_anim_ibufs(ListBase *seqbase, int timeline_frame)
|
||||
}
|
||||
}
|
||||
|
||||
/* Unused */
|
||||
void SEQ_relations_free_all_anim_ibufs(Scene *scene, int timeline_frame)
|
||||
{
|
||||
Editing *ed = SEQ_editing_get(scene);
|
||||
@@ -375,7 +373,6 @@ void SEQ_relations_free_all_anim_ibufs(Scene *scene, int timeline_frame)
|
||||
return;
|
||||
}
|
||||
sequencer_all_free_anim_ibufs(&ed->seqbase, timeline_frame);
|
||||
SEQ_cache_cleanup(scene);
|
||||
}
|
||||
|
||||
static Sequence *sequencer_check_scene_recursion(Scene *scene, ListBase *seqbase)
|
||||
|
Reference in New Issue
Block a user