Blender  V3.3
Classes | Macros | Typedefs | Functions
shrinkwrap.c File Reference
#include <float.h>
#include <math.h>
#include <memory.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "DNA_gpencil_modifier_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "BLI_math.h"
#include "BLI_math_solvers.h"
#include "BLI_task.h"
#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_context.h"
#include "BKE_lattice.h"
#include "BKE_lib_id.h"
#include "BKE_modifier.h"
#include "BKE_shrinkwrap.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_mesh_wrapper.h"
#include "BKE_subsurf.h"
#include "DEG_depsgraph_query.h"
#include "MEM_guardedalloc.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Classes

struct  ShrinkwrapCalcData
 
struct  ShrinkwrapCalcCBData
 
struct  TargetProjectTriData
 

Macros

#define TIMEIT_BENCH(expr, id)   (expr)
 
#define OUT_OF_MEMORY()   ((void)printf("Shrinkwrap: Out of memory\n"))
 

Typedefs

typedef struct ShrinkwrapCalcData ShrinkwrapCalcData
 
typedef struct ShrinkwrapCalcCBData ShrinkwrapCalcCBData
 
typedef struct TargetProjectTriData TargetProjectTriData
 

Functions

bool BKE_shrinkwrap_needs_normals (int shrinkType, int shrinkMode)
 
bool BKE_shrinkwrap_init_tree (ShrinkwrapTreeData *data, Mesh *mesh, int shrinkType, int shrinkMode, bool force_normals)
 
void BKE_shrinkwrap_free_tree (ShrinkwrapTreeData *data)
 
void BKE_shrinkwrap_discard_boundary_data (struct Mesh *mesh)
 
static void merge_vert_dir (ShrinkwrapBoundaryVertData *vdata, signed char *status, int index, const float edge_dir[3], signed char side)
 
static ShrinkwrapBoundaryDatashrinkwrap_build_boundary_data (struct Mesh *mesh)
 
void BKE_shrinkwrap_compute_boundary_data (struct Mesh *mesh)
 
static void shrinkwrap_calc_nearest_vertex_cb_ex (void *__restrict userdata, const int i, const TaskParallelTLS *__restrict tls)
 
static void shrinkwrap_calc_nearest_vertex (ShrinkwrapCalcData *calc)
 
bool BKE_shrinkwrap_project_normal (char options, const float vert[3], const float dir[3], const float ray_radius, const SpaceTransform *transf, ShrinkwrapTreeData *tree, BVHTreeRayHit *hit)
 
static void shrinkwrap_calc_normal_projection_cb_ex (void *__restrict userdata, const int i, const TaskParallelTLS *__restrict tls)
 
static void shrinkwrap_calc_normal_projection (ShrinkwrapCalcData *calc)
 
static void target_project_tri_deviation (void *userdata, const float x[3], float r_delta[3])
 
static void target_project_tri_jacobian (void *userdata, const float x[3], float r_jacobian[3][3])
 
static void target_project_tri_clamp (float x[3])
 
static bool target_project_tri_correct (void *UNUSED(userdata), const float x[3], float step[3], float x_next[3])
 
static bool target_project_solve_point_tri (const float *vtri_co[3], const float vtri_no[3][3], const float point_co[3], const float hit_co[3], float hit_dist_sq, float r_hit_co[3], float r_hit_no[3])
 
static bool update_hit (BVHTreeNearest *nearest, int index, const float co[3], const float hit_co[3], const float hit_no[3])
 
static void target_project_edge (const ShrinkwrapTreeData *tree, int index, const float co[3], BVHTreeNearest *nearest, int eidx)
 
