/* note: does not work for derivedmesh and render... it recreates all again in convertblender.c */ void group_handle_recalc_and_update(Scene *scene, Object *parent, Group *group) { GroupObject *go; /* if animated group... */ if(give_timeoffset(parent) != 0.0f || parent->nlastrips.first) { int cfrao; /* switch to local time */ cfrao= scene->r.cfra; scene->r.cfra -= (int)give_timeoffset(parent); /* we need a DAG per group... */ for(go= group->gobject.first; go; go= go->next) { if(go->ob && go->recalc) { go->ob->recalc= go->recalc; group_replaces_nla(parent, go->ob, 's'); object_handle_update(scene, go->ob); group_replaces_nla(parent, go->ob, 'e'); /* leave recalc tags in case group members are in normal scene */ go->ob->recalc= go->recalc; } } /* restore */ scene->r.cfra= cfrao; } else { /* only do existing tags, as set by regular depsgraph */ for(go= group->gobject.first; go; go= go->next) { if(go->ob) { if(go->ob->recalc) { object_handle_update(scene, go->ob); } } } } }
void draw_uvedit_main(SpaceImage *sima, ARegion *ar, Scene *scene, Object *obedit) { int show_uvedit, show_uvshadow; show_uvedit= ED_space_image_show_uvedit(sima, obedit); show_uvshadow= ED_space_image_show_uvshadow(sima, obedit); if(show_uvedit || show_uvshadow) { /* this is basically the same object_handle_update as in the 3d view, * here we have to do it as well for the object we are editing if we * are displaying the final result */ if(obedit && (sima->flag & SI_DRAWSHADOW)) object_handle_update(scene, obedit); if(show_uvshadow) draw_uvs_shadow(sima, obedit); else draw_uvs(sima, scene, obedit); if(show_uvedit) drawcursor_sima(sima, ar); } }
/* 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 */ 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! */ scene_update_for_newframe(G.main, scene, scene->lay); // XXX this is the best way we can get anything moving #endif }