[Bf-blender-cvs] [6c1c6f2] master: Removed the omat matrix from DupliObject.

Lukas Tönne noreply at git.blender.org
Thu Jan 23 10:25:09 CET 2014


Commit: 6c1c6f22cea9729c40e02ed45374bad31fbca6dd
Author: Lukas Tönne
Date:   Thu Jan 23 10:20:42 2014 +0100
https://developer.blender.org/rB6c1c6f22cea9729c40e02ed45374bad31fbca6dd

Removed the omat matrix from DupliObject.

This was storing the original object matrix, which builds on the
assumption that obmat is modified during dupli construction, which is a
bad hack.

Now the obmats are still modified, but this only happens outside of the
dupli system itself and the original ("omat") is stored as local
variables in the same place where the obmat manipulation takes place.
This is easier to follow and avoids hidden hacks as much as possible.

Reviewed By: campbellbarton

Differential Revision: https://developer.blender.org/D254

===================================================================

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/object_dupli.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_view.c
M	source/blender/gpu/intern/gpu_material.c
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/makesrna/intern/rna_object.c
M	source/blender/render/intern/source/convertblender.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 4ff1c8b..d19c281 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -83,7 +83,8 @@ void         BKE_scene_base_select(struct Scene *sce, struct Base *selbase);
 typedef struct SceneBaseIter {
 	struct ListBase *duplilist;
 	struct DupliObject *dupob;
-	int fase;
+	float omat[4][4];
+	int phase;
 } SceneBaseIter;
 
 int BKE_scene_base_iter_next(struct EvaluationContext *eval_ctx, struct SceneBaseIter *iter,
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index 41d411b..0671c8e 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -159,7 +159,6 @@ static DupliObject *make_dupli(const DupliContext *ctx,
 
 	dob->ob = ob;
 	mul_m4_m4m4(dob->mat, (float (*)[4])ctx->space_mat, mat);
-	copy_m4_m4(dob->omat, ob->obmat);
 	dob->type = ctx->gen->type;
 	dob->animated = animated || ctx->animated; /* object itself or some parent is animated */
 
@@ -378,7 +377,6 @@ static void make_duplis_frames(const DupliContext *ctx)
 			BKE_object_where_is_calc_time(scene, ob, (float)scene->r.cfra);
 
 			dob = make_dupli(ctx, ob, ob->obmat, scene->r.cfra, false, false);
-			copy_m4_m4(dob->omat, copyob.obmat);
 		}
 	}
 
