Complex issue in group duplicators... since they can duplicate entire

animation systems, all transforms of all duplicated group members have
to be set first, before drawing or converting for render. This because
then still deformation can be calculated.
This commit is contained in:
Ton Roosendaal
2006-02-28 20:43:21 +00:00
parent 59aced7a50
commit 3ecee5f154
3 changed files with 38 additions and 7 deletions

View File

@@ -291,6 +291,7 @@ static void new_dupli_object(ListBase *lb, Object *ob, float mat[][4], int lay,
static void group_duplilist(ListBase *lb, Object *ob)
{
DupliObject *dob;
GroupObject *go;
float mat[4][4];
@@ -306,6 +307,10 @@ static void group_duplilist(ListBase *lb, Object *ob)
new_dupli_object(lb, go->ob, mat, ob->lay, 0);
}
}
/* make copy already, because in group dupli's deform displists can be makde, requiring parent matrices */
for(dob= lb->first; dob; dob= dob->next)
Mat4CpyMat4(dob->ob->obmat, dob->mat);
}
static void frames_duplilist(ListBase *lb, Object *ob)
@@ -616,6 +621,7 @@ static void font_duplilist(ListBase *lb, Object *par)
/* ***************************** */
/* note; group dupli's already set transform matrix. see note in group_duplilist() */
ListBase *object_duplilist(Scene *sce, Object *ob)
{
static ListBase duplilist={NULL, NULL};
@@ -652,8 +658,11 @@ void free_object_duplilist(ListBase *lb)
{
DupliObject *dob;
for(dob= lb->first; dob; dob= dob->next)
for(dob= lb->first; dob; dob= dob->next) {
dob->ob->lay= dob->origlay;
Mat4CpyMat4(dob->ob->obmat, dob->omat);
}
BLI_freelistN(lb);
}

View File

@@ -3014,6 +3014,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
for(dob= lb->first; dob; dob= dob->next) {
Object *obd= dob->ob;
Mat4CpyMat4(obd->obmat, dob->mat);
if(obd->type!=OB_MBALL) {
@@ -3030,7 +3031,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
}
else init_render_object(re, obd, ob, dob->index, 0);
}
Mat4CpyMat4(obd->obmat, dob->omat);
if(re->test_break()) break;
}
free_object_duplilist(lb);
@@ -3198,12 +3199,12 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
for(dob= lb->first; dob; dob= dob->next) {
Object *obd= dob->ob;
Mat4CpyMat4(obd->obmat, dob->mat);
if(obd->type!=OB_MBALL) {
init_render_object(re, obd, ob, dob->index, 1);
}
Mat4CpyMat4(obd->obmat, dob->omat);
}
free_object_duplilist(lb);
}

View File

@@ -82,6 +82,7 @@
#include "BKE_curve.h"
#include "BKE_displist.h"
#include "BKE_depsgraph.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_lattice.h"
#include "BKE_library.h"
@@ -2300,6 +2301,7 @@ static void draw_dupli_objects(View3D *v3d, Base *base)
tbase.object= dob->ob;
Mat4CpyMat4(dob->ob->obmat, dob->mat);
/* extra service: draw the duplicator in drawtype of parent */
dt= tbase.object->dt; tbase.object->dt= base->object->dt;
dtx= tbase.object->dtx; tbase.object->dtx= base->object->dtx;
@@ -2307,14 +2309,13 @@ static void draw_dupli_objects(View3D *v3d, Base *base)
BIF_ThemeColorBlend(color, TH_BACK, 0.5);
draw_object(&tbase, DRAW_CONSTCOLOR);
/* restore */
Mat4CpyMat4(dob->ob->obmat, dob->omat);
tbase.object->dt= dt;
tbase.object->dtx= dtx;
}
/* Transp afterdraw disabled, afterdraw only stores base pointers, and duplis can be same obj */
free_object_duplilist(lb);
free_object_duplilist(lb); /* does restore */
}
@@ -2439,6 +2440,26 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
/* update all objects, ipos, matrices, displists, etc. Flags set by depgraph or manual, no layer check here, gets correct flushed */
for(base= G.scene->base.first; base; base= base->next) {
object_handle_update(base->object); // bke_object.h
#if 0
if(v3d->lay & base->lay) {
if(base->object->dup_group) {
GroupObject *go;
for(go= base->object->dup_group->gobject.first; go; go= go->next) {
if(go->ob) {
if(go->ob->type==OB_MESH) {
int dummy;
mesh_get_derived_deform(go->ob, &dummy);
mesh_get_derived_final(go->ob, &dummy);
}
else if(go->ob->type==OB_CURVE) {
cu= ob->data;
if (cu->disp.first==NULL) makeDispListCurveTypes(ob, 0);
}
}
}
}
}
#endif
}
/* then draw not selected and the duplis, but skip editmode object */