Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-06-17 19:14:43 +0400
committerTon Roosendaal <ton@blender.org>2006-06-17 19:14:43 +0400
commite7af9c48398ad0f03994ccedddbc372263c8e011 (patch)
treef9af89fb3c9ed0792edec8dd06d8db904326e942 /source
parent06bf1cddeca3f4c7d9504439c9b0ef2e00fab32e (diff)
Bug #4348
Animated groups, being linked and dupli-grouped in other file, didn't correctly calculate particles inside the group.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c51
-rw-r--r--source/blender/blenkernel/intern/effect.c96
2 files changed, 101 insertions, 46 deletions
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index dbe0ce14040..2a177207a87 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -65,6 +65,7 @@
#include "BKE_action.h"
#include "BKE_effect.h"
#include "BKE_global.h"
+#include "BKE_group.h"
#include "BKE_key.h"
#include "BKE_main.h"
#include "BKE_mball.h"
@@ -1209,7 +1210,7 @@ struct DagNodeQueue *get_all_childs(struct DagForest *dag, void *ob)
time = 1;
- node = dag_find_node(dag,ob); // could be done in loop above (ton)
+ node = dag_find_node(dag, ob); // could be done in loop above (ton)
if(node) { // can be null for newly added objects
node->color = DAG_GRAY;
@@ -1253,7 +1254,7 @@ short are_obs_related(struct DagForest *dag, void *ob1, void *ob2) {
DagNode * node;
DagAdjList *itA;
- node = dag_find_node(dag,ob1);
+ node = dag_find_node(dag, ob1);
itA = node->child;
while(itA != NULL) {
@@ -1881,24 +1882,38 @@ void DAG_object_update_flags(Scene *sce, Object *ob, unsigned int lay)
for(node = sce->theDag->DagNode.first; node; node= node->next)
node->color = DAG_WHITE;
- node = dag_get_node(sce->theDag, ob);
- node->color = DAG_GRAY;
+ node= dag_find_node(sce->theDag, ob);
- sce->theDag->time++;
- node= sce->theDag->DagNode.first;
- for(itA = node->child; itA; itA= itA->next) {
- if(itA->node->type==ID_OB && itA->node->lasttime!=sce->theDag->time)
- itA->node->color= parent_check_node(itA->node, sce->theDag->time);
+ /* object not in scene? then handle group exception. needs to be dagged once too */
+ if(node==NULL) {
+ Group *group= find_group(ob);
+ if(group) {
+ GroupObject *go;
+ /* primitive; tag all... this call helps building groups for particles */
+ for(go= group->gobject.first; go; go= go->next)
+ go->ob->recalc= OB_RECALC;
+ }
}
-
- /* set recalcs and flushes */
- DAG_scene_update_flags(sce, lay);
-
- /* now we clear recalcs, unless color is set */
- for(node = sce->theDag->DagNode.first; node; node= node->next) {
- if(node->type==ID_OB && node->color==DAG_WHITE) {
- Object *ob= node->ob;
- ob->recalc= 0;
+ else {
+
+ node->color = DAG_GRAY;
+
+ sce->theDag->time++;
+ node= sce->theDag->DagNode.first;
+ for(itA = node->child; itA; itA= itA->next) {
+ if(itA->node->type==ID_OB && itA->node->lasttime!=sce->theDag->time)
+ itA->node->color= parent_check_node(itA->node, sce->theDag->time);
+ }
+
+ /* set recalcs and flushes */
+ DAG_scene_update_flags(sce, lay);
+
+ /* now we clear recalcs, unless color is set */
+ for(node = sce->theDag->DagNode.first; node; node= node->next) {
+ if(node->type==ID_OB && node->color==DAG_WHITE) {
+ Object *ob= node->ob;
+ ob->recalc= 0;
+ }
}
}
}
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 853e7ba6eac..0dc7a5d5c2a 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -74,6 +74,7 @@
#include "BKE_DerivedMesh.h"
#include "BKE_effect.h"
#include "BKE_global.h"
+#include "BKE_group.h"
#include "BKE_ipo.h"
#include "BKE_key.h"
#include "BKE_lattice.h"
@@ -81,6 +82,7 @@
#include "BKE_material.h"
#include "BKE_main.h"
#include "BKE_object.h"
+#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -1528,10 +1530,15 @@ typedef struct pMatrixCache {
static pMatrixCache *cache_object_matrices(Object *ob, int start, int end)
{
pMatrixCache *mcache, *mc;
+ Group *group= NULL;
Object *obcopy;
Base *base;
float framelenold, cfrao;
+ /* object can be linked in group... stupid exception */
+ if(NULL==object_in_scene(ob, G.scene))
+ group= find_group(ob);
+
mcache= mc= MEM_mallocN( (end-start+1)*sizeof(pMatrixCache), "ob matrix cache");
framelenold= G.scene->r.framelen;
@@ -1543,25 +1550,42 @@ static pMatrixCache *cache_object_matrices(Object *ob, int start, int end)
for(obcopy= G.main->object.first; obcopy; obcopy= obcopy->id.next)
obcopy->id.newid= NULL;
- /* all objects get tagged recalc that influence this object */
+ /* all objects get tagged recalc that influence this object (does group too) */
DAG_object_update_flags(G.scene, ob, G.scene->lay);
for(G.scene->r.cfra= start; G.scene->r.cfra<=end; G.scene->r.cfra++, mc++) {
- for(base= G.scene->base.first; base; base= base->next) {
- if(base->object->recalc) {
- if(base->object->id.newid==NULL)
- base->object->id.newid= MEM_dupallocN(base->object);
-
- where_is_object(base->object);
-
- do_ob_key(base->object);
- if(base->object->type==OB_ARMATURE) {
- do_all_pose_actions(base->object); // only does this object actions
- where_is_pose(base->object);
+
+ if(group) {
+ GroupObject *go;
+
+ for(go= group->gobject.first; go; go= go->next) {
+ if(go->ob->recalc) {
+ where_is_object(go->ob);
+
+ do_ob_key(go->ob);
+ if(go->ob->type==OB_ARMATURE) {
+ do_all_pose_actions(go->ob); // only does this object actions
+ where_is_pose(go->ob);
+ }
}
}
}
-
+ else {
+ for(base= G.scene->base.first; base; base= base->next) {
+ if(base->object->recalc) {
+ if(base->object->id.newid==NULL)
+ base->object->id.newid= MEM_dupallocN(base->object);
+
+ where_is_object(base->object);
+
+ do_ob_key(base->object);
+ if(base->object->type==OB_ARMATURE) {
+ do_all_pose_actions(base->object); // only does this object actions
+ where_is_pose(base->object);
+ }
+ }
+ }
+ }
Mat4CpyMat4(mc->obmat, ob->obmat);
Mat4Invert(ob->imat, ob->obmat);
Mat3CpyMat4(mc->imat, ob->imat);
@@ -1572,24 +1596,40 @@ static pMatrixCache *cache_object_matrices(Object *ob, int start, int end)
G.scene->r.cfra= cfrao;
G.scene->r.framelen= framelenold;
- for(base= G.scene->base.first; base; base= base->next) {
- if(base->object->recalc) {
-
- if(base->object->id.newid) {
- obcopy= (Object *)base->object->id.newid;
- *(base->object) = *(obcopy);
- MEM_freeN(obcopy);
- base->object->id.newid= NULL;
- }
-
- do_ob_key(base->object);
- if(base->object->type==OB_ARMATURE) {
- do_all_pose_actions(base->object); // only does this object actions
- where_is_pose(base->object);
+ if(group) {
+ GroupObject *go;
+
+ for(go= group->gobject.first; go; go= go->next) {
+ if(go->ob->recalc) {
+ where_is_object(go->ob);
+
+ do_ob_key(go->ob);
+ if(go->ob->type==OB_ARMATURE) {
+ do_all_pose_actions(go->ob); // only does this object actions
+ where_is_pose(go->ob);
+ }
}
}
}
-
+ else {
+ for(base= G.scene->base.first; base; base= base->next) {
+ if(base->object->recalc) {
+
+ if(base->object->id.newid) {
+ obcopy= (Object *)base->object->id.newid;
+ *(base->object) = *(obcopy);
+ MEM_freeN(obcopy);
+ base->object->id.newid= NULL;
+ }
+
+ do_ob_key(base->object);
+ if(base->object->type==OB_ARMATURE) {
+ do_all_pose_actions(base->object); // only does this object actions
+ where_is_pose(base->object);
+ }
+ }
+ }
+ }
return mcache;
}