Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorDaniel Genrich <daniel.genrich@gmx.net>2008-03-12 04:42:39 +0300
committerDaniel Genrich <daniel.genrich@gmx.net>2008-03-12 04:42:39 +0300
commit33a6bf610eb66ef6c306d5b8759043960edc8052 (patch)
tree87874c4b39e97060b845be1eafe74f64bbd88ec9 /source
parent3c561ec2165f201deaa910f981e0dd116f36e64e (diff)
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
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/cloth.c23
-rw-r--r--source/blender/render/intern/source/convertblender.c88
2 files changed, 100 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index b0f8cc9c330..d7dc96abfac 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -738,20 +738,21 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd,Object *ob, DerivedMesh *d
/* 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 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd,Object *ob, DerivedMesh *d
{
/* 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;
}
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index bd431b70cdc..d9708a6c50b 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -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 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
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 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
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 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
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 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
// 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);