2014-03-06 04:33:15 +11:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup blenloader
|
2014-03-06 04:33:15 +11:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "BLI_utildefines.h"
|
|
|
|
#include "BLI_compiler_attrs.h"
|
|
|
|
|
2014-03-11 21:46:12 +02:00
|
|
|
/* for MinGW32 definition of NULL, could use BLI_blenlib.h instead too */
|
|
|
|
#include <stddef.h>
|
|
|
|
|
2014-03-06 04:33:15 +11:00
|
|
|
/* allow readfile to use deprecated functionality */
|
|
|
|
#define DNA_DEPRECATED_ALLOW
|
|
|
|
|
2016-12-07 13:52:12 +01:00
|
|
|
#include "DNA_anim_types.h"
|
2016-05-18 03:19:06 +12:00
|
|
|
#include "DNA_armature_types.h"
|
2014-07-21 12:02:05 +02:00
|
|
|
#include "DNA_brush_types.h"
|
2015-02-12 18:54:41 +01:00
|
|
|
#include "DNA_camera_types.h"
|
2014-08-26 15:30:59 +02:00
|
|
|
#include "DNA_cloth_types.h"
|
2014-04-07 12:10:37 +02:00
|
|
|
#include "DNA_constraint_types.h"
|
2015-12-13 21:03:13 +13:00
|
|
|
#include "DNA_gpencil_types.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
#include "DNA_sdna_types.h"
|
2015-03-24 12:24:30 +01:00
|
|
|
#include "DNA_sequence_types.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
#include "DNA_space_types.h"
|
|
|
|
#include "DNA_screen_types.h"
|
2018-02-07 11:14:08 +11:00
|
|
|
#include "DNA_object_force_types.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
#include "DNA_object_types.h"
|
2016-12-02 10:45:03 +01:00
|
|
|
#include "DNA_mask_types.h"
|
2014-04-13 12:18:51 +02:00
|
|
|
#include "DNA_mesh_types.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
#include "DNA_modifier_types.h"
|
2016-12-28 17:30:58 +01:00
|
|
|
#include "DNA_particle_types.h"
|
2014-04-18 14:59:02 +09:00
|
|
|
#include "DNA_linestyle_types.h"
|
2015-04-06 10:40:12 -03:00
|
|
|
#include "DNA_view3d_types.h"
|
2016-09-24 21:41:16 +02:00
|
|
|
#include "DNA_smoke_types.h"
|
2016-11-07 12:56:58 +03:00
|
|
|
#include "DNA_rigidbody_types.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
|
|
|
|
#include "DNA_genfile.h"
|
|
|
|
|
2016-12-07 13:52:12 +01:00
|
|
|
#include "BKE_animsys.h"
|
2017-09-28 01:38:17 +10:00
|
|
|
#include "BKE_brush.h"
|
2015-10-27 19:00:51 +05:00
|
|
|
#include "BKE_colortools.h"
|
2017-12-06 00:54:39 +13:00
|
|
|
#include "BKE_fcurve.h"
|
|
|
|
#include "BKE_gpencil.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
#include "BKE_main.h"
|
2016-12-02 10:45:03 +01:00
|
|
|
#include "BKE_mask.h"
|
2015-02-13 13:51:10 +05:00
|
|
|
#include "BKE_modifier.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
#include "BKE_node.h"
|
2015-04-06 10:40:12 -03:00
|
|
|
#include "BKE_scene.h"
|
2015-03-24 12:24:30 +01:00
|
|
|
#include "BKE_sequencer.h"
|
2015-02-11 00:09:45 +01:00
|
|
|
#include "BKE_screen.h"
|
Rework 2D stabilizator
See this page for motivation and description of concepts:
https://github.com/Ichthyostega/blender/wiki
See this video for UI explanation and demonstration of usage
http://vimeo.com/blenderHack/stabilizerdemo
This proposal attempts to improve usability of Blender's image stabilization
feature for real-world footage esp. with moving and panning camera. It builds
upon the feature tracking to get a measurement of 2D image movement.
- Use a weighted average of movement contributions (instead of a median).
- Allow for rotation compensation and zoom (image scale) compensation.
- Allow to pick a different set of tracks for translation and for
rotation/zoom.
- Treat translation / rotation / zoom contributions systematically in a
similar way.
- Improve handling of partial tracking data with gaps and varying
start / end points.
- Have a user definable anchor frame and interpolate / extrapolate data to
avoid jumping back to "neutral" position when no tracking data is available.
- Support for travelling and panning shots by including an //intended//
position/rotation/zoom ("target position"). The idea is for these parameters
to be //animated// by the user, in order to supply an smooth, intended
camera movement. This way, we can keep the image content roughly in frame
even when moving completely away from the initial view.
A known shortcoming is that the pivot point for rotation compensation is set to
the translation compensated image center. This can produce spurious rotation on
travelling shots, which needs to be compensated manually (by animating the
target rotation parameter). There are several possible ways to address that
problem, yet all of them are considered beyond the scope of this improvement
proposal for now.
Own modifications:
- Restrict line length, it's really handy for split-view editing
- In motion tracking we prefer fully human-readable comments, meaning we
don't use doxygen with it's weird markup and comments are supposed to
start with capital and end with a full stop,
- Add explicit comparison of pointer to NULL.
Reviewers: sergey
Subscribers: kusi, kdawg, forest-house, mardy, Samoth, plasmasolutions, willolis, sebastian_k, hype, enetheru, sunboy, jta, leon_cheung
Maniphest Tasks: T49036
Differential Revision: https://developer.blender.org/D583
2016-08-16 10:32:55 +02:00
|
|
|
#include "BKE_tracking.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
|
Bake API - bpy.ops.object.bake()
New operator that can calls a bake function to the current render engine when available. This commit provides no feature for the users, but allows external engines to be accessed by the operator and be integrated with the baking api.
The API itself is simple. Blender sends a populated array of BakePixels to the renderer, and gets back an array of floats with the result.
The Blender Internal (and multires) system is still running independent, but we eventually will pipe it through the API as well. Cycles baking will come next as a separated commit
Python Operator:
----------------
The operator can be called with some arguments, or a user interface can be created for it. In that case the arguments can be ommited and the interface can expose the settings from bpy.context.scene.render.bake
bpy.ops.object.bake(type='COMBINED', filepath="", width=512, height=512, margin=16, use_selected_to_active=False, cage_extrusion=0, cage="", normal_space='TANGENT', normal_r='POS_X', normal_g='POS_Y', normal_b='POS_Z', save_mode='INTERNAL', use_clear=False, use_split_materials=False, use_automatic_name=False)
Note: external save mode is currently disabled.
Supported Features:
------------------
* Margin - Baked result is extended this many pixels beyond the border of each UV "island," to soften seams in the texture.
* Selected to Active - bake shading on the surface of selected object to the active object. The rays are cast from the lowpoly object inwards towards the highpoly object. If the highpoly object is not entirely involved by the lowpoly object, you can tweak the rays start point with Cage Extrusion. For even more control of the cage you can use a Cage object.
* Cage Extrusion - distance to use for the inward ray cast when using selected to active
* Custom Cage - object to use as cage (instead of the lowpoly object).
* Normal swizzle - change the axis that gets mapped to RGB
* Normal space - save as tangent or object normal spaces
Supported Passes:
-----------------
Any pass that is supported by Blender renderlayer system. Though it's up to the external engine to provide a valid enum with its supported passes. Normal passes get a special treatment since we post-process them to converted and "swizzled"
Development Notes for External Engines:
---------------------------------------
(read them in bake_api.c)
* For a complete implementation example look at the Cycles Bake commit (next).
Review: D421
Reviewed by: Campbell Barton, Brecht van Lommel, Sergey Sharybin, Thomas Dinge
Normal map pipeline "consulting" by Andy Davies (metalliandy)
Original design by Brecht van Lommel.
The entire commit history can be found on the branch: bake-cycles
2014-01-02 19:05:07 -02:00
|
|
|
#include "BLI_math.h"
|
2014-11-27 23:24:13 +01:00
|
|
|
#include "BLI_listbase.h"
|
Bake API - bpy.ops.object.bake()
New operator that can calls a bake function to the current render engine when available. This commit provides no feature for the users, but allows external engines to be accessed by the operator and be integrated with the baking api.
The API itself is simple. Blender sends a populated array of BakePixels to the renderer, and gets back an array of floats with the result.
The Blender Internal (and multires) system is still running independent, but we eventually will pipe it through the API as well. Cycles baking will come next as a separated commit
Python Operator:
----------------
The operator can be called with some arguments, or a user interface can be created for it. In that case the arguments can be ommited and the interface can expose the settings from bpy.context.scene.render.bake
bpy.ops.object.bake(type='COMBINED', filepath="", width=512, height=512, margin=16, use_selected_to_active=False, cage_extrusion=0, cage="", normal_space='TANGENT', normal_r='POS_X', normal_g='POS_Y', normal_b='POS_Z', save_mode='INTERNAL', use_clear=False, use_split_materials=False, use_automatic_name=False)
Note: external save mode is currently disabled.
Supported Features:
------------------
* Margin - Baked result is extended this many pixels beyond the border of each UV "island," to soften seams in the texture.
* Selected to Active - bake shading on the surface of selected object to the active object. The rays are cast from the lowpoly object inwards towards the highpoly object. If the highpoly object is not entirely involved by the lowpoly object, you can tweak the rays start point with Cage Extrusion. For even more control of the cage you can use a Cage object.
* Cage Extrusion - distance to use for the inward ray cast when using selected to active
* Custom Cage - object to use as cage (instead of the lowpoly object).
* Normal swizzle - change the axis that gets mapped to RGB
* Normal space - save as tangent or object normal spaces
Supported Passes:
-----------------
Any pass that is supported by Blender renderlayer system. Though it's up to the external engine to provide a valid enum with its supported passes. Normal passes get a special treatment since we post-process them to converted and "swizzled"
Development Notes for External Engines:
---------------------------------------
(read them in bake_api.c)
* For a complete implementation example look at the Cycles Bake commit (next).
Review: D421
Reviewed by: Campbell Barton, Brecht van Lommel, Sergey Sharybin, Thomas Dinge
Normal map pipeline "consulting" by Andy Davies (metalliandy)
Original design by Brecht van Lommel.
The entire commit history can be found on the branch: bake-cycles
2014-01-02 19:05:07 -02:00
|
|
|
#include "BLI_string.h"
|
2018-07-31 10:22:19 +02:00
|
|
|
#include "BLI_string_utils.h"
|
|
|
|
|
|
|
|
#include "BLT_translation.h"
|
Bake API - bpy.ops.object.bake()
New operator that can calls a bake function to the current render engine when available. This commit provides no feature for the users, but allows external engines to be accessed by the operator and be integrated with the baking api.
The API itself is simple. Blender sends a populated array of BakePixels to the renderer, and gets back an array of floats with the result.
The Blender Internal (and multires) system is still running independent, but we eventually will pipe it through the API as well. Cycles baking will come next as a separated commit
Python Operator:
----------------
The operator can be called with some arguments, or a user interface can be created for it. In that case the arguments can be ommited and the interface can expose the settings from bpy.context.scene.render.bake
bpy.ops.object.bake(type='COMBINED', filepath="", width=512, height=512, margin=16, use_selected_to_active=False, cage_extrusion=0, cage="", normal_space='TANGENT', normal_r='POS_X', normal_g='POS_Y', normal_b='POS_Z', save_mode='INTERNAL', use_clear=False, use_split_materials=False, use_automatic_name=False)
Note: external save mode is currently disabled.
Supported Features:
------------------
* Margin - Baked result is extended this many pixels beyond the border of each UV "island," to soften seams in the texture.
* Selected to Active - bake shading on the surface of selected object to the active object. The rays are cast from the lowpoly object inwards towards the highpoly object. If the highpoly object is not entirely involved by the lowpoly object, you can tweak the rays start point with Cage Extrusion. For even more control of the cage you can use a Cage object.
* Cage Extrusion - distance to use for the inward ray cast when using selected to active
* Custom Cage - object to use as cage (instead of the lowpoly object).
* Normal swizzle - change the axis that gets mapped to RGB
* Normal space - save as tangent or object normal spaces
Supported Passes:
-----------------
Any pass that is supported by Blender renderlayer system. Though it's up to the external engine to provide a valid enum with its supported passes. Normal passes get a special treatment since we post-process them to converted and "swizzled"
Development Notes for External Engines:
---------------------------------------
(read them in bake_api.c)
* For a complete implementation example look at the Cycles Bake commit (next).
Review: D421
Reviewed by: Campbell Barton, Brecht van Lommel, Sergey Sharybin, Thomas Dinge
Normal map pipeline "consulting" by Andy Davies (metalliandy)
Original design by Brecht van Lommel.
The entire commit history can be found on the branch: bake-cycles
2014-01-02 19:05:07 -02:00
|
|
|
|
2014-03-06 04:33:15 +11:00
|
|
|
#include "BLO_readfile.h"
|
|
|
|
|
2016-12-07 13:52:12 +01:00
|
|
|
#include "NOD_common.h"
|
|
|
|
#include "NOD_socket.h"
|
Render API/Cycles: Identify Render Passes by their name instead of a type flag
Previously, every RenderPass would have a bitfield that specified its type. That limits the number of passes to 32, which was reached a while ago.
However, most of the code already supported arbitrary RenderPasses since they were also used to store Multilayer EXR images.
Therefore, this commit completely removes the passflag from RenderPass and changes all code to use the unique pass name for identification.
Since Blender Internal relies on hardcoded passes and to preserve compatibility, 32 pass names are reserved for the old hardcoded passes.
To support these arbitrary passes, the Render Result compositor node now adds dynamic sockets. For compatibility, the old hardcoded sockets are always stored and just hidden when the corresponding pass isn't available.
To use these changes, the Render Engine API now includes a function that allows render engines to add arbitrary passes to the render result. To be able to add options for these passes, addons can now add their own properties to SceneRenderLayers.
To keep the compositor input node updated, render engine plugins have to implement a callback that registers all the passes that will be generated.
From a user perspective, nothing should change with this commit.
Differential Revision: https://developer.blender.org/D2443
Differential Revision: https://developer.blender.org/D2444
2017-05-03 00:21:18 +02:00
|
|
|
#include "NOD_composite.h"
|
2016-12-07 13:52:12 +01:00
|
|
|
|
2014-03-06 04:33:15 +11:00
|
|
|
#include "readfile.h"
|
|
|
|
|
2015-02-11 00:09:45 +01:00
|
|
|
#include "MEM_guardedalloc.h"
|
2014-03-06 04:33:15 +11:00
|
|
|
|
2018-07-31 10:22:19 +02:00
|
|
|
/* ************************************************** */
|
|
|
|
/* GP Palettes API (Deprecated) */
|
|
|
|
|
|
|
|
/* add a new gp-palette */
|
|
|
|
static bGPDpalette *BKE_gpencil_palette_addnew(bGPdata *gpd, const char *name)
|
|
|
|
{
|
|
|
|
bGPDpalette *palette;
|
|
|
|
|
|
|
|
/* check that list is ok */
|
|
|
|
if (gpd == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* allocate memory and add to end of list */
|
|
|
|
palette = MEM_callocN(sizeof(bGPDpalette), "bGPDpalette");
|
|
|
|
|
|
|
|
/* add to datablock */
|
|
|
|
BLI_addtail(&gpd->palettes, palette);
|
|
|
|
|
|
|
|
/* set basic settings */
|
|
|
|
/* auto-name */
|
|
|
|
BLI_strncpy(palette->info, name, sizeof(palette->info));
|
|
|
|
BLI_uniquename(&gpd->palettes, palette, DATA_("GP_Palette"), '.', offsetof(bGPDpalette, info),
|
2018-11-30 14:51:16 +11:00
|
|
|
sizeof(palette->info));
|
2018-07-31 10:22:19 +02:00
|
|
|
|
|
|
|
/* return palette */
|
|
|
|
return palette;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* add a new gp-palettecolor */
|
|
|
|
static bGPDpalettecolor *BKE_gpencil_palettecolor_addnew(bGPDpalette *palette, const char *name)
|
|
|
|
{
|
|
|
|
bGPDpalettecolor *palcolor;
|
|
|
|
|
|
|
|
/* check that list is ok */
|
|
|
|
if (palette == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* allocate memory and add to end of list */
|
|
|
|
palcolor = MEM_callocN(sizeof(bGPDpalettecolor), "bGPDpalettecolor");
|
|
|
|
|
|
|
|
/* add to datablock */
|
|
|
|
BLI_addtail(&palette->colors, palcolor);
|
|
|
|
|
|
|
|
/* set basic settings */
|
|
|
|
copy_v4_v4(palcolor->color, U.gpencil_new_layer_col);
|
|
|
|
ARRAY_SET_ITEMS(palcolor->fill, 1.0f, 1.0f, 1.0f);
|
|
|
|
|
|
|
|
/* auto-name */
|
|
|
|
BLI_strncpy(palcolor->info, name, sizeof(palcolor->info));
|
|
|
|
BLI_uniquename(&palette->colors, palcolor, DATA_("Color"), '.', offsetof(bGPDpalettecolor, info),
|
2018-11-30 14:51:16 +11:00
|
|
|
sizeof(palcolor->info));
|
2018-07-31 10:22:19 +02:00
|
|
|
|
|
|
|
/* return palette color */
|
|
|
|
return palcolor;
|
|
|
|
}
|
|
|
|
|
Rework 2D stabilizator
See this page for motivation and description of concepts:
https://github.com/Ichthyostega/blender/wiki
See this video for UI explanation and demonstration of usage
http://vimeo.com/blenderHack/stabilizerdemo
This proposal attempts to improve usability of Blender's image stabilization
feature for real-world footage esp. with moving and panning camera. It builds
upon the feature tracking to get a measurement of 2D image movement.
- Use a weighted average of movement contributions (instead of a median).
- Allow for rotation compensation and zoom (image scale) compensation.
- Allow to pick a different set of tracks for translation and for
rotation/zoom.
- Treat translation / rotation / zoom contributions systematically in a
similar way.
- Improve handling of partial tracking data with gaps and varying
start / end points.
- Have a user definable anchor frame and interpolate / extrapolate data to
avoid jumping back to "neutral" position when no tracking data is available.
- Support for travelling and panning shots by including an //intended//
position/rotation/zoom ("target position"). The idea is for these parameters
to be //animated// by the user, in order to supply an smooth, intended
camera movement. This way, we can keep the image content roughly in frame
even when moving completely away from the initial view.
A known shortcoming is that the pivot point for rotation compensation is set to
the translation compensated image center. This can produce spurious rotation on
travelling shots, which needs to be compensated manually (by animating the
target rotation parameter). There are several possible ways to address that
problem, yet all of them are considered beyond the scope of this improvement
proposal for now.
Own modifications:
- Restrict line length, it's really handy for split-view editing
- In motion tracking we prefer fully human-readable comments, meaning we
don't use doxygen with it's weird markup and comments are supposed to
start with capital and end with a full stop,
- Add explicit comparison of pointer to NULL.
Reviewers: sergey
Subscribers: kusi, kdawg, forest-house, mardy, Samoth, plasmasolutions, willolis, sebastian_k, hype, enetheru, sunboy, jta, leon_cheung
Maniphest Tasks: T49036
Differential Revision: https://developer.blender.org/D583
2016-08-16 10:32:55 +02:00
|
|
|
/**
|
|
|
|
* Setup rotation stabilization from ancient single track spec.
|
|
|
|
* Former Version of 2D stabilization used a single tracking marker to determine the rotation
|
|
|
|
* to be compensated. Now several tracks can contribute to rotation detection and this feature
|
|
|
|
* is enabled by the MovieTrackingTrack#flag on a per track base.
|
|
|
|
*/
|
|
|
|
static void migrate_single_rot_stabilization_track_settings(MovieTrackingStabilization *stab)
|
|
|
|
{
|
|
|
|
if (stab->rot_track) {
|
|
|
|
if (!(stab->rot_track->flag & TRACK_USE_2D_STAB_ROT)) {
|
|
|
|
stab->tot_rot_track++;
|
|
|
|
stab->rot_track->flag |= TRACK_USE_2D_STAB_ROT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stab->rot_track = NULL; /* this field is now ignored */
|
|
|
|
}
|
|
|
|
|
2014-04-07 19:43:21 +02:00
|
|
|
static void do_version_constraints_radians_degrees_270_1(ListBase *lb)
|
|
|
|
{
|
|
|
|
bConstraint *con;
|
|
|
|
|
|
|
|
for (con = lb->first; con; con = con->next) {
|
|
|
|
if (con->type == CONSTRAINT_TYPE_TRANSFORM) {
|
|
|
|
bTransformConstraint *data = (bTransformConstraint *)con->data;
|
|
|
|
const float deg_to_rad_f = DEG2RADF(1.0f);
|
|
|
|
|
|
|
|
if (data->from == TRANS_ROTATION) {
|
|
|
|
mul_v3_fl(data->from_min, deg_to_rad_f);
|
|
|
|
mul_v3_fl(data->from_max, deg_to_rad_f);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data->to == TRANS_ROTATION) {
|
|
|
|
mul_v3_fl(data->to_min, deg_to_rad_f);
|
|
|
|
mul_v3_fl(data->to_max, deg_to_rad_f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-28 13:20:37 +02:00
|
|
|
static void do_version_constraints_radians_degrees_270_5(ListBase *lb)
|
|
|
|
{
|
|
|
|
bConstraint *con;
|
|
|
|
|
|
|
|
for (con = lb->first; con; con = con->next) {
|
|
|
|
if (con->type == CONSTRAINT_TYPE_TRANSFORM) {
|
|
|
|
bTransformConstraint *data = (bTransformConstraint *)con->data;
|
|
|
|
|
|
|
|
if (data->from == TRANS_ROTATION) {
|
|
|
|
copy_v3_v3(data->from_min_rot, data->from_min);
|
|
|
|
copy_v3_v3(data->from_max_rot, data->from_max);
|
|
|
|
}
|
|
|
|
else if (data->from == TRANS_SCALE) {
|
|
|
|
copy_v3_v3(data->from_min_scale, data->from_min);
|
|
|
|
copy_v3_v3(data->from_max_scale, data->from_max);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data->to == TRANS_ROTATION) {
|
|
|
|
copy_v3_v3(data->to_min_rot, data->to_min);
|
|
|
|
copy_v3_v3(data->to_max_rot, data->to_max);
|
|
|
|
}
|
|
|
|
else if (data->to == TRANS_SCALE) {
|
|
|
|
copy_v3_v3(data->to_min_scale, data->to_min);
|
|
|
|
copy_v3_v3(data->to_max_scale, data->to_max);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-04-07 19:43:21 +02:00
|
|
|
|
2014-10-14 11:49:58 +02:00
|
|
|
static void do_version_constraints_stretch_to_limits(ListBase *lb)
|
|
|
|
{
|
|
|
|
bConstraint *con;
|
|
|
|
|
|
|
|
for (con = lb->first; con; con = con->next) {
|
|
|
|
if (con->type == CONSTRAINT_TYPE_STRETCHTO) {
|
|
|
|
bStretchToConstraint *data = (bStretchToConstraint *)con->data;
|
|
|
|
data->bulge_min = 1.0f;
|
|
|
|
data->bulge_max = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-08 14:38:30 +12:00
|
|
|
static void do_version_action_editor_properties_region(ListBase *regionbase)
|
|
|
|
{
|
|
|
|
ARegion *ar;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-05-08 14:38:30 +12:00
|
|
|
for (ar = regionbase->first; ar; ar = ar->next) {
|
|
|
|
if (ar->regiontype == RGN_TYPE_UI) {
|
|
|
|
/* already exists */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (ar->regiontype == RGN_TYPE_WINDOW) {
|
|
|
|
/* add new region here */
|
|
|
|
ARegion *arnew = MEM_callocN(sizeof(ARegion), "buttons for action");
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-05-08 14:38:30 +12:00
|
|
|
BLI_insertlinkbefore(regionbase, ar, arnew);
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-05-08 14:38:30 +12:00
|
|
|
arnew->regiontype = RGN_TYPE_UI;
|
|
|
|
arnew->alignment = RGN_ALIGN_RIGHT;
|
|
|
|
arnew->flag = RGN_FLAG_HIDDEN;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-05-08 14:38:30 +12:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-18 03:19:06 +12:00
|
|
|
static void do_version_bones_super_bbone(ListBase *lb)
|
|
|
|
{
|
|
|
|
for (Bone *bone = lb->first; bone; bone = bone->next) {
|
|
|
|
bone->scaleIn = 1.0f;
|
|
|
|
bone->scaleOut = 1.0f;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-05-18 03:19:06 +12:00
|
|
|
do_version_bones_super_bbone(&bone->childbase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-07 13:52:12 +01:00
|
|
|
/* TODO(sergey): Consider making it somewhat more generic function in BLI_anim.h. */
|
|
|
|
static void anim_change_prop_name(FCurve *fcu,
|
|
|
|
const char *prefix,
|
|
|
|
const char *old_prop_name,
|
|
|
|
const char *new_prop_name)
|
|
|
|
{
|
|
|
|
const char *old_path = BLI_sprintfN("%s.%s", prefix, old_prop_name);
|
|
|
|
if (STREQ(fcu->rna_path, old_path)) {
|
|
|
|
MEM_freeN(fcu->rna_path);
|
|
|
|
fcu->rna_path = BLI_sprintfN("%s.%s", prefix, new_prop_name);
|
|
|
|
}
|
|
|
|
MEM_freeN((char *)old_path);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void do_version_hue_sat_node(bNodeTree *ntree, bNode *node)
|
|
|
|
{
|
2017-01-27 11:24:23 +01:00
|
|
|
if (node->storage == NULL) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-12-07 13:52:12 +01:00
|
|
|
/* Make sure new sockets are properly created. */
|
|
|
|
node_verify_socket_templates(ntree, node);
|
|
|
|
/* Convert value from old storage to new sockets. */
|
|
|
|
NodeHueSat *nhs = node->storage;
|
|
|
|
bNodeSocket *hue = nodeFindSocket(node, SOCK_IN, "Hue"),
|
|
|
|
*saturation = nodeFindSocket(node, SOCK_IN, "Saturation"),
|
|
|
|
*value = nodeFindSocket(node, SOCK_IN, "Value");
|
|
|
|
((bNodeSocketValueFloat *)hue->default_value)->value = nhs->hue;
|
|
|
|
((bNodeSocketValueFloat *)saturation->default_value)->value = nhs->sat;
|
|
|
|
((bNodeSocketValueFloat *)value->default_value)->value = nhs->val;
|
|
|
|
/* Take care of possible animation. */
|
|
|
|
AnimData *adt = BKE_animdata_from_id(&ntree->id);
|
|
|
|
if (adt != NULL && adt->action != NULL) {
|
|
|
|
const char *prefix = BLI_sprintfN("nodes[\"%s\"]", node->name);
|
|
|
|
for (FCurve *fcu = adt->action->curves.first; fcu != NULL; fcu = fcu->next) {
|
|
|
|
if (STRPREFIX(fcu->rna_path, prefix)) {
|
|
|
|
anim_change_prop_name(fcu, prefix, "color_hue", "inputs[1].default_value");
|
|
|
|
anim_change_prop_name(fcu, prefix, "color_saturation", "inputs[2].default_value");
|
|
|
|
anim_change_prop_name(fcu, prefix, "color_value", "inputs[3].default_value");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
MEM_freeN((char *)prefix);
|
|
|
|
}
|
|
|
|
/* Free storage, it is no longer used. */
|
|
|
|
MEM_freeN(node->storage);
|
|
|
|
node->storage = NULL;
|
|
|
|
}
|
|
|
|
|
2017-05-24 15:39:15 +02:00
|
|
|
static void do_versions_compositor_render_passes_storage(bNode *node)
|
|
|
|
{
|
|
|
|
int pass_index = 0;
|
|
|
|
const char *sockname;
|
|
|
|
for (bNodeSocket *sock = node->outputs.first; sock && pass_index < 31; sock = sock->next, pass_index++) {
|
|
|
|
if (sock->storage == NULL) {
|
|
|
|
NodeImageLayer *sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
|
|
|
|
sock->storage = sockdata;
|
|
|
|
BLI_strncpy(sockdata->pass_name, node_cmp_rlayers_sock_to_pass(pass_index), sizeof(sockdata->pass_name));
|
|
|
|
|
|
|
|
if (pass_index == 0) sockname = "Image";
|
|
|
|
else if (pass_index == 1) sockname = "Alpha";
|
|
|
|
else sockname = node_cmp_rlayers_sock_to_pass(pass_index);
|
|
|
|
BLI_strncpy(sock->name, sockname, sizeof(sock->name));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void do_versions_compositor_render_passes(bNodeTree *ntree)
|
|
|
|
{
|
|
|
|
for (bNode *node = ntree->nodes.first; node; node = node->next) {
|
|
|
|
if (node->type == CMP_NODE_R_LAYERS) {
|
|
|
|
/* First we make sure existing sockets have proper names.
|
|
|
|
* This is important because otherwise verification will
|
|
|
|
* drop links from sockets which were renamed.
|
|
|
|
*/
|
|
|
|
do_versions_compositor_render_passes_storage(node);
|
|
|
|
/* Make sure new sockets are properly created. */
|
|
|
|
node_verify_socket_templates(ntree, node);
|
|
|
|
/* Make sure all possibly created sockets have proper storage. */
|
|
|
|
do_versions_compositor_render_passes_storage(node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-06 00:54:39 +13:00
|
|
|
|
|
|
|
static char *replace_bbone_easing_rnapath(char *old_path)
|
|
|
|
{
|
|
|
|
char *new_path = NULL;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2017-12-06 00:54:39 +13:00
|
|
|
/* NOTE: This will break paths for any bones/custom-properties
|
|
|
|
* which happen be named after the bbone property id's
|
|
|
|
*/
|
|
|
|
if (strstr(old_path, "bbone_in"))
|
|
|
|
new_path = BLI_str_replaceN(old_path, "bbone_in", "bbone_easein");
|
|
|
|
else if (strstr(old_path, "bbone_out"))
|
|
|
|
new_path = BLI_str_replaceN(old_path, "bbone_out", "bbone_easeout");
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2017-12-06 00:54:39 +13:00
|
|
|
if (new_path) {
|
|
|
|
MEM_freeN(old_path);
|
|
|
|
return new_path;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return old_path;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void do_version_bbone_easing_fcurve_fix(ID *UNUSED(id), FCurve *fcu, void *UNUSED(user_data))
|
|
|
|
{
|
|
|
|
/* F-Curve's path (for bbone_in/out) */
|
|
|
|
if (fcu->rna_path) {
|
|
|
|
fcu->rna_path = replace_bbone_easing_rnapath(fcu->rna_path);
|
|
|
|
}
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2017-12-06 00:54:39 +13:00
|
|
|
/* Driver -> Driver Vars (for bbone_in/out) */
|
|
|
|
if (fcu->driver) {
|
|
|
|
for (DriverVar *dvar = fcu->driver->variables.first; dvar; dvar = dvar->next) {
|
2018-11-30 15:08:47 +11:00
|
|
|
DRIVER_TARGETS_LOOPER_BEGIN(dvar)
|
2017-12-06 00:54:39 +13:00
|
|
|
{
|
|
|
|
if (dtar->rna_path) {
|
|
|
|
dtar->rna_path = replace_bbone_easing_rnapath(dtar->rna_path);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
DRIVER_TARGETS_LOOPER_END;
|
|
|
|
}
|
|
|
|
}
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2017-12-06 00:54:39 +13:00
|
|
|
/* FModifiers -> Stepped (for frame_start/end) */
|
|
|
|
if (fcu->modifiers.first) {
|
|
|
|
for (FModifier *fcm = fcu->modifiers.first; fcm; fcm = fcm->next) {
|
|
|
|
if (fcm->type == FMODIFIER_TYPE_STEPPED) {
|
|
|
|
FMod_Stepped *data = fcm->data;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2017-12-06 00:54:39 +13:00
|
|
|
/* Modifier doesn't work if the modifier's copy of start/end frame are both 0
|
|
|
|
* as those were only getting written to the fcm->data copy (T52009)
|
|
|
|
*/
|
|
|
|
if ((fcm->sfra == fcm->efra) && (fcm->sfra == 0)) {
|
|
|
|
fcm->sfra = data->start_frame;
|
|
|
|
fcm->efra = data->end_frame;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
2014-03-06 04:33:15 +11:00
|
|
|
{
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 270, 0)) {
|
2014-03-06 04:33:15 +11:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "BevelModifierData", "float", "profile")) {
|
|
|
|
Object *ob;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2014-03-06 04:33:15 +11:00
|
|
|
ModifierData *md;
|
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Bevel) {
|
|
|
|
BevelModifierData *bmd = (BevelModifierData *)md;
|
|
|
|
bmd->profile = 0.5f;
|
|
|
|
bmd->val_flags = MOD_BEVEL_AMT_OFFSET;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* nodes don't use fixed node->id any more, clean up */
|
2018-11-30 15:22:01 +11:00
|
|
|
FOREACH_NODETREE_BEGIN(bmain, ntree, id) {
|
2014-03-06 04:33:15 +11:00
|
|
|
if (ntree->type == NTREE_COMPOSIT) {
|
|
|
|
bNode *node;
|
|
|
|
for (node = ntree->nodes.first; node; node = node->next) {
|
|
|
|
if (ELEM(node->type, CMP_NODE_COMPOSITE, CMP_NODE_OUTPUT_FILE)) {
|
|
|
|
node->id = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-30 15:22:01 +11:00
|
|
|
} FOREACH_NODETREE_END;
|
2014-03-06 04:33:15 +11:00
|
|
|
|
|
|
|
{
|
|
|
|
bScreen *screen;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (screen = bmain->screens.first; screen; screen = screen->id.next) {
|
2014-03-06 04:33:15 +11:00
|
|
|
ScrArea *area;
|
|
|
|
for (area = screen->areabase.first; area; area = area->next) {
|
|
|
|
SpaceLink *space_link;
|
|
|
|
for (space_link = area->spacedata.first; space_link; space_link = space_link->next) {
|
|
|
|
if (space_link->spacetype == SPACE_CLIP) {
|
2018-11-30 14:51:16 +11:00
|
|
|
SpaceClip *space_clip = (SpaceClip *)space_link;
|
2014-03-06 04:33:15 +11:00
|
|
|
if (space_clip->mode != SC_MODE_MASKEDIT) {
|
|
|
|
space_clip->mode = SC_MODE_TRACKING;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "MovieTrackingSettings", "float", "default_weight")) {
|
|
|
|
MovieClip *clip;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (clip = bmain->movieclips.first; clip; clip = clip->id.next) {
|
2014-03-06 04:33:15 +11:00
|
|
|
clip->tracking.settings.default_weight = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-04-07 12:10:37 +02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 270, 1)) {
|
2014-04-07 12:10:37 +02:00
|
|
|
Object *ob;
|
|
|
|
|
|
|
|
/* Update Transform constraint (another deg -> rad stuff). */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2014-04-07 19:43:21 +02:00
|
|
|
do_version_constraints_radians_degrees_270_1(&ob->constraints);
|
2014-04-07 12:10:37 +02:00
|
|
|
|
2014-04-07 19:43:21 +02:00
|
|
|
if (ob->pose) {
|
|
|
|
/* Bones constraints! */
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
|
|
|
|
do_version_constraints_radians_degrees_270_1(&pchan->constraints);
|
2014-04-07 12:10:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-04-13 12:18:51 +02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 270, 2)) {
|
2014-04-13 12:18:51 +02:00
|
|
|
Mesh *me;
|
|
|
|
|
|
|
|
/* Mesh smoothresh deg->rad. */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (me = bmain->meshes.first; me; me = me->id.next) {
|
2014-04-13 12:18:51 +02:00
|
|
|
me->smoothresh = DEG2RADF(me->smoothresh);
|
|
|
|
}
|
|
|
|
}
|
2014-04-18 14:59:02 +09:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 270, 3)) {
|
2014-04-18 14:59:02 +09:00
|
|
|
FreestyleLineStyle *linestyle;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (linestyle = bmain->linestyles.first; linestyle; linestyle = linestyle->id.next) {
|
2014-04-18 14:59:02 +09:00
|
|
|
linestyle->flag |= LS_NO_SORTING;
|
|
|
|
linestyle->sort_key = LS_SORT_KEY_DISTANCE_FROM_CAMERA;
|
|
|
|
linestyle->integration_type = LS_INTEGRATION_MEAN;
|
|
|
|
}
|
|
|
|
}
|
2014-04-23 15:02:06 +09:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 270, 4)) {
|
2014-04-23 17:59:35 +02:00
|
|
|
/* ui_previews were not handled correctly when copying areas, leading to corrupted files (see T39847).
|
|
|
|
* This will always reset situation to a valid state.
|
|
|
|
*/
|
|
|
|
bScreen *sc;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (sc = bmain->screens.first; sc; sc = sc->id.next) {
|
2014-04-23 17:59:35 +02:00
|
|
|
ScrArea *sa;
|
|
|
|
for (sa = sc->areabase.first; sa; sa = sa->next) {
|
|
|
|
SpaceLink *sl;
|
|
|
|
|
|
|
|
for (sl = sa->spacedata.first; sl; sl = sl->next) {
|
|
|
|
ARegion *ar;
|
|
|
|
ListBase *lb = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase;
|
|
|
|
|
|
|
|
for (ar = lb->first; ar; ar = ar->next) {
|
|
|
|
BLI_listbase_clear(&ar->ui_previews);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 270, 5)) {
|
2014-04-28 13:20:37 +02:00
|
|
|
Object *ob;
|
|
|
|
|
|
|
|
/* Update Transform constraint (again :|). */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2014-04-28 13:20:37 +02:00
|
|
|
do_version_constraints_radians_degrees_270_5(&ob->constraints);
|
|
|
|
|
|
|
|
if (ob->pose) {
|
|
|
|
/* Bones constraints! */
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
|
|
|
|
do_version_constraints_radians_degrees_270_5(&pchan->constraints);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 271, 0)) {
|
2014-06-12 22:16:43 +06:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "RenderData", "BakeData", "bake")) {
|
|
|
|
Scene *sce;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (sce = bmain->scenes.first; sce; sce = sce->id.next) {
|
2014-06-12 22:16:43 +06:00
|
|
|
sce->r.bake.flag = R_BAKE_CLEAR;
|
|
|
|
sce->r.bake.width = 512;
|
|
|
|
sce->r.bake.height = 512;
|
|
|
|
sce->r.bake.margin = 16;
|
|
|
|
sce->r.bake.normal_space = R_BAKE_SPACE_TANGENT;
|
|
|
|
sce->r.bake.normal_swizzle[0] = R_BAKE_POSX;
|
|
|
|
sce->r.bake.normal_swizzle[1] = R_BAKE_POSY;
|
|
|
|
sce->r.bake.normal_swizzle[2] = R_BAKE_POSZ;
|
|
|
|
BLI_strncpy(sce->r.bake.filepath, U.renderdir, sizeof(sce->r.bake.filepath));
|
|
|
|
|
|
|
|
sce->r.bake.im_format.planes = R_IMF_PLANES_RGBA;
|
|
|
|
sce->r.bake.im_format.imtype = R_IMF_IMTYPE_PNG;
|
|
|
|
sce->r.bake.im_format.depth = R_IMF_CHAN_DEPTH_8;
|
|
|
|
sce->r.bake.im_format.quality = 90;
|
|
|
|
sce->r.bake.im_format.compress = 15;
|
|
|
|
}
|
Bake API - bpy.ops.object.bake()
New operator that can calls a bake function to the current render engine when available. This commit provides no feature for the users, but allows external engines to be accessed by the operator and be integrated with the baking api.
The API itself is simple. Blender sends a populated array of BakePixels to the renderer, and gets back an array of floats with the result.
The Blender Internal (and multires) system is still running independent, but we eventually will pipe it through the API as well. Cycles baking will come next as a separated commit
Python Operator:
----------------
The operator can be called with some arguments, or a user interface can be created for it. In that case the arguments can be ommited and the interface can expose the settings from bpy.context.scene.render.bake
bpy.ops.object.bake(type='COMBINED', filepath="", width=512, height=512, margin=16, use_selected_to_active=False, cage_extrusion=0, cage="", normal_space='TANGENT', normal_r='POS_X', normal_g='POS_Y', normal_b='POS_Z', save_mode='INTERNAL', use_clear=False, use_split_materials=False, use_automatic_name=False)
Note: external save mode is currently disabled.
Supported Features:
------------------
* Margin - Baked result is extended this many pixels beyond the border of each UV "island," to soften seams in the texture.
* Selected to Active - bake shading on the surface of selected object to the active object. The rays are cast from the lowpoly object inwards towards the highpoly object. If the highpoly object is not entirely involved by the lowpoly object, you can tweak the rays start point with Cage Extrusion. For even more control of the cage you can use a Cage object.
* Cage Extrusion - distance to use for the inward ray cast when using selected to active
* Custom Cage - object to use as cage (instead of the lowpoly object).
* Normal swizzle - change the axis that gets mapped to RGB
* Normal space - save as tangent or object normal spaces
Supported Passes:
-----------------
Any pass that is supported by Blender renderlayer system. Though it's up to the external engine to provide a valid enum with its supported passes. Normal passes get a special treatment since we post-process them to converted and "swizzled"
Development Notes for External Engines:
---------------------------------------
(read them in bake_api.c)
* For a complete implementation example look at the Cycles Bake commit (next).
Review: D421
Reviewed by: Campbell Barton, Brecht van Lommel, Sergey Sharybin, Thomas Dinge
Normal map pipeline "consulting" by Andy Davies (metalliandy)
Original design by Brecht van Lommel.
The entire commit history can be found on the branch: bake-cycles
2014-01-02 19:05:07 -02:00
|
|
|
}
|
2014-05-16 11:10:25 +09:00
|
|
|
|
2014-06-12 22:16:43 +06:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "FreestyleLineStyle", "float", "texstep")) {
|
|
|
|
FreestyleLineStyle *linestyle;
|
2014-05-16 11:10:25 +09:00
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (linestyle = bmain->linestyles.first; linestyle; linestyle = linestyle->id.next) {
|
2014-06-12 22:16:43 +06:00
|
|
|
linestyle->flag |= LS_TEXTURE;
|
|
|
|
linestyle->texstep = 1.0;
|
|
|
|
}
|
2014-05-16 11:10:25 +09:00
|
|
|
}
|
2014-05-23 18:30:36 +02:00
|
|
|
|
2014-06-12 22:16:43 +06:00
|
|
|
{
|
|
|
|
Scene *scene;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2014-11-16 13:57:58 +01:00
|
|
|
int num_layers = BLI_listbase_count(&scene->r.layers);
|
2014-06-12 22:16:43 +06:00
|
|
|
scene->r.actlay = min_ff(scene->r.actlay, num_layers - 1);
|
|
|
|
}
|
2014-05-23 18:30:36 +02:00
|
|
|
}
|
|
|
|
}
|
2014-07-07 15:54:46 +09:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 271, 1)) {
|
2014-07-07 16:52:50 +09:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "Material", "float", "line_col[4]")) {
|
2014-07-07 15:54:46 +09:00
|
|
|
Material *mat;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (mat = bmain->materials.first; mat; mat = mat->id.next) {
|
2014-07-07 15:54:46 +09:00
|
|
|
mat->line_col[0] = mat->line_col[1] = mat->line_col[2] = 0.0f;
|
|
|
|
mat->line_col[3] = mat->alpha;
|
|
|
|
}
|
|
|
|
}
|
2014-07-21 12:02:05 +02:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "RenderData", "int", "preview_start_resolution")) {
|
|
|
|
Scene *scene;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2014-07-21 12:02:05 +02:00
|
|
|
scene->r.preview_start_resolution = 64;
|
|
|
|
}
|
|
|
|
}
|
2014-07-07 15:54:46 +09:00
|
|
|
}
|
2014-07-09 19:02:07 +06:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 271, 3)) {
|
2014-07-21 12:02:05 +02:00
|
|
|
Brush *br;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (br = bmain->brushes.first; br; br = br->id.next) {
|
2014-07-21 12:02:05 +02:00
|
|
|
br->fill_threshold = 0.2f;
|
|
|
|
}
|
2014-10-02 07:49:11 -04:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "BevelModifierData", "int", "mat")) {
|
|
|
|
Object *ob;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2014-10-02 07:49:11 -04:00
|
|
|
ModifierData *md;
|
|
|
|
|
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Bevel) {
|
|
|
|
BevelModifierData *bmd = (BevelModifierData *)md;
|
|
|
|
bmd->mat = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-07-21 12:02:05 +02:00
|
|
|
}
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 271, 6)) {
|
2016-12-28 17:30:58 +01:00
|
|
|
Object *ob;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2016-12-28 17:30:58 +01:00
|
|
|
ModifierData *md;
|
|
|
|
|
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_ParticleSystem) {
|
|
|
|
ParticleSystemModifierData *pmd = (ParticleSystemModifierData *)md;
|
|
|
|
if (pmd->psys && pmd->psys->clmd) {
|
|
|
|
pmd->psys->clmd->sim_parms->vel_damping = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 272, 0)) {
|
2014-09-23 22:56:37 +06:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "RenderData", "int", "preview_start_resolution")) {
|
|
|
|
Scene *scene;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2014-09-23 22:56:37 +06:00
|
|
|
scene->r.preview_start_resolution = 64;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-10-31 18:26:58 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 272, 1)) {
|
2014-10-03 13:14:10 +02:00
|
|
|
Brush *br;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (br = bmain->brushes.first; br; br = br->id.next) {
|
2014-10-03 13:14:10 +02:00
|
|
|
if ((br->ob_mode & OB_MODE_SCULPT) && ELEM(br->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_SNAKE_HOOK))
|
|
|
|
br->alpha = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
2014-10-02 19:04:38 +06:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 272, 2)) {
|
2014-10-31 18:26:58 +01:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "Image", "float", "gen_color")) {
|
|
|
|
Image *image;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (image = bmain->images.first; image != NULL; image = image->id.next) {
|
2014-10-31 18:26:58 +01:00
|
|
|
image->gen_color[3] = 1.0f;
|
|
|
|
}
|
2014-10-02 19:04:38 +06:00
|
|
|
}
|
2014-10-14 11:49:58 +02:00
|
|
|
|
2014-10-31 18:26:58 +01:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "bStretchToConstraint", "float", "bulge_min")) {
|
|
|
|
Object *ob;
|
2014-10-14 11:49:58 +02:00
|
|
|
|
2014-10-31 18:26:58 +01:00
|
|
|
/* Update Transform constraint (again :|). */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2014-10-31 18:26:58 +01:00
|
|
|
do_version_constraints_stretch_to_limits(&ob->constraints);
|
2014-10-14 11:49:58 +02:00
|
|
|
|
2014-10-31 18:26:58 +01:00
|
|
|
if (ob->pose) {
|
|
|
|
/* Bones constraints! */
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
|
|
|
|
do_version_constraints_stretch_to_limits(&pchan->constraints);
|
|
|
|
}
|
2014-10-14 11:49:58 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-12-26 23:51:27 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 273, 1)) {
|
2018-11-30 14:51:16 +11:00
|
|
|
#define BRUSH_RAKE (1 << 7)
|
2014-12-27 00:10:53 +01:00
|
|
|
#define BRUSH_RANDOM_ROTATION (1 << 25)
|
2014-12-26 23:51:27 +01:00
|
|
|
|
|
|
|
Brush *br;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (br = bmain->brushes.first; br; br = br->id.next) {
|
2014-12-26 23:51:27 +01:00
|
|
|
if (br->flag & BRUSH_RAKE) {
|
|
|
|
br->mtex.brush_angle_mode |= MTEX_ANGLE_RAKE;
|
|
|
|
br->mask_mtex.brush_angle_mode |= MTEX_ANGLE_RAKE;
|
|
|
|
}
|
2014-12-27 00:10:53 +01:00
|
|
|
else if (br->flag & BRUSH_RANDOM_ROTATION) {
|
2014-12-26 23:51:27 +01:00
|
|
|
br->mtex.brush_angle_mode |= MTEX_ANGLE_RANDOM;
|
|
|
|
br->mask_mtex.brush_angle_mode |= MTEX_ANGLE_RANDOM;
|
|
|
|
}
|
2015-01-31 17:23:30 +11:00
|
|
|
br->mtex.random_angle = 2.0 * M_PI;
|
|
|
|
br->mask_mtex.random_angle = 2.0 * M_PI;
|
2014-12-26 23:51:27 +01:00
|
|
|
}
|
2015-04-06 10:40:12 -03:00
|
|
|
}
|
2014-12-26 23:51:27 +01:00
|
|
|
|
|
|
|
#undef BRUSH_RAKE
|
|
|
|
#undef BRUSH_RANDOM_ROTATION
|
2015-01-19 16:30:35 +11:00
|
|
|
|
|
|
|
/* Customizable Safe Areas */
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 273, 2)) {
|
2015-01-19 16:30:35 +11:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "Scene", "DisplaySafeAreas", "safe_areas")) {
|
|
|
|
Scene *scene;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2015-01-19 16:30:35 +11:00
|
|
|
copy_v2_fl2(scene->safe_areas.title, 3.5f / 100.0f, 3.5f / 100.0f);
|
|
|
|
copy_v2_fl2(scene->safe_areas.action, 10.0f / 100.0f, 5.0f / 100.0f);
|
|
|
|
copy_v2_fl2(scene->safe_areas.title_center, 17.5f / 100.0f, 5.0f / 100.0f);
|
|
|
|
copy_v2_fl2(scene->safe_areas.action_center, 15.0f / 100.0f, 5.0f / 100.0f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 273, 3)) {
|
2016-12-28 17:30:58 +01:00
|
|
|
ParticleSettings *part;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (part = bmain->particles.first; part; part = part->id.next) {
|
2016-12-28 17:30:58 +01:00
|
|
|
if (part->clumpcurve)
|
|
|
|
part->child_flag |= PART_CHILD_USE_CLUMP_CURVE;
|
|
|
|
if (part->roughcurve)
|
|
|
|
part->child_flag |= PART_CHILD_USE_ROUGH_CURVE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 273, 6)) {
|
Add Custom Loop Normals.
This is the core code for it, tools (datatransfer and modifier) will come in next commits).
RNA api is already there, though.
See the code for details, but basically, we define, for each 'smooth fan'
(which is a set of adjacent loops around a same vertex that are smooth, i.e. have a single same normal),
a 'loop normal space' (or lnor space), using auto-computed normal and relevant edges, and store
custom normal as two angular factors inside that space. This allows to have custom normals
'following' deformations of the geometry, and to only save two shorts per loop in new clnor CDLayer.
Normal manipulation (editing, mixing, interpolating, etc.) shall always happen with plain 3D vectors normals,
and be converted back into storage format at the end.
Clnor computation has also been threaded (at least for Mesh case, not for BMesh), since the process can
be rather heavy with high poly meshes.
Also, bumping subversion, and fix mess in 2.70 versioning code.
2015-02-05 14:24:48 +01:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "ClothSimSettings", "float", "bending_damping")) {
|
|
|
|
Object *ob;
|
|
|
|
ModifierData *md;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
Add Custom Loop Normals.
This is the core code for it, tools (datatransfer and modifier) will come in next commits).
RNA api is already there, though.
See the code for details, but basically, we define, for each 'smooth fan'
(which is a set of adjacent loops around a same vertex that are smooth, i.e. have a single same normal),
a 'loop normal space' (or lnor space), using auto-computed normal and relevant edges, and store
custom normal as two angular factors inside that space. This allows to have custom normals
'following' deformations of the geometry, and to only save two shorts per loop in new clnor CDLayer.
Normal manipulation (editing, mixing, interpolating, etc.) shall always happen with plain 3D vectors normals,
and be converted back into storage format at the end.
Clnor computation has also been threaded (at least for Mesh case, not for BMesh), since the process can
be rather heavy with high poly meshes.
Also, bumping subversion, and fix mess in 2.70 versioning code.
2015-02-05 14:24:48 +01:00
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Cloth) {
|
|
|
|
ClothModifierData *clmd = (ClothModifierData *)md;
|
|
|
|
clmd->sim_parms->bending_damping = 0.5f;
|
|
|
|
}
|
2016-12-28 17:30:58 +01:00
|
|
|
else if (md->type == eModifierType_ParticleSystem) {
|
|
|
|
ParticleSystemModifierData *pmd = (ParticleSystemModifierData *)md;
|
|
|
|
if (pmd->psys->clmd) {
|
|
|
|
pmd->psys->clmd->sim_parms->bending_damping = 0.5f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "ParticleSettings", "float", "clump_noise_size")) {
|
|
|
|
ParticleSettings *part;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (part = bmain->particles.first; part; part = part->id.next) {
|
2016-12-28 17:30:58 +01:00
|
|
|
part->clump_noise_size = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "ParticleSettings", "int", "kink_extra_steps")) {
|
|
|
|
ParticleSettings *part;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (part = bmain->particles.first; part; part = part->id.next) {
|
2016-12-28 17:30:58 +01:00
|
|
|
part->kink_extra_steps = 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "MTex", "float", "kinkampfac")) {
|
|
|
|
ParticleSettings *part;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (part = bmain->particles.first; part; part = part->id.next) {
|
2016-12-28 17:30:58 +01:00
|
|
|
int a;
|
|
|
|
for (a = 0; a < MAX_MTEX; a++) {
|
|
|
|
MTex *mtex = part->mtex[a];
|
|
|
|
if (mtex) {
|
|
|
|
mtex->kinkampfac = 1.0f;
|
|
|
|
}
|
2014-09-26 17:25:21 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-01-12 16:03:12 +01:00
|
|
|
|
Add Custom Loop Normals.
This is the core code for it, tools (datatransfer and modifier) will come in next commits).
RNA api is already there, though.
See the code for details, but basically, we define, for each 'smooth fan'
(which is a set of adjacent loops around a same vertex that are smooth, i.e. have a single same normal),
a 'loop normal space' (or lnor space), using auto-computed normal and relevant edges, and store
custom normal as two angular factors inside that space. This allows to have custom normals
'following' deformations of the geometry, and to only save two shorts per loop in new clnor CDLayer.
Normal manipulation (editing, mixing, interpolating, etc.) shall always happen with plain 3D vectors normals,
and be converted back into storage format at the end.
Clnor computation has also been threaded (at least for Mesh case, not for BMesh), since the process can
be rather heavy with high poly meshes.
Also, bumping subversion, and fix mess in 2.70 versioning code.
2015-02-05 14:24:48 +01:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "HookModifierData", "char", "flag")) {
|
|
|
|
Object *ob;
|
2015-02-04 07:04:21 +11:00
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
Add Custom Loop Normals.
This is the core code for it, tools (datatransfer and modifier) will come in next commits).
RNA api is already there, though.
See the code for details, but basically, we define, for each 'smooth fan'
(which is a set of adjacent loops around a same vertex that are smooth, i.e. have a single same normal),
a 'loop normal space' (or lnor space), using auto-computed normal and relevant edges, and store
custom normal as two angular factors inside that space. This allows to have custom normals
'following' deformations of the geometry, and to only save two shorts per loop in new clnor CDLayer.
Normal manipulation (editing, mixing, interpolating, etc.) shall always happen with plain 3D vectors normals,
and be converted back into storage format at the end.
Clnor computation has also been threaded (at least for Mesh case, not for BMesh), since the process can
be rather heavy with high poly meshes.
Also, bumping subversion, and fix mess in 2.70 versioning code.
2015-02-05 14:24:48 +01:00
|
|
|
ModifierData *md;
|
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Hook) {
|
|
|
|
HookModifierData *hmd = (HookModifierData *)md;
|
|
|
|
hmd->falloff_type = eHook_Falloff_InvSquare;
|
|
|
|
}
|
2015-02-04 07:04:21 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Add Custom Loop Normals.
This is the core code for it, tools (datatransfer and modifier) will come in next commits).
RNA api is already there, though.
See the code for details, but basically, we define, for each 'smooth fan'
(which is a set of adjacent loops around a same vertex that are smooth, i.e. have a single same normal),
a 'loop normal space' (or lnor space), using auto-computed normal and relevant edges, and store
custom normal as two angular factors inside that space. This allows to have custom normals
'following' deformations of the geometry, and to only save two shorts per loop in new clnor CDLayer.
Normal manipulation (editing, mixing, interpolating, etc.) shall always happen with plain 3D vectors normals,
and be converted back into storage format at the end.
Clnor computation has also been threaded (at least for Mesh case, not for BMesh), since the process can
be rather heavy with high poly meshes.
Also, bumping subversion, and fix mess in 2.70 versioning code.
2015-02-05 14:24:48 +01:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "NodePlaneTrackDeformData", "char", "flag")) {
|
2018-11-30 15:22:01 +11:00
|
|
|
FOREACH_NODETREE_BEGIN(bmain, ntree, id) {
|
Add Custom Loop Normals.
This is the core code for it, tools (datatransfer and modifier) will come in next commits).
RNA api is already there, though.
See the code for details, but basically, we define, for each 'smooth fan'
(which is a set of adjacent loops around a same vertex that are smooth, i.e. have a single same normal),
a 'loop normal space' (or lnor space), using auto-computed normal and relevant edges, and store
custom normal as two angular factors inside that space. This allows to have custom normals
'following' deformations of the geometry, and to only save two shorts per loop in new clnor CDLayer.
Normal manipulation (editing, mixing, interpolating, etc.) shall always happen with plain 3D vectors normals,
and be converted back into storage format at the end.
Clnor computation has also been threaded (at least for Mesh case, not for BMesh), since the process can
be rather heavy with high poly meshes.
Also, bumping subversion, and fix mess in 2.70 versioning code.
2015-02-05 14:24:48 +01:00
|
|
|
if (ntree->type == NTREE_COMPOSIT) {
|
|
|
|
bNode *node;
|
|
|
|
for (node = ntree->nodes.first; node; node = node->next) {
|
|
|
|
if (ELEM(node->type, CMP_NODE_PLANETRACKDEFORM)) {
|
|
|
|
NodePlaneTrackDeformData *data = node->storage;
|
|
|
|
data->flag = 0;
|
|
|
|
data->motion_blur_samples = 16;
|
|
|
|
data->motion_blur_shutter = 0.5f;
|
|
|
|
}
|
2015-02-04 01:16:28 +05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-30 15:22:01 +11:00
|
|
|
FOREACH_NODETREE_END;
|
2015-02-04 01:16:28 +05:00
|
|
|
}
|
2015-02-12 18:54:41 +01:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "Camera", "GPUDOFSettings", "gpu_dof")) {
|
|
|
|
Camera *ca;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ca = bmain->cameras.first; ca; ca = ca->id.next) {
|
2015-02-12 18:54:41 +01:00
|
|
|
ca->gpu_dof.fstop = 128.0f;
|
|
|
|
ca->gpu_dof.focal_length = 1.0f;
|
|
|
|
ca->gpu_dof.focus_distance = 1.0f;
|
|
|
|
ca->gpu_dof.sensor = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
2015-02-04 01:16:28 +05:00
|
|
|
}
|
2015-02-11 00:09:45 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 273, 8)) {
|
2015-02-13 13:51:10 +05:00
|
|
|
Object *ob;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob != NULL; ob = ob->id.next) {
|
2015-02-13 13:51:10 +05:00
|
|
|
ModifierData *md;
|
|
|
|
for (md = ob->modifiers.last; md != NULL; md = md->prev) {
|
|
|
|
if (modifier_unique_name(&ob->modifiers, md)) {
|
|
|
|
printf("Warning: Object '%s' had several modifiers with the "
|
|
|
|
"same name, renamed one of them to '%s'.\n",
|
|
|
|
ob->id.name + 2, md->name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-02-26 14:26:42 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 273, 9)) {
|
2015-02-26 14:26:42 +01:00
|
|
|
bScreen *scr;
|
|
|
|
ScrArea *sa;
|
|
|
|
SpaceLink *sl;
|
|
|
|
ARegion *ar;
|
|
|
|
|
|
|
|
/* Make sure sequencer preview area limits zoom */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scr = bmain->screens.first; scr; scr = scr->id.next) {
|
2015-02-26 14:26:42 +01:00
|
|
|
for (sa = scr->areabase.first; sa; sa = sa->next) {
|
|
|
|
for (sl = sa->spacedata.first; sl; sl = sl->next) {
|
|
|
|
if (sl->spacetype == SPACE_SEQ) {
|
|
|
|
for (ar = sl->regionbase.first; ar; ar = ar->next) {
|
|
|
|
if (ar->regiontype == RGN_TYPE_PREVIEW) {
|
|
|
|
ar->v2d.keepzoom |= V2D_LIMITZOOM;
|
2015-03-05 19:05:39 +01:00
|
|
|
ar->v2d.minzoom = 0.001f;
|
|
|
|
ar->v2d.maxzoom = 1000.0f;
|
2015-02-26 14:26:42 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 274, 1)) {
|
2016-12-28 17:30:58 +01:00
|
|
|
/* particle systems need to be forced to redistribute for jitter mode fix */
|
|
|
|
{
|
|
|
|
Object *ob;
|
|
|
|
ParticleSystem *psys;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2016-12-28 17:30:58 +01:00
|
|
|
for (psys = ob->particlesystem.first; psys; psys = psys->next) {
|
|
|
|
if ((psys->pointcache->flag & PTCACHE_BAKED) == 0) {
|
2018-12-06 17:52:37 +01:00
|
|
|
psys->recalc |= ID_RECALC_PSYS_RESET;
|
2016-12-28 17:30:58 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-22 18:13:53 +01:00
|
|
|
/* hysteresis setted to 10% but not actived */
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "LodLevel", "int", "obhysteresis")) {
|
2015-03-23 22:51:12 +11:00
|
|
|
Object *ob;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2015-03-22 18:13:53 +01:00
|
|
|
LodLevel *level;
|
|
|
|
for (level = ob->lodlevels.first; level; level = level->next) {
|
|
|
|
level->obhysteresis = 10;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-03-17 11:04:44 +01:00
|
|
|
}
|
2015-03-23 18:33:50 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 274, 4)) {
|
2015-04-06 10:40:12 -03:00
|
|
|
SceneRenderView *srv;
|
|
|
|
wmWindowManager *wm;
|
|
|
|
bScreen *screen;
|
|
|
|
wmWindow *win;
|
|
|
|
Scene *scene;
|
|
|
|
Camera *cam;
|
|
|
|
Image *ima;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2015-04-06 10:40:12 -03:00
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
BKE_scene_add_render_view(scene, STEREO_LEFT_NAME);
|
|
|
|
srv = scene->r.views.first;
|
|
|
|
BLI_strncpy(srv->suffix, STEREO_LEFT_SUFFIX, sizeof(srv->suffix));
|
|
|
|
|
|
|
|
BKE_scene_add_render_view(scene, STEREO_RIGHT_NAME);
|
|
|
|
srv = scene->r.views.last;
|
|
|
|
BLI_strncpy(srv->suffix, STEREO_RIGHT_SUFFIX, sizeof(srv->suffix));
|
|
|
|
|
|
|
|
SEQ_BEGIN (scene->ed, seq)
|
|
|
|
{
|
|
|
|
seq->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Stereo Display 3d Format");
|
2015-04-07 16:08:46 +02:00
|
|
|
|
|
|
|
#define SEQ_USE_PROXY_CUSTOM_DIR (1 << 19)
|
|
|
|
#define SEQ_USE_PROXY_CUSTOM_FILE (1 << 21)
|
|
|
|
if (seq->strip && seq->strip->proxy && !seq->strip->proxy->storage) {
|
|
|
|
if (seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)
|
|
|
|
seq->strip->proxy->storage = SEQ_STORAGE_PROXY_CUSTOM_DIR;
|
|
|
|
if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)
|
|
|
|
seq->strip->proxy->storage = SEQ_STORAGE_PROXY_CUSTOM_FILE;
|
|
|
|
}
|
|
|
|
#undef SEQ_USE_PROXY_CUSTOM_DIR
|
|
|
|
#undef SEQ_USE_PROXY_CUSTOM_FILE
|
|
|
|
|
2018-11-30 15:35:15 +11:00
|
|
|
} SEQ_END;
|
2015-04-06 10:40:12 -03:00
|
|
|
}
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (screen = bmain->screens.first; screen; screen = screen->id.next) {
|
2015-04-06 10:40:12 -03:00
|
|
|
ScrArea *sa;
|
|
|
|
for (sa = screen->areabase.first; sa; sa = sa->next) {
|
|
|
|
SpaceLink *sl;
|
|
|
|
|
|
|
|
for (sl = sa->spacedata.first; sl; sl = sl->next) {
|
|
|
|
switch (sl->spacetype) {
|
|
|
|
case SPACE_VIEW3D:
|
|
|
|
{
|
|
|
|
View3D *v3d = (View3D *)sl;
|
|
|
|
v3d->stereo3d_camera = STEREO_3D_ID;
|
|
|
|
v3d->stereo3d_flag |= V3D_S3D_DISPPLANE;
|
|
|
|
v3d->stereo3d_convergence_alpha = 0.15f;
|
|
|
|
v3d->stereo3d_volume_alpha = 0.05f;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case SPACE_IMAGE:
|
|
|
|
{
|
2018-11-30 14:51:16 +11:00
|
|
|
SpaceImage *sima = (SpaceImage *)sl;
|
2015-04-06 10:40:12 -03:00
|
|
|
sima->iuser.flag |= IMA_SHOW_STEREO;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (cam = bmain->cameras.first; cam; cam = cam->id.next) {
|
2015-04-14 10:30:14 +10:00
|
|
|
cam->stereo.interocular_distance = 0.065f;
|
|
|
|
cam->stereo.convergence_distance = 30.0f * 0.065f;
|
2015-04-06 10:40:12 -03:00
|
|
|
}
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ima = bmain->images.first; ima; ima = ima->id.next) {
|
2015-04-06 10:40:12 -03:00
|
|
|
ima->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Image Stereo 3d Format");
|
|
|
|
|
|
|
|
if (ima->packedfile) {
|
|
|
|
ImagePackedFile *imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image Packed File");
|
|
|
|
BLI_addtail(&ima->packedfiles, imapf);
|
|
|
|
|
|
|
|
imapf->packedfile = ima->packedfile;
|
|
|
|
BLI_strncpy(imapf->filepath, ima->name, FILE_MAX);
|
|
|
|
ima->packedfile = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
for (wm = bmain->wm.first; wm; wm = wm->id.next) {
|
2015-04-06 10:40:12 -03:00
|
|
|
for (win = wm->windows.first; win; win = win->next) {
|
|
|
|
win->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Stereo Display 3d Format");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-04-29 21:25:34 +02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 274, 6)) {
|
2015-04-29 21:25:34 +02:00
|
|
|
bScreen *screen;
|
|
|
|
|
2015-05-01 01:49:58 +10:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "FileSelectParams", "int", "thumbnail_size")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (screen = bmain->screens.first; screen; screen = screen->id.next) {
|
2015-04-29 21:25:34 +02:00
|
|
|
ScrArea *sa;
|
|
|
|
|
|
|
|
for (sa = screen->areabase.first; sa; sa = sa->next) {
|
|
|
|
SpaceLink *sl;
|
|
|
|
|
|
|
|
for (sl = sa->spacedata.first; sl; sl = sl->next) {
|
|
|
|
if (sl->spacetype == SPACE_FILE) {
|
|
|
|
SpaceFile *sfile = (SpaceFile *)sl;
|
|
|
|
|
|
|
|
if (sfile->params) {
|
2015-05-01 01:49:58 +10:00
|
|
|
sfile->params->thumbnail_size = 128;
|
2015-04-29 21:25:34 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-05-04 16:26:28 +05:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "RenderData", "short", "simplify_subsurf_render")) {
|
|
|
|
Scene *scene;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) {
|
2015-05-04 16:26:28 +05:00
|
|
|
scene->r.simplify_subsurf_render = scene->r.simplify_subsurf;
|
|
|
|
scene->r.simplify_particles_render = scene->r.simplify_particles;
|
|
|
|
}
|
|
|
|
}
|
2015-06-04 19:49:59 +10:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "DecimateModifierData", "float", "defgrp_factor")) {
|
|
|
|
Object *ob;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2015-06-04 19:49:59 +10:00
|
|
|
ModifierData *md;
|
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Decimate) {
|
|
|
|
DecimateModifierData *dmd = (DecimateModifierData *)md;
|
|
|
|
dmd->defgrp_factor = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-04-29 21:25:34 +02:00
|
|
|
}
|
2015-07-27 12:55:40 +02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 275, 3)) {
|
2015-07-27 12:55:40 +02:00
|
|
|
Brush *br;
|
|
|
|
#define BRUSH_TORUS (1 << 1)
|
2019-03-08 09:29:17 +11:00
|
|
|
for (br = bmain->brushes.first; br; br = br->id.next) {
|
2015-07-27 12:55:40 +02:00
|
|
|
br->flag &= ~BRUSH_TORUS;
|
|
|
|
}
|
|
|
|
#undef BRUSH_TORUS
|
|
|
|
}
|
2015-09-21 23:49:58 +10:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 276, 2)) {
|
2015-09-21 23:49:58 +10:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "bPoseChannel", "float", "custom_scale")) {
|
|
|
|
Object *ob;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2015-09-21 23:49:58 +10:00
|
|
|
if (ob->pose) {
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
|
|
|
|
pchan->custom_scale = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-10-23 04:54:07 +11:00
|
|
|
|
|
|
|
{
|
|
|
|
bScreen *screen;
|
2018-11-30 14:51:16 +11:00
|
|
|
#define RV3D_VIEW_PERSPORTHO 7
|
2019-03-08 09:29:17 +11:00
|
|
|
for (screen = bmain->screens.first; screen; screen = screen->id.next) {
|
2015-10-23 04:54:07 +11:00
|
|
|
ScrArea *sa;
|
|
|
|
for (sa = screen->areabase.first; sa; sa = sa->next) {
|
|
|
|
SpaceLink *sl;
|
|
|
|
for (sl = sa->spacedata.first; sl; sl = sl->next) {
|
|
|
|
if (sl->spacetype == SPACE_VIEW3D) {
|
|
|
|
ARegion *ar;
|
|
|
|
ListBase *lb = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase;
|
|
|
|
for (ar = lb->first; ar; ar = ar->next) {
|
|
|
|
if (ar->regiontype == RGN_TYPE_WINDOW) {
|
|
|
|
if (ar->regiondata) {
|
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
|
|
|
if (rv3d->view == RV3D_VIEW_PERSPORTHO) {
|
|
|
|
rv3d->view = RV3D_VIEW_USER;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#undef RV3D_VIEW_PERSPORTHO
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2018-11-30 14:51:16 +11:00
|
|
|
#define LA_YF_PHOTON 5
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Light *la = bmain->lights.first; la; la = la->id.next) {
|
2019-02-27 10:46:48 +11:00
|
|
|
if (la->type == LA_YF_PHOTON) {
|
|
|
|
la->type = LA_LOCAL;
|
2015-10-23 04:54:07 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#undef LA_YF_PHOTON
|
|
|
|
}
|
2015-09-21 23:49:58 +10:00
|
|
|
}
|
2015-10-27 19:00:51 +05:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 276, 3)) {
|
2015-10-27 19:00:51 +05:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "RenderData", "CurveMapping", "mblur_shutter_curve")) {
|
|
|
|
Scene *scene;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) {
|
2015-10-27 19:00:51 +05:00
|
|
|
CurveMapping *curve_mapping = &scene->r.mblur_shutter_curve;
|
|
|
|
curvemapping_set_defaults(curve_mapping, 1, 0.0f, 0.0f, 1.0f, 1.0f);
|
|
|
|
curvemapping_initialize(curve_mapping);
|
|
|
|
curvemap_reset(curve_mapping->cm,
|
|
|
|
&curve_mapping->clipr,
|
|
|
|
CURVE_PRESET_MAX,
|
|
|
|
CURVEMAP_SLOPE_POS_NEG);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-10-28 02:02:31 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 276, 4)) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2015-12-13 21:03:13 +13:00
|
|
|
ToolSettings *ts = scene->toolsettings;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
if (ts->gp_sculpt.brush[0].size == 0) {
|
2018-11-18 19:28:54 +01:00
|
|
|
GP_Sculpt_Settings *gset = &ts->gp_sculpt;
|
|
|
|
GP_Sculpt_Data *brush;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_SMOOTH];
|
2015-12-13 21:03:13 +13:00
|
|
|
brush->size = 25;
|
|
|
|
brush->strength = 0.3f;
|
2018-11-18 19:28:54 +01:00
|
|
|
brush->flag = GP_SCULPT_FLAG_USE_FALLOFF | GP_SCULPT_FLAG_SMOOTH_PRESSURE;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_THICKNESS];
|
2015-12-13 21:03:13 +13:00
|
|
|
brush->size = 25;
|
|
|
|
brush->strength = 0.5f;
|
2018-11-18 19:28:54 +01:00
|
|
|
brush->flag = GP_SCULPT_FLAG_USE_FALLOFF;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_GRAB];
|
2015-12-13 21:03:13 +13:00
|
|
|
brush->size = 50;
|
|
|
|
brush->strength = 0.3f;
|
2018-11-18 19:28:54 +01:00
|
|
|
brush->flag = GP_SCULPT_FLAG_USE_FALLOFF;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_PUSH];
|
2015-12-13 21:03:13 +13:00
|
|
|
brush->size = 25;
|
|
|
|
brush->strength = 0.3f;
|
2018-11-18 19:28:54 +01:00
|
|
|
brush->flag = GP_SCULPT_FLAG_USE_FALLOFF;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_TWIST];
|
2015-12-13 21:03:13 +13:00
|
|
|
brush->size = 50;
|
|
|
|
brush->strength = 0.3f; // XXX?
|
2018-11-18 19:28:54 +01:00
|
|
|
brush->flag = GP_SCULPT_FLAG_USE_FALLOFF;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_PINCH];
|
2015-12-13 21:03:13 +13:00
|
|
|
brush->size = 50;
|
|
|
|
brush->strength = 0.5f; // XXX?
|
2018-11-18 19:28:54 +01:00
|
|
|
brush->flag = GP_SCULPT_FLAG_USE_FALLOFF;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_RANDOMIZE];
|
2015-12-13 21:03:13 +13:00
|
|
|
brush->size = 25;
|
|
|
|
brush->strength = 0.5f;
|
2018-11-18 19:28:54 +01:00
|
|
|
brush->flag = GP_SCULPT_FLAG_USE_FALLOFF;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_CLONE];
|
2015-12-13 21:03:13 +13:00
|
|
|
brush->size = 50;
|
|
|
|
brush->strength = 1.0f;
|
|
|
|
}
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "ToolSettings", "char", "gpencil_v3d_align")) {
|
|
|
|
#if 0 /* XXX: Cannot do this, as we get random crashes... */
|
|
|
|
if (scene->gpd) {
|
|
|
|
bGPdata *gpd = scene->gpd;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
/* Copy over the settings stored in the GP datablock linked to the scene, for minimal disruption */
|
|
|
|
ts->gpencil_v3d_align = 0;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
if (gpd->flag & GP_DATA_VIEWALIGN) ts->gpencil_v3d_align |= GP_PROJECT_VIEWSPACE;
|
|
|
|
if (gpd->flag & GP_DATA_DEPTH_VIEW) ts->gpencil_v3d_align |= GP_PROJECT_DEPTH_VIEW;
|
|
|
|
if (gpd->flag & GP_DATA_DEPTH_STROKE) ts->gpencil_v3d_align |= GP_PROJECT_DEPTH_STROKE;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
if (gpd->flag & GP_DATA_DEPTH_STROKE_ENDPOINTS)
|
|
|
|
ts->gpencil_v3d_align |= GP_PROJECT_DEPTH_STROKE_ENDPOINTS;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* Default to cursor for all standard 3D views */
|
|
|
|
ts->gpencil_v3d_align = GP_PROJECT_VIEWSPACE;
|
|
|
|
}
|
|
|
|
#endif
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
ts->gpencil_v3d_align = GP_PROJECT_VIEWSPACE;
|
|
|
|
ts->gpencil_v2d_align = GP_PROJECT_VIEWSPACE;
|
|
|
|
ts->gpencil_seq_align = GP_PROJECT_VIEWSPACE;
|
|
|
|
ts->gpencil_ima_align = GP_PROJECT_VIEWSPACE;
|
|
|
|
}
|
|
|
|
}
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (bGPdata *gpd = bmain->gpencils.first; gpd; gpd = gpd->id.next) {
|
2015-12-13 21:09:47 +13:00
|
|
|
bool enabled = false;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2015-12-13 21:09:47 +13:00
|
|
|
/* Ensure that the datablock's onionskinning toggle flag
|
|
|
|
* stays in sync with the status of the actual layers
|
|
|
|
*/
|
|
|
|
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
|
|
|
|
if (gpl->flag & GP_LAYER_ONIONSKIN) {
|
|
|
|
enabled = true;
|
|
|
|
}
|
|
|
|
}
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2015-12-13 21:09:47 +13:00
|
|
|
if (enabled)
|
|
|
|
gpd->flag |= GP_DATA_SHOW_ONIONSKINS;
|
|
|
|
else
|
|
|
|
gpd->flag &= ~GP_DATA_SHOW_ONIONSKINS;
|
|
|
|
}
|
2015-12-13 21:03:13 +13:00
|
|
|
}
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 276, 5)) {
|
Split id->flag in two, persistent flags and runtime tags.
This is purely internal sanitizing/cleanup, no change in behavior is expected at all.
This change was also needed because we were getting short on ID flags, and
future enhancement of 'user_one' ID behavior requires two new ones.
id->flag remains for persistent data (fakeuser only, so far!), this also allows us
100% backward & forward compatibility.
New id->tag is used for most flags. Though written in .blend files, its content
is cleared at read time.
Note that .blend file version was bumped, so that we can clear runtimeflags from
old .blends, important in case we add new persistent flags in future.
Also, behavior of tags (either status ones, or whether they need to be cleared before/after use)
has been added as comments to their declaration.
Reviewers: sergey, campbellbarton
Differential Revision: https://developer.blender.org/D1683
2015-12-27 11:53:50 +01:00
|
|
|
ListBase *lbarray[MAX_LIBARRAY];
|
|
|
|
int a;
|
|
|
|
|
|
|
|
/* Important to clear all non-persistent flags from older versions here, otherwise they could collide
|
|
|
|
* with any new persistent flag we may add in the future. */
|
2018-06-05 15:10:33 +02:00
|
|
|
a = set_listbasepointers(bmain, lbarray);
|
Split id->flag in two, persistent flags and runtime tags.
This is purely internal sanitizing/cleanup, no change in behavior is expected at all.
This change was also needed because we were getting short on ID flags, and
future enhancement of 'user_one' ID behavior requires two new ones.
id->flag remains for persistent data (fakeuser only, so far!), this also allows us
100% backward & forward compatibility.
New id->tag is used for most flags. Though written in .blend files, its content
is cleared at read time.
Note that .blend file version was bumped, so that we can clear runtimeflags from
old .blends, important in case we add new persistent flags in future.
Also, behavior of tags (either status ones, or whether they need to be cleared before/after use)
has been added as comments to their declaration.
Reviewers: sergey, campbellbarton
Differential Revision: https://developer.blender.org/D1683
2015-12-27 11:53:50 +01:00
|
|
|
while (a--) {
|
|
|
|
for (ID *id = lbarray[a]->first; id; id = id->next) {
|
|
|
|
id->flag &= LIB_FAKEUSER;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-01-15 13:00:56 -02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 276, 7)) {
|
2016-01-15 13:00:56 -02:00
|
|
|
Scene *scene;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) {
|
2016-01-15 13:00:56 -02:00
|
|
|
scene->r.bake.pass_filter = R_BAKE_PASS_FILTER_ALL;
|
|
|
|
}
|
|
|
|
}
|
2016-03-03 16:06:49 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 277, 1)) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2016-12-28 17:30:58 +01:00
|
|
|
ParticleEditSettings *pset = &scene->toolsettings->particle;
|
2018-01-18 14:02:26 +11:00
|
|
|
for (int a = 0; a < ARRAY_SIZE(pset->brush); a++) {
|
2016-12-28 17:30:58 +01:00
|
|
|
if (pset->brush[a].strength > 1.0f) {
|
|
|
|
pset->brush[a].strength *= 0.01f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
|
2016-03-26 00:03:43 +01:00
|
|
|
for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
|
|
|
|
for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
|
2016-03-27 13:36:12 +02:00
|
|
|
ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase;
|
|
|
|
/* Bug: Was possible to add preview region to sequencer view by using AZones. */
|
2016-03-26 00:03:43 +01:00
|
|
|
if (sl->spacetype == SPACE_SEQ) {
|
|
|
|
SpaceSeq *sseq = (SpaceSeq *)sl;
|
|
|
|
if (sseq->view == SEQ_VIEW_SEQUENCE) {
|
2016-03-27 13:36:12 +02:00
|
|
|
for (ARegion *ar = regionbase->first; ar; ar = ar->next) {
|
2016-03-26 00:03:43 +01:00
|
|
|
/* remove preview region for sequencer-only view! */
|
|
|
|
if (ar->regiontype == RGN_TYPE_PREVIEW) {
|
2016-03-27 13:17:10 +02:00
|
|
|
ar->flag |= RGN_FLAG_HIDDEN;
|
|
|
|
ar->alignment = RGN_ALIGN_NONE;
|
2016-03-26 00:03:43 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-03-27 13:36:12 +02:00
|
|
|
/* Remove old deprecated region from filebrowsers */
|
|
|
|
else if (sl->spacetype == SPACE_FILE) {
|
|
|
|
for (ARegion *ar = regionbase->first; ar; ar = ar->next) {
|
|
|
|
if (ar->regiontype == RGN_TYPE_CHANNELS) {
|
|
|
|
/* Free old deprecated 'channel' region... */
|
|
|
|
BKE_area_region_free(NULL, ar);
|
|
|
|
BLI_freelinkN(regionbase, ar);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-03-26 00:03:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-04-15 18:10:05 +10:00
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2016-04-15 18:10:05 +10:00
|
|
|
CurvePaintSettings *cps = &scene->toolsettings->curve_paint_settings;
|
|
|
|
if (cps->error_threshold == 0) {
|
|
|
|
cps->curve_type = CU_BEZIER;
|
|
|
|
cps->flag |= CURVE_PAINT_FLAG_CORNERS_DETECT;
|
|
|
|
cps->error_threshold = 8;
|
|
|
|
cps->radius_max = 1.0f;
|
|
|
|
cps->corner_angle = DEG2RADF(70.0f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2016-04-27 15:49:13 +10:00
|
|
|
Sequence *seq;
|
|
|
|
|
|
|
|
SEQ_BEGIN (scene->ed, seq)
|
|
|
|
{
|
2017-07-05 22:18:36 +02:00
|
|
|
if (seq->type != SEQ_TYPE_TEXT) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (seq->effectdata == NULL) {
|
|
|
|
struct SeqEffectHandle effect_handle = BKE_sequence_get_effect(seq);
|
|
|
|
effect_handle.init(seq);
|
|
|
|
}
|
|
|
|
|
|
|
|
TextVars *data = seq->effectdata;
|
|
|
|
if (data->color[3] == 0.0f) {
|
|
|
|
copy_v4_fl(data->color, 1.0f);
|
|
|
|
data->shadow_color[3] = 1.0f;
|
2016-04-27 15:49:13 +10:00
|
|
|
}
|
2018-11-30 15:35:15 +11:00
|
|
|
} SEQ_END;
|
2016-04-27 15:49:13 +10:00
|
|
|
}
|
|
|
|
|
2016-05-08 14:38:30 +12:00
|
|
|
/* Adding "Properties" region to DopeSheet */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
|
2016-05-08 14:38:30 +12:00
|
|
|
for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
|
|
|
|
/* handle pushed-back space data first */
|
|
|
|
for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
|
|
|
|
if (sl->spacetype == SPACE_ACTION) {
|
|
|
|
SpaceAction *saction = (SpaceAction *)sl;
|
|
|
|
do_version_action_editor_properties_region(&saction->regionbase);
|
|
|
|
}
|
|
|
|
}
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-05-08 14:38:30 +12:00
|
|
|
/* active spacedata info must be handled too... */
|
|
|
|
if (sa->spacetype == SPACE_ACTION) {
|
|
|
|
do_version_action_editor_properties_region(&sa->regionbase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-03-03 16:06:49 +01:00
|
|
|
}
|
2016-05-18 03:19:06 +12:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 277, 2)) {
|
2016-05-18 03:19:06 +12:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "Bone", "float", "scaleIn")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (bArmature *arm = bmain->armatures.first; arm; arm = arm->id.next) {
|
2016-05-18 03:19:06 +12:00
|
|
|
do_version_bones_super_bbone(&arm->bonebase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "bPoseChannel", "float", "scaleIn")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2016-05-18 03:19:06 +12:00
|
|
|
if (ob->pose) {
|
|
|
|
for (bPoseChannel *pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
|
|
|
|
/* see do_version_bones_super_bbone()... */
|
|
|
|
pchan->scaleIn = 1.0f;
|
|
|
|
pchan->scaleOut = 1.0f;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-05-18 03:19:06 +12:00
|
|
|
/* also make sure some legacy (unused for over a decade) flags are unset,
|
|
|
|
* so that we can reuse them for stuff that matters now...
|
|
|
|
* (i.e. POSE_IK_MAT, (unknown/unused x 4), POSE_HAS_IK)
|
|
|
|
*
|
|
|
|
* These seem to have been runtime flags used by the IK solver, but that stuff
|
|
|
|
* should be able to be recalculated automatically anyway, so it should be fine.
|
|
|
|
*/
|
|
|
|
pchan->flag &= ~((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-05-17 14:12:29 +02:00
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Camera *camera = bmain->cameras.first; camera != NULL; camera = camera->id.next) {
|
2016-05-17 14:12:29 +02:00
|
|
|
if (camera->stereo.pole_merge_angle_from == 0.0f &&
|
2017-04-24 21:58:28 +10:00
|
|
|
camera->stereo.pole_merge_angle_to == 0.0f)
|
2016-05-17 14:12:29 +02:00
|
|
|
{
|
2016-07-22 04:05:38 +10:00
|
|
|
camera->stereo.pole_merge_angle_from = DEG2RADF(60.0f);
|
|
|
|
camera->stereo.pole_merge_angle_to = DEG2RADF(75.0f);
|
2016-05-17 14:12:29 +02:00
|
|
|
}
|
|
|
|
}
|
2016-06-06 21:41:17 +02:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "NormalEditModifierData", "float", "mix_limit")) {
|
|
|
|
Object *ob;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2016-06-06 21:41:17 +02:00
|
|
|
ModifierData *md;
|
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_NormalEdit) {
|
|
|
|
NormalEditModifierData *nemd = (NormalEditModifierData *)md;
|
|
|
|
nemd->mix_limit = DEG2RADF(180.0f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-07-13 17:45:55 +10:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "BooleanModifierData", "float", "double_threshold")) {
|
|
|
|
Object *ob;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2016-07-13 17:45:55 +10:00
|
|
|
ModifierData *md;
|
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Boolean) {
|
|
|
|
BooleanModifierData *bmd = (BooleanModifierData *)md;
|
|
|
|
bmd->double_threshold = 1e-6f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-07-20 13:54:55 +10:00
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Brush *br = bmain->brushes.first; br; br = br->id.next) {
|
2016-07-20 13:54:55 +10:00
|
|
|
if (br->sculpt_tool == SCULPT_TOOL_FLATTEN) {
|
|
|
|
br->flag |= BRUSH_ACCUMULATE;
|
|
|
|
}
|
|
|
|
}
|
2016-07-30 14:46:19 +10:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "ClothSimSettings", "float", "time_scale")) {
|
|
|
|
Object *ob;
|
|
|
|
ModifierData *md;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2016-07-30 14:46:19 +10:00
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Cloth) {
|
|
|
|
ClothModifierData *clmd = (ClothModifierData *)md;
|
|
|
|
clmd->sim_parms->time_scale = 1.0f;
|
|
|
|
}
|
2016-12-28 17:30:58 +01:00
|
|
|
else if (md->type == eModifierType_ParticleSystem) {
|
|
|
|
ParticleSystemModifierData *pmd = (ParticleSystemModifierData *)md;
|
|
|
|
if (pmd->psys->clmd) {
|
|
|
|
pmd->psys->clmd->sim_parms->time_scale = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
2016-07-30 14:46:19 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-03-03 16:06:49 +01:00
|
|
|
}
|
2016-08-03 23:31:48 +02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 277, 3)) {
|
2016-08-03 23:31:48 +02:00
|
|
|
/* ------- init of grease pencil initialization --------------- */
|
2016-08-13 01:29:17 +02:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "bGPDstroke", "bGPDpalettecolor", "*palcolor")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2016-08-03 23:31:48 +02:00
|
|
|
ToolSettings *ts = scene->toolsettings;
|
|
|
|
/* initialize use position for sculpt brushes */
|
2018-11-18 19:28:54 +01:00
|
|
|
ts->gp_sculpt.flag |= GP_SCULPT_SETT_FLAG_APPLY_POSITION;
|
2016-08-03 23:31:48 +02:00
|
|
|
|
|
|
|
/* new strength sculpt brush */
|
|
|
|
if (ts->gp_sculpt.brush[0].size >= 11) {
|
2018-11-18 19:28:54 +01:00
|
|
|
GP_Sculpt_Settings *gset = &ts->gp_sculpt;
|
|
|
|
GP_Sculpt_Data *brush;
|
2016-08-03 23:31:48 +02:00
|
|
|
|
2018-11-18 19:28:54 +01:00
|
|
|
brush = &gset->brush[GP_SCULPT_TYPE_STRENGTH];
|
2016-08-03 23:31:48 +02:00
|
|
|
brush->size = 25;
|
|
|
|
brush->strength = 0.5f;
|
2018-11-18 19:28:54 +01:00
|
|
|
brush->flag = GP_SCULPT_FLAG_USE_FALLOFF;
|
2016-08-03 23:31:48 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
/* Convert Grease Pencil to new palettes/brushes
|
|
|
|
* Loop all strokes and create the palette and all colors
|
|
|
|
*/
|
2019-03-08 09:29:17 +11:00
|
|
|
for (bGPdata *gpd = bmain->gpencils.first; gpd; gpd = gpd->id.next) {
|
2016-08-03 23:31:48 +02:00
|
|
|
if (BLI_listbase_is_empty(&gpd->palettes)) {
|
|
|
|
/* create palette */
|
2018-07-31 10:22:19 +02:00
|
|
|
bGPDpalette *palette = BKE_gpencil_palette_addnew(gpd, "GP_Palette");
|
2016-08-03 23:31:48 +02:00
|
|
|
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
|
|
|
|
/* create color using layer name */
|
2018-07-31 10:22:19 +02:00
|
|
|
bGPDpalettecolor *palcolor = BKE_gpencil_palettecolor_addnew(palette, gpl->info);
|
2016-08-03 23:31:48 +02:00
|
|
|
if (palcolor != NULL) {
|
|
|
|
/* set color attributes */
|
|
|
|
copy_v4_v4(palcolor->color, gpl->color);
|
|
|
|
copy_v4_v4(palcolor->fill, gpl->fill);
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-08-29 17:00:18 +12:00
|
|
|
if (gpl->flag & GP_LAYER_HIDE) palcolor->flag |= PC_COLOR_HIDE;
|
|
|
|
if (gpl->flag & GP_LAYER_LOCKED) palcolor->flag |= PC_COLOR_LOCKED;
|
|
|
|
if (gpl->flag & GP_LAYER_ONIONSKIN) palcolor->flag |= PC_COLOR_ONIONSKIN;
|
|
|
|
if (gpl->flag & GP_LAYER_VOLUMETRIC) palcolor->flag |= PC_COLOR_VOLUMETRIC;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-08-03 23:31:48 +02:00
|
|
|
/* set layer opacity to 1 */
|
|
|
|
gpl->opacity = 1.0f;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-08-03 23:31:48 +02:00
|
|
|
/* set tint color */
|
|
|
|
ARRAY_SET_ITEMS(gpl->tintcolor, 0.0f, 0.0f, 0.0f, 0.0f);
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-08-29 17:00:18 +12:00
|
|
|
/* flush relevant layer-settings to strokes */
|
2016-08-03 23:31:48 +02:00
|
|
|
for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
|
|
|
|
for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
|
|
|
|
/* set stroke to palette and force recalculation */
|
2016-08-18 15:45:20 +02:00
|
|
|
BLI_strncpy(gps->colorname, gpl->info, sizeof(gps->colorname));
|
2016-08-03 23:31:48 +02:00
|
|
|
gps->thickness = gpl->thickness;
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2016-08-03 23:31:48 +02:00
|
|
|
/* set alpha strength to 1 */
|
|
|
|
for (int i = 0; i < gps->totpoints; i++) {
|
|
|
|
gps->points[i].strength = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* ------- end of grease pencil initialization --------------- */
|
|
|
|
}
|
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 278, 0)) {
|
2016-08-16 13:53:29 +02:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "MovieTrackingTrack", "float", "weight_stab")) {
|
|
|
|
MovieClip *clip;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (clip = bmain->movieclips.first; clip; clip = clip->id.next) {
|
2016-08-16 13:53:29 +02:00
|
|
|
MovieTracking *tracking = &clip->tracking;
|
|
|
|
MovieTrackingObject *tracking_object;
|
|
|
|
for (tracking_object = tracking->objects.first;
|
|
|
|
tracking_object != NULL;
|
|
|
|
tracking_object = tracking_object->next)
|
Rework 2D stabilizator
See this page for motivation and description of concepts:
https://github.com/Ichthyostega/blender/wiki
See this video for UI explanation and demonstration of usage
http://vimeo.com/blenderHack/stabilizerdemo
This proposal attempts to improve usability of Blender's image stabilization
feature for real-world footage esp. with moving and panning camera. It builds
upon the feature tracking to get a measurement of 2D image movement.
- Use a weighted average of movement contributions (instead of a median).
- Allow for rotation compensation and zoom (image scale) compensation.
- Allow to pick a different set of tracks for translation and for
rotation/zoom.
- Treat translation / rotation / zoom contributions systematically in a
similar way.
- Improve handling of partial tracking data with gaps and varying
start / end points.
- Have a user definable anchor frame and interpolate / extrapolate data to
avoid jumping back to "neutral" position when no tracking data is available.
- Support for travelling and panning shots by including an //intended//
position/rotation/zoom ("target position"). The idea is for these parameters
to be //animated// by the user, in order to supply an smooth, intended
camera movement. This way, we can keep the image content roughly in frame
even when moving completely away from the initial view.
A known shortcoming is that the pivot point for rotation compensation is set to
the translation compensated image center. This can produce spurious rotation on
travelling shots, which needs to be compensated manually (by animating the
target rotation parameter). There are several possible ways to address that
problem, yet all of them are considered beyond the scope of this improvement
proposal for now.
Own modifications:
- Restrict line length, it's really handy for split-view editing
- In motion tracking we prefer fully human-readable comments, meaning we
don't use doxygen with it's weird markup and comments are supposed to
start with capital and end with a full stop,
- Add explicit comparison of pointer to NULL.
Reviewers: sergey
Subscribers: kusi, kdawg, forest-house, mardy, Samoth, plasmasolutions, willolis, sebastian_k, hype, enetheru, sunboy, jta, leon_cheung
Maniphest Tasks: T49036
Differential Revision: https://developer.blender.org/D583
2016-08-16 10:32:55 +02:00
|
|
|
{
|
2016-08-16 13:53:29 +02:00
|
|
|
ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, tracking_object);
|
|
|
|
MovieTrackingTrack *track;
|
|
|
|
for (track = tracksbase->first;
|
|
|
|
track != NULL;
|
|
|
|
track = track->next)
|
|
|
|
{
|
|
|
|
track->weight_stab = track->weight;
|
|
|
|
}
|
Rework 2D stabilizator
See this page for motivation and description of concepts:
https://github.com/Ichthyostega/blender/wiki
See this video for UI explanation and demonstration of usage
http://vimeo.com/blenderHack/stabilizerdemo
This proposal attempts to improve usability of Blender's image stabilization
feature for real-world footage esp. with moving and panning camera. It builds
upon the feature tracking to get a measurement of 2D image movement.
- Use a weighted average of movement contributions (instead of a median).
- Allow for rotation compensation and zoom (image scale) compensation.
- Allow to pick a different set of tracks for translation and for
rotation/zoom.
- Treat translation / rotation / zoom contributions systematically in a
similar way.
- Improve handling of partial tracking data with gaps and varying
start / end points.
- Have a user definable anchor frame and interpolate / extrapolate data to
avoid jumping back to "neutral" position when no tracking data is available.
- Support for travelling and panning shots by including an //intended//
position/rotation/zoom ("target position"). The idea is for these parameters
to be //animated// by the user, in order to supply an smooth, intended
camera movement. This way, we can keep the image content roughly in frame
even when moving completely away from the initial view.
A known shortcoming is that the pivot point for rotation compensation is set to
the translation compensated image center. This can produce spurious rotation on
travelling shots, which needs to be compensated manually (by animating the
target rotation parameter). There are several possible ways to address that
problem, yet all of them are considered beyond the scope of this improvement
proposal for now.
Own modifications:
- Restrict line length, it's really handy for split-view editing
- In motion tracking we prefer fully human-readable comments, meaning we
don't use doxygen with it's weird markup and comments are supposed to
start with capital and end with a full stop,
- Add explicit comparison of pointer to NULL.
Reviewers: sergey
Subscribers: kusi, kdawg, forest-house, mardy, Samoth, plasmasolutions, willolis, sebastian_k, hype, enetheru, sunboy, jta, leon_cheung
Maniphest Tasks: T49036
Differential Revision: https://developer.blender.org/D583
2016-08-16 10:32:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-16 13:53:29 +02:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "MovieTrackingStabilization", "int", "tot_rot_track")) {
|
|
|
|
MovieClip *clip;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (clip = bmain->movieclips.first; clip != NULL; clip = clip->id.next) {
|
2016-08-16 13:53:29 +02:00
|
|
|
if (clip->tracking.stabilization.rot_track) {
|
|
|
|
migrate_single_rot_stabilization_track_settings(&clip->tracking.stabilization);
|
Rework 2D stabilizator
See this page for motivation and description of concepts:
https://github.com/Ichthyostega/blender/wiki
See this video for UI explanation and demonstration of usage
http://vimeo.com/blenderHack/stabilizerdemo
This proposal attempts to improve usability of Blender's image stabilization
feature for real-world footage esp. with moving and panning camera. It builds
upon the feature tracking to get a measurement of 2D image movement.
- Use a weighted average of movement contributions (instead of a median).
- Allow for rotation compensation and zoom (image scale) compensation.
- Allow to pick a different set of tracks for translation and for
rotation/zoom.
- Treat translation / rotation / zoom contributions systematically in a
similar way.
- Improve handling of partial tracking data with gaps and varying
start / end points.
- Have a user definable anchor frame and interpolate / extrapolate data to
avoid jumping back to "neutral" position when no tracking data is available.
- Support for travelling and panning shots by including an //intended//
position/rotation/zoom ("target position"). The idea is for these parameters
to be //animated// by the user, in order to supply an smooth, intended
camera movement. This way, we can keep the image content roughly in frame
even when moving completely away from the initial view.
A known shortcoming is that the pivot point for rotation compensation is set to
the translation compensated image center. This can produce spurious rotation on
travelling shots, which needs to be compensated manually (by animating the
target rotation parameter). There are several possible ways to address that
problem, yet all of them are considered beyond the scope of this improvement
proposal for now.
Own modifications:
- Restrict line length, it's really handy for split-view editing
- In motion tracking we prefer fully human-readable comments, meaning we
don't use doxygen with it's weird markup and comments are supposed to
start with capital and end with a full stop,
- Add explicit comparison of pointer to NULL.
Reviewers: sergey
Subscribers: kusi, kdawg, forest-house, mardy, Samoth, plasmasolutions, willolis, sebastian_k, hype, enetheru, sunboy, jta, leon_cheung
Maniphest Tasks: T49036
Differential Revision: https://developer.blender.org/D583
2016-08-16 10:32:55 +02:00
|
|
|
}
|
2016-08-22 17:22:06 +02:00
|
|
|
if (clip->tracking.stabilization.scale == 0.0f) {
|
|
|
|
/* ensure init.
|
|
|
|
* Was previously used for autoscale only,
|
|
|
|
* now used always (as "target scale") */
|
|
|
|
clip->tracking.stabilization.scale = 1.0f;
|
|
|
|
}
|
2016-08-22 17:29:19 +02:00
|
|
|
/* blender prefers 1-based frame counting;
|
|
|
|
* thus using frame 1 as reference typically works best */
|
|
|
|
clip->tracking.stabilization.anchor_frame = 1;
|
2016-08-22 17:22:06 +02:00
|
|
|
/* by default show the track lists expanded, to improve "discoverability" */
|
|
|
|
clip->tracking.stabilization.flag |= TRACKING_SHOW_STAB_TRACKS;
|
|
|
|
/* deprecated, not used anymore */
|
|
|
|
clip->tracking.stabilization.ok = false;
|
Rework 2D stabilizator
See this page for motivation and description of concepts:
https://github.com/Ichthyostega/blender/wiki
See this video for UI explanation and demonstration of usage
http://vimeo.com/blenderHack/stabilizerdemo
This proposal attempts to improve usability of Blender's image stabilization
feature for real-world footage esp. with moving and panning camera. It builds
upon the feature tracking to get a measurement of 2D image movement.
- Use a weighted average of movement contributions (instead of a median).
- Allow for rotation compensation and zoom (image scale) compensation.
- Allow to pick a different set of tracks for translation and for
rotation/zoom.
- Treat translation / rotation / zoom contributions systematically in a
similar way.
- Improve handling of partial tracking data with gaps and varying
start / end points.
- Have a user definable anchor frame and interpolate / extrapolate data to
avoid jumping back to "neutral" position when no tracking data is available.
- Support for travelling and panning shots by including an //intended//
position/rotation/zoom ("target position"). The idea is for these parameters
to be //animated// by the user, in order to supply an smooth, intended
camera movement. This way, we can keep the image content roughly in frame
even when moving completely away from the initial view.
A known shortcoming is that the pivot point for rotation compensation is set to
the translation compensated image center. This can produce spurious rotation on
travelling shots, which needs to be compensated manually (by animating the
target rotation parameter). There are several possible ways to address that
problem, yet all of them are considered beyond the scope of this improvement
proposal for now.
Own modifications:
- Restrict line length, it's really handy for split-view editing
- In motion tracking we prefer fully human-readable comments, meaning we
don't use doxygen with it's weird markup and comments are supposed to
start with capital and end with a full stop,
- Add explicit comparison of pointer to NULL.
Reviewers: sergey
Subscribers: kusi, kdawg, forest-house, mardy, Samoth, plasmasolutions, willolis, sebastian_k, hype, enetheru, sunboy, jta, leon_cheung
Maniphest Tasks: T49036
Differential Revision: https://developer.blender.org/D583
2016-08-16 10:32:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 278, 2)) {
|
FFmpeg interface improvements
This patch changes a couple of things in the video output encoding.
{F362527}
- Clearer separation between container and codec. No more "format", as this is
too ambiguous. As a result, codecs were removed from the container list.
- Added FFmpeg speed presets, so the user can choosen from the range "Very
slow" to "Ultra fast". By default no preset is used.
- Added Constant Rate Factor (CRF) mode, which allows changing the bit-rate
depending on the desired quality and the input. This generally produces the
best quality videos, at the expense of not knowing the exact bit-rate and
file size.
- Added optional maximum of non-B-frames between B-frames (`max_b_frames`).
- Presets were adjusted for these changes, and new presets added. One of the
new presets is [recommended](https://trac.ffmpeg.org/wiki/Encode/VFX#H.264)
for reviewing videos, as it allows players to scrub through it easily. Might
be nice in weeklies. This preset also requires control over the
`max_b_frames` setting.
GUI-only changes:
- Renamed "MPEG" in the output file format menu with "FFmpeg", as this is more
accurate. After all, FFmpeg is used when this option is chosen, which can
also output non-MPEG files.
- Certain parts of the GUI are disabled when not in use:
- bit rate options are not used when a constant rate factor is given.
- audio bitrate & volume are not used when no audio is exported.
Note that I did not touch `BKE_ffmpeg_preset_set()`. There are currently two
preset systems for FFmpeg (`BKE_ffmpeg_preset_set()` and the Python preset
system). Before we do more work on `BKE_ffmpeg_preset_set()`, I think it's a
good idea to determine whether we want to keep it at all.
After this patch has been accepted, I'd be happy to go through the code and
remove any then-obsolete bits, such as the handling of "XVID" as a container
format.
Reviewers: sergey, mont29, brecht
Subscribers: mpan3, Blendify, brecht, fsiddi
Tags: #bf_blender
Differential Revision: https://developer.blender.org/D2242
2016-09-21 15:01:51 +02:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "FFMpegCodecData", "int", "ffmpeg_preset")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
FFmpeg interface improvements
This patch changes a couple of things in the video output encoding.
{F362527}
- Clearer separation between container and codec. No more "format", as this is
too ambiguous. As a result, codecs were removed from the container list.
- Added FFmpeg speed presets, so the user can choosen from the range "Very
slow" to "Ultra fast". By default no preset is used.
- Added Constant Rate Factor (CRF) mode, which allows changing the bit-rate
depending on the desired quality and the input. This generally produces the
best quality videos, at the expense of not knowing the exact bit-rate and
file size.
- Added optional maximum of non-B-frames between B-frames (`max_b_frames`).
- Presets were adjusted for these changes, and new presets added. One of the
new presets is [recommended](https://trac.ffmpeg.org/wiki/Encode/VFX#H.264)
for reviewing videos, as it allows players to scrub through it easily. Might
be nice in weeklies. This preset also requires control over the
`max_b_frames` setting.
GUI-only changes:
- Renamed "MPEG" in the output file format menu with "FFmpeg", as this is more
accurate. After all, FFmpeg is used when this option is chosen, which can
also output non-MPEG files.
- Certain parts of the GUI are disabled when not in use:
- bit rate options are not used when a constant rate factor is given.
- audio bitrate & volume are not used when no audio is exported.
Note that I did not touch `BKE_ffmpeg_preset_set()`. There are currently two
preset systems for FFmpeg (`BKE_ffmpeg_preset_set()` and the Python preset
system). Before we do more work on `BKE_ffmpeg_preset_set()`, I think it's a
good idea to determine whether we want to keep it at all.
After this patch has been accepted, I'd be happy to go through the code and
remove any then-obsolete bits, such as the handling of "XVID" as a container
format.
Reviewers: sergey, mont29, brecht
Subscribers: mpan3, Blendify, brecht, fsiddi
Tags: #bf_blender
Differential Revision: https://developer.blender.org/D2242
2016-09-21 15:01:51 +02:00
|
|
|
/* "medium" is the preset FFmpeg uses when no presets are given. */
|
|
|
|
scene->r.ffcodecdata.ffmpeg_preset = FFM_PRESET_MEDIUM;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "FFMpegCodecData", "int", "constant_rate_factor")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2018-12-24 12:31:39 +01:00
|
|
|
/* fall back to behavior from before we introduced CRF for old files */
|
FFmpeg interface improvements
This patch changes a couple of things in the video output encoding.
{F362527}
- Clearer separation between container and codec. No more "format", as this is
too ambiguous. As a result, codecs were removed from the container list.
- Added FFmpeg speed presets, so the user can choosen from the range "Very
slow" to "Ultra fast". By default no preset is used.
- Added Constant Rate Factor (CRF) mode, which allows changing the bit-rate
depending on the desired quality and the input. This generally produces the
best quality videos, at the expense of not knowing the exact bit-rate and
file size.
- Added optional maximum of non-B-frames between B-frames (`max_b_frames`).
- Presets were adjusted for these changes, and new presets added. One of the
new presets is [recommended](https://trac.ffmpeg.org/wiki/Encode/VFX#H.264)
for reviewing videos, as it allows players to scrub through it easily. Might
be nice in weeklies. This preset also requires control over the
`max_b_frames` setting.
GUI-only changes:
- Renamed "MPEG" in the output file format menu with "FFmpeg", as this is more
accurate. After all, FFmpeg is used when this option is chosen, which can
also output non-MPEG files.
- Certain parts of the GUI are disabled when not in use:
- bit rate options are not used when a constant rate factor is given.
- audio bitrate & volume are not used when no audio is exported.
Note that I did not touch `BKE_ffmpeg_preset_set()`. There are currently two
preset systems for FFmpeg (`BKE_ffmpeg_preset_set()` and the Python preset
system). Before we do more work on `BKE_ffmpeg_preset_set()`, I think it's a
good idea to determine whether we want to keep it at all.
After this patch has been accepted, I'd be happy to go through the code and
remove any then-obsolete bits, such as the handling of "XVID" as a container
format.
Reviewers: sergey, mont29, brecht
Subscribers: mpan3, Blendify, brecht, fsiddi
Tags: #bf_blender
Differential Revision: https://developer.blender.org/D2242
2016-09-21 15:01:51 +02:00
|
|
|
scene->r.ffcodecdata.constant_rate_factor = FFM_CRF_NONE;
|
|
|
|
}
|
|
|
|
}
|
2016-09-24 21:41:16 +02:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "SmokeModifierData", "float", "slice_per_voxel")) {
|
|
|
|
Object *ob;
|
|
|
|
ModifierData *md;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2016-09-24 21:41:16 +02:00
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Smoke) {
|
|
|
|
SmokeModifierData *smd = (SmokeModifierData *)md;
|
|
|
|
if (smd->domain) {
|
|
|
|
smd->domain->slice_per_voxel = 5.0f;
|
|
|
|
smd->domain->slice_depth = 0.5f;
|
|
|
|
smd->domain->display_thickness = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
FFmpeg interface improvements
This patch changes a couple of things in the video output encoding.
{F362527}
- Clearer separation between container and codec. No more "format", as this is
too ambiguous. As a result, codecs were removed from the container list.
- Added FFmpeg speed presets, so the user can choosen from the range "Very
slow" to "Ultra fast". By default no preset is used.
- Added Constant Rate Factor (CRF) mode, which allows changing the bit-rate
depending on the desired quality and the input. This generally produces the
best quality videos, at the expense of not knowing the exact bit-rate and
file size.
- Added optional maximum of non-B-frames between B-frames (`max_b_frames`).
- Presets were adjusted for these changes, and new presets added. One of the
new presets is [recommended](https://trac.ffmpeg.org/wiki/Encode/VFX#H.264)
for reviewing videos, as it allows players to scrub through it easily. Might
be nice in weeklies. This preset also requires control over the
`max_b_frames` setting.
GUI-only changes:
- Renamed "MPEG" in the output file format menu with "FFmpeg", as this is more
accurate. After all, FFmpeg is used when this option is chosen, which can
also output non-MPEG files.
- Certain parts of the GUI are disabled when not in use:
- bit rate options are not used when a constant rate factor is given.
- audio bitrate & volume are not used when no audio is exported.
Note that I did not touch `BKE_ffmpeg_preset_set()`. There are currently two
preset systems for FFmpeg (`BKE_ffmpeg_preset_set()` and the Python preset
system). Before we do more work on `BKE_ffmpeg_preset_set()`, I think it's a
good idea to determine whether we want to keep it at all.
After this patch has been accepted, I'd be happy to go through the code and
remove any then-obsolete bits, such as the handling of "XVID" as a container
format.
Reviewers: sergey, mont29, brecht
Subscribers: mpan3, Blendify, brecht, fsiddi
Tags: #bf_blender
Differential Revision: https://developer.blender.org/D2242
2016-09-21 15:01:51 +02:00
|
|
|
}
|
2016-10-24 18:58:12 +00:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 278, 3)) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) {
|
2016-12-28 17:30:58 +01:00
|
|
|
if (scene->toolsettings != NULL) {
|
|
|
|
ToolSettings *ts = scene->toolsettings;
|
|
|
|
ParticleEditSettings *pset = &ts->particle;
|
2018-01-18 14:02:26 +11:00
|
|
|
for (int a = 0; a < ARRAY_SIZE(pset->brush); a++) {
|
2016-12-28 17:30:58 +01:00
|
|
|
if (pset->brush[a].count == 0) {
|
|
|
|
pset->brush[a].count = 10;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-07 12:56:58 +03:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "RigidBodyCon", "float", "spring_stiffness_ang_x")) {
|
|
|
|
Object *ob;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2016-11-07 12:56:58 +03:00
|
|
|
RigidBodyCon *rbc = ob->rigidbody_constraint;
|
|
|
|
if (rbc) {
|
|
|
|
rbc->spring_stiffness_ang_x = 10.0;
|
|
|
|
rbc->spring_stiffness_ang_y = 10.0;
|
|
|
|
rbc->spring_stiffness_ang_z = 10.0;
|
|
|
|
rbc->spring_damping_ang_x = 0.5;
|
|
|
|
rbc->spring_damping_ang_y = 0.5;
|
|
|
|
rbc->spring_damping_ang_z = 0.5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-11-12 16:14:09 +01:00
|
|
|
|
|
|
|
/* constant detail for sculpting is now a resolution value instead of
|
|
|
|
* a percentage, we reuse old DNA struct member but convert it */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene != NULL; scene = scene->id.next) {
|
2016-11-12 16:14:09 +01:00
|
|
|
if (scene->toolsettings != NULL) {
|
|
|
|
ToolSettings *ts = scene->toolsettings;
|
|
|
|
if (ts->sculpt && ts->sculpt->constant_detail != 0.0f) {
|
|
|
|
ts->sculpt->constant_detail = 100.0f / ts->sculpt->constant_detail;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-10-17 12:37:50 +02:00
|
|
|
}
|
2016-11-16 17:01:19 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 278, 4)) {
|
2016-11-18 15:32:50 +01:00
|
|
|
const float sqrt_3 = (float)M_SQRT3;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Brush *br = bmain->brushes.first; br; br = br->id.next) {
|
2016-11-18 15:32:50 +01:00
|
|
|
br->fill_threshold /= sqrt_3;
|
|
|
|
}
|
2017-01-20 16:49:14 +01:00
|
|
|
|
|
|
|
/* Custom motion paths */
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "bMotionPath", "int", "line_thickness")) {
|
|
|
|
Object *ob;
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2017-01-20 16:49:14 +01:00
|
|
|
bMotionPath *mpath;
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
mpath = ob->mpath;
|
|
|
|
if (mpath) {
|
|
|
|
mpath->color[0] = 1.0f;
|
|
|
|
mpath->color[1] = 0.0f;
|
|
|
|
mpath->color[2] = 0.0f;
|
|
|
|
mpath->line_thickness = 1;
|
|
|
|
mpath->flag |= MOTIONPATH_FLAG_LINES;
|
|
|
|
}
|
|
|
|
/* bones motion path */
|
|
|
|
if (ob->pose) {
|
|
|
|
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
|
|
|
|
mpath = pchan->mpath;
|
|
|
|
if (mpath) {
|
|
|
|
mpath->color[0] = 1.0f;
|
|
|
|
mpath->color[1] = 0.0f;
|
|
|
|
mpath->color[2] = 0.0f;
|
|
|
|
mpath->line_thickness = 1;
|
|
|
|
mpath->flag |= MOTIONPATH_FLAG_LINES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-11-18 15:32:50 +01:00
|
|
|
}
|
2016-11-19 16:28:39 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 278, 5)) {
|
2016-12-02 10:45:03 +01:00
|
|
|
/* Mask primitive adding code was not initializing correctly id_type of its points' parent. */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Mask *mask = bmain->masks.first; mask; mask = mask->id.next) {
|
2016-12-02 10:45:03 +01:00
|
|
|
for (MaskLayer *mlayer = mask->masklayers.first; mlayer; mlayer = mlayer->next) {
|
|
|
|
for (MaskSpline *mspline = mlayer->splines.first; mspline; mspline = mspline->next) {
|
|
|
|
int i = 0;
|
|
|
|
for (MaskSplinePoint *mspoint = mspline->points; i < mspline->tot_point; mspoint++, i++) {
|
|
|
|
if (mspoint->parent.id_type == 0) {
|
|
|
|
BKE_mask_parent_init(&mspoint->parent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-12-07 13:52:12 +01:00
|
|
|
|
2017-02-23 10:39:51 +01:00
|
|
|
/* Fix for T50736, Glare comp node using same var for two different things. */
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "NodeGlare", "char", "star_45")) {
|
2018-11-30 15:22:01 +11:00
|
|
|
FOREACH_NODETREE_BEGIN(bmain, ntree, id) {
|
2017-02-23 10:39:51 +01:00
|
|
|
if (ntree->type == NTREE_COMPOSIT) {
|
|
|
|
ntreeSetTypes(NULL, ntree);
|
|
|
|
for (bNode *node = ntree->nodes.first; node; node = node->next) {
|
|
|
|
if (node->type == CMP_NODE_GLARE) {
|
|
|
|
NodeGlare *ndg = node->storage;
|
|
|
|
switch (ndg->type) {
|
|
|
|
case 2: /* Grrrr! magic numbers :( */
|
|
|
|
ndg->streaks = ndg->angle;
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
ndg->star_45 = ndg->angle != 0;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-30 15:22:01 +11:00
|
|
|
} FOREACH_NODETREE_END;
|
2017-02-23 10:39:51 +01:00
|
|
|
}
|
2017-03-06 02:40:29 -03:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "SurfaceDeformModifierData", "float", "mat[4][4]")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2017-03-06 02:40:29 -03:00
|
|
|
for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_SurfaceDeform) {
|
|
|
|
SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md;
|
|
|
|
unit_m4(smd->mat);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
Render API/Cycles: Identify Render Passes by their name instead of a type flag
Previously, every RenderPass would have a bitfield that specified its type. That limits the number of passes to 32, which was reached a while ago.
However, most of the code already supported arbitrary RenderPasses since they were also used to store Multilayer EXR images.
Therefore, this commit completely removes the passflag from RenderPass and changes all code to use the unique pass name for identification.
Since Blender Internal relies on hardcoded passes and to preserve compatibility, 32 pass names are reserved for the old hardcoded passes.
To support these arbitrary passes, the Render Result compositor node now adds dynamic sockets. For compatibility, the old hardcoded sockets are always stored and just hidden when the corresponding pass isn't available.
To use these changes, the Render Engine API now includes a function that allows render engines to add arbitrary passes to the render result. To be able to add options for these passes, addons can now add their own properties to SceneRenderLayers.
To keep the compositor input node updated, render engine plugins have to implement a callback that registers all the passes that will be generated.
From a user perspective, nothing should change with this commit.
Differential Revision: https://developer.blender.org/D2443
Differential Revision: https://developer.blender.org/D2444
2017-05-03 00:21:18 +02:00
|
|
|
|
2018-11-30 15:22:01 +11:00
|
|
|
FOREACH_NODETREE_BEGIN(bmain, ntree, id) {
|
Render API/Cycles: Identify Render Passes by their name instead of a type flag
Previously, every RenderPass would have a bitfield that specified its type. That limits the number of passes to 32, which was reached a while ago.
However, most of the code already supported arbitrary RenderPasses since they were also used to store Multilayer EXR images.
Therefore, this commit completely removes the passflag from RenderPass and changes all code to use the unique pass name for identification.
Since Blender Internal relies on hardcoded passes and to preserve compatibility, 32 pass names are reserved for the old hardcoded passes.
To support these arbitrary passes, the Render Result compositor node now adds dynamic sockets. For compatibility, the old hardcoded sockets are always stored and just hidden when the corresponding pass isn't available.
To use these changes, the Render Engine API now includes a function that allows render engines to add arbitrary passes to the render result. To be able to add options for these passes, addons can now add their own properties to SceneRenderLayers.
To keep the compositor input node updated, render engine plugins have to implement a callback that registers all the passes that will be generated.
From a user perspective, nothing should change with this commit.
Differential Revision: https://developer.blender.org/D2443
Differential Revision: https://developer.blender.org/D2444
2017-05-03 00:21:18 +02:00
|
|
|
if (ntree->type == NTREE_COMPOSIT) {
|
2017-05-24 15:39:15 +02:00
|
|
|
do_versions_compositor_render_passes(ntree);
|
Render API/Cycles: Identify Render Passes by their name instead of a type flag
Previously, every RenderPass would have a bitfield that specified its type. That limits the number of passes to 32, which was reached a while ago.
However, most of the code already supported arbitrary RenderPasses since they were also used to store Multilayer EXR images.
Therefore, this commit completely removes the passflag from RenderPass and changes all code to use the unique pass name for identification.
Since Blender Internal relies on hardcoded passes and to preserve compatibility, 32 pass names are reserved for the old hardcoded passes.
To support these arbitrary passes, the Render Result compositor node now adds dynamic sockets. For compatibility, the old hardcoded sockets are always stored and just hidden when the corresponding pass isn't available.
To use these changes, the Render Engine API now includes a function that allows render engines to add arbitrary passes to the render result. To be able to add options for these passes, addons can now add their own properties to SceneRenderLayers.
To keep the compositor input node updated, render engine plugins have to implement a callback that registers all the passes that will be generated.
From a user perspective, nothing should change with this commit.
Differential Revision: https://developer.blender.org/D2443
Differential Revision: https://developer.blender.org/D2444
2017-05-03 00:21:18 +02:00
|
|
|
}
|
2018-11-30 15:22:01 +11:00
|
|
|
} FOREACH_NODETREE_END;
|
2016-12-07 13:52:12 +01:00
|
|
|
}
|
2016-12-12 16:17:57 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 279, 0)) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2017-05-16 16:34:49 +02:00
|
|
|
if (scene->r.im_format.exr_codec == R_IMF_EXR_CODEC_DWAB) {
|
|
|
|
scene->r.im_format.exr_codec = R_IMF_EXR_CODEC_DWAA;
|
|
|
|
}
|
|
|
|
}
|
2017-05-19 09:36:14 +02:00
|
|
|
|
2017-05-22 16:15:03 +02:00
|
|
|
/* Fix related to VGroup modifiers creating named defgroup CD layers! See T51520. */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Mesh *me = bmain->meshes.first; me; me = me->id.next) {
|
2017-05-22 16:15:03 +02:00
|
|
|
CustomData_set_layer_name(&me->vdata, CD_MDEFORMVERT, 0, "");
|
|
|
|
}
|
2016-10-24 18:58:12 +00:00
|
|
|
}
|
2017-09-06 15:56:01 +02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 279, 3)) {
|
2018-02-22 16:26:50 +01:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "SmokeDomainSettings", "float", "clipping")) {
|
|
|
|
Object *ob;
|
|
|
|
ModifierData *md;
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2018-02-22 16:26:50 +01:00
|
|
|
for (md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_Smoke) {
|
|
|
|
SmokeModifierData *smd = (SmokeModifierData *)md;
|
|
|
|
if (smd->domain) {
|
|
|
|
smd->domain->clipping = 1e-3f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-15 11:03:29 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 279, 4)) {
|
2017-09-06 15:56:01 +02:00
|
|
|
/* Fix for invalid state of screen due to bug in older versions. */
|
2019-03-08 09:29:17 +11:00
|
|
|
for (bScreen *sc = bmain->screens.first; sc; sc = sc->id.next) {
|
2017-09-06 15:56:01 +02:00
|
|
|
for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) {
|
2017-10-06 16:56:41 +11:00
|
|
|
if (sa->full && sc->state == SCREENNORMAL) {
|
2017-09-06 15:56:01 +02:00
|
|
|
sa->full = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-10-02 21:07:25 +11:00
|
|
|
|
2017-10-06 20:11:17 +11:00
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "Brush", "float", "falloff_angle")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Brush *br = bmain->brushes.first; br; br = br->id.next) {
|
2017-10-06 20:11:17 +11:00
|
|
|
br->falloff_angle = DEG2RADF(80);
|
|
|
|
br->flag &= ~(
|
2019-03-17 10:28:08 +11:00
|
|
|
BRUSH_FLAG_UNUSED_1 | BRUSH_FLAG_UNUSED_6 |
|
|
|
|
BRUSH_FLAG_UNUSED_7 | BRUSH_FLAG_UNUSED_17 |
|
2017-10-06 20:11:17 +11:00
|
|
|
BRUSH_FRONTFACE_FALLOFF);
|
|
|
|
}
|
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2017-10-02 21:07:25 +11:00
|
|
|
ToolSettings *ts = scene->toolsettings;
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
|
|
VPaint *vp = i ? ts->vpaint : ts->wpaint;
|
|
|
|
if (vp != NULL) {
|
|
|
|
/* remove all other flags */
|
2017-10-03 18:50:34 +11:00
|
|
|
vp->flag &= (VP_FLAG_VGROUP_RESTRICT);
|
2017-10-02 21:07:25 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-01-09 15:17:00 +11:00
|
|
|
|
|
|
|
/* Simple deform modifier no longer assumes Z axis (X for bend type).
|
|
|
|
* Must set previous defaults. */
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "SimpleDeformModifierData", "char", "deform_axis")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2018-01-09 15:17:00 +11:00
|
|
|
for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_SimpleDeform) {
|
|
|
|
SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md;
|
2018-01-17 19:17:49 +11:00
|
|
|
smd->deform_axis = 2;
|
2018-01-09 15:17:00 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-04-09 15:27:11 +02:00
|
|
|
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
|
2018-04-09 15:27:11 +02:00
|
|
|
int preset = scene->r.ffcodecdata.ffmpeg_preset;
|
|
|
|
if (preset == FFM_PRESET_NONE || preset >= FFM_PRESET_GOOD) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (preset <= FFM_PRESET_FAST) {
|
|
|
|
preset = FFM_PRESET_REALTIME;
|
|
|
|
}
|
|
|
|
else if (preset >= FFM_PRESET_SLOW) {
|
|
|
|
preset = FFM_PRESET_BEST;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
preset = FFM_PRESET_GOOD;
|
|
|
|
}
|
|
|
|
scene->r.ffcodecdata.ffmpeg_preset = preset;
|
|
|
|
}
|
2018-04-18 12:14:28 +02:00
|
|
|
|
|
|
|
if (!DNA_struct_elem_find(fd->filesdna, "ParticleInstanceModifierData", "float", "particle_amount")) {
|
2019-03-08 09:29:17 +11:00
|
|
|
for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
|
2018-04-18 12:14:28 +02:00
|
|
|
for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
|
|
|
|
if (md->type == eModifierType_ParticleInstance) {
|
|
|
|
ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData *)md;
|
|
|
|
pimd->space = eParticleInstanceSpace_World;
|
|
|
|
pimd->particle_amount = 1.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-09-06 15:56:01 +02:00
|
|
|
}
|
2014-03-06 04:33:15 +11:00
|
|
|
}
|
2017-01-26 17:04:25 +01:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
void do_versions_after_linking_270(Main *bmain)
|
2017-01-26 17:04:25 +01:00
|
|
|
{
|
|
|
|
/* To be added to next subversion bump! */
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 279, 0)) {
|
2018-11-30 15:22:01 +11:00
|
|
|
FOREACH_NODETREE_BEGIN(bmain, ntree, id) {
|
2017-01-26 17:04:25 +01:00
|
|
|
if (ntree->type == NTREE_COMPOSIT) {
|
|
|
|
ntreeSetTypes(NULL, ntree);
|
|
|
|
for (bNode *node = ntree->nodes.first; node; node = node->next) {
|
|
|
|
if (node->type == CMP_NODE_HUE_SAT) {
|
|
|
|
do_version_hue_sat_node(ntree, node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-30 15:22:01 +11:00
|
|
|
} FOREACH_NODETREE_END;
|
2017-01-26 17:04:25 +01:00
|
|
|
}
|
2018-06-17 17:06:07 +02:00
|
|
|
|
2018-06-05 15:10:33 +02:00
|
|
|
if (!MAIN_VERSION_ATLEAST(bmain, 279, 2)) {
|
2017-12-06 00:54:39 +13:00
|
|
|
/* B-Bones (bbone_in/out -> bbone_easein/out) + Stepped FMod Frame Start/End fix */
|
|
|
|
/* if (!DNA_struct_elem_find(fd->filesdna, "Bone", "float", "bbone_easein")) */
|
2018-06-05 15:10:33 +02:00
|
|
|
BKE_fcurves_main_cb(bmain, do_version_bbone_easing_fcurve_fix, NULL);
|
2017-12-06 00:54:39 +13:00
|
|
|
}
|
2017-01-26 17:04:25 +01:00
|
|
|
}
|