Animated groups, being linked and dupli-grouped in other file, didn't
correctly calculate particles inside the group.
This commit is contained in:
Ton Roosendaal
2006-06-17 15:14:43 +00:00
parent 06bf1cddec
commit e7af9c4839
2 changed files with 101 additions and 46 deletions

View File

@@ -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;
}
}
}
}

View File

@@ -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;
}