diff options
Diffstat (limited to 'source/blender/blenloader/intern/readfile.c')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 90 |
1 files changed, 83 insertions, 7 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 94478b0d235..d1da29bef70 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3044,6 +3044,10 @@ static void lib_link_particlesettings(FileData *fd, Main *main) part->dup_group = newlibadr(fd, part->id.lib, part->dup_group); part->eff_group = newlibadr(fd, part->id.lib, part->eff_group); part->bb_ob = newlibadr(fd, part->id.lib, part->bb_ob); + + if(part->effector_weights) + part->effector_weights->group = newlibadr(fd, part->id.lib, part->effector_weights->group); + if(part->boids) { BoidState *state = part->boids->states.first; BoidRule *rule; @@ -3079,6 +3083,11 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part) part->pd= newdataadr(fd, part->pd); part->pd2= newdataadr(fd, part->pd2); + if(part->effector_weights) + part->effector_weights = newdataadr(fd, part->effector_weights); + else + part->effector_weights = BKE_add_effector_weights(part->eff_group); + part->boids= newdataadr(fd, part->boids); if(part->boids) { @@ -3155,18 +3164,17 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles) } - psys->child=newdataadr(fd,psys->child); - psys->effectors.first=psys->effectors.last=0; + psys->child = newdataadr(fd,psys->child); + psys->effectors = NULL; link_list(fd, &psys->targets); psys->edit = NULL; psys->free_edit = NULL; - psys->pathcache = 0; - psys->childcache = 0; - psys->pathcachebufs.first = psys->pathcachebufs.last = 0; - psys->childcachebufs.first = psys->childcachebufs.last = 0; - psys->reactevents.first = psys->reactevents.last = 0; + psys->pathcache = NULL; + psys->childcache = NULL; + psys->pathcachebufs.first = psys->pathcachebufs.last = NULL; + psys->childcachebufs.first = psys->childcachebufs.last = NULL; psys->frand = NULL; psys->pdd = NULL; @@ -3642,12 +3650,24 @@ static void lib_link_object(FileData *fd, Main *main) smd->domain->fluid_group = newlibadr_us(fd, ob->id.lib, smd->domain->fluid_group); } } + + { + ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth); + + if(clmd) + { + clmd->sim_parms->effector_weights->group = newlibadr(fd, ob->id.lib, clmd->sim_parms->effector_weights->group); + } + } /* texture field */ if(ob->pd) if(ob->pd->tex) ob->pd->tex=newlibadr_us(fd, ob->id.lib, ob->pd->tex); + if(ob->soft) + ob->soft->effector_weights->group = newlibadr(fd, ob->id.lib, ob->soft->effector_weights->group); + lib_link_particlesystems(fd, ob, &ob->id, &ob->particlesystem); lib_link_modifiers(fd, ob); } @@ -3727,6 +3747,11 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) if(clmd->sim_parms->presets > 10) clmd->sim_parms->presets = 0; } + + if(clmd->sim_parms->effector_weights) + clmd->sim_parms->effector_weights = newdataadr(fd, clmd->sim_parms->effector_weights); + else + clmd->sim_parms->effector_weights = BKE_add_effector_weights(NULL); } else if (md->type==eModifierType_Fluidsim) { @@ -3948,6 +3973,8 @@ static void direct_link_object(FileData *fd, Object *ob) } ob->pd= newdataadr(fd, ob->pd); + if(ob->pd) + ob->pd->rng=NULL; ob->soft= newdataadr(fd, ob->soft); if(ob->soft) { SoftBody *sb= ob->soft; @@ -3965,6 +3992,11 @@ static void direct_link_object(FileData *fd, Object *ob) } } + if(sb->effector_weights) + sb->effector_weights = newdataadr(fd, sb->effector_weights); + else + sb->effector_weights = BKE_add_effector_weights(NULL); + direct_link_pointcache_list(fd, &sb->ptcaches, &sb->pointcache); } ob->bsoft= newdataadr(fd, ob->bsoft); @@ -9702,6 +9734,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Object *ob; Material *ma; Tex *tex; + ParticleSettings *part; + int do_gravity = 0; for(sce = main->scene.first; sce; sce = sce->id.next) if(sce->unit.scale_length == 0.0f) @@ -9741,6 +9775,48 @@ static void do_versions(FileData *fd, Library *lib, Main *main) sce->audio.doppler_factor = 1.0; sce->audio.speed_of_sound = 343.3; } + + /* Add default gravity to scenes */ + for(sce= main->scene.first; sce; sce= sce->id.next) { + if((sce->physics_settings.flag & PHYS_GLOBAL_GRAVITY) == 0 + && VecLength(sce->physics_settings.gravity) == 0.0f) { + + sce->physics_settings.gravity[0] = sce->physics_settings.gravity[1] = 0.0f; + sce->physics_settings.gravity[2] = -9.81f; + sce->physics_settings.flag = PHYS_GLOBAL_GRAVITY; + do_gravity = 1; + } + } + + /* Assign proper global gravity weights for dynamics (only z-coordinate is taken into account) */ + if(do_gravity) for(part= main->particle.first; part; part= part->id.next) + part->effector_weights->global_gravity = part->acc[2]/-9.81f; + + for(ob = main->object.first; ob; ob = ob->id.next) { + ModifierData *md; + + if(do_gravity) { + for(md= ob->modifiers.first; md; md= md->next) { + ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth); + if(clmd) + clmd->sim_parms->effector_weights->global_gravity = clmd->sim_parms->gravity[2]/-9.81; + } + + if(ob->soft) + ob->soft->effector_weights->global_gravity = ob->soft->grav/9.81; + } + + /* Normal wind shape is plane */ + if(ob->pd) { + if(ob->pd->forcefield == PFIELD_WIND) + ob->pd->shape = PFIELD_SHAPE_PLANE; + + if(ob->pd->flag & PFIELD_PLANAR) + ob->pd->shape = PFIELD_SHAPE_PLANE; + else if(ob->pd->flag & PFIELD_SURFACE) + ob->pd->shape = PFIELD_SHAPE_SURFACE; + } + } } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ |