[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14062] trunk/blender/source/blender: Cloth bugfix for 1.

Daniel Genrich daniel.genrich at gmx.net
Wed Mar 12 02:42:40 CET 2008


Revision: 14062
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14062
Author:   genscher
Date:     2008-03-12 02:42:39 +0100 (Wed, 12 Mar 2008)

Log Message:
-----------
Cloth bugfix for 1. reset of cloth sim during render with vector blur when cache was not protected, 2. fix of bad vector blur for cloth, put fluidsim like function in to get real speed vectors

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/cloth.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/blenkernel/intern/cloth.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cloth.c	2008-03-11 14:40:27 UTC (rev 14061)
+++ trunk/blender/source/blender/blenkernel/intern/cloth.c	2008-03-12 01:42:39 UTC (rev 14062)
@@ -738,20 +738,21 @@
 			/* jump to a non-existing frame makes sim reset if cache is not protected */
 			if(!(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT))
 			{	
-				/*
-				clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
-				*/
-				clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
-				cloth_clear_cache(ob, clmd, 0);
-				
-				cloth_write_cache(ob, clmd, framenr);
+				/* prevent freeing when used with vectorblur */
+				if(!useRenderParams)
+				{
+					clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
+					cloth_clear_cache(ob, clmd, 0);
+					
+					cloth_write_cache(ob, clmd, framenr);
+				}
 			}
 		}
 	}
 	else
 	{	
 		if(G.rt > 0)
-			printf("dt > 1.0 || dt < 0.0, %f\n", framenr);
+			printf("dt > 1.0 || dt < 0.0, %f, st: %f, ct: %f\n", framenr, clmd->sim_parms->sim_time, current_time);
 		if(cloth_read_cache(ob, clmd, framenr))
 		{
 			cloth_to_object (ob, clmd, result);
@@ -761,7 +762,11 @@
 		{
 			/* jump to a non-existing frame makes sim reset if cache is not protected */
 			if(!(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT))
-				clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+			{
+				/* prevent freeing when used with vectorblur */
+				if(!useRenderParams)
+					clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+			}
 		}
 		clmd->sim_parms->sim_time = current_time;
 	}

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-03-11 14:40:27 UTC (rev 14061)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-03-12 01:42:39 UTC (rev 14062)
@@ -44,6 +44,7 @@
 
 #include "DNA_armature_types.h"
 #include "DNA_camera_types.h"
+#include "DNA_cloth_types.h"
 #include "DNA_material_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_effect_types.h"
@@ -66,6 +67,7 @@
 #include "BKE_anim.h"
 #include "BKE_armature.h"
 #include "BKE_action.h"
+#include "BKE_cloth.h"
 #include "BKE_curve.h"
 #include "BKE_customdata.h"
 #include "BKE_colortools.h"
@@ -5208,7 +5210,7 @@
 		fsvec[3] = 0.; 
 		//fsvec[0] = fsvec[1] = fsvec[2] = fsvec[3] = 0.; fsvec[2] = 2.; // NT fixed test
 		for(j=0;j<3;j++) fsvec[j] = vverts[a].co[j];
-
+		
 		// transform (=rotate) to cam space
 		camco[0]= imat[0][0]*fsvec[0] + imat[0][1]*fsvec[1] + imat[0][2]*fsvec[2];
 		camco[1]= imat[1][0]*fsvec[0] + imat[1][1]*fsvec[1] + imat[1][2]*fsvec[2];
@@ -5242,6 +5244,83 @@
 	return 1;
 }
 
