[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30088] trunk/blender/source/blender/ blenkernel/intern/depsgraph.c: Fix #21540: depsgraph problem on load, meshes on non-visible layers
Brecht Van Lommel
brecht at blender.org
Wed Jul 7 19:08:20 CEST 2010
Revision: 30088
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30088
Author: blendix
Date: 2010-07-07 19:08:20 +0200 (Wed, 07 Jul 2010)
Log Message:
-----------
Fix #21540: depsgraph problem on load, meshes on non-visible layers
were not created when objects on visible layers depended on them, now
it uses the flushed layer to determine if the object data should be
recalculated.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/depsgraph.c
Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c 2010-07-07 16:37:41 UTC (rev 30087)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c 2010-07-07 17:08:20 UTC (rev 30088)
@@ -1877,26 +1877,19 @@
}
}
-/* flushes all recalc flags in objects down the dependency tree */
-void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
+/* flush layer flags to dependencies */
+static void dag_scene_flush_layers(Scene *sce, int lay)
{
- DagNode *firstnode, *node;
+ DagNode *node, *firstnode;
DagAdjList *itA;
- Object *ob;
Base *base;
int lasttime;
-
- if(sce->theDag==NULL) {
- printf("DAG zero... not allowed to happen!\n");
- DAG_scene_sort(sce);
- }
-
+
firstnode= sce->theDag->DagNode.first; // always scene node
for(itA = firstnode->child; itA; itA= itA->next)
itA->lay= 0;
-
- /* first we flush the layer flags */
+
sce->theDag->time++; // so we know which nodes were accessed
lasttime= sce->theDag->time;
@@ -1930,7 +1923,26 @@
for(itA = firstnode->child; itA; itA= itA->next)
if(itA->node->lasttime!=lasttime && itA->node->type==ID_OB)
flush_layer_node(sce, itA->node, lasttime);
+}
+
+/* flushes all recalc flags in objects down the dependency tree */
+void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
+{
+ DagNode *firstnode;
+ DagAdjList *itA;
+ Object *ob;
+ int lasttime;
+ if(sce->theDag==NULL) {
+ printf("DAG zero... not allowed to happen!\n");
+ DAG_scene_sort(sce);
+ }
+
+ firstnode= sce->theDag->DagNode.first; // always scene node
+
+ /* first we flush the layer flags */
+ dag_scene_flush_layers(sce, lay);
+
/* then we use the relationships + layer info to flush update events */
sce->theDag->time++; // so we know which nodes were accessed
lasttime= sce->theDag->time;
@@ -2231,7 +2243,8 @@
Object *ob;
Group *group;
GroupObject *go;
- unsigned int lay;
+ DagNode *node;
+ unsigned int lay, oblay;
dag_current_scene_layers(bmain, &scene, &lay);
@@ -2240,10 +2253,14 @@
remade, tag them so they get remade in the scene update loop,
note armature poses or object matrices are preserved and do not
require updates, so we skip those */
+ dag_scene_flush_layers(scene, lay);
+
for(SETLOOPER(scene, base)) {
ob= base->object;
+ node= (sce->theDag)? dag_get_node(sce->theDag, ob): NULL;
+ oblay= (node)? node->lay: ob->lay;
- if(base->lay & lay) {
+ if(oblay & lay) {
if(ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
ob->recalc |= OB_RECALC_DATA;
if(ob->dup_group)
More information about the Bf-blender-cvs
mailing list