This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/blenloader/intern/versioning_290.c
Howard Trickey de21ab418d Add a Self option to the Exact boolean modifier. Fixes T52425.
With this option, self-intersections in either or both operands
will be handled properly (if both sides are piecewise winding
number constant, and maybe some other cases too).
In the Boolean tool, this flag was there already but the code
forced a unary operation in that case; this commit corrects it
to make a binary operation. This flag makes the code slower, which
is why it is an option and not an always-on thing.
2020-09-07 14:29:12 -04:00

561 lines
21 KiB
C

/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/** \file
* \ingroup blenloader
*/
/* allow readfile to use deprecated functionality */
#define DNA_DEPRECATED_ALLOW
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
#include "DNA_brush_types.h"
#include "DNA_cachefile_types.h"
#include "DNA_constraint_types.h"
#include "DNA_genfile.h"
#include "DNA_gpencil_modifier_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_rigidbody_types.h"
#include "DNA_screen_types.h"
#include "DNA_shader_fx_types.h"
#include "BKE_collection.h"
#include "BKE_colortools.h"
#include "BKE_gpencil.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BLO_readfile.h"
#include "readfile.h"
/* Make preferences read-only, use versioning_userdef.c. */
#define U (*((const UserDef *)&U))
void do_versions_after_linking_290(Main *bmain, ReportList *UNUSED(reports))
{
if (!MAIN_VERSION_ATLEAST(bmain, 290, 1)) {
/* Patch old grease pencil modifiers material filter. */
LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
switch (md->type) {
case eGpencilModifierType_Array: {
ArrayGpencilModifierData *gpmd = (ArrayGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Color: {
ColorGpencilModifierData *gpmd = (ColorGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Hook: {
HookGpencilModifierData *gpmd = (HookGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Lattice: {
LatticeGpencilModifierData *gpmd = (LatticeGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Mirror: {
MirrorGpencilModifierData *gpmd = (MirrorGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Multiply: {
MultiplyGpencilModifierData *gpmd = (MultiplyGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Noise: {
NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Offset: {
OffsetGpencilModifierData *gpmd = (OffsetGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Opacity: {
OpacityGpencilModifierData *gpmd = (OpacityGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Simplify: {
SimplifyGpencilModifierData *gpmd = (SimplifyGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Smooth: {
SmoothGpencilModifierData *gpmd = (SmoothGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Subdiv: {
SubdivGpencilModifierData *gpmd = (SubdivGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Texture: {
TextureGpencilModifierData *gpmd = (TextureGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
case eGpencilModifierType_Thick: {
ThickGpencilModifierData *gpmd = (ThickGpencilModifierData *)md;
if (gpmd->materialname[0] != '\0') {
gpmd->material = BLI_findstring(
&bmain->materials, gpmd->materialname, offsetof(ID, name) + 2);
gpmd->materialname[0] = '\0';
}
break;
}
default:
break;
}
}
}
/* Patch first frame for old files. */
Scene *scene = bmain->scenes.first;
if (scene != NULL) {
LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
if (ob->type != OB_GPENCIL) {
continue;
}
bGPdata *gpd = ob->data;
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
bGPDframe *gpf = gpl->frames.first;
if (gpf && gpf->framenum > scene->r.sfra) {
bGPDframe *gpf_dup = BKE_gpencil_frame_duplicate(gpf);
gpf_dup->framenum = scene->r.sfra;
BLI_addhead(&gpl->frames, gpf_dup);
}
}
}
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 291, 1)) {
LISTBASE_FOREACH (Collection *, collection, &bmain->collections) {
if (BKE_collection_cycles_fix(bmain, collection)) {
printf(
"WARNING: Cycle detected in collection '%s', fixed as best as possible.\n"
"You may have to reconstruct your View Layers...\n",
collection->id.name);
}
}
}
/**
* Versioning code until next subversion bump goes here.
*
* \note Be sure to check when bumping the version:
* - #blo_do_versions_290 in this file.
* - "versioning_userdef.c", #BLO_version_defaults_userpref_blend
* - "versioning_userdef.c", #do_versions_theme
*
* \note Keep this message at the bottom of the function.
*/
{
/* Keep this block, even when empty. */
}
}
static void panels_remove_x_closed_flag_recursive(Panel *panel)
{
const bool was_closed_x = panel->flag & PNL_UNUSED_1;
const bool was_closed_y = panel->flag & PNL_CLOSED; /* That value was the Y closed flag. */
SET_FLAG_FROM_TEST(panel->flag, was_closed_x || was_closed_y, PNL_CLOSED);
/* Clear the old PNL_CLOSEDX flag. */
panel->flag &= ~PNL_UNUSED_1;
LISTBASE_FOREACH (Panel *, child_panel, &panel->children) {
panels_remove_x_closed_flag_recursive(child_panel);
}
}
void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
{
UNUSED_VARS(fd);
/** Repair files from duplicate brushes added to blend files, see: T76738. */
if (!MAIN_VERSION_ATLEAST(bmain, 290, 2)) {
{
short id_codes[] = {ID_BR, ID_PAL};
for (int i = 0; i < ARRAY_SIZE(id_codes); i++) {
ListBase *lb = which_libbase(bmain, id_codes[i]);
BKE_main_id_repair_duplicate_names_listbase(lb);
}
}
if (!DNA_struct_elem_find(fd->filesdna, "SpaceImage", "float", "uv_opacity")) {
for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
if (sl->spacetype == SPACE_IMAGE) {
SpaceImage *sima = (SpaceImage *)sl;
sima->uv_opacity = 1.0f;
}
}
}
}
}
/* Init Grease Pencil new random curves. */
if (!DNA_struct_elem_find(fd->filesdna, "BrushGpencilSettings", "float", "random_hue")) {
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
if ((brush->gpencil_settings) && (brush->gpencil_settings->curve_rand_pressure == NULL)) {
brush->gpencil_settings->curve_rand_pressure = BKE_curvemapping_add(
1, 0.0f, 0.0f, 1.0f, 1.0f);
brush->gpencil_settings->curve_rand_strength = BKE_curvemapping_add(
1, 0.0f, 0.0f, 1.0f, 1.0f);
brush->gpencil_settings->curve_rand_uv = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
brush->gpencil_settings->curve_rand_hue = BKE_curvemapping_add(
1, 0.0f, 0.0f, 1.0f, 1.0f);
brush->gpencil_settings->curve_rand_saturation = BKE_curvemapping_add(
1, 0.0f, 0.0f, 1.0f, 1.0f);
brush->gpencil_settings->curve_rand_value = BKE_curvemapping_add(
1, 0.0f, 0.0f, 1.0f, 1.0f);
}
}
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 290, 4)) {
/* Clear old deprecated bit-flag from edit weights modifiers, we now use it for something else.
*/
LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
if (md->type == eModifierType_WeightVGEdit) {
((WeightVGEditModifierData *)md)->edit_flags &= ~MOD_WVG_EDIT_WEIGHTS_NORMALIZE;
}
}
}
/* Initialize parameters of the new Nishita sky model. */
if (!DNA_struct_elem_find(fd->filesdna, "NodeTexSky", "float", "sun_size")) {
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
if (ntree->type == NTREE_SHADER) {
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
if (node->type == SH_NODE_TEX_SKY && node->storage) {
NodeTexSky *tex = (NodeTexSky *)node->storage;
tex->sun_disc = true;
tex->sun_size = DEG2RADF(0.545);
tex->sun_elevation = M_PI_2;
tex->sun_rotation = 0.0f;
tex->altitude = 0.0f;
tex->air_density = 1.0f;
tex->dust_density = 1.0f;
tex->ozone_density = 1.0f;
}
}
}
}
FOREACH_NODETREE_END;
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 290, 6)) {
/* Transition to saving expansion for all of a modifier's sub-panels. */
if (!DNA_struct_elem_find(fd->filesdna, "ModifierData", "short", "ui_expand_flag")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
if (md->mode & eModifierMode_Expanded_DEPRECATED) {
md->ui_expand_flag = 1;
}
else {
md->ui_expand_flag = 0;
}
}
}
}
/* EEVEE Motion blur new parameters. */
if (!DNA_struct_elem_find(fd->filesdna, "SceneEEVEE", "float", "motion_blur_depth_scale")) {
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
scene->eevee.motion_blur_depth_scale = 100.0f;
scene->eevee.motion_blur_max = 32;
}
}
if (!DNA_struct_elem_find(fd->filesdna, "SceneEEVEE", "int", "motion_blur_steps")) {
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
scene->eevee.motion_blur_steps = 1;
}
}
/* Transition to saving expansion for all of a constraint's sub-panels. */
if (!DNA_struct_elem_find(fd->filesdna, "bConstraint", "short", "ui_expand_flag")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (bConstraint *, con, &object->constraints) {
if (con->flag & CONSTRAINT_EXPAND_DEPRECATED) {
con->ui_expand_flag = 1;
}
else {
con->ui_expand_flag = 0;
}
}
}
}
/* Transition to saving expansion for all of grease pencil modifier's sub-panels. */
if (!DNA_struct_elem_find(fd->filesdna, "GpencilModifierData", "short", "ui_expand_flag")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (GpencilModifierData *, md, &object->greasepencil_modifiers) {
if (md->mode & eGpencilModifierMode_Expanded_DEPRECATED) {
md->ui_expand_flag = 1;
}
else {
md->ui_expand_flag = 0;
}
}
}
}
/* Transition to saving expansion for all of an effect's sub-panels. */
if (!DNA_struct_elem_find(fd->filesdna, "ShaderFxData", "short", "ui_expand_flag")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (ShaderFxData *, fx, &object->shader_fx) {
if (fx->mode & eShaderFxMode_Expanded_DEPRECATED) {
fx->ui_expand_flag = 1;
}
else {
fx->ui_expand_flag = 0;
}
}
}
}
/* Refactor bevel profile type to use an enum. */
if (!DNA_struct_elem_find(fd->filesdna, "BevelModifierData", "short", "profile_type")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
if (md->type == eModifierType_Bevel) {
BevelModifierData *bmd = (BevelModifierData *)md;
bool use_custom_profile = bmd->flags & MOD_BEVEL_CUSTOM_PROFILE_DEPRECATED;
bmd->profile_type = use_custom_profile ? MOD_BEVEL_PROFILE_CUSTOM :
MOD_BEVEL_PROFILE_SUPERELLIPSE;
}
}
}
}
/* Change ocean modifier values from [0, 10] to [0, 1] ranges. */
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
if (md->type == eModifierType_Ocean) {
OceanModifierData *omd = (OceanModifierData *)md;
omd->wave_alignment *= 0.1f;
omd->sharpen_peak_jonswap *= 0.1f;
}
}
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 291, 1)) {
/* Initialize additional parameter of the Nishita sky model and change altitude unit. */
if (!DNA_struct_elem_find(fd->filesdna, "NodeTexSky", "float", "sun_intensity")) {
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
if (ntree->type == NTREE_SHADER) {
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
if (node->type == SH_NODE_TEX_SKY && node->storage) {
NodeTexSky *tex = (NodeTexSky *)node->storage;
tex->sun_intensity = 1.0f;
tex->altitude *= 0.001f;
}
}
}
}
FOREACH_NODETREE_END;
}
/* Refactor bevel affect type to use an enum. */
if (!DNA_struct_elem_find(fd->filesdna, "BevelModifierData", "char", "affect_type")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
if (md->type == eModifierType_Bevel) {
BevelModifierData *bmd = (BevelModifierData *)md;
const bool use_vertex_bevel = bmd->flags & MOD_BEVEL_VERT_DEPRECATED;
bmd->affect_type = use_vertex_bevel ? MOD_BEVEL_AFFECT_VERTICES :
MOD_BEVEL_AFFECT_EDGES;
}
}
}
}
/* Initialise additional velocity parameter for CacheFiles. */
if (!DNA_struct_elem_find(
fd->filesdna, "MeshSeqCacheModifierData", "float", "velocity_scale")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
if (md->type == eModifierType_MeshSequenceCache) {
MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *)md;
mcmd->velocity_scale = 1.0f;
mcmd->vertex_velocities = NULL;
mcmd->num_vertices = 0;
}
}
}
}
if (!DNA_struct_elem_find(fd->filesdna, "CacheFile", "char", "velocity_unit")) {
for (CacheFile *cache_file = bmain->cachefiles.first; cache_file != NULL;
cache_file = cache_file->id.next) {
BLI_strncpy(cache_file->velocity_name, ".velocities", sizeof(cache_file->velocity_name));
cache_file->velocity_unit = CACHEFILE_VELOCITY_UNIT_SECOND;
}
}
if (!DNA_struct_elem_find(fd->filesdna, "OceanModifierData", "int", "viewport_resolution")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
if (md->type == eModifierType_Ocean) {
OceanModifierData *omd = (OceanModifierData *)md;
omd->viewport_resolution = omd->resolution;
}
}
}
}
/* Remove panel X axis collapsing, a remnant of horizontal panel alignment. */
LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
LISTBASE_FOREACH (Panel *, panel, &region->panels) {
panels_remove_x_closed_flag_recursive(panel);
}
}
}
}
/* Initialize solver for Boolean. */
if (!DNA_struct_elem_find(fd->filesdna, "BooleanModifierData", "enum", "solver")) {
for (Object *object = bmain->objects.first; object != NULL; object = object->id.next) {
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
if (md->type == eModifierType_Boolean) {
BooleanModifierData *bmd = (BooleanModifierData *)md;
bmd->solver = eBooleanModifierSolver_Fast;
bmd->flag = 0;
}
}
}
}
}
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
RigidBodyWorld *rbw = scene->rigidbody_world;
if (rbw == NULL) {
continue;
}
/* The substep method changed from "per second" to "per frame".
* To get the new value simply divide the old bullet sim fps with the scene fps.
*/
rbw->substeps_per_frame /= FPS;
if (rbw->substeps_per_frame <= 0) {
rbw->substeps_per_frame = 1;
}
}
/**
* Versioning code until next subversion bump goes here.
*
* \note Be sure to check when bumping the version:
* - "versioning_userdef.c", #BLO_version_defaults_userpref_blend
* - "versioning_userdef.c", #do_versions_theme
*
* \note Keep this message at the bottom of the function.
*/
{
/* Set the minimum sequence interpolate for grease pencil. */
if (!DNA_struct_elem_find(fd->filesdna, "GP_Interpolate_Settings", "int", "step")) {
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
ToolSettings *ts = scene->toolsettings;
ts->gp_interpolate.step = 1;
}
}
/* Keep this block, even when empty. */
}
}