Revision: 33869
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33869
Author:   campbellbarton
Date:     2010-12-23 05:16:31 +0100 (Thu, 23 Dec 2010)

Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c     2010-12-23 
02:43:40 UTC (rev 33868)
+++ trunk/blender/source/blender/blenkernel/intern/object.c     2010-12-23 
04:16:31 UTC (rev 33869)
@@ -2550,12 +2550,12 @@
                        case OB_MESH:
                                {
                                        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) {
-                                               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);
                                        } else
-                                               makeDerivedMesh(scene, ob, 
NULL, CD_MASK_BAREMESH);
+                                               makeDerivedMesh(scene, ob, 
NULL, scene->customdata_mask);
                                }
                                break;
 

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c      2010-12-23 
02:43:40 UTC (rev 33868)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c      2010-12-23 
04:16:31 UTC (rev 33869)
@@ -946,6 +946,7 @@
 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. */

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h    2010-12-23 
02:43:40 UTC (rev 33868)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h    2010-12-23 
04:16:31 UTC (rev 33869)
@@ -170,5 +170,7 @@
 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);
 
+unsigned int ED_viewedit_datamask(struct bScreen *screen);
+
 #endif /* ED_VIEW3D_H */
 

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c     
2010-12-23 02:43:40 UTC (rev 33868)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c     
2010-12-23 04:16:31 UTC (rev 33869)
@@ -1950,8 +1950,10 @@
 /* *********************** customdata **************** */
 
 /* 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;
        ScrArea *sa;
        
@@ -2301,11 +2303,10 @@
        Object *ob;
        float backcol[3];
        unsigned int lay_used;
-       Object *obact = OBACT;
        const char *grid_unit= NULL;
 
        /* 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 */
        if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h     2010-12-23 
02:43:40 UTC (rev 33868)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h     2010-12-23 
04:16:31 UTC (rev 33869)
@@ -773,7 +773,7 @@
        
        unsigned int lay;                       /* bitflags for layer 
visibility */
        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 */
        

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 
2010-12-23 02:43:40 UTC (rev 33868)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 
2010-12-23 04:16:31 UTC (rev 33869)
@@ -56,6 +56,7 @@
 #include "ED_fileselect.h"
 #include "ED_info.h"
 #include "ED_screen.h"
+#include "ED_view3d.h"
 #include "ED_util.h"
 
 #include "RNA_access.h"
@@ -296,6 +297,10 @@
                /* XXX make lock in future, or separated derivedmesh users in 
scene */
                if(!G.rendering)
                        /* 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);
        }
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to