Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenloader/intern/writefile.c
| Show First 20 Lines • Show All 156 Lines • ▼ Show 20 Lines | |||||
| #include "BLI_blenlib.h" | #include "BLI_blenlib.h" | ||||
| #include "BLI_linklist.h" | #include "BLI_linklist.h" | ||||
| #include "BLI_mempool.h" | #include "BLI_mempool.h" | ||||
| #include "BKE_action.h" | #include "BKE_action.h" | ||||
| #include "BKE_blender_version.h" | #include "BKE_blender_version.h" | ||||
| #include "BKE_bpath.h" | #include "BKE_bpath.h" | ||||
| #include "BKE_curve.h" | #include "BKE_curve.h" | ||||
| #include "BKE_collection.h" | |||||
| #include "BKE_constraint.h" | #include "BKE_constraint.h" | ||||
| #include "BKE_global.h" // for G | #include "BKE_global.h" // for G | ||||
| #include "BKE_group.h" | |||||
| #include "BKE_idcode.h" | #include "BKE_idcode.h" | ||||
| #include "BKE_library.h" // for set_listbasepointers | #include "BKE_library.h" // for set_listbasepointers | ||||
| #include "BKE_library_override.h" | #include "BKE_library_override.h" | ||||
| #include "BKE_main.h" | #include "BKE_main.h" | ||||
| #include "BKE_node.h" | #include "BKE_node.h" | ||||
| #include "BKE_report.h" | #include "BKE_report.h" | ||||
| #include "BKE_sequencer.h" | #include "BKE_sequencer.h" | ||||
| #include "BKE_subsurf.h" | #include "BKE_subsurf.h" | ||||
| ▲ Show 20 Lines • Show All 1,199 Lines • ▼ Show 20 Lines | if (part->twistcurve) { | ||||
| write_curvemapping(wd, part->twistcurve); | write_curvemapping(wd, part->twistcurve); | ||||
| } | } | ||||
| for (ParticleDupliWeight *dw = part->dupliweights.first; dw; dw = dw->next) { | 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.) */ | /* update indices, but only if dw->ob is set (can be NULL after loading e.g.) */ | ||||
| if (dw->ob != NULL) { | if (dw->ob != NULL) { | ||||
| dw->index = 0; | dw->index = 0; | ||||
| if (part->dup_group) { /* can be NULL if lining fails or set to None */ | if (part->dup_group) { /* can be NULL if lining fails or set to None */ | ||||
| FOREACH_GROUP_OBJECT_BEGIN(part->dup_group, object) | FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(part->dup_group, object) | ||||
| { | { | ||||
| if (object != dw->ob) { | if (object != dw->ob) { | ||||
| dw->index++; | dw->index++; | ||||
| } | } | ||||
| } | } | ||||
| FOREACH_GROUP_OBJECT_END; | FOREACH_COLLECTION_OBJECT_RECURSIVE_END; | ||||
| } | } | ||||
| } | } | ||||
| writestruct(wd, DATA, ParticleDupliWeight, 1, dw); | writestruct(wd, DATA, ParticleDupliWeight, 1, dw); | ||||
| } | } | ||||
| if (part->boids && part->phystype == PART_PHYS_BOIDS) { | if (part->boids && part->phystype == PART_PHYS_BOIDS) { | ||||
| writestruct(wd, DATA, BoidSettings, 1, part->boids); | writestruct(wd, DATA, BoidSettings, 1, part->boids); | ||||
| ▲ Show 20 Lines • Show All 953 Lines • ▼ Show 20 Lines | if (la->nodetree) { | ||||
| writestruct(wd, DATA, bNodeTree, 1, la->nodetree); | writestruct(wd, DATA, bNodeTree, 1, la->nodetree); | ||||
| write_nodetree_nolib(wd, la->nodetree); | write_nodetree_nolib(wd, la->nodetree); | ||||
| } | } | ||||
| write_previews(wd, la->preview); | write_previews(wd, la->preview); | ||||
| } | } | ||||
| } | } | ||||
| static void write_collection_nolib(WriteData *wd, Collection *collection) | |||||
| { | |||||
| /* Shared function for collection datablocks and scene master collection. */ | |||||
| write_previews(wd, collection->preview); | |||||
| for (CollectionObject *cob = collection->gobject.first; cob; cob = cob->next) { | |||||
| writestruct(wd, DATA, CollectionObject, 1, cob); | |||||
| } | |||||
| for (CollectionChild *child = collection->children.first; child; child = child->next) { | |||||
| writestruct(wd, DATA, CollectionChild, 1, child); | |||||
| } | |||||
| } | |||||
| static void write_collection(WriteData *wd, Collection *collection) | |||||
| { | |||||
| if (collection->id.us > 0 || wd->use_memfile) { | |||||
| /* write LibData */ | |||||
| writestruct(wd, ID_GR, Collection, 1, collection); | |||||
| write_iddata(wd, &collection->id); | |||||
| write_collection_nolib(wd, collection); | |||||
| } | |||||
| } | |||||
| static void write_sequence_modifiers(WriteData *wd, ListBase *modbase) | static void write_sequence_modifiers(WriteData *wd, ListBase *modbase) | ||||
| { | { | ||||
| SequenceModifierData *smd; | SequenceModifierData *smd; | ||||
| for (smd = modbase->first; smd; smd = smd->next) { | for (smd = modbase->first; smd; smd = smd->next) { | ||||
| const SequenceModifierTypeInfo *smti = BKE_sequence_modifier_type_info_get(smd->type); | const SequenceModifierTypeInfo *smti = BKE_sequence_modifier_type_info_get(smd->type); | ||||
| if (smti) { | if (smti) { | ||||
| Show All 25 Lines | |||||
| static void write_paint(WriteData *wd, Paint *p) | static void write_paint(WriteData *wd, Paint *p) | ||||
| { | { | ||||
| if (p->cavity_curve) { | if (p->cavity_curve) { | ||||
| write_curvemapping(wd, p->cavity_curve); | write_curvemapping(wd, p->cavity_curve); | ||||
| } | } | ||||
| } | } | ||||
| static void write_scene_collection(WriteData *wd, SceneCollection *sc) | |||||
| { | |||||
| writestruct(wd, DATA, SceneCollection, 1, sc); | |||||
| writelist(wd, DATA, LinkData, &sc->objects); | |||||
| for (SceneCollection *nsc = sc->scene_collections.first; nsc; nsc = nsc->next) { | |||||
| write_scene_collection(wd, nsc); | |||||
| } | |||||
| } | |||||
| static void write_layer_collections(WriteData *wd, ListBase *lb) | static void write_layer_collections(WriteData *wd, ListBase *lb) | ||||
| { | { | ||||
| for (LayerCollection *lc = lb->first; lc; lc = lc->next) { | for (LayerCollection *lc = lb->first; lc; lc = lc->next) { | ||||
| writestruct(wd, DATA, LayerCollection, 1, lc); | writestruct(wd, DATA, LayerCollection, 1, lc); | ||||
| writelist(wd, DATA, LinkData, &lc->object_bases); | |||||
| write_layer_collections(wd, &lc->layer_collections); | write_layer_collections(wd, &lc->layer_collections); | ||||
| } | } | ||||
| } | } | ||||
| static void write_view_layer(WriteData *wd, ViewLayer *view_layer) | static void write_view_layer(WriteData *wd, ViewLayer *view_layer) | ||||
| { | { | ||||
| writestruct(wd, DATA, ViewLayer, 1, view_layer); | writestruct(wd, DATA, ViewLayer, 1, view_layer); | ||||
| writelist(wd, DATA, Base, &view_layer->object_bases); | writelist(wd, DATA, Base, &view_layer->object_bases); | ||||
| ▲ Show 20 Lines • Show All 192 Lines • ▼ Show 20 Lines | static void write_scene(WriteData *wd, Scene *sce) | ||||
| if (sce->rigidbody_world) { | if (sce->rigidbody_world) { | ||||
| writestruct(wd, DATA, RigidBodyWorld, 1, sce->rigidbody_world); | writestruct(wd, DATA, RigidBodyWorld, 1, sce->rigidbody_world); | ||||
| writestruct(wd, DATA, EffectorWeights, 1, sce->rigidbody_world->effector_weights); | writestruct(wd, DATA, EffectorWeights, 1, sce->rigidbody_world->effector_weights); | ||||
| write_pointcaches(wd, &(sce->rigidbody_world->ptcaches)); | write_pointcaches(wd, &(sce->rigidbody_world->ptcaches)); | ||||
| } | } | ||||
| write_previews(wd, sce->preview); | write_previews(wd, sce->preview); | ||||
| write_curvemapping_curves(wd, &sce->r.mblur_shutter_curve); | write_curvemapping_curves(wd, &sce->r.mblur_shutter_curve); | ||||
| write_scene_collection(wd, sce->collection); | |||||
| for (ViewLayer *view_layer = sce->view_layers.first; view_layer; view_layer = view_layer->next) { | for (ViewLayer *view_layer = sce->view_layers.first; view_layer; view_layer = view_layer->next) { | ||||
| write_view_layer(wd, view_layer); | write_view_layer(wd, view_layer); | ||||
| } | } | ||||
| if (sce->layer_properties) { | if (sce->layer_properties) { | ||||
| IDP_WriteProperty(sce->layer_properties, wd); | IDP_WriteProperty(sce->layer_properties, wd); | ||||
| } | } | ||||
| if (sce->collection_properties) { | if (sce->collection_properties) { | ||||
| IDP_WriteProperty(sce->collection_properties, wd); | IDP_WriteProperty(sce->collection_properties, wd); | ||||
| } | } | ||||
| if (sce->master_collection) { | |||||
| writestruct(wd, DATA, Collection, 1, sce->master_collection); | |||||
| write_collection_nolib(wd, sce->master_collection); | |||||
| } | |||||
| } | } | ||||
| static void write_gpencil(WriteData *wd, bGPdata *gpd) | static void write_gpencil(WriteData *wd, bGPdata *gpd) | ||||
| { | { | ||||
| if (gpd->id.us > 0 || wd->use_memfile) { | if (gpd->id.us > 0 || wd->use_memfile) { | ||||
| /* write gpd data block to file */ | /* write gpd data block to file */ | ||||
| writestruct(wd, ID_GD, bGPdata, 1, gpd); | writestruct(wd, ID_GD, bGPdata, 1, gpd); | ||||
| write_iddata(wd, &gpd->id); | write_iddata(wd, &gpd->id); | ||||
| ▲ Show 20 Lines • Show All 399 Lines • ▼ Show 20 Lines | if (prb->id.us > 0 || wd->use_memfile) { | ||||
| write_iddata(wd, &prb->id); | write_iddata(wd, &prb->id); | ||||
| if (prb->adt) { | if (prb->adt) { | ||||
| write_animdata(wd, prb->adt); | write_animdata(wd, prb->adt); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void write_group(WriteData *wd, Group *group) | |||||
| { | |||||
| if (group->id.us > 0 || wd->use_memfile) { | |||||
| /* write LibData */ | |||||
| writestruct(wd, ID_GR, Group, 1, group); | |||||
| write_iddata(wd, &group->id); | |||||
| write_previews(wd, group->preview); | |||||
| write_scene_collection(wd, group->collection); | |||||
| write_view_layer(wd, group->view_layer); | |||||
| } | |||||
| } | |||||
| static void write_nodetree(WriteData *wd, bNodeTree *ntree) | static void write_nodetree(WriteData *wd, bNodeTree *ntree) | ||||
| { | { | ||||
| if (ntree->id.us > 0 || wd->use_memfile) { | if (ntree->id.us > 0 || wd->use_memfile) { | ||||
| writestruct(wd, ID_NT, bNodeTree, 1, ntree); | writestruct(wd, ID_NT, bNodeTree, 1, ntree); | ||||
| /* Note that trees directly used by other IDs (materials etc.) are not 'real' ID, they cannot | /* 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. */ | * be linked, etc., so we write actual id data here only, for 'real' ID trees. */ | ||||
| write_iddata(wd, &ntree->id); | write_iddata(wd, &ntree->id); | ||||
| ▲ Show 20 Lines • Show All 783 Lines • ▼ Show 20 Lines | while (a--) { | ||||
| break; | break; | ||||
| case ID_LP: | case ID_LP: | ||||
| write_probe(wd, (LightProbe *)id); | write_probe(wd, (LightProbe *)id); | ||||
| break; | break; | ||||
| case ID_SO: | case ID_SO: | ||||
| write_sound(wd, (bSound *)id); | write_sound(wd, (bSound *)id); | ||||
| break; | break; | ||||
| case ID_GR: | case ID_GR: | ||||
| write_group(wd, (Group *)id); | write_collection(wd, (Collection *)id); | ||||
| break; | break; | ||||
| case ID_AR: | case ID_AR: | ||||
| write_armature(wd, (bArmature *)id); | write_armature(wd, (bArmature *)id); | ||||
| break; | break; | ||||
| case ID_AC: | case ID_AC: | ||||
| write_action(wd, (bAction *)id); | write_action(wd, (bAction *)id); | ||||
| break; | break; | ||||
| case ID_OB: | case ID_OB: | ||||
| ▲ Show 20 Lines • Show All 272 Lines • Show Last 20 Lines | |||||