Fix realtime compositor not correctly handling multiple scene render layers
Pull Request: https://projects.blender.org/blender/blender/pulls/108909
This commit is contained in:
@@ -84,7 +84,9 @@ class Context {
|
||||
|
||||
/* Get the texture where the given render pass is stored. This should be called by the Render
|
||||
* Layer node to populate its outputs. */
|
||||
virtual GPUTexture *get_input_texture(int view_layer, const char *pass_name) = 0;
|
||||
virtual GPUTexture *get_input_texture(const Scene *scene,
|
||||
int view_layer,
|
||||
const char *pass_name) = 0;
|
||||
|
||||
/* Get the name of the view currently being rendered. */
|
||||
virtual StringRef get_view_name() = 0;
|
||||
|
||||
@@ -163,9 +163,12 @@ class Context : public realtime_compositor::Context {
|
||||
return DRW_viewport_texture_list_get()->color;
|
||||
}
|
||||
|
||||
GPUTexture *get_input_texture(int view_layer, const char *pass_name) override
|
||||
GPUTexture *get_input_texture(const Scene *scene, int view_layer, const char *pass_name) override
|
||||
{
|
||||
if (view_layer == 0 && STREQ(pass_name, RE_PASSNAME_COMBINED)) {
|
||||
if ((DEG_get_original_id(&scene->id) ==
|
||||
DEG_get_original_id(&DRW_context_state_get()->scene->id)) &&
|
||||
view_layer == 0 && STREQ(pass_name, RE_PASSNAME_COMBINED))
|
||||
{
|
||||
return get_output_texture();
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -824,13 +824,15 @@ class RenderLayerOperation : public NodeOperation {
|
||||
|
||||
void execute() override
|
||||
{
|
||||
const Scene *scene = static_cast<const Scene *>(bnode().id);
|
||||
const int view_layer = bnode().custom1;
|
||||
|
||||
Result &image_result = get_result("Image");
|
||||
Result &alpha_result = get_result("Alpha");
|
||||
|
||||
if (image_result.should_compute() || alpha_result.should_compute()) {
|
||||
GPUTexture *combined_texture = context().get_input_texture(view_layer, RE_PASSNAME_COMBINED);
|
||||
GPUTexture *combined_texture = context().get_input_texture(
|
||||
scene, view_layer, RE_PASSNAME_COMBINED);
|
||||
if (image_result.should_compute()) {
|
||||
execute_pass(image_result, combined_texture, "compositor_read_pass_color");
|
||||
}
|
||||
@@ -850,7 +852,8 @@ class RenderLayerOperation : public NodeOperation {
|
||||
continue;
|
||||
}
|
||||
|
||||
GPUTexture *pass_texture = context().get_input_texture(view_layer, output->identifier);
|
||||
GPUTexture *pass_texture = context().get_input_texture(
|
||||
scene, view_layer, output->identifier);
|
||||
if (output->type == SOCK_FLOAT) {
|
||||
execute_pass(result, pass_texture, "compositor_read_pass_float");
|
||||
}
|
||||
|
||||
@@ -182,9 +182,11 @@ class Context : public realtime_compositor::Context {
|
||||
return viewer_output_texture_;
|
||||
}
|
||||
|
||||
GPUTexture *get_input_texture(int view_layer_id, const char *pass_name) override
|
||||
GPUTexture *get_input_texture(const Scene *scene,
|
||||
int view_layer_id,
|
||||
const char *pass_name) override
|
||||
{
|
||||
Render *re = RE_GetSceneRender(&scene_);
|
||||
Render *re = RE_GetSceneRender(scene);
|
||||
RenderResult *rr = nullptr;
|
||||
GPUTexture *input_texture = nullptr;
|
||||
|
||||
@@ -193,7 +195,7 @@ class Context : public realtime_compositor::Context {
|
||||
}
|
||||
|
||||
if (rr) {
|
||||
ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene_.view_layers, view_layer_id);
|
||||
ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, view_layer_id);
|
||||
if (view_layer) {
|
||||
RenderLayer *rl = RE_GetRenderLayer(rr, view_layer->name);
|
||||
if (rl) {
|
||||
|
||||
Reference in New Issue
Block a user