diff options
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 289 |
1 files changed, 120 insertions, 169 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 3677f6c4130..68206ed47e2 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -155,8 +155,10 @@ #include "BKE_blender_version.h" #include "BKE_bpath.h" #include "BKE_collection.h" +#include "BKE_colortools.h" #include "BKE_constraint.h" #include "BKE_curve.h" +#include "BKE_curveprofile.h" #include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" #include "BKE_global.h" // for G @@ -974,26 +976,6 @@ static void write_animdata(BlendWriter *writer, AnimData *adt) write_nladata(writer, &adt->nla_tracks); } -static void write_curvemapping_curves(BlendWriter *writer, CurveMapping *cumap) -{ - for (int a = 0; a < CM_TOT; a++) { - BLO_write_struct_array(writer, CurveMapPoint, cumap->cm[a].totpoint, cumap->cm[a].curve); - } -} - -static void write_curvemapping(BlendWriter *writer, CurveMapping *cumap) -{ - BLO_write_struct(writer, CurveMapping, cumap); - - write_curvemapping_curves(writer, cumap); -} - -static void write_CurveProfile(BlendWriter *writer, CurveProfile *profile) -{ - BLO_write_struct(writer, CurveProfile, profile); - BLO_write_struct_array(writer, CurveProfilePoint, profile->path_len, profile->path); -} - static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *sock) { if (sock->default_value == NULL) { @@ -1094,7 +1076,7 @@ static void write_nodetree_nolib(BlendWriter *writer, bNodeTree *ntree) /* could be handlerized at some point, now only 1 exception still */ if ((ntree->type == NTREE_SHADER) && ELEM(node->type, SH_NODE_CURVE_VEC, SH_NODE_CURVE_RGB)) { - write_curvemapping(writer, node->storage); + BKE_curvemapping_blend_write(writer, node->storage); } else if (ntree->type == NTREE_SHADER && (node->type == SH_NODE_SCRIPT)) { NodeShaderScript *nss = (NodeShaderScript *)node->storage; @@ -1108,11 +1090,11 @@ static void write_nodetree_nolib(BlendWriter *writer, bNodeTree *ntree) CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) { - write_curvemapping(writer, node->storage); + BKE_curvemapping_blend_write(writer, node->storage); } else if ((ntree->type == NTREE_TEXTURE) && (node->type == TEX_NODE_CURVE_RGB || node->type == TEX_NODE_CURVE_TIME)) { - write_curvemapping(writer, node->storage); + BKE_curvemapping_blend_write(writer, node->storage); } else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_MOVIEDISTORTION)) { /* pass */ @@ -1443,13 +1425,13 @@ static void write_particlesettings(BlendWriter *writer, BLO_write_struct(writer, EffectorWeights, part->effector_weights); if (part->clumpcurve) { - write_curvemapping(writer, part->clumpcurve); + BKE_curvemapping_blend_write(writer, part->clumpcurve); } if (part->roughcurve) { - write_curvemapping(writer, part->roughcurve); + BKE_curvemapping_blend_write(writer, part->roughcurve); } if (part->twistcurve) { - write_curvemapping(writer, part->twistcurve); + BKE_curvemapping_blend_write(writer, part->twistcurve); } LISTBASE_FOREACH (ParticleDupliWeight *, dw, &part->instance_weights) { @@ -1686,16 +1668,7 @@ static void write_modifiers(BlendWriter *writer, ListBase *modbase) BLO_write_struct_by_name(writer, mti->structName, md); - if (md->type == eModifierType_Hook) { - HookModifierData *hmd = (HookModifierData *)md; - - if (hmd->curfalloff) { - write_curvemapping(writer, hmd->curfalloff); - } - - BLO_write_int32_array(writer, hmd->totindex, hmd->indexar); - } - else if (md->type == eModifierType_Cloth) { + if (md->type == eModifierType_Cloth) { ClothModifierData *clmd = (ClothModifierData *)md; BLO_write_struct(writer, ClothSimSettings, clmd->sim_parms); @@ -1777,70 +1750,6 @@ static void write_modifiers(BlendWriter *writer, ListBase *modbase) writestruct(wd, DATA, MFace, collmd->numfaces, collmd->mfaces); #endif } - else if (md->type == eModifierType_MeshDeform) { - MeshDeformModifierData *mmd = (MeshDeformModifierData *)md; - int size = mmd->dyngridsize; - - BLO_write_struct_array(writer, MDefInfluence, mmd->totinfluence, mmd->bindinfluences); - BLO_write_int32_array(writer, mmd->totvert + 1, mmd->bindoffsets); - BLO_write_float3_array(writer, mmd->totcagevert, mmd->bindcagecos); - BLO_write_struct_array(writer, MDefCell, size * size * size, mmd->dyngrid); - BLO_write_struct_array(writer, MDefInfluence, mmd->totinfluence, mmd->dyninfluences); - BLO_write_int32_array(writer, mmd->totvert, mmd->dynverts); - } - else if (md->type == eModifierType_Warp) { - WarpModifierData *tmd = (WarpModifierData *)md; - if (tmd->curfalloff) { - write_curvemapping(writer, tmd->curfalloff); - } - } - else if (md->type == eModifierType_WeightVGEdit) { - WeightVGEditModifierData *wmd = (WeightVGEditModifierData *)md; - - if (wmd->cmap_curve) { - write_curvemapping(writer, wmd->cmap_curve); - } - } - else if (md->type == eModifierType_CorrectiveSmooth) { - CorrectiveSmoothModifierData *csmd = (CorrectiveSmoothModifierData *)md; - - if (csmd->bind_coords) { - BLO_write_float3_array(writer, csmd->bind_coords_num, (float *)csmd->bind_coords); - } - } - else if (md->type == eModifierType_SurfaceDeform) { - SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; - - BLO_write_struct_array(writer, SDefVert, smd->numverts, smd->verts); - - if (smd->verts) { - for (int i = 0; i < smd->numverts; i++) { - BLO_write_struct_array(writer, SDefBind, smd->verts[i].numbinds, smd->verts[i].binds); - - if (smd->verts[i].binds) { - for (int j = 0; j < smd->verts[i].numbinds; j++) { - BLO_write_uint32_array( - writer, smd->verts[i].binds[j].numverts, smd->verts[i].binds[j].vert_inds); - - if (smd->verts[i].binds[j].mode == MOD_SDEF_MODE_CENTROID || - smd->verts[i].binds[j].mode == MOD_SDEF_MODE_LOOPTRI) { - BLO_write_float3_array(writer, 1, smd->verts[i].binds[j].vert_weights); - } - else { - BLO_write_float_array( - writer, smd->verts[i].binds[j].numverts, smd->verts[i].binds[j].vert_weights); - } - } - } - } - } - } - else if (md->type == eModifierType_Bevel) { - BevelModifierData *bmd = (BevelModifierData *)md; - if (bmd->custom_profile) { - write_CurveProfile(writer, bmd->custom_profile); - } - } if (mti->blendWrite != NULL) { mti->blendWrite(writer, md); @@ -1868,21 +1777,21 @@ static void write_gpencil_modifiers(BlendWriter *writer, ListBase *modbase) ThickGpencilModifierData *gpmd = (ThickGpencilModifierData *)md; if (gpmd->curve_thickness) { - write_curvemapping(writer, gpmd->curve_thickness); + BKE_curvemapping_blend_write(writer, gpmd->curve_thickness); } } else if (md->type == eGpencilModifierType_Noise) { NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md; if (gpmd->curve_intensity) { - write_curvemapping(writer, gpmd->curve_intensity); + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); } } else if (md->type == eGpencilModifierType_Hook) { HookGpencilModifierData *gpmd = (HookGpencilModifierData *)md; if (gpmd->curfalloff) { - write_curvemapping(writer, gpmd->curfalloff); + BKE_curvemapping_blend_write(writer, gpmd->curfalloff); } } else if (md->type == eGpencilModifierType_Tint) { @@ -1891,25 +1800,25 @@ static void write_gpencil_modifiers(BlendWriter *writer, ListBase *modbase) BLO_write_struct(writer, ColorBand, gpmd->colorband); } if (gpmd->curve_intensity) { - write_curvemapping(writer, gpmd->curve_intensity); + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); } } else if (md->type == eGpencilModifierType_Smooth) { SmoothGpencilModifierData *gpmd = (SmoothGpencilModifierData *)md; if (gpmd->curve_intensity) { - write_curvemapping(writer, gpmd->curve_intensity); + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); } } else if (md->type == eGpencilModifierType_Color) { ColorGpencilModifierData *gpmd = (ColorGpencilModifierData *)md; if (gpmd->curve_intensity) { - write_curvemapping(writer, gpmd->curve_intensity); + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); } } else if (md->type == eGpencilModifierType_Opacity) { OpacityGpencilModifierData *gpmd = (OpacityGpencilModifierData *)md; if (gpmd->curve_intensity) { - write_curvemapping(writer, gpmd->curve_intensity); + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); } } } @@ -2464,7 +2373,7 @@ static void write_light(BlendWriter *writer, Light *la, const void *id_address) } if (la->curfalloff) { - write_curvemapping(writer, la->curfalloff); + BKE_curvemapping_blend_write(writer, la->curfalloff); } /* Node-tree is integral part of lights, no libdata. */ @@ -2521,12 +2430,12 @@ static void write_sequence_modifiers(BlendWriter *writer, ListBase *modbase) if (smd->type == seqModifierType_Curves) { CurvesModifierData *cmd = (CurvesModifierData *)smd; - write_curvemapping(writer, &cmd->curve_mapping); + BKE_curvemapping_blend_write(writer, &cmd->curve_mapping); } else if (smd->type == seqModifierType_HueCorrect) { HueCorrectModifierData *hcmd = (HueCorrectModifierData *)smd; - write_curvemapping(writer, &hcmd->curve_mapping); + BKE_curvemapping_blend_write(writer, &hcmd->curve_mapping); } } else { @@ -2538,7 +2447,7 @@ static void write_sequence_modifiers(BlendWriter *writer, ListBase *modbase) static void write_view_settings(BlendWriter *writer, ColorManagedViewSettings *view_settings) { if (view_settings->curve_mapping) { - write_curvemapping(writer, view_settings->curve_mapping); + BKE_curvemapping_blend_write(writer, view_settings->curve_mapping); } } @@ -2552,7 +2461,7 @@ static void write_view3dshading(BlendWriter *writer, View3DShading *shading) static void write_paint(BlendWriter *writer, Paint *p) { if (p->cavity_curve) { - write_curvemapping(writer, p->cavity_curve); + BKE_curvemapping_blend_write(writer, p->cavity_curve); } BLO_write_struct_array(writer, PaintToolSlot, p->tool_slots_len, p->tool_slots); } @@ -2669,19 +2578,19 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address) } /* write grease-pencil custom ipo curve to file */ if (tos->gp_interpolate.custom_ipo) { - write_curvemapping(writer, tos->gp_interpolate.custom_ipo); + BKE_curvemapping_blend_write(writer, tos->gp_interpolate.custom_ipo); } /* write grease-pencil multiframe falloff curve to file */ if (tos->gp_sculpt.cur_falloff) { - write_curvemapping(writer, tos->gp_sculpt.cur_falloff); + BKE_curvemapping_blend_write(writer, tos->gp_sculpt.cur_falloff); } /* write grease-pencil primitive curve to file */ if (tos->gp_sculpt.cur_primitive) { - write_curvemapping(writer, tos->gp_sculpt.cur_primitive); + BKE_curvemapping_blend_write(writer, tos->gp_sculpt.cur_primitive); } /* Write the curve profile to the file. */ if (tos->custom_bevel_profile_preset) { - write_CurveProfile(writer, tos->custom_bevel_profile_preset); + BKE_curveprofile_blend_write(writer, tos->custom_bevel_profile_preset); } write_paint(writer, &tos->imapaint.paint); @@ -2823,7 +2732,7 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address) } write_previews(writer, sce->preview); - write_curvemapping_curves(writer, &sce->r.mblur_shutter_curve); + BKE_curvemapping_curves_blend_write(writer, &sce->r.mblur_shutter_curve); LISTBASE_FOREACH (ViewLayer *, view_layer, &sce->view_layers) { write_view_layer(writer, view_layer); @@ -3237,8 +3146,8 @@ static void write_text(BlendWriter *writer, Text *text, const void *id_address) BLO_write_id_struct(writer, Text, id_address, &text->id); write_iddata(writer, &text->id); - if (text->name) { - BLO_write_string(writer, text->name); + if (text->filepath) { + BLO_write_string(writer, text->filepath); } if (!(text->flags & TXT_ISEXT)) { @@ -3327,38 +3236,38 @@ static void write_brush(BlendWriter *writer, Brush *brush, const void *id_addres write_iddata(writer, &brush->id); if (brush->curve) { - write_curvemapping(writer, brush->curve); + BKE_curvemapping_blend_write(writer, brush->curve); } if (brush->gpencil_settings) { BLO_write_struct(writer, BrushGpencilSettings, brush->gpencil_settings); if (brush->gpencil_settings->curve_sensitivity) { - write_curvemapping(writer, brush->gpencil_settings->curve_sensitivity); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_sensitivity); } if (brush->gpencil_settings->curve_strength) { - write_curvemapping(writer, brush->gpencil_settings->curve_strength); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_strength); } if (brush->gpencil_settings->curve_jitter) { - write_curvemapping(writer, brush->gpencil_settings->curve_jitter); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_jitter); } if (brush->gpencil_settings->curve_rand_pressure) { - write_curvemapping(writer, brush->gpencil_settings->curve_rand_pressure); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_rand_pressure); } if (brush->gpencil_settings->curve_rand_strength) { - write_curvemapping(writer, brush->gpencil_settings->curve_rand_strength); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_rand_strength); } if (brush->gpencil_settings->curve_rand_uv) { - write_curvemapping(writer, brush->gpencil_settings->curve_rand_uv); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_rand_uv); } if (brush->gpencil_settings->curve_rand_hue) { - write_curvemapping(writer, brush->gpencil_settings->curve_rand_hue); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_rand_hue); } if (brush->gpencil_settings->curve_rand_saturation) { - write_curvemapping(writer, brush->gpencil_settings->curve_rand_saturation); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_rand_saturation); } if (brush->gpencil_settings->curve_rand_value) { - write_curvemapping(writer, brush->gpencil_settings->curve_rand_value); + BKE_curvemapping_blend_write(writer, brush->gpencil_settings->curve_rand_value); } } if (brush->gradient) { @@ -3619,28 +3528,30 @@ static void write_linestyle_alpha_modifiers(BlendWriter *writer, ListBase *modif for (m = modifiers->first; m; m = m->next) { switch (m->type) { case LS_MODIFIER_ALONG_STROKE: - write_curvemapping(writer, ((LineStyleAlphaModifier_AlongStroke *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleAlphaModifier_AlongStroke *)m)->curve); break; case LS_MODIFIER_DISTANCE_FROM_CAMERA: - write_curvemapping(writer, ((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve); + BKE_curvemapping_blend_write(writer, + ((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve); break; case LS_MODIFIER_DISTANCE_FROM_OBJECT: - write_curvemapping(writer, ((LineStyleAlphaModifier_DistanceFromObject *)m)->curve); + BKE_curvemapping_blend_write(writer, + ((LineStyleAlphaModifier_DistanceFromObject *)m)->curve); break; case LS_MODIFIER_MATERIAL: - write_curvemapping(writer, ((LineStyleAlphaModifier_Material *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleAlphaModifier_Material *)m)->curve); break; case LS_MODIFIER_TANGENT: - write_curvemapping(writer, ((LineStyleAlphaModifier_Tangent *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleAlphaModifier_Tangent *)m)->curve); break; case LS_MODIFIER_NOISE: - write_curvemapping(writer, ((LineStyleAlphaModifier_Noise *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleAlphaModifier_Noise *)m)->curve); break; case LS_MODIFIER_CREASE_ANGLE: - write_curvemapping(writer, ((LineStyleAlphaModifier_CreaseAngle *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleAlphaModifier_CreaseAngle *)m)->curve); break; case LS_MODIFIER_CURVATURE_3D: - write_curvemapping(writer, ((LineStyleAlphaModifier_Curvature_3D *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleAlphaModifier_Curvature_3D *)m)->curve); break; } } @@ -3688,25 +3599,28 @@ static void write_linestyle_thickness_modifiers(BlendWriter *writer, ListBase *m for (m = modifiers->first; m; m = m->next) { switch (m->type) { case LS_MODIFIER_ALONG_STROKE: - write_curvemapping(writer, ((LineStyleThicknessModifier_AlongStroke *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleThicknessModifier_AlongStroke *)m)->curve); break; case LS_MODIFIER_DISTANCE_FROM_CAMERA: - write_curvemapping(writer, ((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve); + BKE_curvemapping_blend_write(writer, + ((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve); break; case LS_MODIFIER_DISTANCE_FROM_OBJECT: - write_curvemapping(writer, ((LineStyleThicknessModifier_DistanceFromObject *)m)->curve); + BKE_curvemapping_blend_write(writer, + ((LineStyleThicknessModifier_DistanceFromObject *)m)->curve); break; case LS_MODIFIER_MATERIAL: - write_curvemapping(writer, ((LineStyleThicknessModifier_Material *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleThicknessModifier_Material *)m)->curve); break; case LS_MODIFIER_TANGENT: - write_curvemapping(writer, ((LineStyleThicknessModifier_Tangent *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleThicknessModifier_Tangent *)m)->curve); break; case LS_MODIFIER_CREASE_ANGLE: - write_curvemapping(writer, ((LineStyleThicknessModifier_CreaseAngle *)m)->curve); + BKE_curvemapping_blend_write(writer, ((LineStyleThicknessModifier_CreaseAngle *)m)->curve); break; case LS_MODIFIER_CURVATURE_3D: - write_curvemapping(writer, ((LineStyleThicknessModifier_Curvature_3D *)m)->curve); + BKE_curvemapping_blend_write(writer, + ((LineStyleThicknessModifier_Curvature_3D *)m)->curve); break; } } @@ -4005,7 +3919,7 @@ static void write_libraries(WriteData *wd, Main *main) writestruct(wd, DATA, PackedFile, 1, pf); writedata(wd, DATA, pf->size, pf->data); if (wd->use_memfile == false) { - printf("write packed .blend: %s\n", main->curlib->name); + printf("write packed .blend: %s\n", main->curlib->filepath); } } if (main->curlib->asset_repository) { @@ -4024,7 +3938,7 @@ static void write_libraries(WriteData *wd, Main *main) "ERROR: write file: data-block '%s' from lib '%s' is not linkable " "but is flagged as directly linked", id->name, - main->curlib->filepath); + main->curlib->filepath_abs); BLI_assert(0); } } @@ -4042,7 +3956,7 @@ static void write_libraries(WriteData *wd, Main *main) "ERROR: write file: data-block '%s' from lib '%s' is not linkable " "but is flagged as directly linked", id->name, - main->curlib->filepath); + main->curlib->filepath_abs); BLI_assert(0); } writestruct(wd, ID_LINK_PLACEHOLDER, ID, 1, id); @@ -4136,6 +4050,7 @@ static bool write_file_handle(Main *mainvar, MemFile *compare, MemFile *current, int write_flags, + bool use_userdef, const BlendThumbnail *thumb) { BHead bhead; @@ -4196,7 +4111,8 @@ static bool write_file_handle(Main *mainvar, BLI_assert( (id->tag & (LIB_TAG_NO_MAIN | LIB_TAG_NO_USER_REFCOUNT | LIB_TAG_NOT_ALLOCATED)) == 0); - const bool do_override = !ELEM(override_storage, NULL, bmain) && id->override_library; + const bool do_override = !ELEM(override_storage, NULL, bmain) && + ID_IS_OVERRIDE_LIBRARY_REAL(id); if (do_override) { BKE_lib_override_library_operations_store_start(bmain, override_storage, id); @@ -4389,7 +4305,7 @@ static bool write_file_handle(Main *mainvar, /* So changes above don't cause a 'DNA1' to be detected as changed on undo. */ mywrite_flush(wd); - if (write_flags & G_FILE_USERPREFS) { + if (use_userdef) { write_userdef(&writer, &U); } @@ -4462,14 +4378,20 @@ static bool do_history(const char *name, ReportList *reports) */ bool BLO_write_file(Main *mainvar, const char *filepath, - int write_flags, - ReportList *reports, - const BlendThumbnail *thumb) + const int write_flags, + const struct BlendFileWriteParams *params, + ReportList *reports) { char tempname[FILE_MAX + 1]; eWriteWrapType ww_type; WriteWrap ww; + eBLO_WritePathRemap remap_mode = params->remap_mode; + const bool use_save_versions = params->use_save_versions; + const bool use_save_as_copy = params->use_save_as_copy; + const bool use_userdef = params->use_userdef; + const BlendThumbnail *thumb = params->thumb; + /* path backup/restore */ void *path_list_backup = NULL; const int path_list_flag = (BKE_BPATH_TRAVERSE_SKIP_LIBRARY | BKE_BPATH_TRAVERSE_SKIP_MULTIFILE); @@ -4499,7 +4421,15 @@ bool BLO_write_file(Main *mainvar, } /* Remapping of relative paths to new file location. */ - if (write_flags & G_FILE_RELATIVE_REMAP) { + if (remap_mode != BLO_WRITE_PATH_REMAP_NONE) { + + if (remap_mode == BLO_WRITE_PATH_REMAP_RELATIVE) { + /* Make all relative as none of the existing paths can be relative in an unsaved document. */ + if (G.relbase_valid == false) { + remap_mode = BLO_WRITE_PATH_REMAP_RELATIVE_ALL; + } + } + char dir_src[FILE_MAX]; char dir_dst[FILE_MAX]; BLI_split_dir_part(mainvar->name, dir_src, sizeof(dir_src)); @@ -4509,29 +4439,49 @@ bool BLO_write_file(Main *mainvar, BLI_path_normalize(mainvar->name, dir_dst); BLI_path_normalize(mainvar->name, dir_src); - if (G.relbase_valid && (BLI_path_cmp(dir_dst, dir_src) == 0)) { - /* Saved to same path. Nothing to do. */ - write_flags &= ~G_FILE_RELATIVE_REMAP; + /* Only for relative, not relative-all, as this means making existing paths relative. */ + if (remap_mode == BLO_WRITE_PATH_REMAP_RELATIVE) { + if (G.relbase_valid && (BLI_path_cmp(dir_dst, dir_src) == 0)) { + /* Saved to same path. Nothing to do. */ + remap_mode = BLO_WRITE_PATH_REMAP_NONE; + } } - else { + else if (remap_mode == BLO_WRITE_PATH_REMAP_ABSOLUTE) { + if (G.relbase_valid == false) { + /* Unsaved, all paths are absolute.Even if the user manages to set a relative path, + * there is no base-path that can be used to make it absolute. */ + remap_mode = BLO_WRITE_PATH_REMAP_NONE; + } + } + + if (remap_mode != BLO_WRITE_PATH_REMAP_NONE) { /* Check if we need to backup and restore paths. */ - if (UNLIKELY(G_FILE_SAVE_COPY & write_flags)) { + if (UNLIKELY(use_save_as_copy)) { path_list_backup = BKE_bpath_list_backup(mainvar, path_list_flag); } - if (G.relbase_valid) { - /* Saved, make relative paths relative to new location (if possible). */ - BKE_bpath_relative_rebase(mainvar, dir_src, dir_dst, NULL); - } - else { - /* Unsaved, make all relative. */ - BKE_bpath_relative_convert(mainvar, dir_dst, NULL); + switch (remap_mode) { + case BLO_WRITE_PATH_REMAP_RELATIVE: + /* Saved, make relative paths relative to new location (if possible). */ + BKE_bpath_relative_rebase(mainvar, dir_src, dir_dst, NULL); + break; + case BLO_WRITE_PATH_REMAP_RELATIVE_ALL: + /* Make all relative (when requested or unsaved). */ + BKE_bpath_relative_convert(mainvar, dir_dst, NULL); + break; + case BLO_WRITE_PATH_REMAP_ABSOLUTE: + /* Make all absolute (when requested or unsaved). */ + BKE_bpath_absolute_convert(mainvar, dir_src, NULL); + break; + case BLO_WRITE_PATH_REMAP_NONE: + BLI_assert(0); /* Unreachable. */ + break; } } } /* actual file writing */ - const bool err = write_file_handle(mainvar, &ww, NULL, NULL, write_flags, thumb); + const bool err = write_file_handle(mainvar, &ww, NULL, NULL, write_flags, use_userdef, thumb); ww.close(&ww); @@ -4549,7 +4499,7 @@ bool BLO_write_file(Main *mainvar, /* file save to temporary file was successful */ /* now do reverse file history (move .blend1 -> .blend2, .blend -> .blend1) */ - if (write_flags & G_FILE_HISTORY) { + if (use_save_versions) { const bool err_hist = do_history(filepath, reports); if (err_hist) { BKE_report(reports, RPT_ERROR, "Version backup failed (file saved with @)"); @@ -4575,9 +4525,10 @@ bool BLO_write_file(Main *mainvar, */ bool BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags) { - write_flags &= ~G_FILE_USERPREFS; + bool use_userdef = false; - const bool err = write_file_handle(mainvar, NULL, compare, current, write_flags, NULL); + const bool err = write_file_handle( + mainvar, NULL, compare, current, write_flags, use_userdef, NULL); return (err == 0); } |