Shape keys have normals?
On Mon, Oct 31, 2011 at 10:17 PM, Campbell Barton <ideasma...@gmail.com> wrote: > Revision: 41427 > > http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41427 > Author: campbellbarton > Date: 2011-11-01 05:17:46 +0000 (Tue, 01 Nov 2011) > Log Message: > ----------- > subdivide smooth now works as in trunk. > - r35832 joeedh removed this with comment "removed the "smoothness" parameter > (which never worked, anyway, even in trunk)", not sure I agree here... just > because its not perfect doesnt mean its not working, anyway, to support in > bmesh at the same level as trunk is not much effort. > - calculating the coordinates was being done on every shape key, I can see > this could be useful to subdiv worked on all shape keys BUT the existing code > didnt do this properly, for it to work right the normals would need to be > updated for each shape key too when calculating smoothing, so now just > calculate the new subdivided location and apply the difference to all other > shape keys. > > Revision Links: > -------------- > > http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35832 > > Modified Paths: > -------------- > branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c > > Modified: branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c > =================================================================== > --- branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c > 2011-11-01 04:31:25 UTC (rev 41426) > +++ branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c > 2011-11-01 05:17:46 UTC (rev 41427) > @@ -168,74 +168,80 @@ > static void alter_co(BMesh *bm, BMVert *v, BMEdge *UNUSED(origed), const > subdparams *params, float perc, > BMVert *vsta, BMVert *vend) > { > - float tvec[3], fac; > - float *co=NULL, *origco=NULL; > + float tvec[3], prev_co[3], fac; > + float *co=NULL; > int i, totlayer = CustomData_number_of_layers(&bm->vdata, CD_SHAPEKEY); > > BM_Vert_UpdateAllNormals(bm, v); > > - origco = CustomData_bmesh_get_n(&bm->vdata, v->head.data, > CD_SHAPEKEY, params->origkey); > - sub_v3_v3v3(tvec, origco, v->co); > - > - for (i=0; i<totlayer; i++) { > - co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, > CD_SHAPEKEY, i); > - sub_v3_v3(co, tvec); > + co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, CD_SHAPEKEY, > params->origkey); > + copy_v3_v3(prev_co, co); > + > + if(params->beauty & B_SMOOTH) { > + /* we calculate an offset vector vec1[], to be added to *co */ > + float len, nor[3], nor1[3], nor2[3], smooth=params->smooth; > + > + sub_v3_v3v3(nor, vsta->co, vend->co); > + len= 0.5f*normalize_v3(nor); > + > + copy_v3_v3(nor1, vsta->no); > + copy_v3_v3(nor2, vend->no); > + > + /* cosine angle */ > + fac= dot_v3v3(nor, nor1); > + mul_v3_v3fl(tvec, nor1, fac); > + > + /* cosine angle */ > + fac= -dot_v3v3(nor, nor2); > + madd_v3_v3fl(tvec, nor2, fac); > + > + /* falloff for multi subdivide */ > + smooth *= sqrtf(fabsf(1.0f - 2.0f*fabsf(0.5f-perc))); > + > + mul_v3_fl(tvec, smooth * len); > + > + add_v3_v3(co, tvec); > } > + else if(params->beauty & B_SPHERE) { /* subdivide sphere */ > + normalize_v3(co); > + mul_v3_fl(co, params->smooth); > + } > > + if(params->beauty & B_FRACTAL) { > + float len = len_v3v3(vsta->co, vend->co); > + float vec2[3] = {0.0f, 0.0f, 0.0f}, co2[3]; > + > + fac= params->fractal*len; > + > + add_v3_v3(vec2, vsta->no); > + add_v3_v3(vec2, vend->no); > + mul_v3_fl(vec2, 0.5f); > + > + add_v3_v3v3(co2, v->co, params->off); > + tvec[0] = fac*(BLI_gTurbulence(1.0, co2[0], co2[1], co2[2], > 15, 0, 1)-0.5f); > + tvec[1] = fac*(BLI_gTurbulence(1.0, co2[0], co2[1], co2[2], > 15, 0, 1)-0.5f); > + tvec[2] = fac*(BLI_gTurbulence(1.0, co2[0], co2[1], co2[2], > 15, 0, 1)-0.5f); > + > + mul_v3_v3(vec2, tvec); > + > + /*add displacement*/ > + add_v3_v3v3(co, co, vec2); > + } > + > + /* apply the new difference to the rest of the shape keys, > + * note that this doent take rotations into account, we _could_ > support > + * this by getting the normals and coords for each shape key and > + * re-calculate the smooth value for each but this is quite involved. > + * for now its ok to simply apply the difference IMHO - campbell */ > + sub_v3_v3v3(tvec, prev_co, co); > + > for (i=0; i<totlayer; i++) { > - co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, > CD_SHAPEKEY, i); > - > - if(params->beauty & B_SMOOTH) { > - /* we calculate an offset vector vec1[], to be added > to *co */ > - float len, nor[3], nor1[3], nor2[3], > smooth=params->smooth; > - > - sub_v3_v3v3(nor, vsta->co, vend->co); > - len= 0.5f*normalize_v3(nor); > - > - copy_v3_v3(nor1, vsta->no); > - copy_v3_v3(nor2, vend->no); > - > - /* cosine angle */ > - fac= dot_v3v3(nor, nor1); > - mul_v3_v3fl(tvec, nor1, fac); > - > - /* cosine angle */ > - fac= -dot_v3v3(nor, nor2); > - madd_v3_v3fl(tvec, nor2, fac); > - > - /* falloff for multi subdivide */ > - smooth *= sqrtf(fabsf(1.0f - 2.0f*fabsf(0.5f-perc))); > - > - mul_v3_fl(tvec, smooth * len); > - > - add_v3_v3(co, tvec); > + if (params->origkey != i) { > + co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, > CD_SHAPEKEY, i); > + sub_v3_v3(co, tvec); > } > - else if(params->beauty & B_SPHERE) { /* subdivide sphere */ > - normalize_v3(co); > - mul_v3_fl(co, params->smooth); > - } > - > - if(params->beauty & B_FRACTAL) { > - float len = len_v3v3(vsta->co, vend->co); > - float vec2[3] = {0.0f, 0.0f, 0.0f}, co2[3]; > - > - fac= params->fractal*len; > + } > > - add_v3_v3(vec2, vsta->no); > - add_v3_v3(vec2, vend->no); > - mul_v3_fl(vec2, 0.5f); > - > - add_v3_v3v3(co2, v->co, params->off); > - tvec[0] = fac*(BLI_gTurbulence(1.0, co2[0], co2[1], > co2[2], 15, 0, 1)-0.5f); > - tvec[1] = fac*(BLI_gTurbulence(1.0, co2[0], co2[1], > co2[2], 15, 0, 1)-0.5f); > - tvec[2] = fac*(BLI_gTurbulence(1.0, co2[0], co2[1], > co2[2], 15, 0, 1)-0.5f); > - > - mul_v3_v3(vec2, tvec); > - > - /*add displacement*/ > - add_v3_v3v3(co, co, vec2); > - } > - } > } > > /* assumes in the edge is the correct interpolated vertices already */ > > _______________________________________________ > Bf-blender-cvs mailing list > bf-blender-...@blender.org > http://lists.blender.org/mailman/listinfo/bf-blender-cvs > _______________________________________________ Bf-committers mailing list Bf-committers@blender.org http://lists.blender.org/mailman/listinfo/bf-committers