static void mesh_looptri_target_project (void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
 
void BKE_shrinkwrap_find_nearest_surface (struct ShrinkwrapTreeData *tree, BVHTreeNearest *nearest, float co[3], int type)
 
static void shrinkwrap_calc_nearest_surface_point_cb_ex (void *__restrict userdata, const int i, const TaskParallelTLS *__restrict tls)
 
void BKE_shrinkwrap_compute_smooth_normal (const struct ShrinkwrapTreeData *tree, const struct SpaceTransform *transform, int looptri_idx, const float hit_co[3], const float hit_no[3], float r_no[3])
 
static void shrinkwrap_snap_with_side (float r_point_co[3], const float point_co[3], const float hit_co[3], const float hit_no[3], float goal_dist, float forcesign, bool forcesnap)
 
void BKE_shrinkwrap_snap_point_to_surface (const struct ShrinkwrapTreeData *tree, const struct SpaceTransform *transform, int mode, int hit_idx, const float hit_co[3], const float hit_no[3], float goal_dist, const float point_co[3], float r_point_co[3])
 
static void shrinkwrap_calc_nearest_surface_point (ShrinkwrapCalcData *calc)
 
void shrinkwrapModifier_deform (ShrinkwrapModifierData *smd, const ModifierEvalContext *ctx, struct Scene *scene, Object *ob, Mesh *mesh, MDeformVert *dvert, const int defgrp_index, float(*vertexCos)[3], int numVerts)
 
void shrinkwrapGpencilModifier_deform (ShrinkwrapGpencilModifierData *mmd, Object *ob, MDeformVert *dvert, const int defgrp_index, float(*vertexCos)[3], int numVerts)
 
void BKE_shrinkwrap_mesh_nearest_surface_deform (struct bContext *C, Object *ob_source, Object *ob_target)
 
void BKE_shrinkwrap_remesh_target_project (Mesh *src_me, Mesh *target_me, Object *ob_target)
 

Macro Definition Documentation

◆ OUT_OF_MEMORY

#define OUT_OF_MEMORY ( )    ((void)printf("Shrinkwrap: Out of memory\n"))

Definition at line 55 of file shrinkwrap.c.

◆ TIMEIT_BENCH

#define TIMEIT_BENCH (   expr,
  id 
)    (expr)

Definition at line 51 of file shrinkwrap.c.

Typedef Documentation

◆ ShrinkwrapCalcCBData

◆ ShrinkwrapCalcData

◆ TargetProjectTriData

Function Documentation

◆ BKE_shrinkwrap_compute_boundary_data()

void BKE_shrinkwrap_compute_boundary_data ( struct Mesh mesh)

◆ BKE_shrinkwrap_compute_smooth_normal()

void BKE_shrinkwrap_compute_smooth_normal ( const struct ShrinkwrapTreeData tree,
const struct SpaceTransform transform,
int  looptri_idx,
const float  hit_co[3],
const float  hit_no[3],
float  r_no[3] 
)

Compute a smooth normal of the target (if applicable) at the hit location.

Parameters
treeinformation about the mesh.
transformtransform from the hit coordinate space to the object space; may be null.
r_nooutput in hit coordinate space; may be shared with inputs.

Definition at line 1170 of file shrinkwrap.c.

References BLI_space_transform_apply(), BLI_space_transform_invert_normal(), MVert::co, copy_v3_v3(), float(), interp_v3_v3v3v3(), interp_weights_tri_v3(), BVHTreeFromMesh::loop, BVHTreeFromMesh::looptri, ME_SMOOTH, normalize_v3(), NULL, MLoopTri::poly, transform(), tree, MLoopTri::tri, MLoop::v, BVHTreeFromMesh::vert, and w().

Referenced by BKE_shrinkwrap_snap_point_to_surface(), and shrinkwrap_get_tarmat().

◆ BKE_shrinkwrap_discard_boundary_data()

void BKE_shrinkwrap_discard_boundary_data ( struct Mesh mesh)

Free boundary data for target project.

Definition at line 152 of file shrinkwrap.c.

References data, MEM_freeN, mesh, NULL, Mesh::runtime, and Mesh_Runtime::shrinkwrap_data.

Referenced by BKE_mesh_runtime_clear_geometry(), and BKE_shrinkwrap_compute_boundary_data().

◆ BKE_shrinkwrap_find_nearest_surface()

void BKE_shrinkwrap_find_nearest_surface ( struct ShrinkwrapTreeData tree,
struct BVHTreeNearest nearest,
float  co[3],
int  type 
)

◆ BKE_shrinkwrap_free_tree()

void BKE_shrinkwrap_free_tree ( struct ShrinkwrapTreeData data)

◆ BKE_shrinkwrap_init_tree()

bool BKE_shrinkwrap_init_tree ( struct ShrinkwrapTreeData data,
Mesh mesh,
int  shrinkType,
int  shrinkMode,
bool  force_normals 
)

◆ BKE_shrinkwrap_mesh_nearest_surface_deform()

void BKE_shrinkwrap_mesh_nearest_surface_deform ( struct bContext C,
struct Object ob_source,
struct Object ob_target 
)

◆ BKE_shrinkwrap_needs_normals()

bool BKE_shrinkwrap_needs_normals ( int  shrinkType,
int  shrinkMode 
)

Checks if the modifier needs target normals with these settings.

Definition at line 90 of file shrinkwrap.c.

