diff options
-rw-r--r-- | source/blender/blenkernel/intern/cloth.c | 23 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 88 |
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); |