Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/object/object_bake_api.c')
-rw-r--r--source/blender/editors/object/object_bake_api.c83
1 files changed, 32 insertions, 51 deletions
diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c
index 90bb853e9d4..0bff5cb83cb 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -62,6 +62,7 @@
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
#include "RE_engine.h"
#include "RE_pipeline.h"
@@ -653,19 +654,20 @@ static int bake(
const char *custom_cage, const char *filepath, const int width, const int height,
const char *identifier, ScrArea *sa, const char *uv_layer)
{
+ /* We build a depsgraph for the baking, so we don't need to change the original data to adjust visibility and modifiers. */
Depsgraph *depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER);
+ DEG_graph_build_from_view_layer(depsgraph, bmain, scene, view_layer);
int op_result = OPERATOR_CANCELLED;
bool ok = false;
Object *ob_cage = NULL;
+ Object *ob_cage_eval = NULL;
+ Object *ob_low_eval = NULL;
BakeHighPolyData *highpoly = NULL;
int tot_highpoly = 0;
- char restrict_flag_low = ob_low->restrictflag;
- char restrict_flag_cage = 0;
-
Mesh *me_low = NULL;
Mesh *me_cage = NULL;
@@ -777,8 +779,9 @@ static int bake(
goto cleanup;
}
else {
- restrict_flag_cage = ob_cage->restrictflag;
- ob_cage->restrictflag |= OB_RESTRICT_RENDER;
+ ob_cage_eval = DEG_get_evaluated_object(depsgraph, ob_cage);
+ ob_cage_eval->restrictflag |= OB_RESTRICT_RENDER;
+ ob_cage_eval->base_flag &= ~(BASE_VISIBLE | BASE_ENABLED_RENDER);
}
}
}
@@ -797,8 +800,8 @@ static int bake(
}
/* Make sure depsgraph is up to date. */
- DEG_graph_build_from_view_layer(depsgraph, bmain, scene, view_layer);
BKE_scene_graph_update_tagged(depsgraph, bmain);
+ ob_low_eval = DEG_get_evaluated_object(depsgraph, ob_low);
/* get the mesh as it arrives in the renderer */
me_low = bake_mesh_new_from_object(depsgraph, bmain, scene, ob_low);
@@ -810,8 +813,6 @@ static int bake(
if (is_selected_to_active) {
CollectionPointerLink *link;
- ModifierData *md, *nmd;
- ListBase modifiers_tmp, modifiers_original;
int i = 0;
/* prepare cage mesh */
@@ -825,30 +826,25 @@ static int bake(
}
}
else if (is_cage) {
- modifiers_original = ob_low->modifiers;
- BLI_listbase_clear(&modifiers_tmp);
+ ModifierData *md = ob_low_eval->modifiers.first;
+ while (md) {
+ ModifierData *md_next = md->next;
- for (md = ob_low->modifiers.first; md; md = md->next) {
/* Edge Split cannot be applied in the cage,
* the cage is supposed to have interpolated normals
* between the faces unless the geometry is physically
* split. So we create a copy of the low poly mesh without
* the eventual edge split.*/
- if (md->type == eModifierType_EdgeSplit)
- continue;
-
- nmd = modifier_new(md->type);
- BLI_strncpy(nmd->name, md->name, sizeof(nmd->name));
- modifier_copyData(md, nmd);
- BLI_addtail(&modifiers_tmp, nmd);
+ if (md->type == eModifierType_EdgeSplit) {
+ BLI_remlink(&ob_low_eval->modifiers, md);
+ modifier_free(md);
+ }
+ md = md_next;
}
- /* temporarily replace the modifiers */
- ob_low->modifiers = modifiers_tmp;
-
/* get the cage mesh as it arrives in the renderer */
- me_cage = bake_mesh_new_from_object(depsgraph, bmain, scene, ob_low);
+ me_cage = bake_mesh_new_from_object(depsgraph, bmain, scene, ob_low_eval);
RE_bake_pixels_populate(me_cage, pixel_array_low, num_pixels, &bake_images, uv_layer);
}
@@ -863,10 +859,10 @@ static int bake(
/* initialize highpoly_data */
highpoly[i].ob = ob_iter;
- highpoly[i].restrict_flag = ob_iter->restrictflag;
-
highpoly[i].me = bake_mesh_new_from_object(depsgraph, bmain, scene, highpoly[i].ob);
- highpoly[i].ob->restrictflag &= ~OB_RESTRICT_RENDER;
+ highpoly[i].ob_eval = DEG_get_evaluated_object(depsgraph, ob_iter);
+ highpoly[i].ob_eval->restrictflag &= ~OB_RESTRICT_RENDER;
+ highpoly[i].ob_eval->base_flag |= (BASE_VISIBLE | BASE_ENABLED_RENDER);
/* lowpoly to highpoly transformation matrix */
copy_m4_m4(highpoly[i].obmat, highpoly[i].ob->obmat);
@@ -879,7 +875,13 @@ static int bake(
BLI_assert(i == tot_highpoly);
- ob_low->restrictflag |= OB_RESTRICT_RENDER;
+
+ if (ob_cage != NULL) {
+ ob_cage_eval->restrictflag |= OB_RESTRICT_RENDER;
+ ob_cage_eval->base_flag &= ~(BASE_VISIBLE | BASE_ENABLED_RENDER);
+ }
+ ob_low_eval->restrictflag |= OB_RESTRICT_RENDER;
+ ob_low_eval->base_flag &= ~(BASE_VISIBLE | BASE_ENABLED_RENDER);
/* populate the pixel arrays with the corresponding face data for each high poly object */
if (!RE_bake_pixels_populate_from_objects(
@@ -887,7 +889,7 @@ static int bake(
cage_extrusion, ob_low->obmat, (ob_cage ? ob_cage->obmat : ob_low->obmat), me_cage))
{
BKE_report(reports, RPT_ERROR, "Error handling selected objects");
- goto cage_cleanup;
+ goto cleanup;
}
/* the baking itself */
@@ -896,27 +898,13 @@ static int bake(
num_pixels, depth, pass_type, pass_filter, result);
if (!ok) {
BKE_reportf(reports, RPT_ERROR, "Error baking from object \"%s\"", highpoly[i].ob->id.name + 2);
- goto cage_cleanup;
- }
- }
-
-cage_cleanup:
- /* reverting data back */
- if ((ob_cage == NULL) && is_cage) {
- ob_low->modifiers = modifiers_original;
-
- while ((md = BLI_pophead(&modifiers_tmp))) {
- modifier_free(md);
+ goto cleanup;
}
}
-
- if (!ok) {
- goto cleanup;
- }
}
else {
- /* make sure low poly renders */
- ob_low->restrictflag &= ~OB_RESTRICT_RENDER;
+ /* If low poly is not renderable it should have failed long ago. */
+ BLI_assert((ob_low->restrictflag & OB_RESTRICT_RENDER) == 0);
if (RE_bake_has_engine(re)) {
ok = RE_bake_engine(re, depsgraph, ob_low, 0, pixel_array_low, num_pixels, depth, pass_type, pass_filter, result);
@@ -1080,22 +1068,15 @@ cleanup:
if (highpoly) {
int i;
for (i = 0; i < tot_highpoly; i++) {
- highpoly[i].ob->restrictflag = highpoly[i].restrict_flag;
-
if (highpoly[i].me)
BKE_libblock_free(bmain, highpoly[i].me);
}
MEM_freeN(highpoly);
}
- ob_low->restrictflag = restrict_flag_low;
-
if (mmd_low)
mmd_low->flags = mmd_flags_low;
- if (ob_cage)
- ob_cage->restrictflag = restrict_flag_cage;
-
if (pixel_array_low)
MEM_freeN(pixel_array_low);