Fix for multiple modifier stack calculations per frame.
Since 2.5x blender has been using CD_MASK_BAREMESH for updating objects since object_handle_update() no longer has access to G.curscreen to calculate the mask from viewports. The problem with this is after an initial calculation, CD_MASK_MTFACE may be required on draw, so it would recalculate the modifier stack multiple times per frame. One case which caused this is armature animated mesh with texface in a dupligroup. Fix this by having customdata_mask member in the scene, this isn't great design but at least fixes the bug and only changes a few files.
This commit is contained in:
@@ -2550,12 +2550,12 @@ void object_handle_update(Scene *scene, Object *ob)
|
|||||||
case OB_MESH:
|
case OB_MESH:
|
||||||
{
|
{
|
||||||
EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
|
EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
|
||||||
// here was vieweditdatamask? XXX
|
BKE_assert((scene->customdata_mask & CD_MASK_BAREMESH) == CD_MASK_BAREMESH);
|
||||||
if(em) {
|
if(em) {
|
||||||
makeDerivedMesh(scene, ob, em, CD_MASK_BAREMESH);
|
makeDerivedMesh(scene, ob, em, scene->customdata_mask); /* was CD_MASK_BAREMESH */
|
||||||
BKE_mesh_end_editmesh(ob->data, em);
|
BKE_mesh_end_editmesh(ob->data, em);
|
||||||
} else
|
} else
|
||||||
makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH);
|
makeDerivedMesh(scene, ob, NULL, scene->customdata_mask);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -946,6 +946,7 @@ float BKE_curframe(Scene *scene)
|
|||||||
static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scene_parent)
|
static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scene_parent)
|
||||||
{
|
{
|
||||||
Base *base;
|
Base *base;
|
||||||
|
scene->customdata_mask= scene_parent->customdata_mask;
|
||||||
|
|
||||||
/* sets first, we allow per definition current scene to have
|
/* sets first, we allow per definition current scene to have
|
||||||
dependencies on sets, but not the other way around. */
|
dependencies on sets, but not the other way around. */
|
||||||
|
|||||||
@@ -170,5 +170,7 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int
|
|||||||
Base *ED_view3d_give_base_under_cursor(struct bContext *C, short *mval);
|
Base *ED_view3d_give_base_under_cursor(struct bContext *C, short *mval);
|
||||||
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, short do_clip);
|
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, short do_clip);
|
||||||
|
|
||||||
|
unsigned int ED_viewedit_datamask(struct bScreen *screen);
|
||||||
|
|
||||||
#endif /* ED_VIEW3D_H */
|
#endif /* ED_VIEW3D_H */
|
||||||
|
|
||||||
|
|||||||
@@ -1950,8 +1950,10 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
|
|||||||
/* *********************** customdata **************** */
|
/* *********************** customdata **************** */
|
||||||
|
|
||||||
/* goes over all modes and view3d settings */
|
/* goes over all modes and view3d settings */
|
||||||
static CustomDataMask get_viewedit_datamask(bScreen *screen, Scene *scene, Object *ob)
|
CustomDataMask ED_viewedit_datamask(bScreen *screen)
|
||||||
{
|
{
|
||||||
|
Scene *scene= screen->scene;
|
||||||
|
Object *ob= scene->basact ? scene->basact->object : NULL;
|
||||||
CustomDataMask mask = CD_MASK_BAREMESH;
|
CustomDataMask mask = CD_MASK_BAREMESH;
|
||||||
ScrArea *sa;
|
ScrArea *sa;
|
||||||
|
|
||||||
@@ -2301,11 +2303,10 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
|||||||
Object *ob;
|
Object *ob;
|
||||||
float backcol[3];
|
float backcol[3];
|
||||||
unsigned int lay_used;
|
unsigned int lay_used;
|
||||||
Object *obact = OBACT;
|
|
||||||
const char *grid_unit= NULL;
|
const char *grid_unit= NULL;
|
||||||
|
|
||||||
/* from now on all object derived meshes check this */
|
/* from now on all object derived meshes check this */
|
||||||
v3d->customdata_mask= get_viewedit_datamask(CTX_wm_screen(C), scene, obact);
|
v3d->customdata_mask= scene->customdata_mask;
|
||||||
|
|
||||||
/* shadow buffers, before we setup matrices */
|
/* shadow buffers, before we setup matrices */
|
||||||
if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
|
if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
|
||||||
|
|||||||
@@ -773,7 +773,7 @@ typedef struct Scene {
|
|||||||
|
|
||||||
unsigned int lay; /* bitflags for layer visibility */
|
unsigned int lay; /* bitflags for layer visibility */
|
||||||
int layact; /* active layer */
|
int layact; /* active layer */
|
||||||
int pad1;
|
unsigned int customdata_mask; /* XXX. runtime flag for drawing, actually belongs in the window, only used by object_handle_update() */
|
||||||
|
|
||||||
short flag; /* various settings */
|
short flag; /* various settings */
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
#include "ED_fileselect.h"
|
#include "ED_fileselect.h"
|
||||||
#include "ED_info.h"
|
#include "ED_info.h"
|
||||||
#include "ED_screen.h"
|
#include "ED_screen.h"
|
||||||
|
#include "ED_view3d.h"
|
||||||
#include "ED_util.h"
|
#include "ED_util.h"
|
||||||
|
|
||||||
#include "RNA_access.h"
|
#include "RNA_access.h"
|
||||||
@@ -296,6 +297,10 @@ void wm_event_do_notifiers(bContext *C)
|
|||||||
/* XXX make lock in future, or separated derivedmesh users in scene */
|
/* XXX make lock in future, or separated derivedmesh users in scene */
|
||||||
if(!G.rendering)
|
if(!G.rendering)
|
||||||
/* depsgraph & animation: update tagged datablocks */
|
/* depsgraph & animation: update tagged datablocks */
|
||||||
|
|
||||||
|
/* copied to set's in scene_update_tagged_recursive() */
|
||||||
|
win->screen->scene->customdata_mask= ED_viewedit_datamask(win->screen);
|
||||||
|
|
||||||
scene_update_tagged(CTX_data_main(C), win->screen->scene);
|
scene_update_tagged(CTX_data_main(C), win->screen->scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user