diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2017-10-16 12:16:13 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2017-10-16 12:22:35 +0300 |
commit | a78b3ee53aa53020b086a6df25c0e28491223dcc (patch) | |
tree | bd883e95580f5777f7eae7cac4e47f182ac9fc00 /source/blender/blenloader/intern/writefile.c | |
parent | 4842cc017c3bb7df2070c2f96605190ff88e6a2e (diff) | |
parent | 49f4ac17bf704614de59a4db7a65c205c085d694 (diff) |
Merge remote-tracking branch 'origin/master' into openvdbopenvdb
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 2298 |
1 files changed, 1075 insertions, 1223 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index ad1999c0bc7..2648ebdc395 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -78,7 +78,7 @@ * - write #TEST (#RenderInfo struct. 128x128 blend file preview is optional). * - write #GLOB (#FileGlobal struct) (some global vars). * - write #DNA1 (#SDNA struct) - * - write #USER (#UserDef struct) if filename is ``~/X.XX/config/startup.blend``. + * - write #USER (#UserDef struct) if filename is ``~/.config/blender/X.XX/config/startup.blend``. */ @@ -797,30 +797,22 @@ static void write_fcurves(WriteData *wd, ListBase *fcurves) } } -static void write_actions(WriteData *wd, ListBase *idbase) +static void write_action(WriteData *wd, bAction *act) { - bAction *act; - bActionGroup *grp; - TimeMarker *marker; - - for (act = idbase->first; act; act = act->id.next) { - if (act->id.us > 0 || wd->current) { - writestruct(wd, ID_AC, bAction, 1, act); - write_iddata(wd, &act->id); + if (act->id.us > 0 || wd->current) { + writestruct(wd, ID_AC, bAction, 1, act); + write_iddata(wd, &act->id); - write_fcurves(wd, &act->curves); + write_fcurves(wd, &act->curves); - for (grp = act->groups.first; grp; grp = grp->next) { - writestruct(wd, DATA, bActionGroup, 1, grp); - } + for (bActionGroup *grp = act->groups.first; grp; grp = grp->next) { + writestruct(wd, DATA, bActionGroup, 1, grp); + } - for (marker = act->markers.first; marker; marker = marker->next) { - writestruct(wd, DATA, TimeMarker, 1, marker); - } + for (TimeMarker *marker = act->markers.first; marker; marker = marker->next) { + writestruct(wd, DATA, TimeMarker, 1, marker); } } - - mywrite_flush(wd); } static void write_keyingsets(WriteData *wd, ListBase *list) @@ -969,7 +961,7 @@ static void write_node_socket_interface(WriteData *wd, bNodeTree *UNUSED(ntree), } } /* this is only direct data, tree itself should have been written */ -static void write_nodetree(WriteData *wd, bNodeTree *ntree) +static void write_nodetree_nolib(WriteData *wd, bNodeTree *ntree) { bNode *node; bNodeSocket *sock; @@ -1030,6 +1022,25 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree) { /* pass */ } + else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_GLARE)) { + /* Simple forward compat for fix for T50736. + * Not ideal (there is no ideal solution here), but should do for now. */ + NodeGlare *ndg = node->storage; + /* Not in undo case. */ + if (!wd->current) { + switch (ndg->type) { + case 2: /* Grrrr! magic numbers :( */ + ndg->angle = ndg->streaks; + break; + case 0: + ndg->angle = ndg->star_45; + break; + default: + break; + } + } + writestruct_id(wd, DATA, node->typeinfo->storagename, 1, node->storage); + } else { writestruct_id(wd, DATA, node->typeinfo->storagename, 1, node->storage); } @@ -1041,7 +1052,7 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree) writestruct(wd, DATA, NodeImageMultiFileSocket, 1, sock->storage); } } - if (node->type == CMP_NODE_IMAGE) { + if (ELEM(node->type, CMP_NODE_IMAGE, CMP_NODE_R_LAYERS)) { /* write extra socket info */ for (sock = node->outputs.first; sock; sock = sock->next) { writestruct(wd, DATA, NodeImageLayer, 1, sock->storage); @@ -1278,68 +1289,60 @@ static void write_pointcaches(WriteData *wd, ListBase *ptcaches) } } } -static void write_particlesettings(WriteData *wd, ListBase *idbase) -{ - ParticleSettings *part; - ParticleDupliWeight *dw; - GroupObject *go; - int a; - part = idbase->first; - while (part) { - if (part->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_PA, ParticleSettings, 1, part); - write_iddata(wd, &part->id); +static void write_particlesettings(WriteData *wd, ParticleSettings *part) +{ + if (part->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_PA, ParticleSettings, 1, part); + write_iddata(wd, &part->id); - if (part->adt) { - write_animdata(wd, part->adt); - } - writestruct(wd, DATA, PartDeflect, 1, part->pd); - writestruct(wd, DATA, PartDeflect, 1, part->pd2); - writestruct(wd, DATA, EffectorWeights, 1, part->effector_weights); + if (part->adt) { + write_animdata(wd, part->adt); + } + writestruct(wd, DATA, PartDeflect, 1, part->pd); + writestruct(wd, DATA, PartDeflect, 1, part->pd2); + writestruct(wd, DATA, EffectorWeights, 1, part->effector_weights); - if (part->clumpcurve) { - write_curvemapping(wd, part->clumpcurve); - } - if (part->roughcurve) { - write_curvemapping(wd, part->roughcurve); - } + if (part->clumpcurve) { + write_curvemapping(wd, part->clumpcurve); + } + if (part->roughcurve) { + write_curvemapping(wd, part->roughcurve); + } - dw = part->dupliweights.first; - for (; dw; dw = dw->next) { - /* update indices, but only if dw->ob is set (can be NULL after loading e.g.) */ - if (dw->ob != NULL) { - dw->index = 0; - if (part->dup_group) { /* can be NULL if lining fails or set to None */ - for (go = part->dup_group->gobject.first; go && go->ob != dw->ob; go = go->next, dw->index++); - } + for (ParticleDupliWeight *dw = part->dupliweights.first; dw; dw = dw->next) { + /* update indices, but only if dw->ob is set (can be NULL after loading e.g.) */ + if (dw->ob != NULL) { + dw->index = 0; + if (part->dup_group) { /* can be NULL if lining fails or set to None */ + for (GroupObject *go = part->dup_group->gobject.first; + go && go->ob != dw->ob; + go = go->next, dw->index++); } - writestruct(wd, DATA, ParticleDupliWeight, 1, dw); } + writestruct(wd, DATA, ParticleDupliWeight, 1, dw); + } - if (part->boids && part->phystype == PART_PHYS_BOIDS) { - BoidState *state = part->boids->states.first; - - writestruct(wd, DATA, BoidSettings, 1, part->boids); + if (part->boids && part->phystype == PART_PHYS_BOIDS) { + writestruct(wd, DATA, BoidSettings, 1, part->boids); - for (; state; state = state->next) { - write_boid_state(wd, state); - } - } - if (part->fluid && part->phystype == PART_PHYS_FLUID) { - writestruct(wd, DATA, SPHFluidSettings, 1, part->fluid); + for (BoidState *state = part->boids->states.first; state; state = state->next) { + write_boid_state(wd, state); } + } + if (part->fluid && part->phystype == PART_PHYS_FLUID) { + writestruct(wd, DATA, SPHFluidSettings, 1, part->fluid); + } - for (a = 0; a < MAX_MTEX; a++) { - if (part->mtex[a]) { - writestruct(wd, DATA, MTex, 1, part->mtex[a]); - } + for (int a = 0; a < MAX_MTEX; a++) { + if (part->mtex[a]) { + writestruct(wd, DATA, MTex, 1, part->mtex[a]); } } - part = part->id.next; } } + static void write_particlesystems(WriteData *wd, ListBase *particles) { ParticleSystem *psys = particles->first; @@ -1830,242 +1833,207 @@ static void write_modifiers(WriteData *wd, ListBase *modbase) writedata(wd, DATA, sizeof(float[3]) * csmd->bind_coords_num, csmd->bind_coords); } } - } -} + else if (md->type == eModifierType_SurfaceDeform) { + SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; -static void write_objects(WriteData *wd, ListBase *idbase) -{ - Object *ob; + writestruct(wd, DATA, SDefVert, smd->numverts, smd->verts); - ob = idbase->first; - while (ob) { - if (ob->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_OB, Object, 1, ob); - write_iddata(wd, &ob->id); + if (smd->verts) { + for (int i = 0; i < smd->numverts; i++) { + writestruct(wd, DATA, SDefBind, smd->verts[i].numbinds, smd->verts[i].binds); - if (ob->adt) { - write_animdata(wd, ob->adt); - } + if (smd->verts[i].binds) { + for (int j = 0; j < smd->verts[i].numbinds; j++) { + writedata(wd, DATA, sizeof(int) * smd->verts[i].binds[j].numverts, smd->verts[i].binds[j].vert_inds); - /* direct data */ - writedata(wd, DATA, sizeof(void *) * ob->totcol, ob->mat); - writedata(wd, DATA, sizeof(char) * ob->totcol, ob->matbits); - /* write_effects(wd, &ob->effect); */ /* not used anymore */ - write_properties(wd, &ob->prop); - write_sensors(wd, &ob->sensors); - write_controllers(wd, &ob->controllers); - write_actuators(wd, &ob->actuators); - - if (ob->type == OB_ARMATURE) { - bArmature *arm = ob->data; - if (arm && ob->pose && arm->act_bone) { - BLI_strncpy(ob->pose->proxy_act_bone, arm->act_bone->name, sizeof(ob->pose->proxy_act_bone)); + if (smd->verts[i].binds[j].mode == MOD_SDEF_MODE_CENTROID || + smd->verts[i].binds[j].mode == MOD_SDEF_MODE_LOOPTRI) + { + writedata(wd, DATA, sizeof(float) * 3, smd->verts[i].binds[j].vert_weights); + } + else { + writedata(wd, DATA, sizeof(float) * smd->verts[i].binds[j].numverts, smd->verts[i].binds[j].vert_weights); + } + } + } } } + } + } +} - write_pose(wd, ob->pose); - write_defgroups(wd, &ob->defbase); - write_constraints(wd, &ob->constraints); - write_motionpath(wd, ob->mpath); +static void write_object(WriteData *wd, Object *ob) +{ + if (ob->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_OB, Object, 1, ob); + write_iddata(wd, &ob->id); - writestruct(wd, DATA, PartDeflect, 1, ob->pd); - writestruct(wd, DATA, SoftBody, 1, ob->soft); - if (ob->soft) { - write_pointcaches(wd, &ob->soft->ptcaches); - writestruct(wd, DATA, EffectorWeights, 1, ob->soft->effector_weights); - } - writestruct(wd, DATA, BulletSoftBody, 1, ob->bsoft); + if (ob->adt) { + write_animdata(wd, ob->adt); + } - if (ob->rigidbody_object) { - /* TODO: if any extra data is added to handle duplis, will need separate function then */ - writestruct(wd, DATA, RigidBodyOb, 1, ob->rigidbody_object); - } - if (ob->rigidbody_constraint) { - writestruct(wd, DATA, RigidBodyCon, 1, ob->rigidbody_constraint); - } + /* direct data */ + writedata(wd, DATA, sizeof(void *) * ob->totcol, ob->mat); + writedata(wd, DATA, sizeof(char) * ob->totcol, ob->matbits); + /* write_effects(wd, &ob->effect); */ /* not used anymore */ + write_properties(wd, &ob->prop); + write_sensors(wd, &ob->sensors); + write_controllers(wd, &ob->controllers); + write_actuators(wd, &ob->actuators); - if (ob->type == OB_EMPTY && ob->empty_drawtype == OB_EMPTY_IMAGE) { - writestruct(wd, DATA, ImageUser, 1, ob->iuser); + if (ob->type == OB_ARMATURE) { + bArmature *arm = ob->data; + if (arm && ob->pose && arm->act_bone) { + BLI_strncpy(ob->pose->proxy_act_bone, arm->act_bone->name, sizeof(ob->pose->proxy_act_bone)); } + } - write_particlesystems(wd, &ob->particlesystem); - write_modifiers(wd, &ob->modifiers); + write_pose(wd, ob->pose); + write_defgroups(wd, &ob->defbase); + write_constraints(wd, &ob->constraints); + write_motionpath(wd, ob->mpath); - writelist(wd, DATA, LinkData, &ob->pc_ids); - writelist(wd, DATA, LodLevel, &ob->lodlevels); + writestruct(wd, DATA, PartDeflect, 1, ob->pd); + writestruct(wd, DATA, SoftBody, 1, ob->soft); + if (ob->soft) { + write_pointcaches(wd, &ob->soft->ptcaches); + writestruct(wd, DATA, EffectorWeights, 1, ob->soft->effector_weights); } + writestruct(wd, DATA, BulletSoftBody, 1, ob->bsoft); - write_previews(wd, ob->preview); + if (ob->rigidbody_object) { + /* TODO: if any extra data is added to handle duplis, will need separate function then */ + writestruct(wd, DATA, RigidBodyOb, 1, ob->rigidbody_object); + } + if (ob->rigidbody_constraint) { + writestruct(wd, DATA, RigidBodyCon, 1, ob->rigidbody_constraint); + } - ob = ob->id.next; - } + if (ob->type == OB_EMPTY && ob->empty_drawtype == OB_EMPTY_IMAGE) { + writestruct(wd, DATA, ImageUser, 1, ob->iuser); + } - mywrite_flush(wd); -} + write_particlesystems(wd, &ob->particlesystem); + write_modifiers(wd, &ob->modifiers); + writelist(wd, DATA, LinkData, &ob->pc_ids); + writelist(wd, DATA, LodLevel, &ob->lodlevels); -static void write_vfonts(WriteData *wd, ListBase *idbase) -{ - VFont *vf; - PackedFile *pf; + write_previews(wd, ob->preview); + } +} - vf = idbase->first; - while (vf) { - if (vf->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_VF, VFont, 1, vf); - write_iddata(wd, &vf->id); - /* direct data */ +static void write_vfont(WriteData *wd, VFont *vf) +{ + if (vf->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_VF, VFont, 1, vf); + write_iddata(wd, &vf->id); - if (vf->packedfile) { - pf = vf->packedfile; - writestruct(wd, DATA, PackedFile, 1, pf); - writedata(wd, DATA, pf->size, pf->data); - } + /* direct data */ + if (vf->packedfile) { + PackedFile *pf = vf->packedfile; + writestruct(wd, DATA, PackedFile, 1, pf); + writedata(wd, DATA, pf->size, pf->data); } - - vf = vf->id.next; } - - mywrite_flush(wd); } -static void write_keys(WriteData *wd, ListBase *idbase) +static void write_key(WriteData *wd, Key *key) { - Key *key; - KeyBlock *kb; - - key = idbase->first; - while (key) { - if (key->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_KE, Key, 1, key); - write_iddata(wd, &key->id); - - if (key->adt) { - write_animdata(wd, key->adt); - } + if (key->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_KE, Key, 1, key); + write_iddata(wd, &key->id); - /* direct data */ - kb = key->block.first; - while (kb) { - writestruct(wd, DATA, KeyBlock, 1, kb); - if (kb->data) { - writedata(wd, DATA, kb->totelem * key->elemsize, kb->data); - } - kb = kb->next; - } + if (key->adt) { + write_animdata(wd, key->adt); } - key = key->id.next; + /* direct data */ + for (KeyBlock *kb = key->block.first; kb; kb = kb->next) { + writestruct(wd, DATA, KeyBlock, 1, kb); + if (kb->data) { + writedata(wd, DATA, kb->totelem * key->elemsize, kb->data); + } + } } - - mywrite_flush(wd); } -static void write_cameras(WriteData *wd, ListBase *idbase) +static void write_camera(WriteData *wd, Camera *cam) { - Camera *cam; - - cam = idbase->first; - while (cam) { - if (cam->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_CA, Camera, 1, cam); - write_iddata(wd, &cam->id); + if (cam->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_CA, Camera, 1, cam); + write_iddata(wd, &cam->id); - if (cam->adt) { - write_animdata(wd, cam->adt); - } + if (cam->adt) { + write_animdata(wd, cam->adt); } - - cam = cam->id.next; } } -static void write_mballs(WriteData *wd, ListBase *idbase) +static void write_mball(WriteData *wd, MetaBall *mb) { - MetaBall *mb; - MetaElem *ml; - - mb = idbase->first; - while (mb) { - if (mb->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_MB, MetaBall, 1, mb); - write_iddata(wd, &mb->id); + if (mb->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_MB, MetaBall, 1, mb); + write_iddata(wd, &mb->id); - /* direct data */ - writedata(wd, DATA, sizeof(void *) * mb->totcol, mb->mat); - if (mb->adt) { - write_animdata(wd, mb->adt); - } + /* direct data */ + writedata(wd, DATA, sizeof(void *) * mb->totcol, mb->mat); + if (mb->adt) { + write_animdata(wd, mb->adt); + } - ml = mb->elems.first; - while (ml) { - writestruct(wd, DATA, MetaElem, 1, ml); - ml = ml->next; - } + for (MetaElem *ml = mb->elems.first; ml; ml = ml->next) { + writestruct(wd, DATA, MetaElem, 1, ml); } - mb = mb->id.next; } } -static void write_curves(WriteData *wd, ListBase *idbase) +static void write_curve(WriteData *wd, Curve *cu) { - Curve *cu; - Nurb *nu; - - cu = idbase->first; - while (cu) { - if (cu->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_CU, Curve, 1, cu); - write_iddata(wd, &cu->id); + if (cu->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_CU, Curve, 1, cu); + write_iddata(wd, &cu->id); - /* direct data */ - writedata(wd, DATA, sizeof(void *) * cu->totcol, cu->mat); - if (cu->adt) { - write_animdata(wd, cu->adt); - } + /* direct data */ + writedata(wd, DATA, sizeof(void *) * cu->totcol, cu->mat); + if (cu->adt) { + write_animdata(wd, cu->adt); + } - if (cu->vfont) { - writedata(wd, DATA, cu->len + 1, cu->str); - writestruct(wd, DATA, CharInfo, cu->len_wchar + 1, cu->strinfo); - writestruct(wd, DATA, TextBox, cu->totbox, cu->tb); + if (cu->vfont) { + writedata(wd, DATA, cu->len + 1, cu->str); + writestruct(wd, DATA, CharInfo, cu->len_wchar + 1, cu->strinfo); + writestruct(wd, DATA, TextBox, cu->totbox, cu->tb); + } + else { + /* is also the order of reading */ + for (Nurb *nu = cu->nurb.first; nu; nu = nu->next) { + writestruct(wd, DATA, Nurb, 1, nu); } - else { - /* is also the order of reading */ - nu = cu->nurb.first; - while (nu) { - writestruct(wd, DATA, Nurb, 1, nu); - nu = nu->next; + for (Nurb *nu = cu->nurb.first; nu; nu = nu->next) { + if (nu->type == CU_BEZIER) { + writestruct(wd, DATA, BezTriple, nu->pntsu, nu->bezt); } - nu = cu->nurb.first; - while (nu) { - if (nu->type == CU_BEZIER) { - writestruct(wd, DATA, BezTriple, nu->pntsu, nu->bezt); + else { + writestruct(wd, DATA, BPoint, nu->pntsu * nu->pntsv, nu->bp); + if (nu->knotsu) { + writedata(wd, DATA, KNOTSU(nu) * sizeof(float), nu->knotsu); } - else { - writestruct(wd, DATA, BPoint, nu->pntsu * nu->pntsv, nu->bp); - if (nu->knotsu) { - writedata(wd, DATA, KNOTSU(nu) * sizeof(float), nu->knotsu); - } - if (nu->knotsv) { - writedata(wd, DATA, KNOTSV(nu) * sizeof(float), nu->knotsv); - } + if (nu->knotsv) { + writedata(wd, DATA, KNOTSV(nu) * sizeof(float), nu->knotsv); } - nu = nu->next; } } } - cu = cu->id.next; } - - mywrite_flush(wd); } static void write_dverts(WriteData *wd, int count, MDeformVert *dvlist) @@ -2182,407 +2150,350 @@ static void write_customdata( } } -static void write_meshes(WriteData *wd, ListBase *idbase) +static void write_mesh(WriteData *wd, Mesh *mesh) { - Mesh *mesh; - bool save_for_old_blender = false; - #ifdef USE_BMESH_SAVE_AS_COMPAT - save_for_old_blender = wd->use_mesh_compat; /* option to save with older mesh format */ + const bool save_for_old_blender = wd->use_mesh_compat; /* option to save with older mesh format */ +#else + const bool save_for_old_blender = false; #endif - mesh = idbase->first; - while (mesh) { - CustomDataLayer *vlayers = NULL, vlayers_buff[CD_TEMP_CHUNK_SIZE]; - CustomDataLayer *elayers = NULL, elayers_buff[CD_TEMP_CHUNK_SIZE]; - CustomDataLayer *flayers = NULL, flayers_buff[CD_TEMP_CHUNK_SIZE]; - CustomDataLayer *llayers = NULL, llayers_buff[CD_TEMP_CHUNK_SIZE]; - CustomDataLayer *players = NULL, players_buff[CD_TEMP_CHUNK_SIZE]; - - if (mesh->id.us > 0 || wd->current) { - /* write LibData */ - if (!save_for_old_blender) { - /* write a copy of the mesh, don't modify in place because it is - * not thread safe for threaded renders that are reading this */ - Mesh *old_mesh = mesh; - Mesh copy_mesh = *mesh; - mesh = ©_mesh; + CustomDataLayer *vlayers = NULL, vlayers_buff[CD_TEMP_CHUNK_SIZE]; + CustomDataLayer *elayers = NULL, elayers_buff[CD_TEMP_CHUNK_SIZE]; + CustomDataLayer *flayers = NULL, flayers_buff[CD_TEMP_CHUNK_SIZE]; + CustomDataLayer *llayers = NULL, llayers_buff[CD_TEMP_CHUNK_SIZE]; + CustomDataLayer *players = NULL, players_buff[CD_TEMP_CHUNK_SIZE]; + + if (mesh->id.us > 0 || wd->current) { + /* write LibData */ + if (!save_for_old_blender) { + /* write a copy of the mesh, don't modify in place because it is + * not thread safe for threaded renders that are reading this */ + Mesh *old_mesh = mesh; + Mesh copy_mesh = *mesh; + mesh = ©_mesh; #ifdef USE_BMESH_SAVE_WITHOUT_MFACE - /* cache only - don't write */ - mesh->mface = NULL; - mesh->totface = 0; - memset(&mesh->fdata, 0, sizeof(mesh->fdata)); + /* cache only - don't write */ + mesh->mface = NULL; + mesh->totface = 0; + memset(&mesh->fdata, 0, sizeof(mesh->fdata)); #endif /* USE_BMESH_SAVE_WITHOUT_MFACE */ - /** - * Those calls: - * - Reduce mesh->xdata.totlayer to number of layers to write. - * - Fill xlayers with those layers to be written. - * Note that mesh->xdata is from now on invalid for Blender, but this is why the whole mesh is - * a temp local copy! - */ - CustomData_file_write_prepare(&mesh->vdata, &vlayers, vlayers_buff, ARRAY_SIZE(vlayers_buff)); - CustomData_file_write_prepare(&mesh->edata, &elayers, elayers_buff, ARRAY_SIZE(elayers_buff)); + /** + * Those calls: + * - Reduce mesh->xdata.totlayer to number of layers to write. + * - Fill xlayers with those layers to be written. + * Note that mesh->xdata is from now on invalid for Blender, but this is why the whole mesh is + * a temp local copy! + */ + CustomData_file_write_prepare(&mesh->vdata, &vlayers, vlayers_buff, ARRAY_SIZE(vlayers_buff)); + CustomData_file_write_prepare(&mesh->edata, &elayers, elayers_buff, ARRAY_SIZE(elayers_buff)); #ifndef USE_BMESH_SAVE_WITHOUT_MFACE /* Do not copy org fdata in this case!!! */ - CustomData_file_write_prepare(&mesh->fdata, &flayers, flayers_buff, ARRAY_SIZE(flayers_buff)); + CustomData_file_write_prepare(&mesh->fdata, &flayers, flayers_buff, ARRAY_SIZE(flayers_buff)); #else - flayers = flayers_buff; + flayers = flayers_buff; #endif - CustomData_file_write_prepare(&mesh->ldata, &llayers, llayers_buff, ARRAY_SIZE(llayers_buff)); - CustomData_file_write_prepare(&mesh->pdata, &players, players_buff, ARRAY_SIZE(players_buff)); + CustomData_file_write_prepare(&mesh->ldata, &llayers, llayers_buff, ARRAY_SIZE(llayers_buff)); + CustomData_file_write_prepare(&mesh->pdata, &players, players_buff, ARRAY_SIZE(players_buff)); - writestruct_at_address(wd, ID_ME, Mesh, 1, old_mesh, mesh); - write_iddata(wd, &mesh->id); + writestruct_at_address(wd, ID_ME, Mesh, 1, old_mesh, mesh); + write_iddata(wd, &mesh->id); - /* direct data */ - if (mesh->adt) { - write_animdata(wd, mesh->adt); - } + /* direct data */ + if (mesh->adt) { + write_animdata(wd, mesh->adt); + } - writedata(wd, DATA, sizeof(void *) * mesh->totcol, mesh->mat); - writedata(wd, DATA, sizeof(MSelect) * mesh->totselect, mesh->mselect); + writedata(wd, DATA, sizeof(void *) * mesh->totcol, mesh->mat); + writedata(wd, DATA, sizeof(MSelect) * mesh->totselect, mesh->mselect); - write_customdata(wd, &mesh->id, mesh->totvert, &mesh->vdata, vlayers, -1, 0); - write_customdata(wd, &mesh->id, mesh->totedge, &mesh->edata, elayers, -1, 0); - /* fdata is really a dummy - written so slots align */ - write_customdata(wd, &mesh->id, mesh->totface, &mesh->fdata, flayers, -1, 0); - write_customdata(wd, &mesh->id, mesh->totloop, &mesh->ldata, llayers, -1, 0); - write_customdata(wd, &mesh->id, mesh->totpoly, &mesh->pdata, players, -1, 0); + write_customdata(wd, &mesh->id, mesh->totvert, &mesh->vdata, vlayers, -1, 0); + write_customdata(wd, &mesh->id, mesh->totedge, &mesh->edata, elayers, -1, 0); + /* fdata is really a dummy - written so slots align */ + write_customdata(wd, &mesh->id, mesh->totface, &mesh->fdata, flayers, -1, 0); + write_customdata(wd, &mesh->id, mesh->totloop, &mesh->ldata, llayers, -1, 0); + write_customdata(wd, &mesh->id, mesh->totpoly, &mesh->pdata, players, -1, 0); - /* restore pointer */ - mesh = old_mesh; - } - else { + /* restore pointer */ + mesh = old_mesh; + } + else { #ifdef USE_BMESH_SAVE_AS_COMPAT - /* write a copy of the mesh, don't modify in place because it is - * not thread safe for threaded renders that are reading this */ - Mesh *old_mesh = mesh; - Mesh copy_mesh = *mesh; - mesh = ©_mesh; - - mesh->mpoly = NULL; - mesh->mface = NULL; - mesh->totface = 0; - mesh->totpoly = 0; - mesh->totloop = 0; - CustomData_reset(&mesh->fdata); - CustomData_reset(&mesh->pdata); - CustomData_reset(&mesh->ldata); - mesh->edit_btmesh = NULL; - - /* now fill in polys to mfaces */ - /* XXX This breaks writing design, by using temp allocated memory, which will likely generate - * duplicates in stored 'old' addresses. - * This is very bad, but do not see easy way to avoid this, aside from generating those data - * outside of save process itself. - * Maybe we can live with this, though? - */ - mesh->totface = BKE_mesh_mpoly_to_mface(&mesh->fdata, &old_mesh->ldata, &old_mesh->pdata, - mesh->totface, old_mesh->totloop, old_mesh->totpoly); + /* write a copy of the mesh, don't modify in place because it is + * not thread safe for threaded renders that are reading this */ + Mesh *old_mesh = mesh; + Mesh copy_mesh = *mesh; + mesh = ©_mesh; + + mesh->mpoly = NULL; + mesh->mface = NULL; + mesh->totface = 0; + mesh->totpoly = 0; + mesh->totloop = 0; + CustomData_reset(&mesh->fdata); + CustomData_reset(&mesh->pdata); + CustomData_reset(&mesh->ldata); + mesh->edit_btmesh = NULL; + + /* now fill in polys to mfaces */ + /* XXX This breaks writing design, by using temp allocated memory, which will likely generate + * duplicates in stored 'old' addresses. + * This is very bad, but do not see easy way to avoid this, aside from generating those data + * outside of save process itself. + * Maybe we can live with this, though? + */ + mesh->totface = BKE_mesh_mpoly_to_mface( + &mesh->fdata, &old_mesh->ldata, &old_mesh->pdata, + mesh->totface, old_mesh->totloop, old_mesh->totpoly); - BKE_mesh_update_customdata_pointers(mesh, false); + BKE_mesh_update_customdata_pointers(mesh, false); - CustomData_file_write_prepare(&mesh->vdata, &vlayers, vlayers_buff, ARRAY_SIZE(vlayers_buff)); - CustomData_file_write_prepare(&mesh->edata, &elayers, elayers_buff, ARRAY_SIZE(elayers_buff)); - CustomData_file_write_prepare(&mesh->fdata, &flayers, flayers_buff, ARRAY_SIZE(flayers_buff)); + CustomData_file_write_prepare(&mesh->vdata, &vlayers, vlayers_buff, ARRAY_SIZE(vlayers_buff)); + CustomData_file_write_prepare(&mesh->edata, &elayers, elayers_buff, ARRAY_SIZE(elayers_buff)); + CustomData_file_write_prepare(&mesh->fdata, &flayers, flayers_buff, ARRAY_SIZE(flayers_buff)); #if 0 - CustomData_file_write_prepare(&mesh->ldata, &llayers, llayers_buff, ARRAY_SIZE(llayers_buff)); - CustomData_file_write_prepare(&mesh->pdata, &players, players_buff, ARRAY_SIZE(players_buff)); + CustomData_file_write_prepare(&mesh->ldata, &llayers, llayers_buff, ARRAY_SIZE(llayers_buff)); + CustomData_file_write_prepare(&mesh->pdata, &players, players_buff, ARRAY_SIZE(players_buff)); #endif - writestruct_at_address(wd, ID_ME, Mesh, 1, old_mesh, mesh); - write_iddata(wd, &mesh->id); + writestruct_at_address(wd, ID_ME, Mesh, 1, old_mesh, mesh); + write_iddata(wd, &mesh->id); - /* direct data */ - if (mesh->adt) { - write_animdata(wd, mesh->adt); - } + /* direct data */ + if (mesh->adt) { + write_animdata(wd, mesh->adt); + } - writedata(wd, DATA, sizeof(void *) * mesh->totcol, mesh->mat); - /* writedata(wd, DATA, sizeof(MSelect) * mesh->totselect, mesh->mselect); */ /* pre-bmesh NULL's */ + writedata(wd, DATA, sizeof(void *) * mesh->totcol, mesh->mat); + /* writedata(wd, DATA, sizeof(MSelect) * mesh->totselect, mesh->mselect); */ /* pre-bmesh NULL's */ - write_customdata(wd, &mesh->id, mesh->totvert, &mesh->vdata, vlayers, -1, 0); - write_customdata(wd, &mesh->id, mesh->totedge, &mesh->edata, elayers, -1, 0); - write_customdata(wd, &mesh->id, mesh->totface, &mesh->fdata, flayers, -1, 0); - /* harmless for older blender versioins but _not_ writing these keeps file size down */ + write_customdata(wd, &mesh->id, mesh->totvert, &mesh->vdata, vlayers, -1, 0); + write_customdata(wd, &mesh->id, mesh->totedge, &mesh->edata, elayers, -1, 0); + write_customdata(wd, &mesh->id, mesh->totface, &mesh->fdata, flayers, -1, 0); + /* harmless for older blender versioins but _not_ writing these keeps file size down */ #if 0 - write_customdata(wd, &mesh->id, mesh->totloop, &mesh->ldata, llayers, -1, 0); - write_customdata(wd, &mesh->id, mesh->totpoly, &mesh->pdata, players, -1, 0); + write_customdata(wd, &mesh->id, mesh->totloop, &mesh->ldata, llayers, -1, 0); + write_customdata(wd, &mesh->id, mesh->totpoly, &mesh->pdata, players, -1, 0); #endif - CustomData_free(&mesh->fdata, mesh->totface); - flayers = NULL; + CustomData_free(&mesh->fdata, mesh->totface); + flayers = NULL; - /* restore pointer */ - mesh = old_mesh; + /* restore pointer */ + mesh = old_mesh; #endif /* USE_BMESH_SAVE_AS_COMPAT */ - } - } - - if (vlayers && vlayers != vlayers_buff) { - MEM_freeN(vlayers); } - if (elayers && elayers != elayers_buff) { - MEM_freeN(elayers); - } - if (flayers && flayers != flayers_buff) { - MEM_freeN(flayers); - } - if (llayers && llayers != llayers_buff) { - MEM_freeN(llayers); - } - if (players && players != players_buff) { - MEM_freeN(players); - } - - mesh = mesh->id.next; } - mywrite_flush(wd); + if (vlayers && vlayers != vlayers_buff) { + MEM_freeN(vlayers); + } + if (elayers && elayers != elayers_buff) { + MEM_freeN(elayers); + } + if (flayers && flayers != flayers_buff) { + MEM_freeN(flayers); + } + if (llayers && llayers != llayers_buff) { + MEM_freeN(llayers); + } + if (players && players != players_buff) { + MEM_freeN(players); + } } -static void write_lattices(WriteData *wd, ListBase *idbase) +static void write_lattice(WriteData *wd, Lattice *lt) { - Lattice *lt; - - lt = idbase->first; - while (lt) { - if (lt->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_LT, Lattice, 1, lt); - write_iddata(wd, <->id); - - /* write animdata */ - if (lt->adt) { - write_animdata(wd, lt->adt); - } + if (lt->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_LT, Lattice, 1, lt); + write_iddata(wd, <->id); - /* direct data */ - writestruct(wd, DATA, BPoint, lt->pntsu * lt->pntsv * lt->pntsw, lt->def); + /* write animdata */ + if (lt->adt) { + write_animdata(wd, lt->adt); + } - write_dverts(wd, lt->pntsu * lt->pntsv * lt->pntsw, lt->dvert); + /* direct data */ + writestruct(wd, DATA, BPoint, lt->pntsu * lt->pntsv * lt->pntsw, lt->def); - } - lt = lt->id.next; + write_dverts(wd, lt->pntsu * lt->pntsv * lt->pntsw, lt->dvert); } - - mywrite_flush(wd); } -static void write_images(WriteData *wd, ListBase *idbase) +static void write_image(WriteData *wd, Image *ima) { - Image *ima; - PackedFile *pf; - ImageView *iv; - ImagePackedFile *imapf; - - ima = idbase->first; - while (ima) { - if (ima->id.us > 0 || wd->current) { - /* Some trickery to keep forward compatibility of packed images. */ - BLI_assert(ima->packedfile == NULL); - if (ima->packedfiles.first != NULL) { - imapf = ima->packedfiles.first; - ima->packedfile = imapf->packedfile; - } - - /* write LibData */ - writestruct(wd, ID_IM, Image, 1, ima); - write_iddata(wd, &ima->id); + if (ima->id.us > 0 || wd->current) { + ImagePackedFile *imapf; - for (imapf = ima->packedfiles.first; imapf; imapf = imapf->next) { - writestruct(wd, DATA, ImagePackedFile, 1, imapf); - if (imapf->packedfile) { - pf = imapf->packedfile; - writestruct(wd, DATA, PackedFile, 1, pf); - writedata(wd, DATA, pf->size, pf->data); - } - } + /* Some trickery to keep forward compatibility of packed images. */ + BLI_assert(ima->packedfile == NULL); + if (ima->packedfiles.first != NULL) { + imapf = ima->packedfiles.first; + ima->packedfile = imapf->packedfile; + } - write_previews(wd, ima->preview); + /* write LibData */ + writestruct(wd, ID_IM, Image, 1, ima); + write_iddata(wd, &ima->id); - for (iv = ima->views.first; iv; iv = iv->next) { - writestruct(wd, DATA, ImageView, 1, iv); + for (imapf = ima->packedfiles.first; imapf; imapf = imapf->next) { + writestruct(wd, DATA, ImagePackedFile, 1, imapf); + if (imapf->packedfile) { + PackedFile *pf = imapf->packedfile; + writestruct(wd, DATA, PackedFile, 1, pf); + writedata(wd, DATA, pf->size, pf->data); } - writestruct(wd, DATA, Stereo3dFormat, 1, ima->stereo3d_format); + } - ima->packedfile = NULL; + write_previews(wd, ima->preview); + + for (ImageView *iv = ima->views.first; iv; iv = iv->next) { + writestruct(wd, DATA, ImageView, 1, iv); } - ima = ima->id.next; - } + writestruct(wd, DATA, Stereo3dFormat, 1, ima->stereo3d_format); - mywrite_flush(wd); + ima->packedfile = NULL; + } } -static void write_textures(WriteData *wd, ListBase *idbase) +static void write_texture(WriteData *wd, Tex *tex) { - Tex *tex; - - tex = idbase->first; - while (tex) { - if (tex->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_TE, Tex, 1, tex); - write_iddata(wd, &tex->id); + if (tex->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_TE, Tex, 1, tex); + write_iddata(wd, &tex->id); - if (tex->adt) { - write_animdata(wd, tex->adt); - } + if (tex->adt) { + write_animdata(wd, tex->adt); + } - /* direct data */ - if (tex->coba) { - writestruct(wd, DATA, ColorBand, 1, tex->coba); - } - if (tex->type == TEX_ENVMAP && tex->env) { - writestruct(wd, DATA, EnvMap, 1, tex->env); - } - if (tex->type == TEX_POINTDENSITY && tex->pd) { - writestruct(wd, DATA, PointDensity, 1, tex->pd); - if (tex->pd->coba) { - writestruct(wd, DATA, ColorBand, 1, tex->pd->coba); - } - if (tex->pd->falloff_curve) { - write_curvemapping(wd, tex->pd->falloff_curve); - } - } - if (tex->type == TEX_VOXELDATA) { - writestruct(wd, DATA, VoxelData, 1, tex->vd); - } - if (tex->type == TEX_OCEAN && tex->ot) { - writestruct(wd, DATA, OceanTex, 1, tex->ot); + /* direct data */ + if (tex->coba) { + writestruct(wd, DATA, ColorBand, 1, tex->coba); + } + if (tex->type == TEX_ENVMAP && tex->env) { + writestruct(wd, DATA, EnvMap, 1, tex->env); + } + if (tex->type == TEX_POINTDENSITY && tex->pd) { + writestruct(wd, DATA, PointDensity, 1, tex->pd); + if (tex->pd->coba) { + writestruct(wd, DATA, ColorBand, 1, tex->pd->coba); } - - /* nodetree is integral part of texture, no libdata */ - if (tex->nodetree) { - writestruct(wd, DATA, bNodeTree, 1, tex->nodetree); - write_nodetree(wd, tex->nodetree); + if (tex->pd->falloff_curve) { + write_curvemapping(wd, tex->pd->falloff_curve); } + } + if (tex->type == TEX_VOXELDATA) { + writestruct(wd, DATA, VoxelData, 1, tex->vd); + } + if (tex->type == TEX_OCEAN && tex->ot) { + writestruct(wd, DATA, OceanTex, 1, tex->ot); + } - write_previews(wd, tex->preview); + /* nodetree is integral part of texture, no libdata */ + if (tex->nodetree) { + writestruct(wd, DATA, bNodeTree, 1, tex->nodetree); + write_nodetree_nolib(wd, tex->nodetree); } - tex = tex->id.next; - } - mywrite_flush(wd); + write_previews(wd, tex->preview); + } } -static void write_materials(WriteData *wd, ListBase *idbase) +static void write_material(WriteData *wd, Material *ma) { - Material *ma; - int a; - - ma = idbase->first; - while (ma) { - if (ma->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_MA, Material, 1, ma); - write_iddata(wd, &ma->id); - - if (ma->adt) { - write_animdata(wd, ma->adt); - } + if (ma->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_MA, Material, 1, ma); + write_iddata(wd, &ma->id); - for (a = 0; a < MAX_MTEX; a++) { - if (ma->mtex[a]) { - writestruct(wd, DATA, MTex, 1, ma->mtex[a]); - } - } + if (ma->adt) { + write_animdata(wd, ma->adt); + } - if (ma->ramp_col) { - writestruct(wd, DATA, ColorBand, 1, ma->ramp_col); - } - if (ma->ramp_spec) { - writestruct(wd, DATA, ColorBand, 1, ma->ramp_spec); + for (int a = 0; a < MAX_MTEX; a++) { + if (ma->mtex[a]) { + writestruct(wd, DATA, MTex, 1, ma->mtex[a]); } + } - /* nodetree is integral part of material, no libdata */ - if (ma->nodetree) { - writestruct(wd, DATA, bNodeTree, 1, ma->nodetree); - write_nodetree(wd, ma->nodetree); - } + if (ma->ramp_col) { + writestruct(wd, DATA, ColorBand, 1, ma->ramp_col); + } + if (ma->ramp_spec) { + writestruct(wd, DATA, ColorBand, 1, ma->ramp_spec); + } - write_previews(wd, ma->preview); + /* nodetree is integral part of material, no libdata */ + if (ma->nodetree) { + writestruct(wd, DATA, bNodeTree, 1, ma->nodetree); + write_nodetree_nolib(wd, ma->nodetree); } - ma = ma->id.next; + + write_previews(wd, ma->preview); } } -static void write_worlds(WriteData *wd, ListBase *idbase) +static void write_world(WriteData *wd, World *wrld) { - World *wrld; - int a; - - wrld = idbase->first; - while (wrld) { - if (wrld->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_WO, World, 1, wrld); - write_iddata(wd, &wrld->id); - - if (wrld->adt) { - write_animdata(wd, wrld->adt); - } + if (wrld->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_WO, World, 1, wrld); + write_iddata(wd, &wrld->id); - for (a = 0; a < MAX_MTEX; a++) { - if (wrld->mtex[a]) { - writestruct(wd, DATA, MTex, 1, wrld->mtex[a]); - } - } + if (wrld->adt) { + write_animdata(wd, wrld->adt); + } - /* nodetree is integral part of world, no libdata */ - if (wrld->nodetree) { - writestruct(wd, DATA, bNodeTree, 1, wrld->nodetree); - write_nodetree(wd, wrld->nodetree); + for (int a = 0; a < MAX_MTEX; a++) { + if (wrld->mtex[a]) { + writestruct(wd, DATA, MTex, 1, wrld->mtex[a]); } + } - write_previews(wd, wrld->preview); + /* nodetree is integral part of world, no libdata */ + if (wrld->nodetree) { + writestruct(wd, DATA, bNodeTree, 1, wrld->nodetree); + write_nodetree_nolib(wd, wrld->nodetree); } - wrld = wrld->id.next; + + write_previews(wd, wrld->preview); } } -static void write_lamps(WriteData *wd, ListBase *idbase) +static void write_lamp(WriteData *wd, Lamp *la) { - Lamp *la; - int a; - - la = idbase->first; - while (la) { - if (la->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_LA, Lamp, 1, la); - write_iddata(wd, &la->id); - - if (la->adt) { - write_animdata(wd, la->adt); - } - - /* direct data */ - for (a = 0; a < MAX_MTEX; a++) { - if (la->mtex[a]) { - writestruct(wd, DATA, MTex, 1, la->mtex[a]); - } - } + if (la->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_LA, Lamp, 1, la); + write_iddata(wd, &la->id); - if (la->curfalloff) { - write_curvemapping(wd, la->curfalloff); - } + if (la->adt) { + write_animdata(wd, la->adt); + } - /* nodetree is integral part of lamps, no libdata */ - if (la->nodetree) { - writestruct(wd, DATA, bNodeTree, 1, la->nodetree); - write_nodetree(wd, la->nodetree); + /* direct data */ + for (int a = 0; a < MAX_MTEX; a++) { + if (la->mtex[a]) { + writestruct(wd, DATA, MTex, 1, la->mtex[a]); } + } - write_previews(wd, la->preview); + if (la->curfalloff) { + write_curvemapping(wd, la->curfalloff); + } + /* nodetree is integral part of lamps, no libdata */ + if (la->nodetree) { + writestruct(wd, DATA, bNodeTree, 1, la->nodetree); + write_nodetree_nolib(wd, la->nodetree); } - la = la->id.next; - } - mywrite_flush(wd); + write_previews(wd, la->preview); + } } static void write_sequence_modifiers(WriteData *wd, ListBase *modbase) @@ -2626,290 +2537,249 @@ static void write_paint(WriteData *wd, Paint *p) } } -static void write_scenes(WriteData *wd, ListBase *scebase) +static void write_scene(WriteData *wd, Scene *sce) { - Scene *sce; - Base *base; - Editing *ed; - Sequence *seq; - MetaStack *ms; - Strip *strip; - TimeMarker *marker; - TransformOrientation *ts; - SceneRenderLayer *srl; - SceneRenderView *srv; - ToolSettings *tos; - FreestyleModuleConfig *fmc; - FreestyleLineSet *fls; - - sce = scebase->first; - while (sce) { - /* write LibData */ - writestruct(wd, ID_SCE, Scene, 1, sce); - write_iddata(wd, &sce->id); + /* write LibData */ + writestruct(wd, ID_SCE, Scene, 1, sce); + write_iddata(wd, &sce->id); - if (sce->adt) { - write_animdata(wd, sce->adt); - } - write_keyingsets(wd, &sce->keyingsets); + if (sce->adt) { + write_animdata(wd, sce->adt); + } + write_keyingsets(wd, &sce->keyingsets); - /* direct data */ - base = sce->base.first; - while (base) { - writestruct(wd, DATA, Base, 1, base); - base = base->next; - } - - tos = sce->toolsettings; - writestruct(wd, DATA, ToolSettings, 1, tos); - if (tos->vpaint) { - writestruct(wd, DATA, VPaint, 1, tos->vpaint); - write_paint(wd, &tos->vpaint->paint); - } - if (tos->wpaint) { - writestruct(wd, DATA, VPaint, 1, tos->wpaint); - write_paint(wd, &tos->wpaint->paint); - } - if (tos->sculpt) { - writestruct(wd, DATA, Sculpt, 1, tos->sculpt); - write_paint(wd, &tos->sculpt->paint); - } - if (tos->uvsculpt) { - writestruct(wd, DATA, UvSculpt, 1, tos->uvsculpt); - write_paint(wd, &tos->uvsculpt->paint); - } - /* write grease-pencil drawing brushes to file */ - writelist(wd, DATA, bGPDbrush, &tos->gp_brushes); - for (bGPDbrush *brush = tos->gp_brushes.first; brush; brush = brush->next) { - if (brush->cur_sensitivity) { - write_curvemapping(wd, brush->cur_sensitivity); - } - if (brush->cur_strength) { - write_curvemapping(wd, brush->cur_strength); - } - if (brush->cur_jitter) { - write_curvemapping(wd, brush->cur_jitter); - } + /* direct data */ + for (Base *base = sce->base.first; base; base = base->next) { + writestruct(wd, DATA, Base, 1, base); + } + + ToolSettings *tos = sce->toolsettings; + writestruct(wd, DATA, ToolSettings, 1, tos); + if (tos->vpaint) { + writestruct(wd, DATA, VPaint, 1, tos->vpaint); + write_paint(wd, &tos->vpaint->paint); + } + if (tos->wpaint) { + writestruct(wd, DATA, VPaint, 1, tos->wpaint); + write_paint(wd, &tos->wpaint->paint); + } + if (tos->sculpt) { + writestruct(wd, DATA, Sculpt, 1, tos->sculpt); + write_paint(wd, &tos->sculpt->paint); + } + if (tos->uvsculpt) { + writestruct(wd, DATA, UvSculpt, 1, tos->uvsculpt); + write_paint(wd, &tos->uvsculpt->paint); + } + /* write grease-pencil drawing brushes to file */ + writelist(wd, DATA, bGPDbrush, &tos->gp_brushes); + for (bGPDbrush *brush = tos->gp_brushes.first; brush; brush = brush->next) { + if (brush->cur_sensitivity) { + write_curvemapping(wd, brush->cur_sensitivity); + } + if (brush->cur_strength) { + write_curvemapping(wd, brush->cur_strength); } - + if (brush->cur_jitter) { + write_curvemapping(wd, brush->cur_jitter); + } + } + /* write grease-pencil custom ipo curve to file */ + if (tos->gp_interpolate.custom_ipo) { + write_curvemapping(wd, tos->gp_interpolate.custom_ipo); + } - write_paint(wd, &tos->imapaint.paint); - ed = sce->ed; - if (ed) { - writestruct(wd, DATA, Editing, 1, ed); + write_paint(wd, &tos->imapaint.paint); - /* reset write flags too */ + Editing *ed = sce->ed; + if (ed) { + Sequence *seq; - SEQ_BEGIN(ed, seq) - { - if (seq->strip) { - seq->strip->done = false; - } - writestruct(wd, DATA, Sequence, 1, seq); - } - SEQ_END + writestruct(wd, DATA, Editing, 1, ed); - SEQ_BEGIN(ed, seq) - { - if (seq->strip && seq->strip->done == 0) { - /* write strip with 'done' at 0 because readfile */ - - if (seq->effectdata) { - switch (seq->type) { - case SEQ_TYPE_COLOR: - writestruct(wd, DATA, SolidColorVars, 1, seq->effectdata); - break; - case SEQ_TYPE_SPEED: - writestruct(wd, DATA, SpeedControlVars, 1, seq->effectdata); - break; - case SEQ_TYPE_WIPE: - writestruct(wd, DATA, WipeVars, 1, seq->effectdata); - break; - case SEQ_TYPE_GLOW: - writestruct(wd, DATA, GlowVars, 1, seq->effectdata); - break; - case SEQ_TYPE_TRANSFORM: - writestruct(wd, DATA, TransformVars, 1, seq->effectdata); - break; - case SEQ_TYPE_GAUSSIAN_BLUR: - writestruct(wd, DATA, GaussianBlurVars, 1, seq->effectdata); - break; - case SEQ_TYPE_TEXT: - writestruct(wd, DATA, TextVars, 1, seq->effectdata); - break; - } - } + /* reset write flags too */ - writestruct(wd, DATA, Stereo3dFormat, 1, seq->stereo3d_format); + SEQ_BEGIN(ed, seq) + { + if (seq->strip) { + seq->strip->done = false; + } + writestruct(wd, DATA, Sequence, 1, seq); + } + SEQ_END - strip = seq->strip; - writestruct(wd, DATA, Strip, 1, strip); - if (seq->flag & SEQ_USE_CROP && strip->crop) { - writestruct(wd, DATA, StripCrop, 1, strip->crop); - } - if (seq->flag & SEQ_USE_TRANSFORM && strip->transform) { - writestruct(wd, DATA, StripTransform, 1, strip->transform); - } - if (seq->flag & SEQ_USE_PROXY && strip->proxy) { - writestruct(wd, DATA, StripProxy, 1, strip->proxy); - } - if (seq->type == SEQ_TYPE_IMAGE) { - writestruct(wd, DATA, StripElem, - MEM_allocN_len(strip->stripdata) / sizeof(struct StripElem), - strip->stripdata); - } - else if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) { - writestruct(wd, DATA, StripElem, 1, strip->stripdata); + SEQ_BEGIN(ed, seq) + { + if (seq->strip && seq->strip->done == 0) { + /* write strip with 'done' at 0 because readfile */ + + if (seq->effectdata) { + switch (seq->type) { + case SEQ_TYPE_COLOR: + writestruct(wd, DATA, SolidColorVars, 1, seq->effectdata); + break; + case SEQ_TYPE_SPEED: + writestruct(wd, DATA, SpeedControlVars, 1, seq->effectdata); + break; + case SEQ_TYPE_WIPE: + writestruct(wd, DATA, WipeVars, 1, seq->effectdata); + break; + case SEQ_TYPE_GLOW: + writestruct(wd, DATA, GlowVars, 1, seq->effectdata); + break; + case SEQ_TYPE_TRANSFORM: + writestruct(wd, DATA, TransformVars, 1, seq->effectdata); + break; + case SEQ_TYPE_GAUSSIAN_BLUR: + writestruct(wd, DATA, GaussianBlurVars, 1, seq->effectdata); + break; + case SEQ_TYPE_TEXT: + writestruct(wd, DATA, TextVars, 1, seq->effectdata); + break; } - - strip->done = true; } - if (seq->prop) { - IDP_WriteProperty(seq->prop, wd); + writestruct(wd, DATA, Stereo3dFormat, 1, seq->stereo3d_format); + + Strip *strip = seq->strip; + writestruct(wd, DATA, Strip, 1, strip); + if (seq->flag & SEQ_USE_CROP && strip->crop) { + writestruct(wd, DATA, StripCrop, 1, strip->crop); + } + if (seq->flag & SEQ_USE_TRANSFORM && strip->transform) { + writestruct(wd, DATA, StripTransform, 1, strip->transform); + } + if (seq->flag & SEQ_USE_PROXY && strip->proxy) { + writestruct(wd, DATA, StripProxy, 1, strip->proxy); + } + if (seq->type == SEQ_TYPE_IMAGE) { + writestruct(wd, DATA, StripElem, + MEM_allocN_len(strip->stripdata) / sizeof(struct StripElem), + strip->stripdata); + } + else if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) { + writestruct(wd, DATA, StripElem, 1, strip->stripdata); } - write_sequence_modifiers(wd, &seq->modifiers); + strip->done = true; } - SEQ_END - /* new; meta stack too, even when its nasty restore code */ - for (ms = ed->metastack.first; ms; ms = ms->next) { - writestruct(wd, DATA, MetaStack, 1, ms); + if (seq->prop) { + IDP_WriteProperty(seq->prop, wd); } + + write_sequence_modifiers(wd, &seq->modifiers); } + SEQ_END - if (sce->r.avicodecdata) { - writestruct(wd, DATA, AviCodecData, 1, sce->r.avicodecdata); - if (sce->r.avicodecdata->lpFormat) { - writedata(wd, DATA, sce->r.avicodecdata->cbFormat, sce->r.avicodecdata->lpFormat); - } - if (sce->r.avicodecdata->lpParms) { - writedata(wd, DATA, sce->r.avicodecdata->cbParms, sce->r.avicodecdata->lpParms); - } + /* new; meta stack too, even when its nasty restore code */ + for (MetaStack *ms = ed->metastack.first; ms; ms = ms->next) { + writestruct(wd, DATA, MetaStack, 1, ms); } + } - if (sce->r.qtcodecdata) { - writestruct(wd, DATA, QuicktimeCodecData, 1, sce->r.qtcodecdata); - if (sce->r.qtcodecdata->cdParms) { - writedata(wd, DATA, sce->r.qtcodecdata->cdSize, sce->r.qtcodecdata->cdParms); - } + if (sce->r.avicodecdata) { + writestruct(wd, DATA, AviCodecData, 1, sce->r.avicodecdata); + if (sce->r.avicodecdata->lpFormat) { + writedata(wd, DATA, sce->r.avicodecdata->cbFormat, sce->r.avicodecdata->lpFormat); } - if (sce->r.ffcodecdata.properties) { - IDP_WriteProperty(sce->r.ffcodecdata.properties, wd); + if (sce->r.avicodecdata->lpParms) { + writedata(wd, DATA, sce->r.avicodecdata->cbParms, sce->r.avicodecdata->lpParms); } + } + if (sce->r.ffcodecdata.properties) { + IDP_WriteProperty(sce->r.ffcodecdata.properties, wd); + } - /* writing dynamic list of TimeMarkers to the blend file */ - for (marker = sce->markers.first; marker; marker = marker->next) { - writestruct(wd, DATA, TimeMarker, 1, marker); - } + /* writing dynamic list of TimeMarkers to the blend file */ + for (TimeMarker *marker = sce->markers.first; marker; marker = marker->next) { + writestruct(wd, DATA, TimeMarker, 1, marker); + } - /* writing dynamic list of TransformOrientations to the blend file */ - for (ts = sce->transform_spaces.first; ts; ts = ts->next) { - writestruct(wd, DATA, TransformOrientation, 1, ts); - } + /* writing dynamic list of TransformOrientations to the blend file */ + for (TransformOrientation *ts = sce->transform_spaces.first; ts; ts = ts->next) { + writestruct(wd, DATA, TransformOrientation, 1, ts); + } - for (srl = sce->r.layers.first; srl; srl = srl->next) { - writestruct(wd, DATA, SceneRenderLayer, 1, srl); - for (fmc = srl->freestyleConfig.modules.first; fmc; fmc = fmc->next) { - writestruct(wd, DATA, FreestyleModuleConfig, 1, fmc); - } - for (fls = srl->freestyleConfig.linesets.first; fls; fls = fls->next) { - writestruct(wd, DATA, FreestyleLineSet, 1, fls); - } + for (SceneRenderLayer *srl = sce->r.layers.first; srl; srl = srl->next) { + writestruct(wd, DATA, SceneRenderLayer, 1, srl); + if (srl->prop) { + IDP_WriteProperty(srl->prop, wd); } - - /* writing MultiView to the blend file */ - for (srv = sce->r.views.first; srv; srv = srv->next) { - writestruct(wd, DATA, SceneRenderView, 1, srv); + for (FreestyleModuleConfig *fmc = srl->freestyleConfig.modules.first; fmc; fmc = fmc->next) { + writestruct(wd, DATA, FreestyleModuleConfig, 1, fmc); } - - if (sce->nodetree) { - writestruct(wd, DATA, bNodeTree, 1, sce->nodetree); - write_nodetree(wd, sce->nodetree); + for (FreestyleLineSet *fls = srl->freestyleConfig.linesets.first; fls; fls = fls->next) { + writestruct(wd, DATA, FreestyleLineSet, 1, fls); } + } - write_view_settings(wd, &sce->view_settings); + /* writing MultiView to the blend file */ + for (SceneRenderView *srv = sce->r.views.first; srv; srv = srv->next) { + writestruct(wd, DATA, SceneRenderView, 1, srv); + } - /* writing RigidBodyWorld data to the blend file */ - if (sce->rigidbody_world) { - writestruct(wd, DATA, RigidBodyWorld, 1, sce->rigidbody_world); - writestruct(wd, DATA, EffectorWeights, 1, sce->rigidbody_world->effector_weights); - write_pointcaches(wd, &(sce->rigidbody_world->ptcaches)); - } + if (sce->nodetree) { + writestruct(wd, DATA, bNodeTree, 1, sce->nodetree); + write_nodetree_nolib(wd, sce->nodetree); + } - write_previews(wd, sce->preview); - write_curvemapping_curves(wd, &sce->r.mblur_shutter_curve); + write_view_settings(wd, &sce->view_settings); - sce = sce->id.next; + /* writing RigidBodyWorld data to the blend file */ + if (sce->rigidbody_world) { + writestruct(wd, DATA, RigidBodyWorld, 1, sce->rigidbody_world); + writestruct(wd, DATA, EffectorWeights, 1, sce->rigidbody_world->effector_weights); + write_pointcaches(wd, &(sce->rigidbody_world->ptcaches)); } - mywrite_flush(wd); + write_previews(wd, sce->preview); + write_curvemapping_curves(wd, &sce->r.mblur_shutter_curve); } -static void write_gpencils(WriteData *wd, ListBase *lb) +static void write_gpencil(WriteData *wd, bGPdata *gpd) { - bGPdata *gpd; - bGPDlayer *gpl; - bGPDframe *gpf; - bGPDstroke *gps; - bGPDpalette *palette; - - for (gpd = lb->first; gpd; gpd = gpd->id.next) { - if (gpd->id.us > 0 || wd->current) { - /* write gpd data block to file */ - writestruct(wd, ID_GD, bGPdata, 1, gpd); - write_iddata(wd, &gpd->id); - - if (gpd->adt) { - write_animdata(wd, gpd->adt); - } - - /* write grease-pencil layers to file */ - writelist(wd, DATA, bGPDlayer, &gpd->layers); - for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { - - /* write this layer's frames to file */ - writelist(wd, DATA, bGPDframe, &gpl->frames); - for (gpf = gpl->frames.first; gpf; gpf = gpf->next) { - - /* write strokes */ - writelist(wd, DATA, bGPDstroke, &gpf->strokes); - for (gps = gpf->strokes.first; gps; gps = gps->next) { - writestruct(wd, DATA, bGPDspoint, gps->totpoints, gps->points); - } + if (gpd->id.us > 0 || wd->current) { + /* write gpd data block to file */ + writestruct(wd, ID_GD, bGPdata, 1, gpd); + write_iddata(wd, &gpd->id); + + if (gpd->adt) { + write_animdata(wd, gpd->adt); + } + + /* write grease-pencil layers to file */ + writelist(wd, DATA, bGPDlayer, &gpd->layers); + for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { + /* write this layer's frames to file */ + writelist(wd, DATA, bGPDframe, &gpl->frames); + for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) { + /* write strokes */ + writelist(wd, DATA, bGPDstroke, &gpf->strokes); + for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) { + writestruct(wd, DATA, bGPDspoint, gps->totpoints, gps->points); } } - /* write grease-pencil palettes */ - writelist(wd, DATA, bGPDpalette, &gpd->palettes); - for (palette = gpd->palettes.first; palette; palette = palette->next) { - writelist(wd, DATA, bGPDpalettecolor, &palette->colors); - } } - } - mywrite_flush(wd); + /* write grease-pencil palettes */ + writelist(wd, DATA, bGPDpalette, &gpd->palettes); + for (bGPDpalette *palette = gpd->palettes.first; palette; palette = palette->next) { + writelist(wd, DATA, bGPDpalettecolor, &palette->colors); + } + } } -static void write_windowmanagers(WriteData *wd, ListBase *lb) +static void write_windowmanager(WriteData *wd, wmWindowManager *wm) { - wmWindowManager *wm; - wmWindow *win; - - for (wm = lb->first; wm; wm = wm->id.next) { - writestruct(wd, ID_WM, wmWindowManager, 1, wm); - write_iddata(wd, &wm->id); + writestruct(wd, ID_WM, wmWindowManager, 1, wm); + write_iddata(wd, &wm->id); - for (win = wm->windows.first; win; win = win->next) { - writestruct(wd, DATA, wmWindow, 1, win); - writestruct(wd, DATA, Stereo3dFormat, 1, win->stereo3d_format); - } + for (wmWindow *win = wm->windows.first; win; win = win->next) { + writestruct(wd, DATA, wmWindow, 1, win); + writestruct(wd, DATA, Stereo3dFormat, 1, win->stereo3d_format); } - - /* typically flushing wouldn't be needed however this data _always_ changes, - * so flush here for more efficient undo. */ - mywrite_flush(wd); } static void write_region(WriteData *wd, ARegion *ar, int spacetype) @@ -2992,184 +2862,168 @@ static void write_soops(WriteData *wd, SpaceOops *so) } } -static void write_screens(WriteData *wd, ListBase *scrbase) +static void write_screen(WriteData *wd, bScreen *sc) { - bScreen *sc; - ScrArea *sa; - ScrVert *sv; - ScrEdge *se; - - sc = scrbase->first; - while (sc) { + /* write LibData */ + /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */ + writestruct(wd, ID_SCRN, bScreen, 1, sc); + write_iddata(wd, &sc->id); - /* write LibData */ - /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */ - writestruct(wd, ID_SCRN, bScreen, 1, sc); - write_iddata(wd, &sc->id); + /* direct data */ + for (ScrVert *sv = sc->vertbase.first; sv; sv = sv->next) { + writestruct(wd, DATA, ScrVert, 1, sv); + } - /* direct data */ - for (sv = sc->vertbase.first; sv; sv = sv->next) { - writestruct(wd, DATA, ScrVert, 1, sv); - } + for (ScrEdge *se = sc->edgebase.first; se; se = se->next) { + writestruct(wd, DATA, ScrEdge, 1, se); + } - for (se = sc->edgebase.first; se; se = se->next) { - writestruct(wd, DATA, ScrEdge, 1, se); - } + for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) { + SpaceLink *sl; + Panel *pa; + uiList *ui_list; + uiPreview *ui_preview; + PanelCategoryStack *pc_act; + ARegion *ar; - for (sa = sc->areabase.first; sa; sa = sa->next) { - SpaceLink *sl; - Panel *pa; - uiList *ui_list; - uiPreview *ui_preview; - PanelCategoryStack *pc_act; - ARegion *ar; + writestruct(wd, DATA, ScrArea, 1, sa); - writestruct(wd, DATA, ScrArea, 1, sa); + for (ar = sa->regionbase.first; ar; ar = ar->next) { + write_region(wd, ar, sa->spacetype); - for (ar = sa->regionbase.first; ar; ar = ar->next) { - write_region(wd, ar, sa->spacetype); + for (pa = ar->panels.first; pa; pa = pa->next) { + writestruct(wd, DATA, Panel, 1, pa); + } - for (pa = ar->panels.first; pa; pa = pa->next) { - writestruct(wd, DATA, Panel, 1, pa); - } + for (pc_act = ar->panels_category_active.first; pc_act; pc_act = pc_act->next) { + writestruct(wd, DATA, PanelCategoryStack, 1, pc_act); + } - for (pc_act = ar->panels_category_active.first; pc_act; pc_act = pc_act->next) { - writestruct(wd, DATA, PanelCategoryStack, 1, pc_act); - } + for (ui_list = ar->ui_lists.first; ui_list; ui_list = ui_list->next) { + write_uilist(wd, ui_list); + } - for (ui_list = ar->ui_lists.first; ui_list; ui_list = ui_list->next) { - write_uilist(wd, ui_list); - } + for (ui_preview = ar->ui_previews.first; ui_preview; ui_preview = ui_preview->next) { + writestruct(wd, DATA, uiPreview, 1, ui_preview); + } + } - for (ui_preview = ar->ui_previews.first; ui_preview; ui_preview = ui_preview->next) { - writestruct(wd, DATA, uiPreview, 1, ui_preview); - } + for (sl = sa->spacedata.first; sl; sl = sl->next) { + for (ar = sl->regionbase.first; ar; ar = ar->next) { + write_region(wd, ar, sl->spacetype); } - sl = sa->spacedata.first; - while (sl) { - for (ar = sl->regionbase.first; ar; ar = ar->next) { - write_region(wd, ar, sl->spacetype); + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; + BGpic *bgpic; + writestruct(wd, DATA, View3D, 1, v3d); + for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) { + writestruct(wd, DATA, BGpic, 1, bgpic); } - - if (sl->spacetype == SPACE_VIEW3D) { - View3D *v3d = (View3D *)sl; - BGpic *bgpic; - writestruct(wd, DATA, View3D, 1, v3d); - for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) { - writestruct(wd, DATA, BGpic, 1, bgpic); - } - if (v3d->localvd) { - writestruct(wd, DATA, View3D, 1, v3d->localvd); - } - - if (v3d->fx_settings.ssao) { - writestruct(wd, DATA, GPUSSAOSettings, 1, v3d->fx_settings.ssao); - } - if (v3d->fx_settings.dof) { - writestruct(wd, DATA, GPUDOFSettings, 1, v3d->fx_settings.dof); - } + if (v3d->localvd) { + writestruct(wd, DATA, View3D, 1, v3d->localvd); } - else if (sl->spacetype == SPACE_IPO) { - SpaceIpo *sipo = (SpaceIpo *)sl; - ListBase tmpGhosts = sipo->ghostCurves; - - /* temporarily disable ghost curves when saving */ - sipo->ghostCurves.first = sipo->ghostCurves.last = NULL; - writestruct(wd, DATA, SpaceIpo, 1, sl); - if (sipo->ads) { - writestruct(wd, DATA, bDopeSheet, 1, sipo->ads); - } - - /* reenable ghost curves */ - sipo->ghostCurves = tmpGhosts; + if (v3d->fx_settings.ssao) { + writestruct(wd, DATA, GPUSSAOSettings, 1, v3d->fx_settings.ssao); } - else if (sl->spacetype == SPACE_BUTS) { - writestruct(wd, DATA, SpaceButs, 1, sl); + if (v3d->fx_settings.dof) { + writestruct(wd, DATA, GPUDOFSettings, 1, v3d->fx_settings.dof); } - else if (sl->spacetype == SPACE_FILE) { - SpaceFile *sfile = (SpaceFile *)sl; + } + else if (sl->spacetype == SPACE_IPO) { + SpaceIpo *sipo = (SpaceIpo *)sl; + ListBase tmpGhosts = sipo->ghostCurves; - writestruct(wd, DATA, SpaceFile, 1, sl); - if (sfile->params) { - writestruct(wd, DATA, FileSelectParams, 1, sfile->params); - } - } - else if (sl->spacetype == SPACE_SEQ) { - writestruct(wd, DATA, SpaceSeq, 1, sl); - } - else if (sl->spacetype == SPACE_OUTLINER) { - SpaceOops *so = (SpaceOops *)sl; - write_soops(wd, so); - } - else if (sl->spacetype == SPACE_IMAGE) { - writestruct(wd, DATA, SpaceImage, 1, sl); - } - else if (sl->spacetype == SPACE_TEXT) { - writestruct(wd, DATA, SpaceText, 1, sl); - } - else if (sl->spacetype == SPACE_SCRIPT) { - SpaceScript *scr = (SpaceScript *)sl; - scr->but_refs = NULL; - writestruct(wd, DATA, SpaceScript, 1, sl); - } - else if (sl->spacetype == SPACE_ACTION) { - writestruct(wd, DATA, SpaceAction, 1, sl); - } - else if (sl->spacetype == SPACE_NLA) { - SpaceNla *snla = (SpaceNla *)sl; + /* temporarily disable ghost curves when saving */ + sipo->ghostCurves.first = sipo->ghostCurves.last = NULL; - writestruct(wd, DATA, SpaceNla, 1, snla); - if (snla->ads) { - writestruct(wd, DATA, bDopeSheet, 1, snla->ads); - } - } - else if (sl->spacetype == SPACE_TIME) { - writestruct(wd, DATA, SpaceTime, 1, sl); + writestruct(wd, DATA, SpaceIpo, 1, sl); + if (sipo->ads) { + writestruct(wd, DATA, bDopeSheet, 1, sipo->ads); } - else if (sl->spacetype == SPACE_NODE) { - SpaceNode *snode = (SpaceNode *)sl; - bNodeTreePath *path; - writestruct(wd, DATA, SpaceNode, 1, snode); - for (path = snode->treepath.first; path; path = path->next) { - writestruct(wd, DATA, bNodeTreePath, 1, path); - } - } - else if (sl->spacetype == SPACE_LOGIC) { - writestruct(wd, DATA, SpaceLogic, 1, sl); - } - else if (sl->spacetype == SPACE_CONSOLE) { - SpaceConsole *con = (SpaceConsole *)sl; - ConsoleLine *cl; - - for (cl = con->history.first; cl; cl = cl->next) { - /* 'len_alloc' is invalid on write, set from 'len' on read */ - writestruct(wd, DATA, ConsoleLine, 1, cl); - writedata(wd, DATA, cl->len + 1, cl->line); - } - writestruct(wd, DATA, SpaceConsole, 1, sl); + /* reenable ghost curves */ + sipo->ghostCurves = tmpGhosts; + } + else if (sl->spacetype == SPACE_BUTS) { + writestruct(wd, DATA, SpaceButs, 1, sl); + } + else if (sl->spacetype == SPACE_FILE) { + SpaceFile *sfile = (SpaceFile *)sl; + writestruct(wd, DATA, SpaceFile, 1, sl); + if (sfile->params) { + writestruct(wd, DATA, FileSelectParams, 1, sfile->params); } - else if (sl->spacetype == SPACE_USERPREF) { - writestruct(wd, DATA, SpaceUserPref, 1, sl); + } + else if (sl->spacetype == SPACE_SEQ) { + writestruct(wd, DATA, SpaceSeq, 1, sl); + } + else if (sl->spacetype == SPACE_OUTLINER) { + SpaceOops *so = (SpaceOops *)sl; + write_soops(wd, so); + } + else if (sl->spacetype == SPACE_IMAGE) { + writestruct(wd, DATA, SpaceImage, 1, sl); + } + else if (sl->spacetype == SPACE_TEXT) { + writestruct(wd, DATA, SpaceText, 1, sl); + } + else if (sl->spacetype == SPACE_SCRIPT) { + SpaceScript *scr = (SpaceScript *)sl; + scr->but_refs = NULL; + writestruct(wd, DATA, SpaceScript, 1, sl); + } + else if (sl->spacetype == SPACE_ACTION) { + writestruct(wd, DATA, SpaceAction, 1, sl); + } + else if (sl->spacetype == SPACE_NLA) { + SpaceNla *snla = (SpaceNla *)sl; + + writestruct(wd, DATA, SpaceNla, 1, snla); + if (snla->ads) { + writestruct(wd, DATA, bDopeSheet, 1, snla->ads); } - else if (sl->spacetype == SPACE_CLIP) { - writestruct(wd, DATA, SpaceClip, 1, sl); + } + else if (sl->spacetype == SPACE_TIME) { + writestruct(wd, DATA, SpaceTime, 1, sl); + } + else if (sl->spacetype == SPACE_NODE) { + SpaceNode *snode = (SpaceNode *)sl; + bNodeTreePath *path; + writestruct(wd, DATA, SpaceNode, 1, snode); + + for (path = snode->treepath.first; path; path = path->next) { + writestruct(wd, DATA, bNodeTreePath, 1, path); } - else if (sl->spacetype == SPACE_INFO) { - writestruct(wd, DATA, SpaceInfo, 1, sl); + } + else if (sl->spacetype == SPACE_LOGIC) { + writestruct(wd, DATA, SpaceLogic, 1, sl); + } + else if (sl->spacetype == SPACE_CONSOLE) { + SpaceConsole *con = (SpaceConsole *)sl; + ConsoleLine *cl; + + for (cl = con->history.first; cl; cl = cl->next) { + /* 'len_alloc' is invalid on write, set from 'len' on read */ + writestruct(wd, DATA, ConsoleLine, 1, cl); + writedata(wd, DATA, cl->len + 1, cl->line); } + writestruct(wd, DATA, SpaceConsole, 1, sl); - sl = sl->next; + } + else if (sl->spacetype == SPACE_USERPREF) { + writestruct(wd, DATA, SpaceUserPref, 1, sl); + } + else if (sl->spacetype == SPACE_CLIP) { + writestruct(wd, DATA, SpaceClip, 1, sl); + } + else if (sl->spacetype == SPACE_INFO) { + writestruct(wd, DATA, SpaceInfo, 1, sl); } } - - sc = sc->id.next; } - - mywrite_flush(wd); } static void write_bone(WriteData *wd, Bone *bone) @@ -3192,156 +3046,101 @@ static void write_bone(WriteData *wd, Bone *bone) } } -static void write_armatures(WriteData *wd, ListBase *idbase) +static void write_armature(WriteData *wd, bArmature *arm) { - bArmature *arm; - Bone *bone; - - arm = idbase->first; - while (arm) { - if (arm->id.us > 0 || wd->current) { - writestruct(wd, ID_AR, bArmature, 1, arm); - write_iddata(wd, &arm->id); + if (arm->id.us > 0 || wd->current) { + writestruct(wd, ID_AR, bArmature, 1, arm); + write_iddata(wd, &arm->id); - if (arm->adt) { - write_animdata(wd, arm->adt); - } + if (arm->adt) { + write_animdata(wd, arm->adt); + } - /* Direct data */ - bone = arm->bonebase.first; - while (bone) { - write_bone(wd, bone); - bone = bone->next; - } + /* Direct data */ + for (Bone *bone = arm->bonebase.first; bone; bone = bone->next) { + write_bone(wd, bone); } - arm = arm->id.next; } - - mywrite_flush(wd); } -static void write_texts(WriteData *wd, ListBase *idbase) +static void write_text(WriteData *wd, Text *text) { - Text *text; - TextLine *tmp; + if ((text->flags & TXT_ISMEM) && (text->flags & TXT_ISEXT)) { + text->flags &= ~TXT_ISEXT; + } - text = idbase->first; - while (text) { - if ( (text->flags & TXT_ISMEM) && (text->flags & TXT_ISEXT)) { - text->flags &= ~TXT_ISEXT; - } + /* write LibData */ + writestruct(wd, ID_TXT, Text, 1, text); + write_iddata(wd, &text->id); - /* write LibData */ - writestruct(wd, ID_TXT, Text, 1, text); - write_iddata(wd, &text->id); + if (text->name) { + writedata(wd, DATA, strlen(text->name) + 1, text->name); + } - if (text->name) { - writedata(wd, DATA, strlen(text->name) + 1, text->name); + if (!(text->flags & TXT_ISEXT)) { + /* now write the text data, in two steps for optimization in the readfunction */ + for (TextLine *tmp = text->lines.first; tmp; tmp = tmp->next) { + writestruct(wd, DATA, TextLine, 1, tmp); } - if (!(text->flags & TXT_ISEXT)) { - /* now write the text data, in two steps for optimization in the readfunction */ - tmp = text->lines.first; - while (tmp) { - writestruct(wd, DATA, TextLine, 1, tmp); - tmp = tmp->next; - } - - tmp = text->lines.first; - while (tmp) { - writedata(wd, DATA, tmp->len + 1, tmp->line); - tmp = tmp->next; - } + for (TextLine *tmp = text->lines.first; tmp; tmp = tmp->next) { + writedata(wd, DATA, tmp->len + 1, tmp->line); } - - - text = text->id.next; } - - mywrite_flush(wd); } -static void write_speakers(WriteData *wd, ListBase *idbase) +static void write_speaker(WriteData *wd, Speaker *spk) { - Speaker *spk; - - spk = idbase->first; - while (spk) { - if (spk->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_SPK, Speaker, 1, spk); - write_iddata(wd, &spk->id); + if (spk->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_SPK, Speaker, 1, spk); + write_iddata(wd, &spk->id); - if (spk->adt) { - write_animdata(wd, spk->adt); - } + if (spk->adt) { + write_animdata(wd, spk->adt); } - spk = spk->id.next; } } -static void write_sounds(WriteData *wd, ListBase *idbase) +static void write_sound(WriteData *wd, bSound *sound) { - bSound *sound; - - PackedFile *pf; - - sound = idbase->first; - while (sound) { - if (sound->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_SO, bSound, 1, sound); - write_iddata(wd, &sound->id); + if (sound->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_SO, bSound, 1, sound); + write_iddata(wd, &sound->id); - if (sound->packedfile) { - pf = sound->packedfile; - writestruct(wd, DATA, PackedFile, 1, pf); - writedata(wd, DATA, pf->size, pf->data); - } + if (sound->packedfile) { + PackedFile *pf = sound->packedfile; + writestruct(wd, DATA, PackedFile, 1, pf); + writedata(wd, DATA, pf->size, pf->data); } - sound = sound->id.next; } - - mywrite_flush(wd); } -static void write_groups(WriteData *wd, ListBase *idbase) +static void write_group(WriteData *wd, Group *group) { - Group *group; - GroupObject *go; - - for (group = idbase->first; group; group = group->id.next) { - if (group->id.us > 0 || wd->current) { - /* write LibData */ - writestruct(wd, ID_GR, Group, 1, group); - write_iddata(wd, &group->id); + if (group->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_GR, Group, 1, group); + write_iddata(wd, &group->id); - write_previews(wd, group->preview); + write_previews(wd, group->preview); - go = group->gobject.first; - while (go) { - writestruct(wd, DATA, GroupObject, 1, go); - go = go->next; - } + for (GroupObject *go = group->gobject.first; go; go = go->next) { + writestruct(wd, DATA, GroupObject, 1, go); } } - - mywrite_flush(wd); } -static void write_nodetrees(WriteData *wd, ListBase *idbase) +static void write_nodetree(WriteData *wd, bNodeTree *ntree) { - bNodeTree *ntree; - - for (ntree = idbase->first; ntree; ntree = ntree->id.next) { - if (ntree->id.us > 0 || wd->current) { - writestruct(wd, ID_NT, bNodeTree, 1, ntree); - /* Note that trees directly used by other IDs (materials etc.) are not 'real' ID, they cannot - * be linked, etc., so we write actual id data here only, for 'real' ID trees. */ - write_iddata(wd, &ntree->id); + if (ntree->id.us > 0 || wd->current) { + writestruct(wd, ID_NT, bNodeTree, 1, ntree); + /* Note that trees directly used by other IDs (materials etc.) are not 'real' ID, they cannot + * be linked, etc., so we write actual id data here only, for 'real' ID trees. */ + write_iddata(wd, &ntree->id); - write_nodetree(wd, ntree); - } + write_nodetree_nolib(wd, ntree); } } @@ -3415,53 +3214,41 @@ static void customnodes_free_deprecated_data(Main *mainvar) } #endif -static void write_brushes(WriteData *wd, ListBase *idbase) +static void write_brush(WriteData *wd, Brush *brush) { - Brush *brush; - - for (brush = idbase->first; brush; brush = brush->id.next) { - if (brush->id.us > 0 || wd->current) { - writestruct(wd, ID_BR, Brush, 1, brush); - write_iddata(wd, &brush->id); + if (brush->id.us > 0 || wd->current) { + writestruct(wd, ID_BR, Brush, 1, brush); + write_iddata(wd, &brush->id); - if (brush->curve) { - write_curvemapping(wd, brush->curve); - } - if (brush->gradient) { - writestruct(wd, DATA, ColorBand, 1, brush->gradient); - } + if (brush->curve) { + write_curvemapping(wd, brush->curve); + } + if (brush->gradient) { + writestruct(wd, DATA, ColorBand, 1, brush->gradient); } } } -static void write_palettes(WriteData *wd, ListBase *idbase) +static void write_palette(WriteData *wd, Palette *palette) { - Palette *palette; - - for (palette = idbase->first; palette; palette = palette->id.next) { - if (palette->id.us > 0 || wd->current) { - PaletteColor *color; - writestruct(wd, ID_PAL, Palette, 1, palette); - write_iddata(wd, &palette->id); + if (palette->id.us > 0 || wd->current) { + PaletteColor *color; + writestruct(wd, ID_PAL, Palette, 1, palette); + write_iddata(wd, &palette->id); - for (color = palette->colors.first; color; color = color->next) { - writestruct(wd, DATA, PaletteColor, 1, color); - } + for (color = palette->colors.first; color; color = color->next) { + writestruct(wd, DATA, PaletteColor, 1, color); } } } -static void write_paintcurves(WriteData *wd, ListBase *idbase) +static void write_paintcurve(WriteData *wd, PaintCurve *pc) { - PaintCurve *pc; - - for (pc = idbase->first; pc; pc = pc->id.next) { - if (pc->id.us > 0 || wd->current) { - writestruct(wd, ID_PC, PaintCurve, 1, pc); - write_iddata(wd, &pc->id); + if (pc->id.us > 0 || wd->current) { + writestruct(wd, ID_PC, PaintCurve, 1, pc); + write_iddata(wd, &pc->id); - writestruct(wd, DATA, PaintCurvePoint, pc->tot_points, pc->points); - } + writestruct(wd, DATA, PaintCurvePoint, pc->tot_points, pc->points); } } @@ -3503,103 +3290,85 @@ static void write_movieReconstruction(WriteData *wd, MovieTrackingReconstruction } } -static void write_movieclips(WriteData *wd, ListBase *idbase) +static void write_movieclip(WriteData *wd, MovieClip *clip) { - MovieClip *clip; - - clip = idbase->first; - while (clip) { - if (clip->id.us > 0 || wd->current) { - MovieTracking *tracking = &clip->tracking; - MovieTrackingObject *object; + if (clip->id.us > 0 || wd->current) { + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *object; - writestruct(wd, ID_MC, MovieClip, 1, clip); - write_iddata(wd, &clip->id); + writestruct(wd, ID_MC, MovieClip, 1, clip); + write_iddata(wd, &clip->id); - if (clip->adt) { - write_animdata(wd, clip->adt); - } + if (clip->adt) { + write_animdata(wd, clip->adt); + } - write_movieTracks(wd, &tracking->tracks); - write_moviePlaneTracks(wd, &tracking->plane_tracks); - write_movieReconstruction(wd, &tracking->reconstruction); + write_movieTracks(wd, &tracking->tracks); + write_moviePlaneTracks(wd, &tracking->plane_tracks); + write_movieReconstruction(wd, &tracking->reconstruction); - object = tracking->objects.first; - while (object) { - writestruct(wd, DATA, MovieTrackingObject, 1, object); + object = tracking->objects.first; + while (object) { + writestruct(wd, DATA, MovieTrackingObject, 1, object); - write_movieTracks(wd, &object->tracks); - write_moviePlaneTracks(wd, &object->plane_tracks); - write_movieReconstruction(wd, &object->reconstruction); + write_movieTracks(wd, &object->tracks); + write_moviePlaneTracks(wd, &object->plane_tracks); + write_movieReconstruction(wd, &object->reconstruction); - object = object->next; - } + object = object->next; } - - clip = clip->id.next; } - - mywrite_flush(wd); } -static void write_masks(WriteData *wd, ListBase *idbase) +static void write_mask(WriteData *wd, Mask *mask) { - Mask *mask; - - mask = idbase->first; - while (mask) { - if (mask->id.us > 0 || wd->current) { - MaskLayer *masklay; + if (mask->id.us > 0 || wd->current) { + MaskLayer *masklay; - writestruct(wd, ID_MSK, Mask, 1, mask); - write_iddata(wd, &mask->id); + writestruct(wd, ID_MSK, Mask, 1, mask); + write_iddata(wd, &mask->id); - if (mask->adt) { - write_animdata(wd, mask->adt); - } + if (mask->adt) { + write_animdata(wd, mask->adt); + } - for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) { - MaskSpline *spline; - MaskLayerShape *masklay_shape; + for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) { + MaskSpline *spline; + MaskLayerShape *masklay_shape; - writestruct(wd, DATA, MaskLayer, 1, masklay); + writestruct(wd, DATA, MaskLayer, 1, masklay); - for (spline = masklay->splines.first; spline; spline = spline->next) { - int i; + for (spline = masklay->splines.first; spline; spline = spline->next) { + int i; - void *points_deform = spline->points_deform; - spline->points_deform = NULL; + void *points_deform = spline->points_deform; + spline->points_deform = NULL; - writestruct(wd, DATA, MaskSpline, 1, spline); - writestruct(wd, DATA, MaskSplinePoint, spline->tot_point, spline->points); + writestruct(wd, DATA, MaskSpline, 1, spline); + writestruct(wd, DATA, MaskSplinePoint, spline->tot_point, spline->points); - spline->points_deform = points_deform; + spline->points_deform = points_deform; - for (i = 0; i < spline->tot_point; i++) { - MaskSplinePoint *point = &spline->points[i]; + for (i = 0; i < spline->tot_point; i++) { + MaskSplinePoint *point = &spline->points[i]; - if (point->tot_uw) { - writestruct(wd, DATA, MaskSplinePointUW, point->tot_uw, point->uw); - } + if (point->tot_uw) { + writestruct(wd, DATA, MaskSplinePointUW, point->tot_uw, point->uw); } } + } - for (masklay_shape = masklay->splines_shapes.first; - masklay_shape; - masklay_shape = masklay_shape->next) - { - writestruct(wd, DATA, MaskLayerShape, 1, masklay_shape); - writedata(wd, DATA, - masklay_shape->tot_vert * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE, - masklay_shape->data); - } + for (masklay_shape = masklay->splines_shapes.first; + masklay_shape; + masklay_shape = masklay_shape->next) + { + writestruct(wd, DATA, MaskLayerShape, 1, masklay_shape); + writedata(wd, DATA, + masklay_shape->tot_vert * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE, + masklay_shape->data); } } - - mask = mask->id.next; } - - mywrite_flush(wd); } static void write_linestyle_color_modifiers(WriteData *wd, ListBase *modifiers) @@ -3856,48 +3625,39 @@ static void write_linestyle_geometry_modifiers(WriteData *wd, ListBase *modifier } } -static void write_linestyles(WriteData *wd, ListBase *idbase) +static void write_linestyle(WriteData *wd, FreestyleLineStyle *linestyle) { - FreestyleLineStyle *linestyle; - int a; - - for (linestyle = idbase->first; linestyle; linestyle = linestyle->id.next) { - if (linestyle->id.us > 0 || wd->current) { - writestruct(wd, ID_LS, FreestyleLineStyle, 1, linestyle); - write_iddata(wd, &linestyle->id); + if (linestyle->id.us > 0 || wd->current) { + writestruct(wd, ID_LS, FreestyleLineStyle, 1, linestyle); + write_iddata(wd, &linestyle->id); - if (linestyle->adt) { - write_animdata(wd, linestyle->adt); - } + if (linestyle->adt) { + write_animdata(wd, linestyle->adt); + } - write_linestyle_color_modifiers(wd, &linestyle->color_modifiers); - write_linestyle_alpha_modifiers(wd, &linestyle->alpha_modifiers); - write_linestyle_thickness_modifiers(wd, &linestyle->thickness_modifiers); - write_linestyle_geometry_modifiers(wd, &linestyle->geometry_modifiers); - for (a = 0; a < MAX_MTEX; a++) { - if (linestyle->mtex[a]) { - writestruct(wd, DATA, MTex, 1, linestyle->mtex[a]); - } - } - if (linestyle->nodetree) { - writestruct(wd, DATA, bNodeTree, 1, linestyle->nodetree); - write_nodetree(wd, linestyle->nodetree); + write_linestyle_color_modifiers(wd, &linestyle->color_modifiers); + write_linestyle_alpha_modifiers(wd, &linestyle->alpha_modifiers); + write_linestyle_thickness_modifiers(wd, &linestyle->thickness_modifiers); + write_linestyle_geometry_modifiers(wd, &linestyle->geometry_modifiers); + for (int a = 0; a < MAX_MTEX; a++) { + if (linestyle->mtex[a]) { + writestruct(wd, DATA, MTex, 1, linestyle->mtex[a]); } } + if (linestyle->nodetree) { + writestruct(wd, DATA, bNodeTree, 1, linestyle->nodetree); + write_nodetree_nolib(wd, linestyle->nodetree); + } } } -static void write_cachefiles(WriteData *wd, ListBase *idbase) +static void write_cachefile(WriteData *wd, CacheFile *cache_file) { - CacheFile *cache_file; - - for (cache_file = idbase->first; cache_file; cache_file = cache_file->id.next) { - if (cache_file->id.us > 0 || wd->current) { - writestruct(wd, ID_CF, CacheFile, 1, cache_file); + if (cache_file->id.us > 0 || wd->current) { + writestruct(wd, ID_CF, CacheFile, 1, cache_file); - if (cache_file->adt) { - write_animdata(wd, cache_file->adt); - } + if (cache_file->adt) { + write_animdata(wd, cache_file->adt); } } } @@ -3911,7 +3671,6 @@ static void write_libraries(WriteData *wd, Main *main) bool found_one; for (; main; main = main->next) { - a = tot = set_listbasepointers(main, lbarray); /* test: is lib being used */ @@ -3920,16 +3679,13 @@ static void write_libraries(WriteData *wd, Main *main) } else { found_one = false; - while (tot--) { + while (!found_one && tot--) { for (id = lbarray[tot]->first; id; id = id->next) { if (id->us > 0 && (id->tag & LIB_TAG_EXTERN)) { found_one = true; break; } } - if (found_one) { - break; - } } } @@ -4068,38 +3824,134 @@ static bool write_file_handle( * avoid thumbnail detecting changes because of this. */ mywrite_flush(wd); - write_windowmanagers(wd, &mainvar->wm); - write_screens(wd, &mainvar->screen); - write_movieclips(wd, &mainvar->movieclip); - write_masks(wd, &mainvar->mask); - write_scenes(wd, &mainvar->scene); - write_curves(wd, &mainvar->curve); - write_mballs(wd, &mainvar->mball); - write_images(wd, &mainvar->image); - write_cameras(wd, &mainvar->camera); - write_lamps(wd, &mainvar->lamp); - write_lattices(wd, &mainvar->latt); - write_vfonts(wd, &mainvar->vfont); - write_keys(wd, &mainvar->key); - write_worlds(wd, &mainvar->world); - write_texts(wd, &mainvar->text); - write_speakers(wd, &mainvar->speaker); - write_sounds(wd, &mainvar->sound); - write_groups(wd, &mainvar->group); - write_armatures(wd, &mainvar->armature); - write_actions(wd, &mainvar->action); - write_objects(wd, &mainvar->object); - write_materials(wd, &mainvar->mat); - write_textures(wd, &mainvar->tex); - write_meshes(wd, &mainvar->mesh); - write_particlesettings(wd, &mainvar->particle); - write_nodetrees(wd, &mainvar->nodetree); - write_brushes(wd, &mainvar->brush); - write_palettes(wd, &mainvar->palettes); - write_paintcurves(wd, &mainvar->paintcurves); - write_gpencils(wd, &mainvar->gpencil); - write_linestyles(wd, &mainvar->linestyle); - write_cachefiles(wd, &mainvar->cachefiles); + ListBase *lbarray[MAX_LIBARRAY]; + int a = set_listbasepointers(mainvar, lbarray); + while (a--) { + ID *id = lbarray[a]->first; + + if (id && GS(id->name) == ID_LI) { + continue; /* Libraries are handled separately below. */ + } + + for (; id; id = id->next) { + /* We should never attempt to write non-regular IDs (i.e. all kind of temp/runtime ones). */ + BLI_assert((id->tag & (LIB_TAG_NO_MAIN | LIB_TAG_NO_USER_REFCOUNT | LIB_TAG_NOT_ALLOCATED)) == 0); + + switch ((ID_Type)GS(id->name)) { + case ID_WM: + write_windowmanager(wd, (wmWindowManager *)id); + break; + case ID_SCR: + write_screen(wd, (bScreen *)id); + break; + case ID_MC: + write_movieclip(wd, (MovieClip *)id); + break; + case ID_MSK: + write_mask(wd, (Mask *)id); + break; + case ID_SCE: + write_scene(wd, (Scene *)id); + break; + case ID_CU: + write_curve(wd, (Curve *)id); + break; + case ID_MB: + write_mball(wd, (MetaBall *)id); + break; + case ID_IM: + write_image(wd, (Image *)id); + break; + case ID_CA: + write_camera(wd, (Camera *)id); + break; + case ID_LA: + write_lamp(wd, (Lamp *)id); + break; + case ID_LT: + write_lattice(wd, (Lattice *)id); + break; + case ID_VF: + write_vfont(wd, (VFont *)id); + break; + case ID_KE: + write_key(wd, (Key *)id); + break; + case ID_WO: + write_world(wd, (World *)id); + break; + case ID_TXT: + write_text(wd, (Text *)id); + break; + case ID_SPK: + write_speaker(wd, (Speaker *)id); + break; + case ID_SO: + write_sound(wd, (bSound *)id); + break; + case ID_GR: + write_group(wd, (Group *)id); + break; + case ID_AR: + write_armature(wd, (bArmature *)id); + break; + case ID_AC: + write_action(wd, (bAction *)id); + break; + case ID_OB: + write_object(wd, (Object *)id); + break; + case ID_MA: + write_material(wd, (Material *)id); + break; + case ID_TE: + write_texture(wd, (Tex *)id); + break; + case ID_ME: + write_mesh(wd, (Mesh *)id); + break; + case ID_PA: + write_particlesettings(wd, (ParticleSettings *)id); + break; + case ID_NT: + write_nodetree(wd, (bNodeTree *)id); + break; + case ID_BR: + write_brush(wd, (Brush *)id); + break; + case ID_PAL: + write_palette(wd, (Palette *)id); + break; + case ID_PC: + write_paintcurve(wd, (PaintCurve *)id); + break; + case ID_GD: + write_gpencil(wd, (bGPdata *)id); + break; + case ID_LS: + write_linestyle(wd, (FreestyleLineStyle *)id); + break; + case ID_CF: + write_cachefile(wd, (CacheFile *)id); + break; + case ID_LI: + /* Do nothing, handled below - and should never be reached. */ + BLI_assert(0); + break; + case ID_IP: + /* Do nothing, deprecated. */ + break; + default: + /* Should never be reached. */ + BLI_assert(0); + break; + } + } + + mywrite_flush(wd); + } + + /* Special handling, operating over split Mains... */ write_libraries(wd, mainvar->next); /* So changes above don't cause a 'DNA1' to be detected as changed on undo. */ |