static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scene_parent) { Base *base; scene->customdata_mask = scene_parent->customdata_mask; /* sets first, we allow per definition current scene to have * dependencies on sets, but not the other way around. */ if (scene->set) scene_update_tagged_recursive(bmain, scene->set, scene_parent); /* scene objects */ for (base = scene->base.first; base; base = base->next) { Object *ob = base->object; BKE_object_handle_update(scene_parent, ob); if (ob->dup_group && (ob->transflag & OB_DUPLIGROUP)) group_handle_recalc_and_update(scene_parent, ob, ob->dup_group); /* always update layer, so that animating layers works */ base->lay = ob->lay; } /* scene drivers... */ scene_update_drivers(bmain, scene); /* update sound system animation */ sound_update_scene(scene); }
/* deps hack - do extra recalcs at end */ static void scene_depsgraph_hack(Scene *scene, Scene *scene_parent) { Base *base; scene->customdata_mask = scene_parent->customdata_mask; /* sets first, we allow per definition current scene to have * dependencies on sets, but not the other way around. */ if (scene->set) scene_depsgraph_hack(scene->set, scene_parent); for (base = scene->base.first; base; base = base->next) { Object *ob = base->object; if (ob->depsflag) { int recalc = 0; // printf("depshack %s\n", ob->id.name + 2); if (ob->depsflag & OB_DEPS_EXTRA_OB_RECALC) recalc |= OB_RECALC_OB; if (ob->depsflag & OB_DEPS_EXTRA_DATA_RECALC) recalc |= OB_RECALC_DATA; ob->recalc |= recalc; BKE_object_handle_update(scene_parent, ob); if (ob->dup_group && (ob->transflag & OB_DUPLIGROUP)) { GroupObject *go; for (go = ob->dup_group->gobject.first; go; go = go->next) { if (go->ob) go->ob->recalc |= recalc; } BKE_group_handle_recalc_and_update(scene_parent, ob, ob->dup_group); } } } }
/* update scene for current frame */ static void motionpaths_calc_update_scene(Scene *scene) { #if 1 // 'production' optimisations always on Base *base, *last = NULL; /* only stuff that moves or needs display still */ DAG_scene_update_flags(G.main, scene, scene->lay, TRUE); /* find the last object with the tag * - all those afterwards are assumed to not be relevant for our calculations */ // optimize further by moving out... for (base = scene->base.first; base; base = base->next) { if (base->object->flag & BA_TEMP_TAG) last = base; } /* perform updates for tagged objects */ // XXX: this will break if rigs depend on scene or other data that // is animated but not attached to/updatable from objects for (base = scene->base.first; base; base = base->next) { /* update this object */ BKE_object_handle_update(scene, base->object); /* if this is the last one we need to update, let's stop to save some time */ if (base == last) break; } #else // original, 'always correct' version /* do all updates * - if this is too slow, resort to using a more efficient way * that doesn't force complete update, but for now, this is the * most accurate way! */ BKE_scene_update_for_newframe(G.main, scene, scene->lay); // XXX this is the best way we can get anything moving #endif }
static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scene_parent) { Base *base; scene->customdata_mask = scene_parent->customdata_mask; /* sets first, we allow per definition current scene to have * dependencies on sets, but not the other way around. */ if (scene->set) scene_update_tagged_recursive(bmain, scene->set, scene_parent); /* scene objects */ for (base = scene->base.first; base; base = base->next) { Object *ob = base->object; BKE_object_handle_update(scene_parent, ob); if (ob->dup_group && (ob->transflag & OB_DUPLIGROUP)) group_handle_recalc_and_update(scene_parent, ob, ob->dup_group); /* always update layer, so that animating layers works (joshua july 2010) */ /* XXX commented out, this has depsgraph issues anyway - and this breaks setting scenes * (on scene-set, the base-lay is copied to ob-lay (ton nov 2012) */ // base->lay = ob->lay; } /* scene drivers... */ scene_update_drivers(bmain, scene); /* update sound system animation */ sound_update_scene(scene); /* update masking curves */ BKE_mask_update_scene(bmain, scene, FALSE); }
void applyGridAbsolute(TransInfo *t) { float grid_size = 0.0f; GearsType grid_action; TransData *td; float (*obmat)[4] = NULL; bool use_obmat = false; int i; if (!(activeSnap(t) && (ELEM(t->tsnap.mode, SCE_SNAP_MODE_INCREMENT, SCE_SNAP_MODE_GRID)))) return; grid_action = BIG_GEARS; if (t->modifiers & MOD_PRECISION) grid_action = SMALL_GEARS; switch (grid_action) { case NO_GEARS: grid_size = t->snap_spatial[0]; break; case BIG_GEARS: grid_size = t->snap_spatial[1]; break; case SMALL_GEARS: grid_size = t->snap_spatial[2]; break; } /* early exit on unusable grid size */ if (grid_size == 0.0f) return; if (t->flag & (T_EDIT | T_POSE)) { Object *ob = t->obedit ? t->obedit : t->poseobj; obmat = ob->obmat; use_obmat = true; } for (i = 0, td = t->data; i < t->total; i++, td++) { float iloc[3], loc[3], tvec[3]; if (td->flag & TD_NOACTION) break; if (td->flag & TD_SKIP) continue; if ((t->flag & T_PROP_EDIT) && (td->factor == 0.0f)) continue; copy_v3_v3(iloc, td->loc); if (use_obmat) { mul_m4_v3(obmat, iloc); } else if (t->flag & T_OBJECT) { td->ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME; BKE_object_handle_update(G.main->eval_ctx, t->scene, td->ob); copy_v3_v3(iloc, td->ob->obmat[3]); } mul_v3_v3fl(loc, iloc, 1.0f / grid_size); loc[0] = roundf(loc[0]); loc[1] = roundf(loc[1]); loc[2] = roundf(loc[2]); mul_v3_fl(loc, grid_size); sub_v3_v3v3(tvec, loc, iloc); mul_m3_v3(td->smtx, tvec); add_v3_v3(td->loc, tvec); } }
void applyProject(TransInfo *t) { /* XXX FLICKER IN OBJECT MODE */ if ((t->tsnap.project) && activeSnap(t) && (t->flag & T_NO_PROJECT) == 0) { TransData *td = t->data; float tvec[3]; float imat[4][4]; int i; if (t->flag & (T_EDIT | T_POSE)) { Object *ob = t->obedit ? t->obedit : t->poseobj; invert_m4_m4(imat, ob->obmat); } for (i = 0; i < t->total; i++, td++) { float iloc[3], loc[3], no[3]; float mval_fl[2]; float dist_px = TRANSFORM_DIST_MAX_PX; if (td->flag & TD_NOACTION) break; if (td->flag & TD_SKIP) continue; if ((t->flag & T_PROP_EDIT) && (td->factor == 0.0f)) continue; copy_v3_v3(iloc, td->loc); if (t->flag & (T_EDIT | T_POSE)) { Object *ob = t->obedit ? t->obedit : t->poseobj; mul_m4_v3(ob->obmat, iloc); } else if (t->flag & T_OBJECT) { /* TODO(sergey): Ideally force update is not needed here. */ td->ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME; BKE_object_handle_update(G.main->eval_ctx, t->scene, td->ob); copy_v3_v3(iloc, td->ob->obmat[3]); } if (ED_view3d_project_float_global(t->ar, iloc, mval_fl, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) { if (snapObjectsTransform( t, mval_fl, &dist_px, loc, no)) { // if (t->flag & (T_EDIT|T_POSE)) { // mul_m4_v3(imat, loc); // } sub_v3_v3v3(tvec, loc, iloc); mul_m3_v3(td->smtx, tvec); add_v3_v3(td->loc, tvec); if (t->tsnap.align && (t->flag & T_OBJECT)) { /* handle alignment as well */ const float *original_normal; float mat[3][3]; /* In pose mode, we want to align normals with Y axis of bones... */ original_normal = td->axismtx[2]; rotation_between_vecs_to_mat3(mat, original_normal, no); transform_data_ext_rotate(td, mat, true); /* TODO support constraints for rotation too? see ElementRotation */ } } } //XXX constraintTransLim(t, td); } } }