Fix T93152: Cycles baking multiple selected object to active not working

This commit is contained in:
Brecht Van Lommel 2021-11-18 17:43:27 +01:00
parent f0be276514
commit 12fc395436
Notes: blender-bot 2023-02-14 06:27:47 +01:00
Referenced by issue #93152, baking AO from multiple objects to active produces incorrect results
1 changed files with 24 additions and 20 deletions

View File

@ -206,8 +206,8 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
BLI_addtail(&rr->layers, rl);
/* Add render passes. */
RenderPass *result_pass = render_layer_add_pass(
rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA", true);
render_layer_add_pass(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);
@ -244,15 +244,6 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
}
}
/* Initialize tile render result from full image bake result. */
for (int ty = 0; ty < h; ty++) {
size_t offset = ty * w * engine->bake.depth;
size_t bake_offset = ((y + ty) * engine->bake.width + x) * engine->bake.depth;
size_t size = w * engine->bake.depth * sizeof(float);
memcpy(result_pass->rect + offset, engine->bake.result + bake_offset, size);
}
return rr;
}
@ -264,18 +255,31 @@ static void render_result_to_bake(RenderEngine *engine, RenderResult *rr)
return;
}
/* Copy from tile render result to full image bake result. */
int x = rr->tilerect.xmin;
int y = rr->tilerect.ymin;
int w = rr->tilerect.xmax - rr->tilerect.xmin;
int h = rr->tilerect.ymax - rr->tilerect.ymin;
/* Copy from tile render result to full image bake result. Just the pixels for the
* object currently being baked, to preserve other objects when baking multiple. */
const int x = rr->tilerect.xmin;
const int y = rr->tilerect.ymin;
const int w = rr->tilerect.xmax - rr->tilerect.xmin;
const int h = rr->tilerect.ymax - rr->tilerect.ymin;
const size_t pixel_depth = engine->bake.depth;
const size_t pixel_size = pixel_depth * sizeof(float);
for (int ty = 0; ty < h; ty++) {
size_t offset = ty * w * engine->bake.depth;
size_t bake_offset = ((y + ty) * engine->bake.width + x) * engine->bake.depth;
size_t size = w * engine->bake.depth * sizeof(float);
const size_t offset = ty * w;
const size_t bake_offset = (y + ty) * engine->bake.width + x;
memcpy(engine->bake.result + bake_offset, rpass->rect + offset, size);
const float *pass_rect = rpass->rect + offset * pixel_depth;
const BakePixel *bake_pixel = engine->bake.pixels + bake_offset;
float *bake_result = engine->bake.result + bake_offset * pixel_depth;
for (int tx = 0; tx < w; tx++) {
if (bake_pixel->object_id == engine->bake.object_id) {
memcpy(bake_result, pass_rect, pixel_size);
}
pass_rect += pixel_depth;
bake_result += pixel_depth;
bake_pixel++;
}
}
}