[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54122] trunk/blender/source/blender: Fix drivers and shape keys not handling subframes / frame mapping properly .

Brecht Van Lommel brechtvanlommel at pandora.be
Sun Jan 27 17:45:01 CET 2013


Revision: 54122
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54122
Author:   blendix
Date:     2013-01-27 16:45:00 +0000 (Sun, 27 Jan 2013)
Log Message:
-----------
Fix drivers and shape keys not handling subframes / frame mapping properly.

Change Scene.frame_set so that it ensures subframe in range [0,1[ as Blender
expects, otherwise some things like physics point cache lookups don't get
evaluated properly.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/makesrna/intern/rna_scene_api.c

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c	2013-01-27 15:12:52 UTC (rev 54121)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2013-01-27 16:45:00 UTC (rev 54122)
@@ -2258,7 +2258,7 @@
 {
 	bActionModifier *amod;
 	bActionStrip *strip, *strip2;
-	float scene_cfra = (float)scene->r.cfra;
+	float scene_cfra = BKE_scene_frame_get(scene);
 	int do_modif;
 
 	for (strip = armob->nlastrips.first; strip; strip = strip->next) {

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2013-01-27 15:12:52 UTC (rev 54121)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2013-01-27 16:45:00 UTC (rev 54122)
@@ -1065,7 +1065,7 @@
 	if (key->slurph && key->type != KEY_RELATIVE) {
 		const float ctime_scaled = key->ctime / 100.0f;
 		float delta = (float)key->slurph / tot;
-		float cfra = (float)scene->r.cfra + scene->r.subframe;
+		float cfra = BKE_scene_frame_get(scene);
 		int step, a;
 
 		if (tot > 100 && slurph_opt) {
@@ -1163,7 +1163,7 @@
 	if (key->slurph && key->type != KEY_RELATIVE) {
 		const float ctime_scaled = key->ctime / 100.0f;
 		float delta = (float)key->slurph / tot;
-		float cfra = (float)scene->r.cfra + scene->r.subframe;
+		float cfra = BKE_scene_frame_get(scene);
 		Nurb *nu;
 		int i = 0, remain = 0;
 		int step, a;
@@ -1245,7 +1245,7 @@
 	if (key->slurph && key->type != KEY_RELATIVE) {
 		const float ctime_scaled = key->ctime / 100.0f;
 		float delta = (float)key->slurph / tot;
-		float cfra = (float)scene->r.cfra + scene->r.subframe;
+		float cfra = BKE_scene_frame_get(scene);
 		int a;
 
 		for (a = 0; a < tot; a++, cfra += delta) {
@@ -1360,7 +1360,7 @@
 	}
 	else {
 		/* do shapekey local drivers */
-		float ctime = (float)scene->r.cfra + scene->r.subframe;
+		float ctime = BKE_scene_frame_get(scene);
 
 		BKE_animsys_evaluate_animdata(scene, &key->id, key->adt, ctime, ADT_RECALC_DRIVERS);
 		

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2013-01-27 15:12:52 UTC (rev 54121)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2013-01-27 16:45:00 UTC (rev 54122)
@@ -1808,7 +1808,7 @@
 		CLAMP(ctime, 0.0f, 1.0f);
 	}
 	else {
-		ctime = scene->r.cfra;
+		ctime = BKE_scene_frame_get(scene);
 		if (IS_EQF(cu->pathlen, 0.0f) == 0)
 			ctime /= cu->pathlen;
 		
@@ -2187,7 +2187,7 @@
 
 void BKE_object_where_is_calc(struct Scene *scene, Object *ob)
 {
-	BKE_object_where_is_calc_time(scene, ob, (float)scene->r.cfra);
+	BKE_object_where_is_calc_time(scene, ob, BKE_scene_frame_get(scene));
 }
 
 void BKE_object_where_is_calc_simul(Scene *scene, Object *ob)
@@ -2226,7 +2226,7 @@
 		bConstraintOb *cob;
 		
 		cob = BKE_constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
-		BKE_solve_constraints(&ob->constraints, cob, (float)scene->r.cfra);
+		BKE_solve_constraints(&ob->constraints, cob, BKE_scene_frame_get(scene));
 		BKE_constraints_clear_evalob(cob);
 	}
 }
@@ -2670,7 +2670,7 @@
 		if (ob->recalc & OB_RECALC_DATA) {
 			ID *data_id = (ID *)ob->data;
 			AnimData *adt = BKE_animdata_from_id(data_id);
-			float ctime = (float)scene->r.cfra;  /* XXX this is bad... */
+			float ctime = BKE_scene_frame_get(scene);
 			
 			if (G.debug & G_DEBUG)
 				printf("recalcdata %s\n", ob->id.name + 2);

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene_api.c	2013-01-27 15:12:52 UTC (rev 54121)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene_api.c	2013-01-27 16:45:00 UTC (rev 54122)
@@ -55,8 +55,10 @@
 
 static void rna_Scene_frame_set(Scene *scene, int frame, float subframe)
 {
-	scene->r.cfra = frame;
-	scene->r.subframe = subframe;
+	float cfra = (float)frame + subframe;
+
+	scene->r.cfra = floorf(cfra);
+	scene->r.subframe = cfra - floorf(cfra);
 	
 	CLAMP(scene->r.cfra, MINAFRAME, MAXFRAME);
 	BKE_scene_update_for_newframe(G.main, scene, (1 << 20) - 1);




More information about the Bf-blender-cvs mailing list