[Bf-blender-cvs] [12fc3954365] blender-v3.0-release: Fix T93152: Cycles baking multiple selected object to active not working
Brecht Van Lommel
noreply at git.blender.org
Thu Nov 18 17:47:06 CET 2021
Commit: 12fc395436520157a98b6f6a07d5154033988bf8
Author: Brecht Van Lommel
Date: Thu Nov 18 17:43:27 2021 +0100
Branches: blender-v3.0-release
https://developer.blender.org/rB12fc395436520157a98b6f6a07d5154033988bf8
Fix T93152: Cycles baking multiple selected object to active not working
===================================================================
M source/blender/render/intern/engine.c
===================================================================
diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c
index 5f8679b572d..cb92b15f873 100644
--- a/source/blender/render/intern/engine.c
+++ b/source/blender/render/intern/engine.c
@@ -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++;
+ }
}
}
More information about the Bf-blender-cvs
mailing list