[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16072] branches/soc-2008-jaguarandi/ source/blender:
André Pinto
andresusanopinto at gmail.com
Tue Aug 12 22:43:10 CEST 2008
Revision: 16072
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16072
Author: jaguarandi
Date: 2008-08-12 22:43:10 +0200 (Tue, 12 Aug 2008)
Log Message:
-----------
*Added documentation mainly at shrinkwrap.c
*removed commented code about the dropped shrinkwrap options
*Removed references to "cut plane", "limitMesh".. its now called "auxiliar target"
*Added option to shrinkwrap over an selected axis
*"Normal projection" mode is now called "projection" since it can now project over "normal, and any combination X, Y, Z"
Modified Paths:
--------------
branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/constraint.c
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_constraint_types.h
branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c
branches/soc-2008-jaguarandi/source/blender/src/buttons_object.c
Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h 2008-08-12 20:28:43 UTC (rev 16071)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h 2008-08-12 20:43:10 UTC (rev 16072)
@@ -30,27 +30,36 @@
#define BKE_SHRINKWRAP_H
/* mesh util */
-//TODO move this somewhere else
+//TODO: move this somewhere else
#include "BKE_customdata.h"
struct DerivedMesh;
struct Object;
struct DerivedMesh *object_get_derived_final(struct Object *ob, CustomDataMask dataMask);
-/* bitset stuff */
-//TODO: should move this to other generic lib files?
-typedef char* BitSet;
-#define bitset_memsize(size) (sizeof(char)*((size+7)>>3))
-#define bitset_new(size,name) ((BitSet)MEM_callocN( bitset_memsize(size) , name))
-#define bitset_free(set) (MEM_freeN((void*)set))
-
-#define bitset_get(set,index) ((set)[(index)>>3] & (1 << ((index)&0x7)))
-#define bitset_set(set,index) ((set)[(index)>>3] |= (1 << ((index)&0x7)))
-#define bitset_unset(set,index) ((set)[(index)>>3] &= ~(1 << ((index)&0x7)))
-
-
/* SpaceTransform stuff */
-//TODO: should move to other generic space?
+/*
+ * TODO: move this somewhere else
+ *
+ * this structs encapsulates all needed data to convert between 2 coordinate spaces
+ * (where conversion can be represented by a matrix multiplication)
+ *
+ * This is used to reduce the number of arguments to pass to functions that need to perform
+ * this kind of operation and make it easier for the coder, as he/she doenst needs to recode
+ * the matrix calculation.
+ *
+ * A SpaceTransform is initialized using:
+ * space_transform_setup( &data, ob1, ob2 )
+ *
+ * After that the following calls can be used:
+ * space_transform_apply (&data, co); //converts a coordinate in ob1 coords space to the corresponding ob2 coords
+ * space_transform_invert(&data, co); //converts a coordinate in ob2 coords space to the corresponding ob1 coords
+ *
+ * //Same Concept as space_transform_apply and space_transform_invert, but no is normalized after conversion
+ * space_transform_apply_normal (&data, &no);
+ * space_transform_invert_normal(&data, &no);
+ *
+ */
struct Object;
typedef struct SpaceTransform
@@ -66,21 +75,30 @@
void space_transform_apply (const SpaceTransform *data, float *co);
void space_transform_invert(const SpaceTransform *data, float *co);
-void space_transform_apply_normal (const SpaceTransform *data, float *co);
-void space_transform_invert_normal(const SpaceTransform *data, float *co);
+void space_transform_apply_normal (const SpaceTransform *data, float *no);
+void space_transform_invert_normal(const SpaceTransform *data, float *no);
/* Shrinkwrap stuff */
#include "BKE_bvhutils.h"
+/*
+ * Shrinkwrap is composed by a set of functions and options that define the type of shrink.
+ *
+ * 3 modes are available:
+ * - Nearest vertex
+ * - Nearest surface
+ * - Normal projection
+ *
+ * ShrinkwrapCalcData encapsulates all needed data for shrinkwrap functions.
+ * (So that you dont have to pass an enormous ammount of arguments to functions)
+ */
+
struct Object;
struct DerivedMesh;
struct ShrinkwrapModifierData;
struct BVHTree;
-/* maybe move to bvh util */
-int normal_projection_project_vertex(char options, const float *vert, const float *dir, const SpaceTransform *transf, BVHTree *tree, BVHTreeRayHit *hit, BVHTree_RayCastCallback callback, void *userdata);
-
typedef struct ShrinkwrapCalcData
{
ShrinkwrapModifierData *smd; //shrinkwrap modifier data
@@ -95,7 +113,6 @@
SpaceTransform local2target; //transform to move bettwem local and target space
float keptDist; //Distance to kept from target (units are in local space)
- BitSet moved; //BitSet indicating if vertex has moved
} ShrinkwrapCalcData;
@@ -103,15 +120,27 @@
void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *data);
void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *data);
-struct DerivedMesh *shrinkwrapModifier_do(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc);
void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
+/*
+ * This function casts a ray in the given BVHTree.. but it takes into consideration the space_transform, that is:
+ *
+ * if transf was configured with "space_transform_setup( &transf, ob1, ob2 )"
+ * then the input (vert, dir, BVHTreeRayHit) must be defined in ob1 coordinates space
+ * and the BVHTree must be built in ob2 coordinate space.
+ *
+ * Thus it provides an easy way to cast the same ray across several trees (where each tree was built on its own coords space)
+ */
+int normal_projection_project_vertex(char options, const float *vert, const float *dir, const SpaceTransform *transf, BVHTree *tree, BVHTreeRayHit *hit, BVHTree_RayCastCallback callback, void *userdata);
+
+/*
+ * NULL initializers to local data
+ */
#define NULL_ShrinkwrapCalcData {NULL, }
#define NULL_BVHTreeFromMesh {NULL, }
#define NULL_BVHTreeRayHit {NULL, }
-#define NULL_BVHTreeNearest {NULL, }
+#define NULL_BVHTreeNearest {0, }
#endif
-
Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/constraint.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/constraint.c 2008-08-12 20:28:43 UTC (rev 16071)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/constraint.c 2008-08-12 20:43:10 UTC (rev 16072)
@@ -3274,6 +3274,7 @@
if( VALID_CONS_TARGET(ct) && (ct->tar->type == OB_MESH) )
{
+ int fail = FALSE;
float co[3] = {0.0f, 0.0f, 0.0f};
float no[3] = {0.0f, 0.0f, 0.0f};
float dist;
@@ -3295,59 +3296,73 @@
hit.index = -1;
hit.dist = 100000.0f; //TODO should use FLT_MAX.. but normal projection doenst yet supports it
- switch(scon->normalAxis)
- {
- case UP_X: no[0] = 1.0f; break;
- case UP_Y: no[1] = 1.0f; break;
- case UP_Z: no[2] = 1.0f; break;
- }
-
if(target != NULL)
{
space_transform_from_matrixs(&transform, cob->startmat, ct->tar->obmat);
- //Normal projection applies the transform later
- if(scon->shrinkType != MOD_SHRINKWRAP_NORMAL)
- {
- space_transform_apply(&transform, co);
- space_transform_apply_normal(&transform, no);
- }
-
switch(scon->shrinkType)
{
case MOD_SHRINKWRAP_NEAREST_SURFACE:
bvhtree_from_mesh_faces(&treeData, target, 0.0, 2, 6);
- if(treeData.tree == NULL) return;
+ if(treeData.tree == NULL)
+ {
+ fail = TRUE;
+ break;
+ }
+ space_transform_apply(&transform, co);
+
BLI_bvhtree_find_nearest(treeData.tree, co, &nearest, treeData.nearest_callback, &treeData);
dist = VecLenf(co, nearest.co);
VecLerpf(co, co, nearest.co, (dist - scon->dist)/dist); //linear interpolation
+ space_transform_invert(&transform, co);
break;
case MOD_SHRINKWRAP_NEAREST_VERTEX:
bvhtree_from_mesh_verts(&treeData, target, 0.0, 2, 6);
- if(treeData.tree == NULL) return;
+ if(treeData.tree == NULL)
+ {
+ fail = TRUE;
+ break;
+ }
+ space_transform_apply_normal(&transform, no);
+
BLI_bvhtree_find_nearest(treeData.tree, co, &nearest, treeData.nearest_callback, &treeData);
dist = VecLenf(co, nearest.co);
VecLerpf(co, co, nearest.co, (dist - scon->dist)/dist); //linear interpolation
+ space_transform_invert(&transform, co);
break;
- case MOD_SHRINKWRAP_NORMAL:
- bvhtree_from_mesh_faces(&treeData, target, scon->dist, 4, 6);
- if(treeData.tree == NULL) return;
+ case MOD_SHRINKWRAP_PROJECT:
+ if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS) no[0] = 1.0f;
+ if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS) no[1] = 1.0f;
+ if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS) no[2] = 1.0f;
- if(normal_projection_project_vertex(0, co, no, &transform, treeData.tree, &hit, treeData.raycast_callback, &treeData) == FALSE)
+ if(INPR(no,no) < FLT_EPSILON)
{
- free_bvhtree_from_mesh(&treeData);
+ fail = TRUE;
+ break;
+ }
- target->release(target);
+ Normalize(no);
- return;
+
+ bvhtree_from_mesh_faces(&treeData, target, scon->dist, 4, 6);
+ if(treeData.tree == NULL)
+ {
+ fail = TRUE;
+ break;
}
+
+ if(normal_projection_project_vertex(0, co, no, &transform, treeData.tree, &hit, treeData.raycast_callback, &treeData) == FALSE)
+ {
+ fail = TRUE;
+ break;
+ }
VECCOPY(co, hit.co);
break;
}
@@ -3356,11 +3371,8 @@
target->release(target);
- if(scon->shrinkType != MOD_SHRINKWRAP_NORMAL)
- {
- space_transform_invert(&transform, co);
- }
- VECADD(ct->matrix[3], ct->matrix[3], co);
+ if(fail == FALSE)
+ VECADD(ct->matrix[3], ct->matrix[3], co);
}
}
}
Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c 2008-08-12 20:28:43 UTC (rev 16071)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c 2008-08-12 20:43:10 UTC (rev 16072)
@@ -7230,11 +7230,11 @@
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
smd->shrinkType = MOD_SHRINKWRAP_NEAREST_SURFACE;
- smd->shrinkOpts = MOD_SHRINKWRAP_ALLOW_DEFAULT_NORMAL;
+ smd->shrinkOpts = MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR;
smd->keptDist = 0.0f;
- smd->target = 0;
- smd->cutPlane = 0;
+ smd->target = NULL;
+ smd->auxTarget = NULL;
}
static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target)
@@ -7242,12 +7242,14 @@
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*)md;
ShrinkwrapModifierData *tsmd = (ShrinkwrapModifierData*)target;
- tsmd->target = smd->target;
- tsmd->cutPlane = smd->cutPlane;
+ tsmd->target = smd->target;
+ tsmd->auxTarget = smd->auxTarget;
+
strcpy(tsmd->vgroup_name, smd->vgroup_name);
- tsmd->keptDist = smd->keptDist;
- tsmd->shrinkType = smd->shrinkType;
- tsmd->shrinkOpts = smd->shrinkOpts;
+
+ tsmd->keptDist = smd->keptDist;
+ tsmd->shrinkType= smd->shrinkType;
+ tsmd->shrinkOpts= smd->shrinkOpts;
}
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list