+static int load_clothsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *vectors, int step)
+{
+	ObjectRen *obr= obi->obr;
+	VertRen *ver= NULL;
+	float *speed, div, zco[2];
+	float zmulx= re->winx/2, zmuly= re->winy/2, len;
+	float winsq= re->winx*re->winy, winroot= sqrt(winsq);
+	int a, j;
+	float hoco[4], ho[4], csvec[4], camco[4];
+	float mat[4][4], winmat[4][4];
+	float imat[4][4];
+	ClothModifierData *clmd = NULL;
+	Cloth *cloth = NULL;
+
+	/* only one step needed */
+	if(step) return 1;
+	
+	Mat4CpyMat4(mat, re->viewmat);
+	MTC_Mat4Invert(imat, mat);
+
+	/* set first vertex OK */
+	clmd = (ClothModifierData *)modifiers_findByType(obr->ob, eModifierType_Cloth);
+	if( !clmd || !(clmd->clothObject) ) return 0;
+	
+	cloth = clmd->clothObject;
+	
+	if( obr->totvert != cloth->numverts ) {
+		return 0;
+	}
+
+	if(obi->flag & R_TRANSFORMED)
+		Mat4MulMat4(winmat, obi->mat, re->winmat);
+	else
+		Mat4CpyMat4(winmat, re->winmat);
+	
+	for(a=0; a<obr->totvert; a++, vectors+=2) {
+		if((a & 255)==0)
+			ver= obr->vertnodes[a>>8].vert;
+		else
+			ver++;
+
+		// get cloth velocity
+		csvec[3] = 0.; 
+		for(j=0;j<3;j++) csvec[j] = cloth->verts[a].v[j];
+
+		// transform (=rotate) to cam space
+		camco[0]= imat[0][0]*csvec[0] + imat[0][1]*csvec[1] + imat[0][2]*csvec[2];
+		camco[1]= imat[1][0]*csvec[0] + imat[1][1]*csvec[1] + imat[1][2]*csvec[2];
+		camco[2]= imat[2][0]*csvec[0] + imat[2][1]*csvec[1] + imat[2][2]*csvec[2];
+
+		// get homogenous coordinates
+		projectvert(camco, winmat, hoco);
+		projectvert(ver->co, winmat, ho);
+		
+		/* now map hocos to screenspace, uses very primitive clip still */
+		// use ho[3] of original vertex, xy component of vel. direction
+		if(ho[3]<0.1f) div= 10.0f;
+		else div= 1.0f/ho[3];
+		zco[0]= zmulx*hoco[0]*div;
+		zco[1]= zmuly*hoco[1]*div;
+		
+		// maximize speed as usual
+		len= zco[0]*zco[0] + zco[1]*zco[1];
+		if(len > winsq) {
+			len= winroot/sqrt(len);
+			zco[0]*= len; zco[1]*= len;
+		}
+		
+		speed= RE_vertren_get_winspeed(obi, ver, 1);
+		// set both to the same value
+		speed[0]= speed[2]= zco[0];
+		speed[1]= speed[3]= zco[1];
+	}
+
+	return 1;
+}
+
 /* makes copy per object of all vectors */
 /* result should be that we can free entire database */
 static void copy_dbase_object_vectors(Render *re, ListBase *lb)
@@ -5298,6 +5377,7 @@
 	ListBase oldtable= {NULL, NULL}, newtable= {NULL, NULL};
 	ListBase strandsurface;
 	int step;
+	ModifierData *md = NULL;
 	
 	re->i.infostr= "Calculating previous vectors";
 	re->r.mode |= R_SPEED;
@@ -5372,7 +5452,11 @@
 					// use preloaded per vertex simulation data , only does calculation for step=1
 					// NOTE/FIXME - velocities and meshes loaded unnecessarily often during the database_fromscene_vectors calls...
 					load_fluidsimspeedvectors(re, obi, oldobi->vectors, step);
-				} else {
+				}
+				else if((md = modifiers_findByType(obi->ob, eModifierType_Cloth)) && (md->mode & eModifierMode_Render) ) {
+					load_clothsimspeedvectors(re, obi, oldobi->vectors, step);
+				}
+				else {
 					/* check if both have same amounts of vertices */
 					if(obi->totvector==oldobi->totvector)
 						calculate_speedvectors(re, obi, oldobi->vectors, step);





More information about the Bf-blender-cvs mailing list