From b6d28b585001bcee99e60660454313ca63d104c4 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Wed, 22 Sep 2010 09:38:11 +0000 Subject: Fix for [#21718] Shrinkwrap's "Project" mode with offset gives wrong results. * normal offset not taken properly into account * wrong usage of BVHTree (epsilon != radius) caused massive slowdowns in calculations, for example just opening test file took about 30 s on my machine, after fix about 0.5 s :) --- source/blender/blenkernel/intern/shrinkwrap.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 01652aaa713..f64854f90de 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -337,7 +337,7 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S } //After sucessufuly build the trees, start projection vertexs - if( bvhtree_from_mesh_faces(&treeData, calc->target, calc->keepDist, 4, 6) + if( bvhtree_from_mesh_faces(&treeData, calc->target, 0.0, 4, 6) && (auxMesh == NULL || bvhtree_from_mesh_faces(&auxData, auxMesh, 0.0, 4, 6))) { @@ -383,6 +383,9 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S normal_projection_project_vertex(0, tmp_co, tmp_no, &local2aux, auxData.tree, &hit, auxData.raycast_callback, &auxData); normal_projection_project_vertex(calc->smd->shrinkOpts, tmp_co, tmp_no, &calc->local2target, treeData.tree, &hit, treeData.raycast_callback, &treeData); + + if(hit.index != -1) + madd_v3_v3v3fl(hit.co, hit.co, tmp_no, -calc->keepDist); } //Project over negative direction of axis @@ -395,6 +398,9 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S normal_projection_project_vertex(0, tmp_co, inv_no, &local2aux, auxData.tree, &hit, auxData.raycast_callback, &auxData); normal_projection_project_vertex(calc->smd->shrinkOpts, tmp_co, inv_no, &calc->local2target, treeData.tree, &hit, treeData.raycast_callback, &treeData); + + if(hit.index != -1) + madd_v3_v3v3fl(hit.co, hit.co, tmp_no, calc->keepDist); } -- cgit v1.2.3 From 3367ef8b6591b62b1b76f07fccb310485f6d45c7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 31 Oct 2010 15:39:37 +0000 Subject: initialize structs to zero rather then using memset(). --- source/blender/blenkernel/intern/shrinkwrap.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index f64854f90de..4746341876f 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -559,8 +559,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object //Using vertexs positions/normals as if a subsurface was applied if(smd->subsurfLevels) { - SubsurfModifierData ssmd; - memset(&ssmd, 0, sizeof(ssmd)); + SubsurfModifierData ssmd= {{0}}; ssmd.subdivType = ME_CC_SUBSURF; //catmull clark ssmd.levels = smd->subsurfLevels; //levels -- cgit v1.2.3 From fe8d5b81b09462d2344a50b32bfd2d8df5c6d886 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 3 Nov 2010 06:31:53 +0000 Subject: use c90 compatible static initializers. --- source/blender/blenkernel/intern/shrinkwrap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 4746341876f..a6daaf36ff6 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -391,8 +391,8 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S //Project over negative direction of axis if(use_normal & MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR) { - float inv_no[3] = { -tmp_no[0], -tmp_no[1], -tmp_no[2] }; - + float inv_no[3]; + negate_v3_v3(inv_no, tmp_no); if(auxData.tree) normal_projection_project_vertex(0, tmp_co, inv_no, &local2aux, auxData.tree, &hit, auxData.raycast_callback, &auxData); -- cgit v1.2.3 From 66b274766a0584a74a63bb2b039f2a71e5b48534 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 5 Nov 2010 13:37:18 +0000 Subject: minor c90 compat edits. (no functional changes). --- source/blender/blenkernel/intern/shrinkwrap.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index a6daaf36ff6..936fb1bfeab 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -49,14 +49,9 @@ #include "BKE_subsurf.h" #include "BLI_math.h" -#include "BLI_editVert.h" - /* Util macros */ -#define TO_STR(a) #a -#define JOIN(a,b) a##b - #define OUT_OF_MEMORY() ((void)printf("Shrinkwrap: Out of memory\n")) /* Benchmark macros */ @@ -90,7 +85,7 @@ typedef void ( *Shrinkwrap_ForeachVertexCallback) (DerivedMesh *target, float *c DerivedMesh *object_get_derived_final(struct Scene *scene, Object *ob, CustomDataMask dataMask) { Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); + struct EditMesh *em = BKE_mesh_get_editmesh(me); if (em) { -- cgit v1.2.3 From 8b28c24d16386db7e68326d8607de5d20c9833b0 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 17 Dec 2010 20:13:54 +0000 Subject: Fix #25272: shrinkwrap with dependency cycle could lead to eternal loop and increasing memory usage. Modifiers should never call mesh_get_derived_final or similar, only use ob->derivedFinal if it exists, if the dependencies are set correct and there are no cycles, it will be there. --- source/blender/blenkernel/intern/shrinkwrap.c | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 936fb1bfeab..16e4933332c 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -48,6 +48,7 @@ #include "BKE_mesh.h" #include "BKE_subsurf.h" +#include "BLI_editVert.h" #include "BLI_math.h" @@ -82,21 +83,18 @@ typedef void ( *Shrinkwrap_ForeachVertexCallback) (DerivedMesh *target, float *c /* get derived mesh */ //TODO is anyfunction that does this? returning the derivedFinal witouth we caring if its in edit mode or not? -DerivedMesh *object_get_derived_final(struct Scene *scene, Object *ob, CustomDataMask dataMask) +DerivedMesh *object_get_derived_final(Object *ob) { Mesh *me= ob->data; - struct EditMesh *em = BKE_mesh_get_editmesh(me); + EditMesh *em = BKE_mesh_get_editmesh(me); - if (em) - { - DerivedMesh *final = NULL; - editmesh_get_derived_cage_and_final(scene, ob, em, &final, dataMask); - + if(em) { + DerivedMesh *dm = em->derivedFinal; BKE_mesh_end_editmesh(me, em); - return final; + return dm; } - else - return mesh_get_derived_final(scene, ob, dataMask); + + return ob->derivedFinal; } /* Space transform */ @@ -282,7 +280,7 @@ int normal_projection_project_vertex(char options, const float *vert, const floa } -static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct Scene *scene) +static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc) { int i; @@ -327,7 +325,9 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S if(calc->smd->auxTarget) { - auxMesh = object_get_derived_final(scene, calc->smd->auxTarget, CD_MASK_BAREMESH); + auxMesh = object_get_derived_final(calc->smd->auxTarget); + if(!auxMesh) + return; space_transform_setup( &local2aux, calc->ob, calc->smd->auxTarget); } @@ -499,7 +499,7 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc) } /* Main shrinkwrap function */ -void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts) +void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts) { DerivedMesh *ss_mesh = NULL; @@ -530,7 +530,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object if(smd->target) { - calc.target = object_get_derived_final(scene, smd->target, CD_MASK_BAREMESH); + calc.target = object_get_derived_final(smd->target); //TODO there might be several "bugs" on non-uniform scales matrixs //because it will no longer be nearest surface, not sphere projection @@ -587,7 +587,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object break; case MOD_SHRINKWRAP_PROJECT: - BENCH(shrinkwrap_calc_normal_projection(&calc, scene)); + BENCH(shrinkwrap_calc_normal_projection(&calc)); break; case MOD_SHRINKWRAP_NEAREST_VERTEX: -- cgit v1.2.3 From 8f21a43535cb200c0569566a1b012aec883aa53c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Jan 2011 18:36:47 +0000 Subject: split BKE_utildefines.h, now it only has blender specific defines like GS() MAKE_ID, FILE_MAXDIR, moved the generic defines to BLI_utildefines.h. no functional changes. --- source/blender/blenkernel/intern/shrinkwrap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 16e4933332c..ee39e639a99 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -40,6 +40,10 @@ #include "DNA_mesh_types.h" #include "DNA_scene_types.h" +#include "BLI_editVert.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + #include "BKE_shrinkwrap.h" #include "BKE_DerivedMesh.h" #include "BKE_lattice.h" @@ -48,10 +52,6 @@ #include "BKE_mesh.h" #include "BKE_subsurf.h" -#include "BLI_editVert.h" -#include "BLI_math.h" - - /* Util macros */ #define OUT_OF_MEMORY() ((void)printf("Shrinkwrap: Out of memory\n")) -- cgit v1.2.3 From 89c9aaaa25cc7ce60c305d8e30e1c008cb117cf1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Jan 2011 19:18:31 +0000 Subject: remove references to BKE_utildefines where its not needed. - move GS() define into DNA_ID.h - add BLI_utildefines as an automatic include with makesrna generated files. --- source/blender/blenkernel/intern/shrinkwrap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index ee39e639a99..753e31d565b 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -22,7 +22,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): André Pinto + * Contributor(s): Andr Pinto * * ***** END GPL LICENSE BLOCK ***** */ @@ -47,7 +47,7 @@ #include "BKE_shrinkwrap.h" #include "BKE_DerivedMesh.h" #include "BKE_lattice.h" -#include "BKE_utildefines.h" + #include "BKE_deform.h" #include "BKE_mesh.h" #include "BKE_subsurf.h" -- cgit v1.2.3 From 98268ba40fb23d1af413114d469ab08b412d5b49 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 8 Feb 2011 01:43:16 +0000 Subject: fix [#25801] Shrinkwrap Offset problems with Project mode. The positive result from the previous ray-cast is used again, inadvertently negating the offset from the first hit (acts as if no offset is applied). --- source/blender/blenkernel/intern/shrinkwrap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 753e31d565b..75a955a09a9 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -384,7 +384,7 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc) } //Project over negative direction of axis - if(use_normal & MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR) + if(use_normal & MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR && hit.index == -1) { float inv_no[3]; negate_v3_v3(inv_no, tmp_no); -- cgit v1.2.3 From 0242a96f3bc0d844c6ca1c3916671b891de10d9f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 8 Feb 2011 02:09:59 +0000 Subject: Change in behavior to shrinkwrap modifier's offset value with negative enabled. - negative ray casts would invert the offset direction. this meant if positive and negative were enabled at once and the mesh was slightly inside & outside the object it wrapped, the offset would be applied in opposite directions. This way the offset is always along the vertex normal. - allow negative offset from RNA, could be useful and no benefit to disable. --- source/blender/blenkernel/intern/shrinkwrap.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 75a955a09a9..48d9a4e0dee 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -378,9 +378,6 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc) normal_projection_project_vertex(0, tmp_co, tmp_no, &local2aux, auxData.tree, &hit, auxData.raycast_callback, &auxData); normal_projection_project_vertex(calc->smd->shrinkOpts, tmp_co, tmp_no, &calc->local2target, treeData.tree, &hit, treeData.raycast_callback, &treeData); - - if(hit.index != -1) - madd_v3_v3v3fl(hit.co, hit.co, tmp_no, -calc->keepDist); } //Project over negative direction of axis @@ -393,14 +390,12 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc) normal_projection_project_vertex(0, tmp_co, inv_no, &local2aux, auxData.tree, &hit, auxData.raycast_callback, &auxData); normal_projection_project_vertex(calc->smd->shrinkOpts, tmp_co, inv_no, &calc->local2target, treeData.tree, &hit, treeData.raycast_callback, &treeData); - - if(hit.index != -1) - madd_v3_v3v3fl(hit.co, hit.co, tmp_no, calc->keepDist); } if(hit.index != -1) { + madd_v3_v3v3fl(hit.co, hit.co, tmp_no, calc->keepDist); interp_v3_v3v3(co, co, hit.co, weight); } } -- cgit v1.2.3 From 0955c664aa7c5fc5f0bd345c58219c40f04ab9c1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 13 Feb 2011 10:52:18 +0000 Subject: fix for warnings from Sparse static source code checker, mostly BKE/BLI and python functions. - use NULL rather then 0 where possible (makes code & function calls more readable IMHO). - set static variables and functions (exposed some unused vars/funcs). - use func(void) rather then func() for definitions. --- source/blender/blenkernel/intern/shrinkwrap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 48d9a4e0dee..29c29fb5158 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -102,7 +102,7 @@ void space_transform_from_matrixs(SpaceTransform *data, float local[4][4], float { float itarget[4][4]; invert_m4_m4(itarget, target); - mul_serie_m4(data->local2target, itarget, local, 0, 0, 0, 0, 0, 0); + mul_serie_m4(data->local2target, itarget, local, NULL, NULL, NULL, NULL, NULL, NULL); invert_m4_m4(data->target2local, data->local2target); } -- cgit v1.2.3 From c09e8b34348518e0f81dfed0d7aea61f852bf26f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 19 Feb 2011 09:01:28 +0000 Subject: fix for string wrap backface culling not working when one of the objects was rotated. also skip calculating the dot product if its not needed. --- source/blender/blenkernel/intern/shrinkwrap.c | 32 +++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 29c29fb5158..a75bc2164c3 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -255,22 +255,26 @@ int normal_projection_project_vertex(char options, const float *vert, const floa BLI_bvhtree_ray_cast(tree, co, no, 0.0f, &hit_tmp, callback, userdata); - if(hit_tmp.index != -1) - { - float dot = INPR( dir, hit_tmp.no); - - if(((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot <= 0.0f) - || ((options & MOD_SHRINKWRAP_CULL_TARGET_BACKFACE) && dot >= 0.0f)) - return FALSE; //Ignore hit - + if(hit_tmp.index != -1) { + /* invert the normal first so face culling works on rotated objects */ + if(transf) { + space_transform_invert_normal(transf, hit_tmp.no); + } - //Inverting space transform (TODO make coeherent with the initial dist readjust) - if(transf) - { - space_transform_invert( transf, hit_tmp.co ); - space_transform_invert_normal( transf, hit_tmp.no ); + if (options & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE|MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) { + /* apply backface */ + const float dot= dot_v3v3(dir, hit_tmp.no); + if( ((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot <= 0.0f) || + ((options & MOD_SHRINKWRAP_CULL_TARGET_BACKFACE) && dot >= 0.0f) + ) { + return FALSE; /* Ignore hit */ + } + } - hit_tmp.dist = len_v3v3( (float*)vert, hit_tmp.co ); + if(transf) { + /* Inverting space transform (TODO make coeherent with the initial dist readjust) */ + space_transform_invert(transf, hit_tmp.co); + hit_tmp.dist = len_v3v3((float *)vert, hit_tmp.co); } memcpy(hit, &hit_tmp, sizeof(hit_tmp) ); -- cgit v1.2.3 From 5b607701a7541c328cc058e10bd7a8c6d0c998ab Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Wed, 23 Feb 2011 10:52:22 +0000 Subject: doxygen: prevent GPL license block from being parsed as doxygen comment. --- source/blender/blenkernel/intern/shrinkwrap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index a75bc2164c3..f2c456cc465 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -1,4 +1,4 @@ -/** +/* * shrinkwrap.c * * ***** BEGIN GPL LICENSE BLOCK ***** -- cgit v1.2.3 From 00c05c84048857391a4f30042721f79c60798814 Mon Sep 17 00:00:00 2001 From: "Guillermo S. Romero" Date: Wed, 23 Feb 2011 18:03:40 +0000 Subject: Clean up headers a bit more. --- source/blender/blenkernel/intern/shrinkwrap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenkernel/intern/shrinkwrap.c') diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index f2c456cc465..53fefa685b9 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -1,5 +1,5 @@ /* - * shrinkwrap.c + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * -- cgit v1.2.3