References MOD_SHRINKWRAP_ABOVE_SURFACE, MOD_SHRINKWRAP_NEAREST_VERTEX, and MOD_SHRINKWRAP_TARGET_PROJECT.

Referenced by BKE_shrinkwrap_init_tree(), blender::deg::DepsgraphRelationBuilder::build_constraints(), and updateDepsgraph().

◆ BKE_shrinkwrap_project_normal()

bool BKE_shrinkwrap_project_normal ( char  options,
const float  vert[3],
const float  dir[3],
const float  ray_radius,
const SpaceTransform transf,
ShrinkwrapTreeData tree,
BVHTreeRayHit hit 
)

◆ BKE_shrinkwrap_remesh_target_project()

void BKE_shrinkwrap_remesh_target_project ( struct Mesh src_me,
struct Mesh target_me,
struct Object ob_target 
)

◆ BKE_shrinkwrap_snap_point_to_surface()

void BKE_shrinkwrap_snap_point_to_surface ( const struct ShrinkwrapTreeData tree,
const struct SpaceTransform transform,
int  mode,
int  hit_idx,
const float  hit_co[3],
const float  hit_no[3],
float  goal_dist,
const float  point_co[3],
float  r_point_co[3] 
)

Apply the shrink to surface modes to the given original coordinates and nearest point.

Parameters
treemesh data for smooth normals.
transformtransform from the hit coordinate space to the object space; may be null.
r_point_comay be the same memory location as point_co, hit_co, or hit_no.

Definition at line 1288 of file shrinkwrap.c.

References BKE_shrinkwrap_compute_smooth_normal(), copy_v3_v3(), madd_v3_v3v3fl(), MOD_SHRINKWRAP_ABOVE_SURFACE, MOD_SHRINKWRAP_INSIDE, MOD_SHRINKWRAP_ON_SURFACE, MOD_SHRINKWRAP_OUTSIDE, MOD_SHRINKWRAP_OUTSIDE_SURFACE, shrinkwrap_snap_with_side(), transform(), and tree.

Referenced by shrinkwrap_calc_nearest_surface_point_cb_ex(), shrinkwrap_calc_normal_projection_cb_ex(), and shrinkwrap_get_tarmat().

◆ merge_vert_dir()

static void merge_vert_dir ( ShrinkwrapBoundaryVertData vdata,
signed char *  status,
int  index,
const float  edge_dir[3],
signed char  side 
)
static

◆ mesh_looptri_target_project()

static void mesh_looptri_target_project ( void userdata,
int  index,
const float  co[3],
BVHTreeNearest nearest 
)
static

◆ shrinkwrap_build_boundary_data()

static ShrinkwrapBoundaryData* shrinkwrap_build_boundary_data ( struct Mesh mesh)
static

◆ shrinkwrap_calc_nearest_surface_point()

static void shrinkwrap_calc_nearest_surface_point ( ShrinkwrapCalcData calc)
static

◆ shrinkwrap_calc_nearest_surface_point_cb_ex()

static void shrinkwrap_calc_nearest_surface_point_cb_ex ( void *__restrict  userdata,
const int  i,
const TaskParallelTLS *__restrict  tls 
)
static

◆ shrinkwrap_calc_nearest_vertex()

static void shrinkwrap_calc_nearest_vertex ( ShrinkwrapCalcData calc)
static

◆ shrinkwrap_calc_nearest_vertex_cb_ex()

static void shrinkwrap_calc_nearest_vertex_cb_ex ( void *__restrict  userdata,
const int  i,
const TaskParallelTLS *__restrict  tls 
)
static

◆ shrinkwrap_calc_normal_projection()

static void shrinkwrap_calc_normal_projection ( ShrinkwrapCalcData calc)
static

◆ shrinkwrap_calc_normal_projection_cb_ex()

static void shrinkwrap_calc_normal_projection_cb_ex ( void *__restrict  userdata,
const int  i,
const TaskParallelTLS *__restrict  tls 
)
static

◆ shrinkwrap_snap_with_side()

static void shrinkwrap_snap_with_side ( float  r_point_co[3],
const float  point_co[3],
const float  hit_co[3],
const float  hit_no[3],
float  goal_dist,
float  forcesign,
bool  forcesnap 
)
static

◆ shrinkwrapGpencilModifier_deform()

void shrinkwrapGpencilModifier_deform ( ShrinkwrapGpencilModifierData mmd,
Object ob,
MDeformVert dvert,
const int  defgrp_index,
float(*)  vertexCos[3],
int  numVerts 
)

◆ shrinkwrapModifier_deform()

