This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/blenloader/intern/versioning_legacy.c

3651 lines
93 KiB
C
Raw Normal View History

/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* 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.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
*
* Contributor(s): Blender Foundation
*
* ***** END GPL LICENSE BLOCK *****
*
*/
/** \file blender/blenloader/intern/versioning_legacy.c
* \ingroup blenloader
*/
#include "zlib.h"
#include <limits.h>
#ifndef WIN32
# include <unistd.h> // for read close
#else
# include <io.h> // for open close read
# include "winsock2.h"
# include "BLI_winstuff.h"
#endif
/* allow readfile to use deprecated functionality */
#define DNA_DEPRECATED_ALLOW
#include "DNA_armature_types.h"
#include "DNA_actuator_types.h"
#include "DNA_camera_types.h"
#include "DNA_constraint_types.h"
#include "DNA_effect_types.h"
#include "DNA_group_types.h"
#include "DNA_key_types.h"
#include "DNA_lattice_types.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_nla_types.h"
#include "DNA_node_types.h"
#include "DNA_object_fluidsim.h" // NT
#include "DNA_object_types.h"
#include "DNA_property_types.h"
#include "DNA_view3d_types.h"
#include "DNA_screen_types.h"
#include "DNA_sensor_types.h"
#include "DNA_sdna_types.h"
#include "DNA_sequence_types.h"
#include "DNA_sound_types.h"
#include "DNA_space_types.h"
#include "DNA_vfont_types.h"
#include "DNA_world_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_edgehash.h"
#include "BKE_armature.h"
#include "BKE_colortools.h"
#include "BKE_constraint.h"
#include "BKE_deform.h"
#include "BKE_fcurve.h"
#include "BKE_global.h" // for G
#include "BKE_image.h"
#include "BKE_lattice.h"
#include "BKE_main.h" // for Main
#include "BKE_mesh.h" // for ME_ defines (patching)
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_property.h" // for BKE_bproperty_object_get
#include "BKE_scene.h"
#include "BKE_sequencer.h"
#include "IMB_imbuf.h" // for proxy / timecode versioning stuff
#include "NOD_socket.h"
#include "BLO_readfile.h"
#include "BLO_undofile.h"
#include "RE_engine.h"
#include "readfile.h"
#include "PIL_time.h"
#include <errno.h>
static void vcol_to_fcol(Mesh *me)
{
MFace *mface;
unsigned int *mcol, *mcoln, *mcolmain;
int a;
if (me->totface == 0 || me->mcol == NULL)
return;
mcoln = mcolmain = MEM_mallocN(4*sizeof(int)*me->totface, "mcoln");
mcol = (unsigned int *)me->mcol;
mface = me->mface;
for (a = me->totface; a > 0; a--, mface++) {
mcoln[0] = mcol[mface->v1];
mcoln[1] = mcol[mface->v2];
mcoln[2] = mcol[mface->v3];
mcoln[3] = mcol[mface->v4];
mcoln += 4;
}
MEM_freeN(me->mcol);
me->mcol = (MCol *)mcolmain;
}
static int map_223_keybd_code_to_224_keybd_code(int code)
{
switch (code) {
case 312:
return 311; /* F12KEY */
case 159:
return 161; /* PADSLASHKEY */
case 161:
return 150; /* PAD0 */
case 154:
return 151; /* PAD1 */
case 150:
return 152; /* PAD2 */
case 155:
return 153; /* PAD3 */
case 151:
return 154; /* PAD4 */
case 156:
return 155; /* PAD5 */
case 152:
return 156; /* PAD6 */
case 157:
return 157; /* PAD7 */
case 153:
return 158; /* PAD8 */
case 158:
return 159; /* PAD9 */
default:
return code;
}
}
static void do_version_bone_head_tail_237(Bone *bone)
{
Bone *child;
float vec[3];
/* head */
copy_v3_v3(bone->arm_head, bone->arm_mat[3]);
/* tail is in current local coord system */
copy_v3_v3(vec, bone->arm_mat[1]);
mul_v3_fl(vec, bone->length);
add_v3_v3v3(bone->arm_tail, bone->arm_head, vec);
for (child = bone->childbase.first; child; child = child->next)
do_version_bone_head_tail_237(child);
}
static void bone_version_238(ListBase *lb)
{
Bone *bone;
for (bone = lb->first; bone; bone = bone->next) {
if (bone->rad_tail == 0.0f && bone->rad_head == 0.0f) {
bone->rad_head = 0.25f*bone->length;
bone->rad_tail = 0.1f*bone->length;
bone->dist-= bone->rad_head;
if (bone->dist<=0.0f)
bone->dist = 0.0f;
}
bone_version_238(&bone->childbase);
}
}
static void bone_version_239(ListBase *lb)
{
Bone *bone;
for (bone = lb->first; bone; bone = bone->next) {
if (bone->layer == 0)
bone->layer = 1;
bone_version_239(&bone->childbase);
}
}
static void ntree_version_241(bNodeTree *ntree)
{
bNode *node;
if (ntree->type == NTREE_COMPOSIT) {
for (node = ntree->nodes.first; node; node = node->next) {
if (node->type == CMP_NODE_BLUR) {
if (node->storage == NULL) {
NodeBlurData *nbd = MEM_callocN(sizeof(NodeBlurData), "node blur patch");
nbd->sizex = node->custom1;
nbd->sizey = node->custom2;
nbd->filtertype = R_FILTER_QUAD;
node->storage = nbd;
}
}
else if (node->type == CMP_NODE_VECBLUR) {
if (node->storage == NULL) {
NodeBlurData *nbd = MEM_callocN(sizeof(NodeBlurData), "node blur patch");
nbd->samples = node->custom1;
nbd->maxspeed = node->custom2;
nbd->fac = 1.0f;
node->storage = nbd;
}
}
}
}
}
static void ntree_version_242(bNodeTree *ntree)
{
bNode *node;
if (ntree->type == NTREE_COMPOSIT) {
for (node = ntree->nodes.first; node; node = node->next) {
if (node->type == CMP_NODE_HUE_SAT) {
if (node->storage) {
NodeHueSat *nhs = node->storage;
if (nhs->val == 0.0f)
nhs->val = 1.0f;
}
}
}
}
else if (ntree->type == NTREE_SHADER) {
for (node = ntree->nodes.first; node; node = node->next)
if (node->type == SH_NODE_GEOMETRY && node->storage == NULL)
node->storage = MEM_callocN(sizeof(NodeGeometry), "NodeGeometry");
}
}
static void ntree_version_245(FileData *fd, Library *lib, bNodeTree *ntree)
{
bNode *node;
NodeTwoFloats *ntf;
ID *nodeid;
Image *image;
ImageUser *iuser;
if (ntree->type == NTREE_COMPOSIT) {
for (node = ntree->nodes.first; node; node = node->next) {
if (node->type == CMP_NODE_ALPHAOVER) {
if (!node->storage) {
ntf = MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats");
node->storage = ntf;
if (node->custom1)
ntf->x = 1.0f;
}
}
/* fix for temporary flag changes during 245 cycle */
nodeid = blo_do_versions_newlibadr(fd, lib, node->id);
if (node->storage && nodeid && GS(nodeid->name) == ID_IM) {
image = (Image*)nodeid;
iuser = node->storage;
if (iuser->flag & IMA_OLD_PREMUL) {
iuser->flag &= ~IMA_OLD_PREMUL;
}
if (iuser->flag & IMA_DO_PREMUL) {
image->flag &= ~IMA_OLD_PREMUL;
Alpha premul pipeline cleanup This assumptions are now made: - Internally float buffers are always linear alpha-premul colors - Readers should worry about delivering float buffers with that assumptions. - There's an input image setting to say whether it's stored with straight/premul alpha on the disk. - Byte buffers are now assumed have straight alpha, readers should deliver straight alpha. Some implementation details: - Removed scene's color unpremultiply setting, which was very much confusing and was wrong for default settings. Now all renderers assumes to deliver premultiplied alpha. - IMB_buffer_byte_from_float will now linearize alpha when converting from buffer. - Sequencer's effects were changed to assume bytes have got straight alpha. Most of effects will work with bytes still, however for glow it was more tricky to avoid data loss, so there's a commented out glow implementation which converts byte buffer to floats first, operates on floats and returns bytes back. It's slower and not sure if it should actually be used -- who're using glow on alpha anyway? - Sequencer modifiers should also be working nice with straight bytes now. - GLSL preview will predivide float textures to make nice shading, shading with byte textures worked nice (GLSL was assuming straight alpha). - Blender Internal will set alpha=1 to the whole sky. The same happens in Cycles and there's no way to avoid this -- sky is neither straight nor premul and doesn't fit color pipeline well. - Straight alpha mode for render result was also eliminated. - Conversion to correct alpha need to be done before linearizing float buffer. - TIFF will now load and save files with proper alpha mode setting in file meta data header. - Remove Use Alpha from texture mapping and replaced with image datablock setting. Behaves much more predictable and clear from code point of view and solves possible regressions when non-premultiplied images were used as textures with ignoring alpha channel.
2012-12-31 13:52:13 +00:00
image->alpha_mode = IMA_ALPHA_STRAIGHT;
}
}
}
}
}
static void idproperties_fix_groups_lengths_recurse(IDProperty *prop)
{
IDProperty *loop;
int i;
for (loop = prop->data.group.first, i = 0; loop; loop = loop->next, i++) {
if (loop->type == IDP_GROUP)
idproperties_fix_groups_lengths_recurse(loop);
}
if (prop->len != i) {
printf("Found and fixed bad id property group length.\n");
prop->len = i;
}
}
static void idproperties_fix_group_lengths(ListBase idlist)
{
ID *id;
for (id = idlist.first; id; id = id->next) {
if (id->properties) {
idproperties_fix_groups_lengths_recurse(id->properties);
}
}
}
static void alphasort_version_246(FileData *fd, Library *lib, Mesh *me)
{
Material *ma;
MFace *mf;
MTFace *tf;
int a, b, texalpha;
/* verify we have a tface layer */
for (b = 0; b < me->fdata.totlayer; b++)
if (me->fdata.layers[b].type == CD_MTFACE)
break;
if (b == me->fdata.totlayer)
return;
/* if we do, set alpha sort if the game engine did it before */
for (a = 0, mf = me->mface; a < me->totface; a++, mf++) {
if (mf->mat_nr < me->totcol) {
ma = blo_do_versions_newlibadr(fd, lib, me->mat[mf->mat_nr]);
texalpha = 0;
/* we can't read from this if it comes from a library,
* because direct_link might not have happened on it,
* so ma->mtex is not pointing to valid memory yet */
if (ma && ma->id.lib)
ma = NULL;
for (b = 0; ma && b < MAX_MTEX; b++)
if (ma->mtex[b] && ma->mtex[b]->mapto & MAP_ALPHA)
texalpha = 1;
}
else {
ma = NULL;
texalpha = 0;
}
for (b = 0; b < me->fdata.totlayer; b++) {
if (me->fdata.layers[b].type == CD_MTFACE) {
tf = ((MTFace*)me->fdata.layers[b].data) + a;
tf->mode &= ~TF_ALPHASORT;
if (ma && (ma->mode & MA_ZTRANSP))
if (ELEM(tf->transp, TF_ALPHA, TF_ADD) || (texalpha && (tf->transp != TF_CLIP)))
tf->mode |= TF_ALPHASORT;
}
}
}
}
static void customdata_version_242(Mesh *me)
{
CustomDataLayer *layer;
MTFace *mtf;
MCol *mcol;
TFace *tf;
int a, mtfacen, mcoln;
if (!me->vdata.totlayer) {
CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, me->mvert, me->totvert);
if (me->dvert)
CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, CD_ASSIGN, me->dvert, me->totvert);
}
if (!me->edata.totlayer)
CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, me->medge, me->totedge);
if (!me->fdata.totlayer) {
CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, me->mface, me->totface);
if (me->tface) {
if (me->mcol)
MEM_freeN(me->mcol);
me->mcol = CustomData_add_layer(&me->fdata, CD_MCOL, CD_CALLOC, NULL, me->totface);
me->mtface = CustomData_add_layer(&me->fdata, CD_MTFACE, CD_CALLOC, NULL, me->totface);
mtf = me->mtface;
mcol = me->mcol;
tf = me->tface;
for (a = 0; a < me->totface; a++, mtf++, tf++, mcol += 4) {
memcpy(mcol, tf->col, sizeof(tf->col));
memcpy(mtf->uv, tf->uv, sizeof(tf->uv));
mtf->flag = tf->flag;
mtf->unwrap = tf->unwrap;
mtf->mode = tf->mode;
mtf->tile = tf->tile;
mtf->tpage = tf->tpage;
mtf->transp = tf->transp;
}
MEM_freeN(me->tface);
me->tface = NULL;
}
else if (me->mcol) {
me->mcol = CustomData_add_layer(&me->fdata, CD_MCOL, CD_ASSIGN, me->mcol, me->totface);
}
}
if (me->tface) {
MEM_freeN(me->tface);
me->tface = NULL;
}
for (a = 0, mtfacen = 0, mcoln = 0; a < me->fdata.totlayer; a++) {
layer = &me->fdata.layers[a];
if (layer->type == CD_MTFACE) {
if (layer->name[0] == 0) {
if (mtfacen == 0) strcpy(layer->name, "UVMap");
else BLI_snprintf(layer->name, sizeof(layer->name), "UVMap.%.3d", mtfacen);
}
mtfacen++;
}
else if (layer->type == CD_MCOL) {
if (layer->name[0] == 0) {
if (mcoln == 0)
strcpy(layer->name, "Col");
else
BLI_snprintf(layer->name, sizeof(layer->name), "Col.%.3d", mcoln);
}
mcoln++;
}
}
BKE_mesh_update_customdata_pointers(me, true);
}
/*only copy render texface layer from active*/
static void customdata_version_243(Mesh *me)
{
CustomDataLayer *layer;
int a;
for (a = 0; a < me->fdata.totlayer; a++) {
layer = &me->fdata.layers[a];
layer->active_rnd = layer->active;
}
}
/* struct NodeImageAnim moved to ImageUser, and we make it default available */
static void do_version_ntree_242_2(bNodeTree *ntree)
{
bNode *node;
if (ntree->type == NTREE_COMPOSIT) {
for (node = ntree->nodes.first; node; node = node->next) {
if (ELEM3(node->type, CMP_NODE_IMAGE, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
/* only image had storage */
if (node->storage) {
NodeImageAnim *nia = node->storage;
ImageUser *iuser = MEM_callocN(sizeof(ImageUser), "ima user node");
iuser->frames = nia->frames;
iuser->sfra = nia->sfra;
iuser->offset = nia->nr-1;
iuser->cycl = nia->cyclic;
iuser->fie_ima = 2;
iuser->ok = 1;
node->storage = iuser;
MEM_freeN(nia);
}
else {
ImageUser *iuser = node->storage = MEM_callocN(sizeof(ImageUser), "node image user");
iuser->sfra = 1;
iuser->fie_ima = 2;
iuser->ok = 1;
}
}
}
}
}
static void do_version_free_effect_245(Effect *eff)
{
PartEff *paf;
if (eff->type == EFF_PARTICLE) {
paf = (PartEff *)eff;
if (paf->keys)
MEM_freeN(paf->keys);
}
MEM_freeN(eff);
}
static void do_version_free_effects_245(ListBase *lb)
{
Effect *eff;
while ((eff = BLI_pophead(lb))) {
do_version_free_effect_245(eff);
}
}
PartEff *blo_do_version_give_parteff_245(Object *ob)
{
PartEff *paf;
paf = ob->effect.first;
while (paf) {
if (paf->type == EFF_PARTICLE)
return paf;
paf = paf->next;
}
return NULL;
}
/* NOTE: this version patch is intended for versions < 2.52.2, but was initially introduced in 2.27 already */
void blo_do_version_old_trackto_to_constraints(Object *ob)
{
/* create new trackto constraint from the relationship */
if (ob->track) {
bConstraint *con = BKE_add_ob_constraint(ob, "AutoTrack", CONSTRAINT_TYPE_TRACKTO);
bTrackToConstraint *data = con->data;
/* copy tracking settings from the object */
data->tar = ob->track;
data->reserved1 = ob->trackflag;
data->reserved2 = ob->upflag;
}
/* clear old track setting */
ob->track = NULL;
}
void blo_do_versions_pre250(FileData *fd, Library *lib, Main *main)
{
/* WATCH IT!!!: pointers from libdata have not been converted */
if (main->versionfile == 100) {
/* tex->extend and tex->imageflag have changed: */
Tex *tex = main->tex.first;
while (tex) {
if (tex->id.flag & LIB_NEED_LINK) {
if (tex->extend == 0) {
if (tex->xrepeat || tex->yrepeat) {
tex->extend = TEX_REPEAT;
}
else {
tex->extend = TEX_EXTEND;
tex->xrepeat = tex->yrepeat = 1;
}
}
}
tex = tex->id.next;
}
}
if (main->versionfile <= 101) {
/* frame mapping */
Scene *sce = main->scene.first;
while (sce) {
sce->r.framapto = 100;
sce->r.images = 100;
sce->r.framelen = 1.0;
sce = sce->id.next;
}
}
if (main->versionfile <= 102) {
/* init halo's at 1.0 */
Material *ma = main->mat.first;
while (ma) {
ma->add = 1.0;
ma = ma->id.next;
}
}
if (main->versionfile <= 103) {
/* new variable in object: colbits */
Object *ob = main->object.first;
int a;
while (ob) {
ob->colbits = 0;
if (ob->totcol) {
for (a = 0; a < ob->totcol; a++) {
if (ob->mat[a])
ob->colbits |= (1<<a);
}
}
ob = ob->id.next;
}
}
if (main->versionfile <= 104) {
/* timeoffs moved */
Object *ob = main->object.first;
while (ob) {
if (ob->transflag & 1) {
ob->transflag -= 1;
//ob->ipoflag |= OB_OFFS_OB;
}
ob = ob->id.next;
}
}
if (main->versionfile <= 105) {
Object *ob = main->object.first;
while (ob) {
ob->dupon = 1;
ob->dupoff = 0;
ob->dupsta = 1;
ob->dupend = 100;
ob = ob->id.next;
}
}
if (main->versionfile <= 106) {
/* mcol changed */
Mesh *me = main->mesh.first;
while (me) {
if (me->mcol)
vcol_to_fcol(me);
me = me->id.next;
}
}
if (main->versionfile <= 107) {
Object *ob;
Scene *sce = main->scene.first;
while (sce) {
sce->r.mode |= R_GAMMA;
sce = sce->id.next;
}
ob = main->object.first;
while (ob) {
//ob->ipoflag |= OB_OFFS_PARENT;
if (ob->dt == 0)
ob->dt = OB_SOLID;
ob = ob->id.next;
}
}
if (main->versionfile <= 109) {
/* new variable: gridlines */
bScreen *sc = main->screen.first;
while (sc) {
ScrArea *sa = sc->areabase.first;
while (sa) {
SpaceLink *sl = sa->spacedata.first;
while (sl) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D*) sl;
if (v3d->gridlines == 0)
v3d->gridlines = 20;
}
sl = sl->next;
}
sa = sa->next;
}
sc = sc->id.next;
}
}
if (main->versionfile <= 113) {
Material *ma = main->mat.first;
while (ma) {
if (ma->flaresize == 0.0f)
ma->flaresize = 1.0f;
ma->subsize = 1.0f;
ma->flareboost = 1.0f;
ma = ma->id.next;
}
}
if (main->versionfile <= 134) {
Tex *tex = main->tex.first;
while (tex) {
if ((tex->rfac == 0.0f) &&
(tex->gfac == 0.0f) &&
(tex->bfac == 0.0f))
{
tex->rfac = 1.0f;
tex->gfac = 1.0f;
tex->bfac = 1.0f;
tex->filtersize = 1.0f;
}
tex = tex->id.next;
}
}
if (main->versionfile <= 140) {
/* r-g-b-fac in texture */
Tex *tex = main->tex.first;
while (tex) {
if ((tex->rfac == 0.0f) &&
(tex->gfac == 0.0f) &&
(tex->bfac == 0.0f))
{
tex->rfac = 1.0f;
tex->gfac = 1.0f;
tex->bfac = 1.0f;
tex->filtersize = 1.0f;
}
tex = tex->id.next;
}
}
if (main->versionfile <= 153) {
Scene *sce = main->scene.first;
while (sce) {
if (sce->r.blurfac == 0.0f)
sce->r.blurfac = 1.0f;
sce = sce->id.next;
}
}
if (main->versionfile <= 163) {
Scene *sce = main->scene.first;
while (sce) {
if (sce->r.frs_sec == 0)
sce->r.frs_sec = 25;
sce = sce->id.next;
}
}
if (main->versionfile <= 164) {
Mesh *me = main->mesh.first;
while (me) {
me->smoothresh = 30;
me = me->id.next;
}
}
if (main->versionfile <= 165) {
Mesh *me = main->mesh.first;
TFace *tface;
int nr;
char *cp;
while (me) {
if (me->tface) {
nr = me->totface;
tface = me->tface;
while (nr--) {
cp = (char *)&tface->col[0];
if (cp[1] > 126) cp[1] = 255; else cp[1] *= 2;
if (cp[2] > 126) cp[2] = 255; else cp[2] *= 2;
if (cp[3] > 126) cp[3] = 255; else cp[3] *= 2;
cp = (char *)&tface->col[1];
if (cp[1] > 126) cp[1] = 255; else cp[1] *= 2;
if (cp[2] > 126) cp[2] = 255; else cp[2] *= 2;
if (cp[3] > 126) cp[3] = 255; else cp[3] *= 2;
cp = (char *)&tface->col[2];
if (cp[1] > 126) cp[1] = 255; else cp[1] *= 2;
if (cp[2] > 126) cp[2] = 255; else cp[2] *= 2;
if (cp[3] > 126) cp[3] = 255; else cp[3] *= 2;
cp = (char *)&tface->col[3];
if (cp[1] > 126) cp[1] = 255; else cp[1] *= 2;
if (cp[2] > 126) cp[2] = 255; else cp[2] *= 2;
if (cp[3] > 126) cp[3] = 255; else cp[3] *= 2;
tface++;
}
}
me = me->id.next;
}
}
if (main->versionfile <= 169) {
Mesh *me = main->mesh.first;
while (me) {
if (me->subdiv == 0)
me->subdiv = 1;
me = me->id.next;
}
}
if (main->versionfile <= 169) {
bScreen *sc = main->screen.first;
while (sc) {
ScrArea *sa = sc->areabase.first;
while (sa) {
SpaceLink *sl = sa->spacedata.first;
while (sl) {
if (sl->spacetype == SPACE_IPO) {
SpaceIpo *sipo = (SpaceIpo*) sl;
sipo->v2d.max[0] = 15000.0;
}
sl = sl->next;
}
sa = sa->next;
}
sc = sc->id.next;
}
}
if (main->versionfile <= 170) {
Object *ob = main->object.first;
PartEff *paf;
while (ob) {
paf = blo_do_version_give_parteff_245(ob);
if (paf) {
if (paf->staticstep == 0) {
paf->staticstep = 5;
}
}
ob = ob->id.next;
}
}
if (main->versionfile <= 171) {
bScreen *sc = main->screen.first;
while (sc) {
ScrArea *sa = sc->areabase.first;
while (sa) {
SpaceLink *sl = sa->spacedata.first;
while (sl) {
if (sl->spacetype == SPACE_TEXT) {
SpaceText *st = (SpaceText*) sl;
st->lheight = 12;
}
sl = sl->next;
}
sa = sa->next;
}
sc = sc->id.next;
}
}
if (main->versionfile <= 173) {
int a, b;
Mesh *me = main->mesh.first;
while (me) {
if (me->tface) {
TFace *tface = me->tface;
for (a = 0; a < me->totface; a++, tface++) {
for (b = 0; b < 4; b++) {
tface->uv[b][0] /= 32767.0f;
tface->uv[b][1] /= 32767.0f;
}
}
}
me = me->id.next;
}
}
if (main->versionfile <= 191) {
Object *ob = main->object.first;
Material *ma = main->mat.first;
/* let faces have default add factor of 0.0 */
while (ma) {
if (!(ma->mode & MA_HALO))
ma->add = 0.0;
ma = ma->id.next;
}
while (ob) {
ob->mass = 1.0f;
ob->damping = 0.1f;
/*ob->quat[1] = 1.0f;*/ /* quats arnt used yet */
ob = ob->id.next;
}
}
if (main->versionfile <= 193) {
Object *ob = main->object.first;
while (ob) {
ob->inertia = 1.0f;
ob->rdamping = 0.1f;
ob = ob->id.next;
}
}
if (main->versionfile <= 196) {
Mesh *me = main->mesh.first;
int a, b;
while (me) {
if (me->tface) {
TFace *tface = me->tface;
for (a = 0; a < me->totface; a++, tface++) {
for (b = 0; b < 4; b++) {
tface->mode |= TF_DYNAMIC;
tface->mode &= ~TF_INVISIBLE;
}
}
}
me = me->id.next;
}
}
if (main->versionfile <= 200) {
Object *ob = main->object.first;
while (ob) {
ob->scaflag = ob->gameflag & (OB_DO_FH|OB_ROT_FH|OB_ANISOTROPIC_FRICTION|OB_GHOST|OB_RIGID_BODY|OB_BOUNDS);
/* 64 is do_fh */
ob->gameflag &= ~(OB_ROT_FH|OB_ANISOTROPIC_FRICTION|OB_GHOST|OB_RIGID_BODY|OB_BOUNDS);
ob = ob->id.next;
}
}
if (main->versionfile <= 201) {
/* add-object + end-object are joined to edit-object actuator */
Object *ob = main->object.first;
bProperty *prop;
bActuator *act;
bIpoActuator *ia;
bEditObjectActuator *eoa;
bAddObjectActuator *aoa;
while (ob) {
act = ob->actuators.first;
while (act) {
if (act->type == ACT_IPO) {
ia = act->data;
prop = BKE_bproperty_object_get(ob, ia->name);
if (prop) {
ia->type = ACT_IPO_FROM_PROP;
}
}
else if (act->type == ACT_ADD_OBJECT) {
aoa = act->data;
eoa = MEM_callocN(sizeof(bEditObjectActuator), "edit ob act");
eoa->type = ACT_EDOB_ADD_OBJECT;
eoa->ob = aoa->ob;
eoa->time = aoa->time;
MEM_freeN(aoa);
act->data = eoa;
act->type = act->otype = ACT_EDIT_OBJECT;
}
else if (act->type == ACT_END_OBJECT) {
eoa = MEM_callocN(sizeof(bEditObjectActuator), "edit ob act");
eoa->type = ACT_EDOB_END_OBJECT;
act->data = eoa;
act->type = act->otype = ACT_EDIT_OBJECT;
}
act = act->next;
}
ob = ob->id.next;
}
}
if (main->versionfile <= 202) {
/* add-object and end-object are joined to edit-object
* actuator */
Object *ob = main->object.first;
bActuator *act;
bObjectActuator *oa;
while (ob) {
act = ob->actuators.first;
while (act) {
if (act->type == ACT_OBJECT) {
oa = act->data;
oa->flag &= ~(ACT_TORQUE_LOCAL|ACT_DROT_LOCAL); /* this actuator didn't do local/glob rot before */
}
act = act->next;
}
ob = ob->id.next;
}
}
if (main->versionfile <= 204) {
/* patches for new physics */
Object *ob = main->object.first;
bActuator *act;
bObjectActuator *oa;
bSound *sound;
while (ob) {
/* please check this for demo20 files like
* original Egypt levels etc. converted
* rotation factor of 50 is not workable */
act = ob->actuators.first;
while (act) {
if (act->type == ACT_OBJECT) {
oa = act->data;
oa->forceloc[0] *= 25.0f;
oa->forceloc[1] *= 25.0f;
oa->forceloc[2] *= 25.0f;
oa->forcerot[0] *= 10.0f;
oa->forcerot[1] *= 10.0f;
oa->forcerot[2] *= 10.0f;
}
act = act->next;
}
ob = ob->id.next;
}
sound = main->sound.first;
while (sound) {
if (sound->volume < 0.01f) {
sound->volume = 1.0f;
}
sound = sound->id.next;
}
}
if (main->versionfile <= 205) {
/* patches for new physics */
Object *ob = main->object.first;
bActuator *act;
bSensor *sens;
bEditObjectActuator *oa;
bRaySensor *rs;
bCollisionSensor *cs;
while (ob) {
/* Set anisotropic friction off for old objects,
* values to 1.0. */
ob->gameflag &= ~OB_ANISOTROPIC_FRICTION;
ob->anisotropicFriction[0] = 1.0;
ob->anisotropicFriction[1] = 1.0;
ob->anisotropicFriction[2] = 1.0;
act = ob->actuators.first;
while (act) {
if (act->type == ACT_EDIT_OBJECT) {
/* Zero initial velocity for newly
* added objects */
oa = act->data;
oa->linVelocity[0] = 0.0;
oa->linVelocity[1] = 0.0;
oa->linVelocity[2] = 0.0;
oa->localflag = 0;
}
act = act->next;
}
sens = ob->sensors.first;
while (sens) {
/* Extra fields for radar sensors. */
if (sens->type == SENS_RADAR) {
bRadarSensor *s = sens->data;
s->range = 10000.0;
}
/* Pulsing: defaults for new sensors. */
if (sens->type != SENS_ALWAYS) {
sens->pulse = 0;
sens->freq = 0;
}
else {
sens->pulse = 1;
}
/* Invert: off. */
sens->invert = 0;
/* Collision and ray: default = trigger
* on property. The material field can
* remain empty. */
if (sens->type == SENS_COLLISION) {
cs = (bCollisionSensor*) sens->data;
cs->mode = 0;
}
if (sens->type == SENS_RAY) {
rs = (bRaySensor*) sens->data;
rs->mode = 0;
}
sens = sens->next;
}
ob = ob->id.next;
}
/* have to check the exact multiplier */
}
if (main->versionfile <= 211) {
/* Render setting: per scene, the applicable gamma value
* can be set. Default is 1.0, which means no
* correction. */
bActuator *act;
bObjectActuator *oa;
Object *ob;
/* added alpha in obcolor */
ob = main->object.first;
while (ob) {
ob->col[3] = 1.0;
ob = ob->id.next;
}
/* added alpha in obcolor */
ob = main->object.first;
while (ob) {
act = ob->actuators.first;
while (act) {
if (act->type == ACT_OBJECT) {
/* multiply velocity with 50 in old files */
oa = act->data;
if (fabsf(oa->linearvelocity[0]) >= 0.01f)
oa->linearvelocity[0] *= 50.0f;
if (fabsf(oa->linearvelocity[1]) >= 0.01f)
oa->linearvelocity[1] *= 50.0f;
if (fabsf(oa->linearvelocity[2]) >= 0.01f)
oa->linearvelocity[2] *= 50.0f;
if (fabsf(oa->angularvelocity[0]) >= 0.01f)
oa->angularvelocity[0] *= 50.0f;
if (fabsf(oa->angularvelocity[1]) >= 0.01f)
oa->angularvelocity[1] *= 50.0f;
if (fabsf(oa->angularvelocity[2]) >= 0.01f)
oa->angularvelocity[2] *= 50.0f;
}
act = act->next;
}
ob = ob->id.next;
}
}
if (main->versionfile <= 212) {
2012-08-26 11:35:43 +00:00
bSound *sound;
bProperty *prop;
Object *ob;
Mesh *me;
sound = main->sound.first;
while (sound) {
sound->max_gain = 1.0;
sound->min_gain = 0.0;
sound->distance = 1.0;
if (sound->attenuation > 0.0f)
sound->flags |= SOUND_FLAGS_3D;
else
sound->flags &= ~SOUND_FLAGS_3D;
sound = sound->id.next;
}
ob = main->object.first;
while (ob) {
prop = ob->prop.first;
while (prop) {
if (prop->type == GPROP_TIME) {
// convert old GPROP_TIME values from int to float
*((float *)&prop->data) = (float) prop->data;
}
prop = prop->next;
}
ob = ob->id.next;
}
/* me->subdiv changed to reflect the actual reparametization
* better, and smeshes were removed - if it was a smesh make
* it a subsurf, and reset the subdiv level because subsurf
* takes a lot more work to calculate.
*/
for (me = main->mesh.first; me; me = me->id.next) {
if (me->flag & ME_SMESH) {
me->flag &= ~ME_SMESH;
me->flag |= ME_SUBSURF;
me->subdiv = 1;
}
else {
if (me->subdiv < 2)
me->subdiv = 1;
else
me->subdiv--;
}
}
}
if (main->versionfile <= 220) {
Object *ob;
Mesh *me;
ob = main->object.first;
/* adapt form factor in order to get the 'old' physics
* behavior back...
*/
while (ob) {
/* in future, distinguish between different
* object bounding shapes
*/
ob->formfactor = 0.4f;
/* patch form factor, note that inertia equiv radius
* of a rotation symmetrical obj
*/
if (ob->inertia != 1.0f) {
ob->formfactor /= ob->inertia * ob->inertia;
}
ob = ob->id.next;
}
/* Began using alpha component of vertex colors, but
* old file vertex colors are undefined, reset them
* to be fully opaque. -zr
*/
for (me = main->mesh.first; me; me = me->id.next) {
if (me->mcol) {
int i;
for (i = 0; i < me->totface * 4; i++) {
MCol *mcol = &me->mcol[i];
mcol->a = 255;
}
}
if (me->tface) {
int i, j;
for (i = 0; i < me->totface; i++) {
TFace *tf = &((TFace*) me->tface)[i];
for (j = 0; j < 4; j++) {
2012-10-20 18:46:57 +00:00
char *col = (char *) &tf->col[j];
col[0] = 255;
}
}
}
}
}
if (main->versionfile <= 221) {
Scene *sce = main->scene.first;
/* new variables for std-alone player and runtime */
while (sce) {
sce->r.xplay = 640;
sce->r.yplay = 480;
sce->r.freqplay = 60;
sce = sce->id.next;
}
}
if (main->versionfile <= 222) {
Scene *sce = main->scene.first;
/* new variables for std-alone player and runtime */
while (sce) {
sce->r.depth = 32;
sce = sce->id.next;
}
}
if (main->versionfile <= 223) {
VFont *vf;
Image *ima;
Object *ob;
for (vf = main->vfont.first; vf; vf = vf->id.next) {
if (strcmp(vf->name + strlen(vf->name)-6, ".Bfont") == 0) {
strcpy(vf->name, FO_BUILTIN_NAME);
}
}
/* Old textures animate at 25 FPS */
for (ima = main->image.first; ima; ima = ima->id.next) {
ima->animspeed = 25;
}
/* Zr remapped some keyboard codes to be linear (stupid zr) */
for (ob = main->object.first; ob; ob = ob->id.next) {
bSensor *sens;
for (sens = ob->sensors.first; sens; sens = sens->next) {
if (sens->type == SENS_KEYBOARD) {
bKeyboardSensor *ks = sens->data;
ks->key = map_223_keybd_code_to_224_keybd_code(ks->key);
ks->qual = map_223_keybd_code_to_224_keybd_code(ks->qual);
ks->qual2 = map_223_keybd_code_to_224_keybd_code(ks->qual2);
}
}
}
}
if (main->versionfile <= 224) {
2012-08-26 11:35:43 +00:00
bSound *sound;
Scene *sce;
Mesh *me;
bScreen *sc;
for (sound = main->sound.first; sound; sound = sound->id.next) {
if (sound->packedfile) {
if (sound->newpackedfile == NULL) {
sound->newpackedfile = sound->packedfile;
}
sound->packedfile = NULL;
}
}
/* Make sure that old subsurf meshes don't have zero subdivision level for rendering */
for (me = main->mesh.first; me; me = me->id.next) {
if ((me->flag & ME_SUBSURF) && (me->subdivr == 0))
me->subdivr = me->subdiv;
}
for (sce = main->scene.first; sce; sce = sce->id.next) {
sce->r.stereomode = 1; // no stereo
}
/* some oldfile patch, moved from set_func_space */
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_IPO) {
SpaceSeq *sseq = (SpaceSeq*) sl;
sseq->v2d.keeptot = 0;
}
}
}
}
}
if (main->versionfile <= 225) {
World *wo;
/* Use Sumo for old games */
for (wo = main->world.first; wo; wo = wo->id.next) {
wo->physicsEngine = 2;
}
}
if (main->versionfile <= 227) {
Scene *sce;
Material *ma;
bScreen *sc;
Object *ob;
/* As of now, this insures that the transition from the old Track system
* to the new full constraint Track is painless for everyone. - theeth
*/
ob = main->object.first;
while (ob) {
ListBase *list;
list = &ob->constraints;
/* check for already existing TrackTo constraint
* set their track and up flag correctly
*/
if (list) {
bConstraint *curcon;
for (curcon = list->first; curcon; curcon = curcon->next) {
if (curcon->type == CONSTRAINT_TYPE_TRACKTO) {
bTrackToConstraint *data = curcon->data;
data->reserved1 = ob->trackflag;
data->reserved2 = ob->upflag;
}
}
}
if (ob->type == OB_ARMATURE) {
if (ob->pose) {
bConstraint *curcon;
bPoseChannel *pchan;
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
for (curcon = pchan->constraints.first; curcon; curcon = curcon->next) {
if (curcon->type == CONSTRAINT_TYPE_TRACKTO) {
bTrackToConstraint *data = curcon->data;
data->reserved1 = ob->trackflag;
data->reserved2 = ob->upflag;
}
}
}
}
}
/* Change Ob->Track in real TrackTo constraint */
blo_do_version_old_trackto_to_constraints(ob);
ob = ob->id.next;
}
for (sce = main->scene.first; sce; sce = sce->id.next) {
sce->audio.mixrate = 44100;
sce->audio.flag |= AUDIO_SCRUB;
sce->r.mode |= R_ENVMAP;
}
/* init new shader vars */
for (ma = main->mat.first; ma; ma = ma->id.next) {
ma->refrac = 4.0f;
ma->roughness = 0.5f;
ma->param[0] = 0.5f;
ma->param[1] = 0.1f;
ma->param[2] = 0.1f;
ma->param[3] = 0.05f;
}
/* patch for old wrong max view2d settings, allows zooming out more */
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_ACTION) {
SpaceAction *sac = (SpaceAction *) sl;
sac->v2d.max[0] = 32000;
}
else if (sl->spacetype == SPACE_NLA) {
SpaceNla *sla = (SpaceNla *) sl;
sla->v2d.max[0] = 32000;
}
}
}
}
}
if (main->versionfile <= 228) {
Scene *sce;
bScreen *sc;
Object *ob;
/* As of now, this insures that the transition from the old Track system
* to the new full constraint Track is painless for everyone.
*/
ob = main->object.first;
while (ob) {
ListBase *list;
list = &ob->constraints;
/* check for already existing TrackTo constraint
* set their track and up flag correctly */
if (list) {
bConstraint *curcon;
for (curcon = list->first; curcon; curcon = curcon->next) {
if (curcon->type == CONSTRAINT_TYPE_TRACKTO) {
bTrackToConstraint *data = curcon->data;
data->reserved1 = ob->trackflag;
data->reserved2 = ob->upflag;
}
}
}
if (ob->type == OB_ARMATURE) {
if (ob->pose) {
bConstraint *curcon;
bPoseChannel *pchan;
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
for (curcon = pchan->constraints.first; curcon; curcon = curcon->next) {
if (curcon->type == CONSTRAINT_TYPE_TRACKTO) {
bTrackToConstraint *data = curcon->data;
data->reserved1 = ob->trackflag;
data->reserved2 = ob->upflag;
}
}
}
}
}
ob = ob->id.next;
}
for (sce = main->scene.first; sce; sce = sce->id.next) {
sce->r.mode |= R_ENVMAP;
}
/* convert old mainb values for new button panels */
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_BUTS) {
SpaceButs *sbuts = (SpaceButs *) sl;
sbuts->v2d.maxzoom = 1.2f;
sbuts->align = 1; /* horizontal default */
if (sbuts->mainb == BUTS_LAMP) {
sbuts->mainb = CONTEXT_SHADING;
//sbuts->tab[CONTEXT_SHADING] = TAB_SHADING_LAMP;
}
else if (sbuts->mainb == BUTS_MAT) {
sbuts->mainb = CONTEXT_SHADING;
//sbuts->tab[CONTEXT_SHADING] = TAB_SHADING_MAT;
}
else if (sbuts->mainb == BUTS_TEX) {
sbuts->mainb = CONTEXT_SHADING;
//sbuts->tab[CONTEXT_SHADING] = TAB_SHADING_TEX;
}
else if (sbuts->mainb == BUTS_ANIM) {
sbuts->mainb = CONTEXT_OBJECT;
}
else if (sbuts->mainb == BUTS_WORLD) {
sbuts->mainb = CONTEXT_SCENE;
//sbuts->tab[CONTEXT_SCENE] = TAB_SCENE_WORLD;
}
else if (sbuts->mainb == BUTS_RENDER) {
sbuts->mainb = CONTEXT_SCENE;
//sbuts->tab[CONTEXT_SCENE] = TAB_SCENE_RENDER;
}
else if (sbuts->mainb == BUTS_GAME) {
sbuts->mainb = CONTEXT_LOGIC;
}
else if (sbuts->mainb == BUTS_FPAINT) {
sbuts->mainb = CONTEXT_EDITING;
}
else if (sbuts->mainb == BUTS_RADIO) {
sbuts->mainb = CONTEXT_SHADING;
//sbuts->tab[CONTEXT_SHADING] = TAB_SHADING_RAD;
}
else if (sbuts->mainb == BUTS_CONSTRAINT) {
sbuts->mainb = CONTEXT_OBJECT;
}
else if (sbuts->mainb == BUTS_SCRIPT) {
sbuts->mainb = CONTEXT_OBJECT;
}
else if (sbuts->mainb == BUTS_EDIT) {
sbuts->mainb = CONTEXT_EDITING;
}
else {
sbuts->mainb = CONTEXT_SCENE;
}
}
}
}
}
}
/* ton: made this 230 instead of 229,
* to be sure (tuho files) and this is a reliable check anyway
* nevertheless, we might need to think over a fitness (initialize)
* check apart from the do_versions()
*/
if (main->versionfile <= 230) {
bScreen *sc;
/* new variable blockscale, for panels in any area */
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->blockscale == 0.0f)
sl->blockscale = 0.7f;
/* added: 5x better zoom in for action */
if (sl->spacetype == SPACE_ACTION) {
SpaceAction *sac = (SpaceAction *)sl;
sac->v2d.maxzoom = 50;
}
}
}
}
}
if (main->versionfile <= 231) {
/* new bit flags for showing/hiding grid floor and axes */
bScreen *sc = main->screen.first;
while (sc) {
ScrArea *sa = sc->areabase.first;
while (sa) {
SpaceLink *sl = sa->spacedata.first;
while (sl) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D*) sl;
if (v3d->gridflag == 0) {
v3d->gridflag |= V3D_SHOW_X;
v3d->gridflag |= V3D_SHOW_Y;
v3d->gridflag |= V3D_SHOW_FLOOR;
v3d->gridflag &= ~V3D_SHOW_Z;
}
}
sl = sl->next;
}
sa = sa->next;
}
sc = sc->id.next;
}
}
if (main->versionfile <= 231) {
Material *ma = main->mat.first;
bScreen *sc = main->screen.first;
Scene *sce;
Lamp *la;
World *wrld;
/* introduction of raytrace */
while (ma) {
if (ma->fresnel_tra_i == 0.0f)
ma->fresnel_tra_i = 1.25f;
if (ma->fresnel_mir_i == 0.0f)
ma->fresnel_mir_i = 1.25f;
ma->ang = 1.0;
ma->ray_depth = 2;
ma->ray_depth_tra = 2;
ma->fresnel_tra = 0.0;
ma->fresnel_mir = 0.0;
ma = ma->id.next;
}
sce = main->scene.first;
while (sce) {
if (sce->r.gauss == 0.0f)
sce->r.gauss = 1.0f;
sce = sce->id.next;
}
la = main->lamp.first;
while (la) {
if (la->k == 0.0f) la->k = 1.0;
if (la->ray_samp == 0)
la->ray_samp = 1;
if (la->ray_sampy == 0)
la->ray_sampy = 1;
if (la->ray_sampz == 0)
la->ray_sampz = 1;
if (la->area_size == 0.0f)
la->area_size = 1.0f;
if (la->area_sizey == 0.0f)
la->area_sizey = 1.0f;
if (la->area_sizez == 0.0f)
la->area_sizez = 1.0f;
la = la->id.next;
}
wrld = main->world.first;
while (wrld) {
if (wrld->range == 0.0f) {
wrld->range = 1.0f / wrld->exposure;
}
wrld = wrld->id.next;
}
/* new bit flags for showing/hiding grid floor and axes */
while (sc) {
ScrArea *sa = sc->areabase.first;
while (sa) {
SpaceLink *sl = sa->spacedata.first;
while (sl) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D*) sl;
if (v3d->gridflag == 0) {
v3d->gridflag |= V3D_SHOW_X;
v3d->gridflag |= V3D_SHOW_Y;
v3d->gridflag |= V3D_SHOW_FLOOR;
v3d->gridflag &= ~V3D_SHOW_Z;
}
}
sl = sl->next;
}
sa = sa->next;
}
sc = sc->id.next;
}
}
if (main->versionfile <= 232) {
Tex *tex = main->tex.first;
World *wrld = main->world.first;
bScreen *sc;
Scene *sce;
while (tex) {
if ((tex->flag & (TEX_CHECKER_ODD+TEX_CHECKER_EVEN))==0) {
tex->flag |= TEX_CHECKER_ODD;
}
/* copied from kernel texture.c */
if (tex->ns_outscale == 0.0f) {
/* musgrave */
tex->mg_H = 1.0f;
tex->mg_lacunarity = 2.0f;
tex->mg_octaves = 2.0f;
tex->mg_offset = 1.0f;
tex->mg_gain = 1.0f;
tex->ns_outscale = 1.0f;
/* distnoise */
tex->dist_amount = 1.0f;
/* voronoi */
tex->vn_w1 = 1.0f;
tex->vn_mexp = 2.5f;
}
tex = tex->id.next;
}
while (wrld) {
if (wrld->aodist == 0.0f) {
wrld->aodist = 10.0f;
wrld->aobias = 0.05f;
}
if (wrld->aosamp == 0)
wrld->aosamp = 5;
if (wrld->aoenergy == 0.0f)
wrld->aoenergy = 1.0f;
wrld = wrld->id.next;
}
/* new variable blockscale, for panels in any area, do again because new
* areas didnt initialize it to 0.7 yet
*/
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->blockscale == 0.0f)
sl->blockscale = 0.7f;
/* added: 5x better zoom in for nla */
if (sl->spacetype == SPACE_NLA) {
SpaceNla *snla = (SpaceNla *) sl;
snla->v2d.maxzoom = 50;
}
}
}
}
sce = main->scene.first;
while (sce) {
if (sce->r.ocres == 0)
sce->r.ocres = 64;
sce = sce->id.next;
}
}
if (main->versionfile <= 233) {
bScreen *sc;
Material *ma = main->mat.first;
/* Object *ob = main->object.first; */
while (ma) {
if (ma->rampfac_col == 0.0f)
ma->rampfac_col = 1.0;
if (ma->rampfac_spec == 0.0f)
ma->rampfac_spec = 1.0;
if (ma->pr_lamp == 0)
ma->pr_lamp = 3;
ma = ma->id.next;
}
/* this should have been done loooong before! */
#if 0 /* deprecated in 2.5+ */
while (ob) {
if (ob->ipowin == 0)
ob->ipowin = ID_OB;
ob = ob->id.next;
}
#endif
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D *) sl;
v3d->flag |= V3D_SELECT_OUTLINE;
}
}
}
}
}
if (main->versionfile <= 234) {
World *wo;
bScreen *sc;
/* force sumo engine to be active */
for (wo = main->world.first; wo; wo = wo->id.next) {
if (wo->physicsEngine == 0)
wo->physicsEngine = 2;
}
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D *) sl;
v3d->flag |= V3D_ZBUF_SELECT;
}
else if (sl->spacetype == SPACE_TEXT) {
SpaceText *st = (SpaceText *)sl;
if (st->tabnumber == 0)
st->tabnumber = 2;
}
}
}
}
}
if (main->versionfile <= 235) {
Tex *tex = main->tex.first;
Scene *sce = main->scene.first;
Sequence *seq;
Editing *ed;
while (tex) {
if (tex->nabla == 0.0f)
tex->nabla = 0.025f;
tex = tex->id.next;
}
while (sce) {
ed = sce->ed;
if (ed) {
SEQ_BEGIN (sce->ed, seq)
{
if (seq->type == SEQ_TYPE_IMAGE || seq->type == SEQ_TYPE_MOVIE)
Alpha premul pipeline cleanup This assumptions are now made: - Internally float buffers are always linear alpha-premul colors - Readers should worry about delivering float buffers with that assumptions. - There's an input image setting to say whether it's stored with straight/premul alpha on the disk. - Byte buffers are now assumed have straight alpha, readers should deliver straight alpha. Some implementation details: - Removed scene's color unpremultiply setting, which was very much confusing and was wrong for default settings. Now all renderers assumes to deliver premultiplied alpha. - IMB_buffer_byte_from_float will now linearize alpha when converting from buffer. - Sequencer's effects were changed to assume bytes have got straight alpha. Most of effects will work with bytes still, however for glow it was more tricky to avoid data loss, so there's a commented out glow implementation which converts byte buffer to floats first, operates on floats and returns bytes back. It's slower and not sure if it should actually be used -- who're using glow on alpha anyway? - Sequencer modifiers should also be working nice with straight bytes now. - GLSL preview will predivide float textures to make nice shading, shading with byte textures worked nice (GLSL was assuming straight alpha). - Blender Internal will set alpha=1 to the whole sky. The same happens in Cycles and there's no way to avoid this -- sky is neither straight nor premul and doesn't fit color pipeline well. - Straight alpha mode for render result was also eliminated. - Conversion to correct alpha need to be done before linearizing float buffer. - TIFF will now load and save files with proper alpha mode setting in file meta data header. - Remove Use Alpha from texture mapping and replaced with image datablock setting. Behaves much more predictable and clear from code point of view and solves possible regressions when non-premultiplied images were used as textures with ignoring alpha channel.
2012-12-31 13:52:13 +00:00
seq->alpha_mode = SEQ_ALPHA_STRAIGHT;
}
SEQ_END
}
sce = sce->id.next;
}
}
if (main->versionfile <= 236) {
Object *ob;
Camera *cam = main->camera.first;
Material *ma;
bScreen *sc;
while (cam) {
if (cam->ortho_scale == 0.0f) {
cam->ortho_scale = 256.0f / cam->lens;
if (cam->type == CAM_ORTHO)
printf("NOTE: ortho render has changed, tweak new Camera 'scale' value.\n");
}
cam = cam->id.next;
}
/* set manipulator type */
/* force oops draw if depgraph was set*/
/* set time line var */
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D *) sl;
if (v3d->twtype == 0)
v3d->twtype = V3D_MANIP_TRANSLATE;
}
}
}
}
/* init new shader vars */
for (ma = main->mat.first; ma; ma = ma->id.next) {
if (ma->darkness == 0.0f) {
ma->rms = 0.1f;
ma->darkness = 1.0f;
}
}
/* softbody init new vars */
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->soft) {
if (ob->soft->defgoal == 0.0f)
ob->soft->defgoal = 0.7f;
if (ob->soft->physics_speed == 0.0f)
ob->soft->physics_speed = 1.0f;
if (ob->soft->interval == 0) {
ob->soft->interval = 2;
ob->soft->sfra = 1;
ob->soft->efra = 100;
}
}
if (ob->soft && ob->soft->vertgroup == 0) {
bDeformGroup *locGroup = defgroup_find_name(ob, "SOFTGOAL");
if (locGroup) {
/* retrieve index for that group */
ob->soft->vertgroup = 1 + BLI_findindex(&ob->defbase, locGroup);
}
}
}
}
if (main->versionfile <= 237) {
bArmature *arm;
bConstraint *con;
Object *ob;
Bone *bone;
/* armature recode checks */
for (arm = main->armature.first; arm; arm = arm->id.next) {
BKE_armature_where_is(arm);
for (bone = arm->bonebase.first; bone; bone = bone->next)
do_version_bone_head_tail_237(bone);
}
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->parent) {
Object *parent = blo_do_versions_newlibadr(fd, lib, ob->parent);
if (parent && parent->type == OB_LATTICE)
ob->partype = PARSKEL;
}
/* btw. armature_rebuild_pose is further only called on leave editmode */
if (ob->type == OB_ARMATURE) {
if (ob->pose)
ob->pose->flag |= POSE_RECALC;
/* cannot call stuff now (pointers!), done in setup_app_data */
ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* new generic xray option */
arm = blo_do_versions_newlibadr(fd, lib, ob->data);
if (arm->flag & ARM_DRAWXRAY) {
ob->dtx |= OB_DRAWXRAY;
}
}
else if (ob->type == OB_MESH) {
Mesh *me = blo_do_versions_newlibadr(fd, lib, ob->data);
if ((me->flag&ME_SUBSURF)) {
SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
smd->levels = MAX2(1, me->subdiv);
smd->renderLevels = MAX2(1, me->subdivr);
smd->subdivType = me->subsurftype;
smd->modifier.mode = 0;
if (me->subdiv != 0)
smd->modifier.mode |= 1;
if (me->subdivr != 0)
smd->modifier.mode |= 2;
if (me->flag & ME_OPT_EDGES)
smd->flags |= eSubsurfModifierFlag_ControlEdges;
BLI_addtail(&ob->modifiers, smd);
modifier_unique_name(&ob->modifiers, (ModifierData*)smd);
}
}
/* follow path constraint needs to set the 'path' option in curves... */
for (con = ob->constraints.first; con; con = con->next) {
if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) {
bFollowPathConstraint *data = con->data;
Object *obc = blo_do_versions_newlibadr(fd, lib, data->tar);
if (obc && obc->type == OB_CURVE) {
Curve *cu = blo_do_versions_newlibadr(fd, lib, obc->data);
if (cu)
cu->flag |= CU_PATH;
}
}
}
}
}
if (main->versionfile <= 238) {
Lattice *lt;
Object *ob;
bArmature *arm;
Mesh *me;
Key *key;
Scene *sce = main->scene.first;
while (sce) {
if (sce->toolsettings == NULL) {
sce->toolsettings = MEM_callocN(sizeof(struct ToolSettings), "Tool Settings Struct");
sce->toolsettings->cornertype =0;
sce->toolsettings->degr = 90;
sce->toolsettings->step = 9;
sce->toolsettings->turn = 1;
sce->toolsettings->extr_offs = 1;
sce->toolsettings->doublimit = 0.001f;
sce->toolsettings->segments = 32;
sce->toolsettings->rings = 32;
sce->toolsettings->vertices = 32;
}
sce = sce->id.next;
}
for (lt = main->latt.first; lt; lt = lt->id.next) {
if (lt->fu == 0.0f && lt->fv == 0.0f && lt->fw == 0.0f) {
calc_lat_fudu(lt->flag, lt->pntsu, &lt->fu, &lt->du);
calc_lat_fudu(lt->flag, lt->pntsv, &lt->fv, &lt->dv);
calc_lat_fudu(lt->flag, lt->pntsw, &lt->fw, &lt->dw);
}
}
for (ob = main->object.first; ob; ob = ob->id.next) {
ModifierData *md;
PartEff *paf;
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Subsurf) {
SubsurfModifierData *smd = (SubsurfModifierData*) md;
smd->flags &= ~(eSubsurfModifierFlag_Incremental|eSubsurfModifierFlag_DebugIncr);
}
}
if ((ob->softflag & OB_SB_ENABLE) && !modifiers_findByType(ob, eModifierType_Softbody)) {
if (ob->softflag & OB_SB_POSTDEF) {
md = ob->modifiers.first;
while (md && modifierType_getInfo(md->type)->type == eModifierTypeType_OnlyDeform) {
md = md->next;
}
BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(eModifierType_Softbody));
}
else {
BLI_addhead(&ob->modifiers, modifier_new(eModifierType_Softbody));
}
ob->softflag &= ~OB_SB_ENABLE;
}
if (ob->pose) {
bPoseChannel *pchan;
bConstraint *con;
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
/* note, pchan->bone is also lib-link stuff */
if (pchan->limitmin[0] == 0.0f && pchan->limitmax[0] == 0.0f) {
pchan->limitmin[0] = pchan->limitmin[1] = pchan->limitmin[2] = -180.0f;
pchan->limitmax[0] = pchan->limitmax[1] = pchan->limitmax[2] = 180.0f;
for (con = pchan->constraints.first; con; con = con->next) {
if (con->type == CONSTRAINT_TYPE_KINEMATIC) {
bKinematicConstraint *data = (bKinematicConstraint*)con->data;
data->weight = 1.0f;
data->orientweight = 1.0f;
data->flag &= ~CONSTRAINT_IK_ROT;
/* enforce conversion from old IK_TOPARENT to rootbone index */
data->rootbone = -1;
/* update_pose_etc handles rootbone == -1 */
ob->pose->flag |= POSE_RECALC;
}
}
}
}
}
paf = blo_do_version_give_parteff_245(ob);
if (paf) {
if (paf->disp == 0)
paf->disp = 100;
if (paf->speedtex == 0)
paf->speedtex = 8;
if (paf->omat == 0)
paf->omat = 1;
}
}
for (arm = main->armature.first; arm; arm = arm->id.next) {
bone_version_238(&arm->bonebase);
arm->deformflag |= ARM_DEF_VGROUP;
}
for (me = main->mesh.first; me; me = me->id.next) {
if (!me->medge) {
2012-05-05 21:28:12 +00:00
BKE_mesh_make_edges(me, 1); /* 1 = use mface->edcode */
}
else {
2012-05-05 21:28:12 +00:00
BKE_mesh_strip_loose_faces(me);
}
}
for (key = main->key.first; key; key = key->id.next) {
KeyBlock *kb;
int index = 1;
for (kb = key->block.first; kb; kb = kb->next) {
if (kb == key->refkey) {
if (kb->name[0] == 0)
strcpy(kb->name, "Basis");
}
else {
if (kb->name[0] == 0) {
BLI_snprintf(kb->name, sizeof(kb->name), "Key %d", index);
}
index++;
}
}
}
}
if (main->versionfile <= 239) {
bArmature *arm;
Object *ob;
Scene *sce = main->scene.first;
Camera *cam = main->camera.first;
Material *ma = main->mat.first;
int set_passepartout = 0;
/* deformflag is local in modifier now */
for (ob = main->object.first; ob; ob = ob->id.next) {
ModifierData *md;
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Armature) {
ArmatureModifierData *amd = (ArmatureModifierData*) md;
if (amd->object && amd->deformflag == 0) {
Object *oba = blo_do_versions_newlibadr(fd, lib, amd->object);
arm = blo_do_versions_newlibadr(fd, lib, oba->data);
amd->deformflag = arm->deformflag;
}
}
}
}
/* updating stepsize for ghost drawing */
for (arm = main->armature.first; arm; arm = arm->id.next) {
if (arm->ghostsize == 0)
arm->ghostsize = 1;
bone_version_239(&arm->bonebase);
if (arm->layer == 0)
arm->layer = 1;
}
for (; sce; sce = sce->id.next) {
/* make 'innervert' the default subdivide type, for backwards compat */
sce->toolsettings->cornertype = 1;
if (sce->r.scemode & R_PASSEPARTOUT) {
set_passepartout = 1;
sce->r.scemode &= ~R_PASSEPARTOUT;
}
/* gauss is filter variable now */
if (sce->r.mode & R_GAUSS) {
sce->r.filtertype = R_FILTER_GAUSS;
sce->r.mode &= ~R_GAUSS;
}
}
for (; cam; cam = cam->id.next) {
if (set_passepartout)
cam->flag |= CAM_SHOWPASSEPARTOUT;
/* make sure old cameras have title safe on */
if (!(cam->flag & CAM_SHOWTITLESAFE))
cam->flag |= CAM_SHOWTITLESAFE;
/* set an appropriate camera passepartout alpha */
if (!(cam->passepartalpha))
cam->passepartalpha = 0.2f;
}
for (; ma; ma = ma->id.next) {
if (ma->strand_sta == 0.0f) {
ma->strand_sta = ma->strand_end = 1.0f;
ma->mode |= MA_TANGENT_STR;
}
if (ma->mode & MA_TRACEBLE)
ma->mode |= MA_SHADBUF;
}
}
if (main->versionfile <= 241) {
Object *ob;
Tex *tex;
Scene *sce;
World *wo;
Lamp *la;
Material *ma;
bArmature *arm;
bNodeTree *ntree;
for (wo = main->world.first; wo; wo = wo->id.next) {
/* Migrate to Bullet for games, except for the NaN versions */
/* People can still explicitly choose for Sumo (after 2.42 is out) */
if (main->versionfile > 225)
wo->physicsEngine = WOPHY_BULLET;
if (WO_AODIST == wo->aomode)
wo->aocolor = WO_AOPLAIN;
}
/* updating layers still */
for (arm = main->armature.first; arm; arm = arm->id.next) {
bone_version_239(&arm->bonebase);
if (arm->layer == 0)
arm->layer = 1;
}
for (sce = main->scene.first; sce; sce = sce->id.next) {
if (sce->audio.mixrate == 0)
sce->audio.mixrate = 44100;
if (sce->r.xparts <2 )
sce->r.xparts = 4;
if (sce->r.yparts < 2)
sce->r.yparts = 4;
/* adds default layer */
if (sce->r.layers.first == NULL)
BKE_scene_add_render_layer(sce, NULL);
else {
SceneRenderLayer *srl;
/* new layer flag for sky, was default for solid */
for (srl = sce->r.layers.first; srl; srl = srl->next) {
if (srl->layflag & SCE_LAY_SOLID)
srl->layflag |= SCE_LAY_SKY;
srl->passflag &= (SCE_PASS_COMBINED|SCE_PASS_Z|SCE_PASS_NORMAL|SCE_PASS_VECTOR);
}
}
/* node version changes */
if (sce->nodetree)
ntree_version_241(sce->nodetree);
/* uv calculation options moved to toolsettings */
if (sce->toolsettings->uvcalc_radius == 0.0f) {
sce->toolsettings->uvcalc_radius = 1.0f;
sce->toolsettings->uvcalc_cubesize = 1.0f;
sce->toolsettings->uvcalc_mapdir = 1;
sce->toolsettings->uvcalc_mapalign = 1;
sce->toolsettings->uvcalc_flag = UVCALC_FILLHOLES;
sce->toolsettings->unwrapper = 1;
}
if (sce->r.mode & R_PANORAMA) {
/* all these checks to ensure saved files with svn version keep working... */
if (sce->r.xsch < sce->r.ysch) {
Object *obc = blo_do_versions_newlibadr(fd, lib, sce->camera);
if (obc && obc->type == OB_CAMERA) {
Camera *cam = blo_do_versions_newlibadr(fd, lib, obc->data);
if (cam->lens >= 10.0f) {
sce->r.xsch *= sce->r.xparts;
cam->lens *= (float)sce->r.ysch / (float)sce->r.xsch;
}
}
}
}
}
for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next)
ntree_version_241(ntree);
for (la = main->lamp.first; la; la = la->id.next)
if (la->buffers == 0)
la->buffers = 1;
for (tex = main->tex.first; tex; tex = tex->id.next) {
if (tex->env && tex->env->viewscale == 0.0f)
tex->env->viewscale = 1.0f;
//tex->imaflag |= TEX_GAUSS_MIP;
}
/* for empty drawsize and drawtype */
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->empty_drawsize == 0.0f) {
ob->empty_drawtype = OB_ARROWS;
ob->empty_drawsize = 1.0;
}
}
for (ma = main->mat.first; ma; ma = ma->id.next) {
/* stucci returns intensity from now on */
int a;
for (a = 0; a < MAX_MTEX; a++) {
if (ma->mtex[a] && ma->mtex[a]->tex) {
tex = blo_do_versions_newlibadr(fd, lib, ma->mtex[a]->tex);
if (tex && tex->type == TEX_STUCCI)
ma->mtex[a]->mapto &= ~(MAP_COL|MAP_SPEC|MAP_REF);
}
}
/* transmissivity defaults */
if (ma->tx_falloff == 0.0f)
ma->tx_falloff = 1.0f;
}
/* during 2.41 images with this name were used for viewer node output, lets fix that */
if (main->versionfile == 241) {
Image *ima;
for (ima = main->image.first; ima; ima = ima->id.next)
if (strcmp(ima->name, "Compositor") == 0) {
2013-03-18 18:25:05 +00:00
strcpy(ima->id.name + 2, "Viewer Node");
strcpy(ima->name, "Viewer Node");
}
}
}
if (main->versionfile <= 242) {
Scene *sce;
bScreen *sc;
Object *ob;
Curve *cu;
Material *ma;
Mesh *me;
Group *group;
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
bNodeTree *ntree;
int a;
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
sa = sc->areabase.first;
while (sa) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D*) sl;
if (v3d->gridsubdiv == 0)
v3d->gridsubdiv = 10;
}
}
sa = sa->next;
}
}
for (sce = main->scene.first; sce; sce = sce->id.next) {
if (sce->toolsettings->select_thresh == 0.0f)
sce->toolsettings->select_thresh = 0.01f;
if (sce->toolsettings->clean_thresh == 0.0f)
sce->toolsettings->clean_thresh = 0.1f;
if (sce->r.threads == 0) {
if (sce->r.mode & R_THREADS)
sce->r.threads = 2;
else
sce->r.threads = 1;
}
if (sce->nodetree)
ntree_version_242(sce->nodetree);
}
for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next)
ntree_version_242(ntree);
/* add default radius values to old curve points */
for (cu = main->curve.first; cu; cu = cu->id.next) {
for (nu = cu->nurb.first; nu; nu = nu->next) {
if (nu) {
if (nu->bezt) {
for (bezt = nu->bezt, a = 0; a < nu->pntsu; a++, bezt++) {
if (!bezt->radius)
bezt->radius = 1.0;
}
}
else if (nu->bp) {
for (bp = nu->bp, a = 0; a < nu->pntsu * nu->pntsv; a++, bp++) {
if (!bp->radius)
bp->radius = 1.0;
}
}
}
}
}
for (ob = main->object.first; ob; ob = ob->id.next) {
ModifierData *md;
ListBase *list;
list = &ob->constraints;
/* check for already existing MinMax (floor) constraint
* and update the sticky flagging */
if (list) {
bConstraint *curcon;
for (curcon = list->first; curcon; curcon = curcon->next) {
switch (curcon->type) {
case CONSTRAINT_TYPE_MINMAX:
{
bMinMaxConstraint *data = curcon->data;
if (data->sticky == 1)
data->flag |= MINMAX_STICKY;
else
data->flag &= ~MINMAX_STICKY;
}
break;
case CONSTRAINT_TYPE_ROTLIKE:
{
bRotateLikeConstraint *data = curcon->data;
/* version patch from buttons_object.c */
if (data->flag == 0)
data->flag = ROTLIKE_X|ROTLIKE_Y|ROTLIKE_Z;
}
break;
}
}
}
if (ob->type == OB_ARMATURE) {
if (ob->pose) {
bConstraint *curcon;
bPoseChannel *pchan;
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
for (curcon = pchan->constraints.first; curcon; curcon = curcon->next) {
switch (curcon->type) {
case CONSTRAINT_TYPE_MINMAX:
{
bMinMaxConstraint *data = curcon->data;
if (data->sticky == 1)
data->flag |= MINMAX_STICKY;
else
data->flag &= ~MINMAX_STICKY;
}
break;
case CONSTRAINT_TYPE_KINEMATIC:
{
bKinematicConstraint *data = curcon->data;
if (!(data->flag & CONSTRAINT_IK_POS)) {
data->flag |= CONSTRAINT_IK_POS;
data->flag |= CONSTRAINT_IK_STRETCH;
}
}
break;
case CONSTRAINT_TYPE_ROTLIKE:
{
bRotateLikeConstraint *data = curcon->data;
/* version patch from buttons_object.c */
if (data->flag == 0)
data->flag = ROTLIKE_X|ROTLIKE_Y|ROTLIKE_Z;
}
break;
}
}
}
}
}
/* copy old object level track settings to curve modifers */
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Curve) {
CurveModifierData *cmd = (CurveModifierData*) md;
if (cmd->defaxis == 0)
cmd->defaxis = ob->trackflag+1;
}
}
}
for (ma = main->mat.first; ma; ma = ma->id.next) {
if (ma->shad_alpha == 0.0f)
ma->shad_alpha = 1.0f;
if (ma->nodetree)
ntree_version_242(ma->nodetree);
}
for (me = main->mesh.first; me; me = me->id.next)
customdata_version_242(me);
for (group = main->group.first; group; group = group->id.next)
if (group->layer == 0)
group->layer = (1<<20)-1;
/* now, subversion control! */
if (main->subversionfile < 3) {
Image *ima;
Tex *tex;
/* Image refactor initialize */
for (ima = main->image.first; ima; ima = ima->id.next) {
ima->source = IMA_SRC_FILE;
ima->type = IMA_TYPE_IMAGE;
ima->gen_x = 256; ima->gen_y = 256;
ima->gen_type = 1;
2013-03-18 18:25:05 +00:00
if (0 == strncmp(ima->id.name + 2, "Viewer Node", sizeof(ima->id.name) - 2)) {
ima->source = IMA_SRC_VIEWER;
ima->type = IMA_TYPE_COMPOSITE;
}
2013-03-18 18:25:05 +00:00
if (0 == strncmp(ima->id.name + 2, "Render Result", sizeof(ima->id.name) - 2)) {
ima->source = IMA_SRC_VIEWER;
ima->type = IMA_TYPE_R_RESULT;
}
}
for (tex = main->tex.first; tex; tex = tex->id.next) {
if (tex->type == TEX_IMAGE && tex->ima) {
ima = blo_do_versions_newlibadr(fd, lib, tex->ima);
if (tex->imaflag & TEX_ANIM5_)
ima->source = IMA_SRC_MOVIE;
if (tex->imaflag & TEX_FIELDS_)
ima->flag |= IMA_FIELDS;
if (tex->imaflag & TEX_STD_FIELD_)
ima->flag |= IMA_STD_FIELD;
}
tex->iuser.frames = tex->frames;
tex->iuser.fie_ima = (char)tex->fie_ima;
tex->iuser.offset = tex->offset;
tex->iuser.sfra = tex->sfra;
tex->iuser.cycl = (tex->imaflag & TEX_ANIMCYCLIC_)!=0;
}
for (sce = main->scene.first; sce; sce = sce->id.next) {
if (sce->nodetree)
do_version_ntree_242_2(sce->nodetree);
}
for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next)
do_version_ntree_242_2(ntree);
for (ma = main->mat.first; ma; ma = ma->id.next)
if (ma->nodetree)
do_version_ntree_242_2(ma->nodetree);
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_IMAGE)
((SpaceImage *)sl)->iuser.fie_ima = 2;
else if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D *)sl;
BGpic *bgpic;
for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next)
bgpic->iuser.fie_ima = 2;
}
}
}
}
}
if (main->subversionfile < 4) {
for (sce = main->scene.first; sce; sce = sce->id.next) {
sce->r.bake_mode = 1; /* prevent to include render stuff here */
sce->r.bake_filter = 16;
sce->r.bake_osa = 5;
sce->r.bake_flag = R_BAKE_CLEAR;
}
}
if (main->subversionfile < 5) {
for (sce = main->scene.first; sce; sce = sce->id.next) {
/* improved triangle to quad conversion settings */
if (sce->toolsettings->jointrilimit == 0.0f)
sce->toolsettings->jointrilimit = 0.8f;
}
}
}
if (main->versionfile <= 243) {
Object *ob = main->object.first;
Material *ma;
for (ma = main->mat.first; ma; ma = ma->id.next) {
if (ma->sss_scale == 0.0f) {
ma->sss_radius[0] = 1.0f;
ma->sss_radius[1] = 1.0f;
ma->sss_radius[2] = 1.0f;
ma->sss_col[0] = 0.8f;
ma->sss_col[1] = 0.8f;
ma->sss_col[2] = 0.8f;
ma->sss_error = 0.05f;
ma->sss_scale = 0.1f;
ma->sss_ior = 1.3f;
ma->sss_colfac = 1.0f;
ma->sss_texfac = 0.0f;
}
if (ma->sss_front == 0 && ma->sss_back == 0) {
ma->sss_front = 1.0f;
ma->sss_back = 1.0f;
}
if (ma->sss_col[0] == 0 && ma->sss_col[1] == 0 && ma->sss_col[2] == 0) {
ma->sss_col[0] = ma->r;
ma->sss_col[1] = ma->g;
ma->sss_col[2] = ma->b;
}
}
for (; ob; ob = ob->id.next) {
bDeformGroup *curdef;
for (curdef = ob->defbase.first; curdef; curdef = curdef->next) {
/* replace an empty-string name with unique name */
if (curdef->name[0] == '\0') {
defgroup_unique_name(curdef, ob);
}
}
if (main->versionfile < 243 || main->subversionfile < 1) {
ModifierData *md;
/* translate old mirror modifier axis values to new flags */
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Mirror) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
switch (mmd->axis) {
case 0:
mmd->flag |= MOD_MIR_AXIS_X;
break;
case 1:
mmd->flag |= MOD_MIR_AXIS_Y;
break;
case 2:
mmd->flag |= MOD_MIR_AXIS_Z;
break;
}
mmd->axis = 0;
}
}
}
}
/* render layer added, this is not the active layer */
if (main->versionfile <= 243 || main->subversionfile < 2) {
Mesh *me;
for (me = main->mesh.first; me; me = me->id.next)
customdata_version_243(me);
}
}
if (main->versionfile <= 244) {
Scene *sce;
bScreen *sc;
Lamp *la;
World *wrld;
if (main->versionfile != 244 || main->subversionfile < 2) {
for (sce = main->scene.first; sce; sce = sce->id.next)
sce->r.mode |= R_SSS;
/* correct older action editors - incorrect scrolling */
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
sa = sc->areabase.first;
while (sa) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_ACTION) {
SpaceAction *saction = (SpaceAction*) sl;
saction->v2d.tot.ymin = -1000.0;
saction->v2d.tot.ymax = 0.0;
saction->v2d.cur.ymin = -75.0;
saction->v2d.cur.ymax = 5.0;
}
}
sa = sa->next;
}
}
}
if (main->versionfile != 244 || main->subversionfile < 3) {
/* constraints recode version patch used to be here. Moved to 245 now... */
for (wrld = main->world.first; wrld; wrld = wrld->id.next) {
if (wrld->mode & WO_AMB_OCC)
wrld->ao_samp_method = WO_AOSAMP_CONSTANT;
else
wrld->ao_samp_method = WO_AOSAMP_HAMMERSLEY;
wrld->ao_adapt_thresh = 0.005f;
}
for (la = main->lamp.first; la; la = la->id.next) {
if (la->type == LA_AREA)
la->ray_samp_method = LA_SAMP_CONSTANT;
else
la->ray_samp_method = LA_SAMP_HALTON;
la->adapt_thresh = 0.001f;
}
}
}
if (main->versionfile <= 245) {
Scene *sce;
Object *ob;
Image *ima;
Lamp *la;
Material *ma;
ParticleSettings *part;
World *wrld;
Mesh *me;
bNodeTree *ntree;
Tex *tex;
ModifierData *md;
ParticleSystem *psys;
/* unless the file was created 2.44.3 but not 2.45, update the constraints */
if (!(main->versionfile == 244 && main->subversionfile == 3) &&
((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile == 0)) )
{
for (ob = main->object.first; ob; ob = ob->id.next) {
ListBase *list;
list = &ob->constraints;
/* fix up constraints due to constraint recode changes (originally at 2.44.3) */
if (list) {
bConstraint *curcon;
for (curcon = list->first; curcon; curcon = curcon->next) {
/* old CONSTRAINT_LOCAL check -> convert to CONSTRAINT_SPACE_LOCAL */
if (curcon->flag & 0x20) {
curcon->ownspace = CONSTRAINT_SPACE_LOCAL;
curcon->tarspace = CONSTRAINT_SPACE_LOCAL;
}
switch (curcon->type) {
case CONSTRAINT_TYPE_LOCLIMIT:
{
bLocLimitConstraint *data = (bLocLimitConstraint *) curcon->data;
/* old limit without parent option for objects */
if (data->flag2)
curcon->ownspace = CONSTRAINT_SPACE_LOCAL;
}
break;
}
}
}
/* correctly initialize constinv matrix */
unit_m4(ob->constinv);
if (ob->type == OB_ARMATURE) {
if (ob->pose) {
bConstraint *curcon;
bPoseChannel *pchan;
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
/* make sure constraints are all up to date */
for (curcon = pchan->constraints.first; curcon; curcon = curcon->next) {
/* old CONSTRAINT_LOCAL check -> convert to CONSTRAINT_SPACE_LOCAL */
if (curcon->flag & 0x20) {
curcon->ownspace = CONSTRAINT_SPACE_LOCAL;
curcon->tarspace = CONSTRAINT_SPACE_LOCAL;
}
switch (curcon->type) {
case CONSTRAINT_TYPE_ACTION:
{
bActionConstraint *data = (bActionConstraint *) curcon->data;
/* 'data->local' used to mean that target was in local-space */
if (data->local)
curcon->tarspace = CONSTRAINT_SPACE_LOCAL;
}
break;
}
}
/* correctly initialize constinv matrix */
unit_m4(pchan->constinv);
}
}
}
}
}
/* fix all versions before 2.45 */
if (main->versionfile != 245) {
/* repair preview from 242 - 244*/
for (ima = main->image.first; ima; ima = ima->id.next) {
ima->preview = NULL;
}
}
/* add point caches */
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->soft && !ob->soft->pointcache)
ob->soft->pointcache = BKE_ptcache_add(&ob->soft->ptcaches);
for (psys = ob->particlesystem.first; psys; psys = psys->next) {
if (psys->pointcache) {
if (psys->pointcache->flag & PTCACHE_BAKED && (psys->pointcache->flag & PTCACHE_DISK_CACHE) == 0) {
printf("Old memory cache isn't supported for particles, so re-bake the simulation!\n");
psys->pointcache->flag &= ~PTCACHE_BAKED;
}
}
else
psys->pointcache = BKE_ptcache_add(&psys->ptcaches);
}
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Cloth) {
ClothModifierData *clmd = (ClothModifierData*) md;
if (!clmd->point_cache)
clmd->point_cache = BKE_ptcache_add(&clmd->ptcaches);
}
}
}
/* Copy over old per-level multires vertex data
* into a single vertex array in struct Multires */
for (me = main->mesh.first; me; me = me->id.next) {
if (me->mr && !me->mr->verts) {
MultiresLevel *lvl = me->mr->levels.last;
if (lvl) {
me->mr->verts = lvl->verts;
lvl->verts = NULL;
/* Don't need the other vert arrays */
for (lvl = lvl->prev; lvl; lvl = lvl->prev) {
MEM_freeN(lvl->verts);
lvl->verts = NULL;
}
}
}
}
if (main->versionfile != 245 || main->subversionfile < 1) {
for (la = main->lamp.first; la; la = la->id.next) {
if (la->mode & LA_QUAD)
la->falloff_type = LA_FALLOFF_SLIDERS;
else
la->falloff_type = LA_FALLOFF_INVLINEAR;
if (la->curfalloff == NULL) {
la->curfalloff = curvemapping_add(1, 0.0f, 1.0f, 1.0f, 0.0f);
curvemapping_initialize(la->curfalloff);
}
}
}
for (ma = main->mat.first; ma; ma = ma->id.next) {
if (ma->samp_gloss_mir == 0) {
ma->gloss_mir = ma->gloss_tra = 1.0f;
ma->aniso_gloss_mir = 1.0f;
ma->samp_gloss_mir = ma->samp_gloss_tra = 18;
ma->adapt_thresh_mir = ma->adapt_thresh_tra = 0.005f;
ma->dist_mir = 0.0f;
ma->fadeto_mir = MA_RAYMIR_FADETOSKY;
}
if (ma->strand_min == 0.0f)
ma->strand_min = 1.0f;
}
for (part = main->particle.first; part; part = part->id.next) {
if (part->ren_child_nbr == 0)
part->ren_child_nbr = part->child_nbr;
if (part->simplify_refsize == 0) {
part->simplify_refsize = 1920;
part->simplify_rate = 1.0f;
part->simplify_transition = 0.1f;
part->simplify_viewport = 0.8f;
}
}
for (wrld = main->world.first; wrld; wrld = wrld->id.next) {
if (wrld->ao_approx_error == 0.0f)
wrld->ao_approx_error = 0.25f;
}
for (sce = main->scene.first; sce; sce = sce->id.next) {
if (sce->nodetree)
ntree_version_245(fd, lib, sce->nodetree);
if (sce->r.simplify_shadowsamples == 0) {
sce->r.simplify_subsurf = 6;
sce->r.simplify_particles = 1.0f;
sce->r.simplify_shadowsamples = 16;
sce->r.simplify_aosss = 1.0f;
}
if (sce->r.cineongamma == 0) {
sce->r.cineonblack = 95;
sce->r.cineonwhite = 685;
sce->r.cineongamma = 1.7f;
}
}
for (ntree = main->nodetree.first; ntree; ntree = ntree->id.next)
ntree_version_245(fd, lib, ntree);
/* fix for temporary flag changes during 245 cycle */
for (ima = main->image.first; ima; ima = ima->id.next) {
if (ima->flag & IMA_OLD_PREMUL) {
ima->flag &= ~IMA_OLD_PREMUL;
Alpha premul pipeline cleanup This assumptions are now made: - Internally float buffers are always linear alpha-premul colors - Readers should worry about delivering float buffers with that assumptions. - There's an input image setting to say whether it's stored with straight/premul alpha on the disk. - Byte buffers are now assumed have straight alpha, readers should deliver straight alpha. Some implementation details: - Removed scene's color unpremultiply setting, which was very much confusing and was wrong for default settings. Now all renderers assumes to deliver premultiplied alpha. - IMB_buffer_byte_from_float will now linearize alpha when converting from buffer. - Sequencer's effects were changed to assume bytes have got straight alpha. Most of effects will work with bytes still, however for glow it was more tricky to avoid data loss, so there's a commented out glow implementation which converts byte buffer to floats first, operates on floats and returns bytes back. It's slower and not sure if it should actually be used -- who're using glow on alpha anyway? - Sequencer modifiers should also be working nice with straight bytes now. - GLSL preview will predivide float textures to make nice shading, shading with byte textures worked nice (GLSL was assuming straight alpha). - Blender Internal will set alpha=1 to the whole sky. The same happens in Cycles and there's no way to avoid this -- sky is neither straight nor premul and doesn't fit color pipeline well. - Straight alpha mode for render result was also eliminated. - Conversion to correct alpha need to be done before linearizing float buffer. - TIFF will now load and save files with proper alpha mode setting in file meta data header. - Remove Use Alpha from texture mapping and replaced with image datablock setting. Behaves much more predictable and clear from code point of view and solves possible regressions when non-premultiplied images were used as textures with ignoring alpha channel.
2012-12-31 13:52:13 +00:00
ima->alpha_mode = IMA_ALPHA_STRAIGHT;
}
}
for (tex = main->tex.first; tex; tex = tex->id.next) {
if (tex->iuser.flag & IMA_OLD_PREMUL) {
tex->iuser.flag &= ~IMA_OLD_PREMUL;
}
ima = blo_do_versions_newlibadr(fd, lib, tex->ima);
if (ima && (tex->iuser.flag & IMA_DO_PREMUL)) {
ima->flag &= ~IMA_OLD_PREMUL;
Alpha premul pipeline cleanup This assumptions are now made: - Internally float buffers are always linear alpha-premul colors - Readers should worry about delivering float buffers with that assumptions. - There's an input image setting to say whether it's stored with straight/premul alpha on the disk. - Byte buffers are now assumed have straight alpha, readers should deliver straight alpha. Some implementation details: - Removed scene's color unpremultiply setting, which was very much confusing and was wrong for default settings. Now all renderers assumes to deliver premultiplied alpha. - IMB_buffer_byte_from_float will now linearize alpha when converting from buffer. - Sequencer's effects were changed to assume bytes have got straight alpha. Most of effects will work with bytes still, however for glow it was more tricky to avoid data loss, so there's a commented out glow implementation which converts byte buffer to floats first, operates on floats and returns bytes back. It's slower and not sure if it should actually be used -- who're using glow on alpha anyway? - Sequencer modifiers should also be working nice with straight bytes now. - GLSL preview will predivide float textures to make nice shading, shading with byte textures worked nice (GLSL was assuming straight alpha). - Blender Internal will set alpha=1 to the whole sky. The same happens in Cycles and there's no way to avoid this -- sky is neither straight nor premul and doesn't fit color pipeline well. - Straight alpha mode for render result was also eliminated. - Conversion to correct alpha need to be done before linearizing float buffer. - TIFF will now load and save files with proper alpha mode setting in file meta data header. - Remove Use Alpha from texture mapping and replaced with image datablock setting. Behaves much more predictable and clear from code point of view and solves possible regressions when non-premultiplied images were used as textures with ignoring alpha channel.
2012-12-31 13:52:13 +00:00
ima->alpha_mode = IMA_ALPHA_STRAIGHT;
}
}
}
/* sanity check for skgen */
{
Scene *sce;
for (sce = main->scene.first; sce; sce = sce->id.next) {
if (sce->toolsettings->skgen_subdivisions[0] == sce->toolsettings->skgen_subdivisions[1] ||
sce->toolsettings->skgen_subdivisions[0] == sce->toolsettings->skgen_subdivisions[2] ||
sce->toolsettings->skgen_subdivisions[1] == sce->toolsettings->skgen_subdivisions[2])
{
sce->toolsettings->skgen_subdivisions[0] = SKGEN_SUB_CORRELATION;
sce->toolsettings->skgen_subdivisions[1] = SKGEN_SUB_LENGTH;
sce->toolsettings->skgen_subdivisions[2] = SKGEN_SUB_ANGLE;
}
}
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 2)) {
Image *ima;
/* initialize 1:1 Aspect */
for (ima = main->image.first; ima; ima = ima->id.next) {
ima->aspx = ima->aspy = 1.0f;
}
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 4)) {
bArmature *arm;
ModifierData *md;
Object *ob;
for (arm = main->armature.first; arm; arm = arm->id.next)
arm->deformflag |= ARM_DEF_B_BONE_REST;
for (ob = main->object.first; ob; ob = ob->id.next) {
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Armature)
((ArmatureModifierData*) md)->deformflag |= ARM_DEF_B_BONE_REST;
}
}
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 5)) {
/* foreground color needs to be something other then black */
Scene *sce;
for (sce = main->scene.first; sce; sce = sce->id.next) {
sce->r.fg_stamp[0] = sce->r.fg_stamp[1] = sce->r.fg_stamp[2] = 0.8f;
sce->r.fg_stamp[3] = 1.0f; /* don't use text alpha yet */
sce->r.bg_stamp[3] = 0.25f; /* make sure the background has full alpha */
}
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 6)) {
Scene *sce;
/* fix frs_sec_base */
for (sce = main->scene.first; sce; sce = sce->id.next) {
if (sce->r.frs_sec_base == 0) {
sce->r.frs_sec_base = 1;
}
}
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 7)) {
Object *ob;
bPoseChannel *pchan;
bConstraint *con;
bConstraintTarget *ct;
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->pose) {
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
for (con = pchan->constraints.first; con; con = con->next) {
if (con->type == CONSTRAINT_TYPE_PYTHON) {
bPythonConstraint *data = (bPythonConstraint *)con->data;
if (data->tar) {
/* version patching needs to be done */
ct = MEM_callocN(sizeof(bConstraintTarget), "PyConTarget");
ct->tar = data->tar;
BLI_strncpy(ct->subtarget, data->subtarget, sizeof(ct->subtarget));
ct->space = con->tarspace;
BLI_addtail(&data->targets, ct);
data->tarnum++;
/* clear old targets to avoid problems */
data->tar = NULL;
data->subtarget[0] = '\0';
}
}
else if (con->type == CONSTRAINT_TYPE_LOCLIKE) {
bLocateLikeConstraint *data = (bLocateLikeConstraint *)con->data;
/* new headtail functionality makes Bone-Tip function obsolete */
if (data->flag & LOCLIKE_TIP)
con->headtail = 1.0f;
}
}
}
}
for (con = ob->constraints.first; con; con = con->next) {
if (con->type == CONSTRAINT_TYPE_PYTHON) {
bPythonConstraint *data = (bPythonConstraint *)con->data;
if (data->tar) {
/* version patching needs to be done */
ct = MEM_callocN(sizeof(bConstraintTarget), "PyConTarget");
ct->tar = data->tar;
BLI_strncpy(ct->subtarget, data->subtarget, sizeof(ct->subtarget));
ct->space = con->tarspace;
BLI_addtail(&data->targets, ct);
data->tarnum++;
/* clear old targets to avoid problems */
data->tar = NULL;
data->subtarget[0] = '\0';
}
}
else if (con->type == CONSTRAINT_TYPE_LOCLIKE) {
bLocateLikeConstraint *data = (bLocateLikeConstraint *)con->data;
/* new headtail functionality makes Bone-Tip function obsolete */
if (data->flag & LOCLIKE_TIP)
con->headtail = 1.0f;
}
}
if (ob->soft && ob->soft->keys) {
SoftBody *sb = ob->soft;
int k;
for (k = 0; k < sb->totkey; k++) {
if (sb->keys[k])
MEM_freeN(sb->keys[k]);
}
MEM_freeN(sb->keys);
sb->keys = NULL;
sb->totkey = 0;
}
}
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 8)) {
Scene *sce;
Object *ob;
PartEff *paf = NULL;
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->soft && ob->soft->keys) {
SoftBody *sb = ob->soft;
int k;
for (k = 0; k < sb->totkey; k++) {
if (sb->keys[k])
MEM_freeN(sb->keys[k]);
}
MEM_freeN(sb->keys);
sb->keys = NULL;
sb->totkey = 0;
}
/* convert old particles to new system */
if ((paf = blo_do_version_give_parteff_245(ob))) {
ParticleSystem *psys;
ModifierData *md;
ParticleSystemModifierData *psmd;
ParticleSettings *part;
/* create new particle system */
psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
psys->pointcache = BKE_ptcache_add(&psys->ptcaches);
part = psys->part = psys_new_settings("ParticleSettings", main);
/* needed for proper libdata lookup */
blo_do_versions_oldnewmap_insert(fd->libmap, psys->part, psys->part, 0);
part->id.lib = ob->id.lib;
part->id.us--;
part->id.flag |= (ob->id.flag & LIB_NEED_LINK);
psys->totpart = 0;
psys->flag = PSYS_ENABLED|PSYS_CURRENT;
BLI_addtail(&ob->particlesystem, psys);
md = modifier_new(eModifierType_ParticleSystem);
BLI_snprintf(md->name, sizeof(md->name), "ParticleSystem %i", BLI_countlist(&ob->particlesystem));
psmd = (ParticleSystemModifierData*) md;
psmd->psys = psys;
BLI_addtail(&ob->modifiers, md);
/* convert settings from old particle system */
/* general settings */
part->totpart = MIN2(paf->totpart, 100000);
part->sta = paf->sta;
part->end = paf->end;
part->lifetime = paf->lifetime;
part->randlife = paf->randlife;
psys->seed = paf->seed;
part->disp = paf->disp;
part->omat = paf->mat[0];
part->hair_step = paf->totkey;
part->eff_group = paf->group;
/* old system didn't interpolate between keypoints at render time */
part->draw_step = part->ren_step = 0;
/* physics */
part->normfac = paf->normfac * 25.0f;
part->obfac = paf->obfac;
part->randfac = paf->randfac * 25.0f;
part->dampfac = paf->damp;
copy_v3_v3(part->acc, paf->force);
/* flags */
if (paf->stype & PAF_VECT) {
if (paf->flag & PAF_STATIC) {
/* new hair lifetime is always 100.0f */
float fac = paf->lifetime / 100.0f;
part->draw_as = PART_DRAW_PATH;
part->type = PART_HAIR;
psys->recalc |= PSYS_RECALC_REDO;
part->normfac *= fac;
part->randfac *= fac;
}
else {
part->draw_as = PART_DRAW_LINE;
part->draw |= PART_DRAW_VEL_LENGTH;
part->draw_line[1] = 0.04f;
}
}
part->rotmode = PART_ROT_VEL;
part->flag |= (paf->flag & PAF_BSPLINE) ? PART_HAIR_BSPLINE : 0;
part->flag |= (paf->flag & PAF_TRAND) ? PART_TRAND : 0;
part->flag |= (paf->flag & PAF_EDISTR) ? PART_EDISTR : 0;
part->flag |= (paf->flag & PAF_UNBORN) ? PART_UNBORN : 0;
part->flag |= (paf->flag & PAF_DIED) ? PART_DIED : 0;
part->from |= (paf->flag & PAF_FACE) ? PART_FROM_FACE : 0;
part->draw |= (paf->flag & PAF_SHOWE) ? PART_DRAW_EMITTER : 0;
psys->vgroup[PSYS_VG_DENSITY] = paf->vertgroup;
psys->vgroup[PSYS_VG_VEL] = paf->vertgroup_v;
psys->vgroup[PSYS_VG_LENGTH] = paf->vertgroup_v;
/* dupliobjects */
if (ob->transflag & OB_DUPLIVERTS) {
Object *dup = main->object.first;
for (; dup; dup = dup->id.next) {
if (ob == blo_do_versions_newlibadr(fd, lib, dup->parent)) {
part->dup_ob = dup;
ob->transflag |= OB_DUPLIPARTS;
ob->transflag &= ~OB_DUPLIVERTS;
part->draw_as = PART_DRAW_OB;
/* needed for proper libdata lookup */
blo_do_versions_oldnewmap_insert(fd->libmap, dup, dup, 0);
}
}
}
{
FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim);
if (fluidmd && fluidmd->fss && fluidmd->fss->type == OB_FLUIDSIM_PARTICLE)
part->type = PART_FLUID;
}
do_version_free_effects_245(&ob->effect);
printf("Old particle system converted to new system.\n");
}
}
for (sce = main->scene.first; sce; sce = sce->id.next) {
ParticleEditSettings *pset = &sce->toolsettings->particle;
int a;
if (pset->brush[0].size == 0) {
pset->flag = PE_KEEP_LENGTHS|PE_LOCK_FIRST|PE_DEFLECT_EMITTER;
pset->emitterdist = 0.25f;
pset->totrekey = 5;
pset->totaddkey = 5;
pset->brushtype = PE_BRUSH_NONE;
for (a = 0; a < PE_TOT_BRUSH; a++) {
pset->brush[a].strength = 50;
pset->brush[a].size = 50;
pset->brush[a].step = 10;
}
pset->brush[PE_BRUSH_CUT].strength = 100;
}
}
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 9)) {
Material *ma;
int a;
for (ma = main->mat.first; ma; ma = ma->id.next)
if (ma->mode & MA_NORMAP_TANG)
for (a = 0; a < MAX_MTEX; a++)
if (ma->mtex[a] && ma->mtex[a]->tex)
ma->mtex[a]->normapspace = MTEX_NSPACE_TANGENT;
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 10)) {
Object *ob;
/* dupliface scale */
for (ob = main->object.first; ob; ob = ob->id.next)
ob->dupfacesca = 1.0f;
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 11)) {
Object *ob;
bActionStrip *strip;
/* nla-strips - scale */
for (ob = main->object.first; ob; ob = ob->id.next) {
for (strip = ob->nlastrips.first; strip; strip = strip->next) {
float length, actlength, repeat;
if (strip->flag & ACTSTRIP_USESTRIDE)
repeat = 1.0f;
else
repeat = strip->repeat;
length = strip->end-strip->start;
if (length == 0.0f)
length = 1.0f;
actlength = strip->actend-strip->actstart;
strip->scale = length / (repeat * actlength);
if (strip->scale == 0.0f)
strip->scale = 1.0f;
}
if (ob->soft) {
ob->soft->inpush = ob->soft->inspring;
ob->soft->shearstiff = 1.0f;
}
}
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 14)) {
Scene *sce;
Sequence *seq;
for (sce = main->scene.first; sce; sce = sce->id.next) {
SEQ_BEGIN (sce->ed, seq)
{
if (seq->blend_mode == 0)
seq->blend_opacity = 100.0f;
}
SEQ_END
}
}
/* fix broken group lengths in id properties */
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 15)) {
idproperties_fix_group_lengths(main->scene);
idproperties_fix_group_lengths(main->library);
idproperties_fix_group_lengths(main->object);
idproperties_fix_group_lengths(main->mesh);
idproperties_fix_group_lengths(main->curve);
idproperties_fix_group_lengths(main->mball);
idproperties_fix_group_lengths(main->mat);
idproperties_fix_group_lengths(main->tex);
idproperties_fix_group_lengths(main->image);
idproperties_fix_group_lengths(main->latt);
idproperties_fix_group_lengths(main->lamp);
idproperties_fix_group_lengths(main->camera);
idproperties_fix_group_lengths(main->ipo);
idproperties_fix_group_lengths(main->key);
idproperties_fix_group_lengths(main->world);
idproperties_fix_group_lengths(main->screen);
idproperties_fix_group_lengths(main->script);
idproperties_fix_group_lengths(main->vfont);
idproperties_fix_group_lengths(main->text);
idproperties_fix_group_lengths(main->sound);
idproperties_fix_group_lengths(main->group);
idproperties_fix_group_lengths(main->armature);
idproperties_fix_group_lengths(main->action);
idproperties_fix_group_lengths(main->nodetree);
idproperties_fix_group_lengths(main->brush);
idproperties_fix_group_lengths(main->particle);
}
/* sun/sky */
if (main->versionfile < 246) {
Object *ob;
bActuator *act;
/* dRot actuator change direction in 2.46 */
for (ob = main->object.first; ob; ob = ob->id.next) {
for (act = ob->actuators.first; act; act = act->next) {
if (act->type == ACT_OBJECT) {
bObjectActuator *ba = act->data;
ba->drot[0] = -ba->drot[0];
ba->drot[1] = -ba->drot[1];
ba->drot[2] = -ba->drot[2];
}
}
}
}
/* convert fluids to modifier */
if (main->versionfile < 246 || (main->versionfile == 246 && main->subversionfile < 1)) {
Object *ob;
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->fluidsimSettings) {
FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifier_new(eModifierType_Fluidsim);
BLI_addhead(&ob->modifiers, (ModifierData *)fluidmd);
MEM_freeN(fluidmd->fss);
fluidmd->fss = MEM_dupallocN(ob->fluidsimSettings);
fluidmd->fss->ipo = blo_do_versions_newlibadr_us(fd, ob->id.lib, ob->fluidsimSettings->ipo);
MEM_freeN(ob->fluidsimSettings);
fluidmd->fss->lastgoodframe = INT_MAX;
fluidmd->fss->flag = 0;
fluidmd->fss->meshVelocities = NULL;
}
}
}
if (main->versionfile < 246 || (main->versionfile == 246 && main->subversionfile < 1)) {
Mesh *me;
for (me = main->mesh.first; me; me = me->id.next)
alphasort_version_246(fd, lib, me);
}
if (main->versionfile < 246 || (main->versionfile == 246 && main->subversionfile < 1)) {
Object *ob;
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->pd && (ob->pd->forcefield == PFIELD_WIND))
ob->pd->f_noise = 0.0f;
}
}
if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 2)) {
Object *ob;
for (ob = main->object.first; ob; ob = ob->id.next) {
ob->gameflag |= OB_COLLISION;
ob->margin = 0.06f;
}
}
if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 3)) {
Object *ob;
for (ob = main->object.first; ob; ob = ob->id.next) {
/* Starting from subversion 3, ACTOR is a separate feature.
* Before it was conditioning all the other dynamic flags */
if (!(ob->gameflag & OB_ACTOR))
ob->gameflag &= ~(OB_GHOST|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_COLLISION_RESPONSE);
/* suitable default for older files */
}
}
if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 5)) {
Lamp *la = main->lamp.first;
for (; la; la = la->id.next) {
la->skyblendtype = MA_RAMP_ADD;
la->skyblendfac = 1.0f;
}
}
/* set the curve radius interpolation to 2.47 default - easy */
if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 6)) {
Curve *cu;
Nurb *nu;
for (cu = main->curve.first; cu; cu = cu->id.next) {
for (nu = cu->nurb.first; nu; nu = nu->next) {
if (nu) {
nu->radius_interp = 3;
/* resolu and resolv are now used differently for surfaces
* rather than using the resolution to define the entire number of divisions,
* use it for the number of divisions per segment
*/
if (nu->pntsv > 1) {
nu->resolu = MAX2( 1, (int)(((float)nu->resolu / (float)nu->pntsu)+0.5f) );
nu->resolv = MAX2( 1, (int)(((float)nu->resolv / (float)nu->pntsv)+0.5f) );
}
}
}
}
}
/* direction constraint actuators were always local in previous version */
if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 7)) {
bActuator *act;
Object *ob;
for (ob = main->object.first; ob; ob = ob->id.next) {
for (act = ob->actuators.first; act; act = act->next) {
if (act->type == ACT_CONSTRAINT) {
bConstraintActuator *coa = act->data;
if (coa->type == ACT_CONST_TYPE_DIST) {
coa->flag |= ACT_CONST_LOCAL;
}
}
}
}
}
if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 9)) {
Lamp *la = main->lamp.first;
for (; la; la = la->id.next) {
la->sky_exposure = 1.0f;
}
}
/* BGE message actuators needed OB prefix, very confusing */
if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 10)) {
bActuator *act;
Object *ob;
for (ob = main->object.first; ob; ob = ob->id.next) {
for (act = ob->actuators.first; act; act = act->next) {
if (act->type == ACT_MESSAGE) {
bMessageActuator *msgAct = (bMessageActuator *) act->data;
if (BLI_strnlen(msgAct->toPropName, 3) > 2) {
/* strip first 2 chars, would have only worked if these were OB anyway */
memmove(msgAct->toPropName, msgAct->toPropName + 2, sizeof(msgAct->toPropName) - 2);
}
else {
msgAct->toPropName[0] = '\0';
}
}
}
}
}
if (main->versionfile < 248) {
Lamp *la;
for (la = main->lamp.first; la; la = la->id.next) {
if (la->atm_turbidity == 0.0f) {
la->sun_effect_type = 0;
la->horizon_brightness = 1.0f;
la->spread = 1.0f;
la->sun_brightness = 1.0f;
la->sun_size = 1.0f;
la->backscattered_light = 1.0f;
la->atm_turbidity = 2.0f;
la->atm_inscattering_factor = 1.0f;
la->atm_extinction_factor = 1.0f;
la->atm_distance_factor = 1.0f;
la->sun_intensity = 1.0f;
}
}
}
if (main->versionfile < 248 || (main->versionfile == 248 && main->subversionfile < 2)) {
Scene *sce;
/* Note, these will need to be added for painting */
for (sce = main->scene.first; sce; sce = sce->id.next) {
sce->toolsettings->imapaint.seam_bleed = 2;
sce->toolsettings->imapaint.normal_angle = 80;
/* initialize skeleton generation toolsettings */
sce->toolsettings->skgen_resolution = 250;
sce->toolsettings->skgen_threshold_internal = 0.1f;
sce->toolsettings->skgen_threshold_external = 0.1f;
sce->toolsettings->skgen_angle_limit = 30.0f;
sce->toolsettings->skgen_length_ratio = 1.3f;
sce->toolsettings->skgen_length_limit = 1.5f;
sce->toolsettings->skgen_correlation_limit = 0.98f;
sce->toolsettings->skgen_symmetry_limit = 0.1f;
sce->toolsettings->skgen_postpro = SKGEN_SMOOTH;
sce->toolsettings->skgen_postpro_passes = 3;
sce->toolsettings->skgen_options = SKGEN_FILTER_INTERNAL|SKGEN_FILTER_EXTERNAL|SKGEN_FILTER_SMART|SKGEN_SUB_CORRELATION|SKGEN_HARMONIC;
sce->toolsettings->skgen_subdivisions[0] = SKGEN_SUB_CORRELATION;
sce->toolsettings->skgen_subdivisions[1] = SKGEN_SUB_LENGTH;
sce->toolsettings->skgen_subdivisions[2] = SKGEN_SUB_ANGLE;
sce->toolsettings->skgen_retarget_angle_weight = 1.0f;
sce->toolsettings->skgen_retarget_length_weight = 1.0f;
sce->toolsettings->skgen_retarget_distance_weight = 1.0f;
/* Skeleton Sketching */
sce->toolsettings->bone_sketching = 0;
sce->toolsettings->skgen_retarget_roll = SK_RETARGET_ROLL_VIEW;
}
}
if (main->versionfile < 248 || (main->versionfile == 248 && main->subversionfile < 3)) {
bScreen *sc;
/* adjust default settings for Animation Editors */
for (sc = main->screen.first; sc; sc = sc->id.next) {
ScrArea *sa;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;
for (sl = sa->spacedata.first; sl; sl = sl->next) {
switch (sl->spacetype) {
case SPACE_ACTION:
{
SpaceAction *sact = (SpaceAction *)sl;
sact->mode = SACTCONT_DOPESHEET;
sact->autosnap = SACTSNAP_FRAME;
}
break;
case SPACE_IPO:
{
SpaceIpo *sipo = (SpaceIpo *)sl;
sipo->autosnap = SACTSNAP_FRAME;
}
break;
case SPACE_NLA:
{
SpaceNla *snla = (SpaceNla *)sl;
snla->autosnap = SACTSNAP_FRAME;
}
break;
}
}
}
}
}
if (main->versionfile < 248 || (main->versionfile == 248 && main->subversionfile < 3)) {
Object *ob;
/* Adjustments needed after Bullets update */
for (ob = main->object.first; ob; ob = ob->id.next) {
ob->damping *= 0.635f;
ob->rdamping = 0.1f + (0.8f * ob->rdamping);
}
}
if (main->versionfile < 248 || (main->versionfile == 248 && main->subversionfile < 4)) {
Scene *sce;
World *wrld;
/* Dome (Fisheye) default parameters */
for (sce = main->scene.first; sce; sce = sce->id.next) {
sce->r.domeangle = 180;
sce->r.domemode = 1;
sce->r.domeres = 4;
sce->r.domeresbuf = 1.0f;
sce->r.dometilt = 0;
}
/* DBVT culling by default */
for (wrld = main->world.first; wrld; wrld = wrld->id.next) {
wrld->mode |= WO_DBVT_CULLING;
wrld->occlusionRes = 128;
}
}
if (main->versionfile < 248 || (main->versionfile == 248 && main->subversionfile < 5)) {
Object *ob;
World *wrld;
for (ob = main->object.first; ob; ob = ob->id.next) {
/* pad3 is used for m_contactProcessingThreshold */
ob->m_contactProcessingThreshold = 1.0f;
if (ob->parent) {
/* check if top parent has compound shape set and if yes, set this object
* to compound shaper as well (was the behavior before, now it's optional) */
Object *parent = blo_do_versions_newlibadr(fd, lib, ob->parent);
while (parent && parent != ob && parent->parent != NULL) {
parent = blo_do_versions_newlibadr(fd, lib, parent->parent);
}
if (parent) {
if (parent->gameflag & OB_CHILD)
ob->gameflag |= OB_CHILD;
}
}
}
for (wrld = main->world.first; wrld; wrld = wrld->id.next) {
wrld->ticrate = 60;
wrld->maxlogicstep = 5;
wrld->physubstep = 1;
wrld->maxphystep = 5;
}
}
/* correct introduce of seed for wind force */
if (main->versionfile < 249 && main->subversionfile < 1) {
Object *ob;
for (ob = main->object.first; ob; ob = ob->id.next) {
if (ob->pd)
ob->pd->seed = ((unsigned int)(ceil(PIL_check_seconds_timer())) + 1) % 128;
}
}
if (main->versionfile < 249 && main->subversionfile < 2) {
Scene *sce = main->scene.first;
Sequence *seq;
Editing *ed;
while (sce) {
ed = sce->ed;
if (ed) {
SEQP_BEGIN (ed, seq)
{
if (seq->strip && seq->strip->proxy) {
seq->strip->proxy->quality =90;
}
}
SEQ_END
}
sce = sce->id.next;
}
}
}