@@ -839,7 +837,7 @@ static void make_duplis_particle_system(const DupliContext *ctx, ParticleSystem
 	ParticleCacheKey *cache;
 	float ctime, pa_time, scale = 1.0f;
 	float tmat[4][4], mat[4][4], pamat[4][4], vec[3], size = 0.0;
-	float (*obmat)[4], (*oldobmat)[4];
+	float (*obmat)[4];
 	int a, b, hair = 0;
 	int totpart, totchild, totgroup = 0 /*, pa_num */;
 	int dupli_type_hack = !BKE_scene_use_new_shading_nodes(scene);
@@ -993,11 +991,9 @@ static void make_duplis_particle_system(const DupliContext *ctx, ParticleSystem
 
 				ob = oblist[b];
 				obmat = oblist[b]->obmat;
-				oldobmat = obcopylist[b].obmat;
 			}
 			else {
 				obmat = ob->obmat;
-				oldobmat = obcopy.obmat;
 			}
 
 			if (hair) {
@@ -1045,7 +1041,6 @@ static void make_duplis_particle_system(const DupliContext *ctx, ParticleSystem
 
 					dob = make_dupli(ctx, go->ob, mat, a, false, false);
 					dob->particle_system = psys;
-					copy_m4_m4(dob->omat, obcopylist[b].obmat);
 					if (for_render)
 						psys_get_dupli_texture(psys, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
 				}
@@ -1095,7 +1090,6 @@ static void make_duplis_particle_system(const DupliContext *ctx, ParticleSystem
 
 				dob = make_dupli(ctx, ob, mat, a, false, false);
 				dob->particle_system = psys;
-				copy_m4_m4(dob->omat, oldobmat);
 				if (for_render)
 					psys_get_dupli_texture(psys, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
 				/* XXX blender internal needs this to be set to dupligroup to render
@@ -1218,7 +1212,6 @@ void free_object_duplilist(ListBase *lb)
 	 * solution is more complicated */
 	for (dob = lb->last; dob; dob = dob->prev) {
 		dob->ob->lay = dob->origlay;
-		copy_m4_m4(dob->ob->obmat, dob->omat);
 	}
 
 	BLI_freelistN(lb);
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index ca6ff4d..584aab9 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -747,7 +747,7 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter,
 	
 	/* init */
 	if (val == 0) {
-		iter->fase = F_START;
+		iter->phase = F_START;
 		iter->dupob = NULL;
 		iter->duplilist = NULL;
 	}
@@ -757,11 +757,11 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter,
 			run_again = 0;
 
 			/* the first base */
-			if (iter->fase == F_START) {
+			if (iter->phase == F_START) {
 				*base = (*scene)->base.first;
 				if (*base) {
 					*ob = (*base)->object;
-					iter->fase = F_SCENE;
+					iter->phase = F_SCENE;
 				}
 				else {
 					/* exception: empty scene */
@@ -770,20 +770,20 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter,
 						if ((*scene)->base.first) {
 							*base = (*scene)->base.first;
 							*ob = (*base)->object;
-							iter->fase = F_SCENE;
+							iter->phase = F_SCENE;
 							break;
 						}
 					}
 				}
 			}
 			else {
-				if (*base && iter->fase != F_DUPLI) {
+				if (*base && iter->phase != F_DUPLI) {
 					*base = (*base)->next;
 					if (*base) {
 						*ob = (*base)->object;
 					}
 					else {
-						if (iter->fase == F_SCENE) {
+						if (iter->phase == F_SCENE) {
 							/* (*scene) is finished, now do the set */
 							while ((*scene)->set) {
 								(*scene) = (*scene)->set;
@@ -799,10 +799,10 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter,
 			}
 			
 			if (*base == NULL) {
-				iter->fase = F_START;
+				iter->phase = F_START;
 			}
 			else {
-				if (iter->fase != F_DUPLI) {
+				if (iter->phase != F_DUPLI) {
 					if ( (*base)->object->transflag & OB_DUPLI) {
 						/* groups cannot be duplicated for mballs yet, 
 						 * this enters eternal loop because of 
@@ -820,20 +820,21 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter,
 				/* handle dupli's */
 				if (iter->dupob) {
 					
+					copy_m4_m4(iter->omat, iter->dupob->ob->obmat);
 					copy_m4_m4(iter->dupob->ob->obmat, iter->dupob->mat);
 					
 					(*base)->flag |= OB_FROMDUPLI;
 					*ob = iter->dupob->ob;
-					iter->fase = F_DUPLI;
+					iter->phase = F_DUPLI;
 					
 					iter->dupob = iter->dupob->next;
 				}
-				else if (iter->fase == F_DUPLI) {
-					iter->fase = F_SCENE;
+				else if (iter->phase == F_DUPLI) {
+					iter->phase = F_SCENE;
 					(*base)->flag &= ~OB_FROMDUPLI;
 					
 					for (iter->dupob = iter->duplilist->first; iter->dupob; iter->dupob = iter->dupob->next) {
-						copy_m4_m4(iter->dupob->ob->obmat, iter->dupob->omat);
+						copy_m4_m4(iter->dupob->ob->obmat, iter->omat);
 					}
 					
 					free_object_duplilist(iter->duplilist);
@@ -850,7 +851,7 @@ int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter,
 	}
 #endif
 
-	return iter->fase;
+	return iter->phase;
 }
 
 Object *BKE_scene_camera_find(Scene *sc)
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 2325280..ad5f393 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -1960,6 +1960,7 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas
 	RegionView3D *rv3d = ar->regiondata;
 	ListBase *lb;
 	LodLevel *savedlod;
+	float savedobmat[4][4];
 	DupliObject *dob_prev = NULL, *dob, *dob_next = NULL;
 	Base tbase = {NULL};
 	BoundBox bb, *bb_tmp; /* use a copy because draw_object, calls clear_mesh_caches */
@@ -1982,6 +1983,7 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas
 
 		/* Make sure lod is updated from dupli's position */
 
+		copy_m4_m4(savedobmat, dob->ob->obmat);
 		copy_m4_m4(dob->ob->obmat, dob->mat);
 		savedlod = dob->ob->currentlod;
 		BKE_object_lod_update(dob->ob, rv3d->viewinv[3]);
@@ -2069,11 +2071,12 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas
 		tbase.object->dtx = dtx;
 		tbase.object->transflag = transflag;
 		tbase.object->currentlod = savedlod;
+		copy_m4_m4(tbase.object->obmat, savedobmat);
 	}
 	
 	/* Transp afterdraw disabled, afterdraw only stores base pointers, and duplis can be same obj */
 	
-	free_object_duplilist(lb);  /* does restore */
+	free_object_duplilist(lb);
 	
 	if (use_displist)
 		glDeleteLists(displist, 1);
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index dcbcb12..595e6dd 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -987,7 +987,10 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
 						lb = object_duplilist(G.main->eval_ctx, scene, base->object);
 						
 						for (dob = lb->first; dob; dob = dob->next) {
+							float omat[4][4];
+							
 							tbase.object = dob->ob;
+							copy_m4_m4(omat, dob->ob->obmat);
 							copy_m4_m4(dob->ob->obmat, dob->mat);
 							
 							/* extra service: draw the duplicator in drawtype of parent */
@@ -1000,7 +1003,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
 							tbase.object->dt = dt;
 							tbase.object->dtx = dtx;
 
-							copy_m4_m4(dob->ob->obmat, dob->omat);
+							copy_m4_m4(dob->ob->obmat, omat);
 						}
 						free_object_duplilist(lb);
 					}
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index a425153..7c67e61 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -859,11 +859,15 @@ static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
 				Object *ob_iter = dob->ob;
 
 				if (ob_iter->type==OB_LAMP) {
+					float omat[4][4];
+					copy_m4_m4(omat, ob_iter->obmat);
 					copy_m4_m4(ob_iter->obmat, dob->mat);
 
 					lamp = GPU_lamp_from_blender(shi->gpumat->scene, ob_iter, ob);
 					if (lamp)
 						shade_one_light(shi, shr, lamp);
+
+					copy_m4_m4(ob_iter->obmat, omat);
 				}
 			}
 			
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 782d00f..1f18b05 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -317,7 +317,7 @@ typedef struct DupliObject {
 	struct DupliObject *next, *prev;
 	struct Object *ob;
 	unsigned int origlay, pad;
-	float mat[4][4], omat[4][4];
+	float mat[4][4];
 	float orco[3], uv[2];
 
 	short type; /* from Object.transflag */
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index d82fe46..41f34f0 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -2771,12 +2771,6 @@ static void rna_def_dupli_object(BlenderRNA *brna)
 	/* RNA_def_property_pointer_funcs(prop, "rna_DupliOb

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list