void shrinkwrapModifier_deform ( ShrinkwrapModifierData smd,
const ModifierEvalContext ctx,
struct Scene scene,
Object ob,
Mesh mesh,
MDeformVert dvert,
const int  defgrp_index,
float(*)  vertexCos[3],
int  numVerts 
)

Definition at line 1367 of file shrinkwrap.c.

References ShrinkwrapCalcData::aux_target, ShrinkwrapModifierData::auxTarget, BKE_mesh_vertex_normals_ensure(), BKE_modifier_get_evaluated_mesh_from_evaluated_object(), BKE_shrinkwrap_free_tree(), BKE_shrinkwrap_init_tree(), BLI_assert, BLI_SPACE_TRANSFORM_SETUP, CD_MVERT, CDDM_from_mesh(), DEG_get_evaluated_object(), ModifierEvalContext::depsgraph, ShrinkwrapCalcData::dvert, SubsurfModifierData::emCache, DerivedMesh::getNumVerts, DerivedMesh::getVertDataArray, ShrinkwrapCalcData::invert_vgroup, ShrinkwrapCalcData::keepDist, ShrinkwrapModifierData::keepDist, SubsurfModifierData::levels, ShrinkwrapCalcData::local2target, SubsurfModifierData::mCache, ME_CC_SUBSURF, mesh, MOD_SHRINKWRAP_INVERT_VGROUP, MOD_SHRINKWRAP_NEAREST_SURFACE, MOD_SHRINKWRAP_NEAREST_VERTEX, MOD_SHRINKWRAP_PROJECT, MOD_SHRINKWRAP_TARGET_PROJECT, Object::mode, Mesh::mvert, NULL, NULL_ShrinkwrapCalcData, ShrinkwrapCalcData::numVerts, ShrinkwrapCalcData::ob, OB_MODE_EDIT, DerivedMesh::release, scene, ShrinkwrapModifierData::shrinkMode, ShrinkwrapModifierData::shrinkOpts, ShrinkwrapModifierData::shrinkType, shrinkwrap_calc_nearest_surface_point(), shrinkwrap_calc_nearest_vertex(), shrinkwrap_calc_normal_projection(), ShrinkwrapCalcData::smd, SubsurfModifierData::subdivType, SUBSURF_IN_EDIT_MODE, subsurf_make_derived_from_derived(), ShrinkwrapModifierData::subsurfLevels, ShrinkwrapCalcData::target, ShrinkwrapModifierData::target, TIMEIT_BENCH, ShrinkwrapCalcData::tree, tree, ShrinkwrapCalcData::vert, ShrinkwrapCalcData::vert_normals, ShrinkwrapCalcData::vertexCos, and ShrinkwrapCalcData::vgroup.

Referenced by BKE_shrinkwrap_mesh_nearest_surface_deform().

◆ target_project_edge()

static void target_project_edge ( const ShrinkwrapTreeData tree,
int  index,
const float  co[3],
BVHTreeNearest nearest,
int  eidx 
)
static

◆ target_project_solve_point_tri()

static bool target_project_solve_point_tri ( const float vtri_co[3],
const float  vtri_no[3][3],
const float  point_co[3],
const float  hit_co[3],
float  hit_dist_sq,
float  r_hit_co[3],
float  r_hit_no[3] 
)
static

◆ target_project_tri_clamp()

static void target_project_tri_clamp ( float  x[3])
static

Definition at line 758 of file shrinkwrap.c.

References x.

Referenced by target_project_solve_point_tri(), and target_project_tri_correct().

◆ target_project_tri_correct()

static bool target_project_tri_correct ( void UNUSEDuserdata,
const float  x[3],
float  step[3],
float  x_next[3] 
)
static

◆ target_project_tri_deviation()

static void target_project_tri_deviation ( void userdata,
const float  x[3],
float  r_delta[3] 
)
static

Definition at line 732 of file shrinkwrap.c.

References data, interp_v3_v3v3v3(), madd_v3_v3v3fl(), sub_v3_v3(), w(), and x.

Referenced by target_project_solve_point_tri().

◆ target_project_tri_jacobian()

static void target_project_tri_jacobian ( void userdata,
const float  x[3],
float  r_jacobian[3][3] 
)
static

Definition at line 745 of file shrinkwrap.c.

References copy_v3_v3(), data, madd_v3_v3fl(), madd_v3_v3v3fl(), and x.

Referenced by target_project_solve_point_tri().

◆ update_hit()

static bool update_hit ( BVHTreeNearest nearest,
int  index,
const float  co[3],
const float  hit_co[3],
const float  hit_no[3] 
)
static