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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user