Blender V4.3
MOD_surfacedeform.cc File Reference
#include "BLI_math_geom.h"
#include "BLI_math_matrix.h"
#include "BLI_task.h"
#include "BLT_translation.hh"
#include "DNA_defaults.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
#include "BKE_bvhutils.hh"
#include "BKE_deform.hh"
#include "BKE_lib_query.hh"
#include "BKE_mesh.hh"
#include "BKE_mesh_wrapper.hh"
#include "BKE_modifier.hh"
#include "UI_interface.hh"
#include "UI_resources.hh"
#include "BLO_read_write.hh"
#include "RNA_access.hh"
#include "RNA_prototypes.hh"
#include "DEG_depsgraph.hh"
#include "MEM_guardedalloc.h"
#include "MOD_ui_common.hh"
#include "MOD_util.hh"

Go to the source code of this file.

Classes

struct  SDefAdjacency
 
struct  SDefAdjacencyArray
 
struct  SDefEdgePolys
 
struct  SDefBindCalcData
 
struct  SDefBindPoly
 
struct  SDefBindWeightData
 
struct  SDefDeformData
 

Enumerations

enum  {
  MOD_SDEF_BIND_RESULT_SUCCESS = 1 , MOD_SDEF_BIND_RESULT_GENERIC_ERR = 0 , MOD_SDEF_BIND_RESULT_MEM_ERR = -1 , MOD_SDEF_BIND_RESULT_NONMANY_ERR = -2 ,
  MOD_SDEF_BIND_RESULT_CONCAVE_ERR = -3 , MOD_SDEF_BIND_RESULT_OVERLAP_ERR = -4
}
 
enum  { MOD_SDEF_INFINITE_WEIGHT_ANGULAR = (1 << 0) , MOD_SDEF_INFINITE_WEIGHT_DIST_PROJ = (1 << 1) , MOD_SDEF_INFINITE_WEIGHT_DIST = (1 << 2) }
 

Functions

static void init_data (ModifierData *md)
 
static void required_data_mask (ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
 
static void free_data (ModifierData *md)
 
static void copy_data (const ModifierData *md, ModifierData *target, const int flag)
 
static void foreach_ID_link (ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
 
static void update_depsgraph (ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
 
static void freeAdjacencyMap (SDefAdjacencyArray *const vert_edges, SDefAdjacency *const adj_ref, SDefEdgePolys *const edge_polys)
 
static int buildAdjacencyMap (const blender::OffsetIndices< int > polys, const blender::Span< blender::int2 > edges, const blender::Span< int > corner_edges, SDefAdjacencyArray *const vert_edges, SDefAdjacency *adj, SDefEdgePolys *const edge_polys)
 
BLI_INLINE void sortPolyVertsEdge (uint *indices, const int *const corner_verts, const int *const corner_edges, const uint edge, const uint num)
 
BLI_INLINE void sortPolyVertsTri (uint *indices, const int *const corner_verts, const uint loopstart, const uint num)
 
BLI_INLINE uint nearestVert (SDefBindCalcData *const data, const float point_co[3])
 
BLI_INLINE int isPolyValid (const float coords[][2], const uint nr)
 
static void freeBindData (SDefBindWeightData *const bwdata)
 
BLI_INLINE float computeAngularWeight (const float point_angle, const float edgemid_angle)
 
BLI_INLINE SDefBindWeightDatacomputeBindWeights (SDefBindCalcData *const data, const float point_co[3])
 
BLI_INLINE float computeNormalDisplacement (const float point_co[3], const float point_co_proj[3], const float normal[3])
 
static void bindVert (void *__restrict userdata, const int index, const TaskParallelTLS *__restrict)
 
static void compactSparseBinds (SurfaceDeformModifierData *smd)
 
static bool surfacedeformBind (Object *ob, SurfaceDeformModifierData *smd_orig, SurfaceDeformModifierData *smd_eval, float(*vertexCos)[3], uint verts_num, uint target_faces_num, uint target_verts_num, Mesh *target, Mesh *mesh)
 
static void deformVert (void *__restrict userdata, const int index, const TaskParallelTLS *__restrict)
 
static void surfacedeformModifier_do (ModifierData *md, const ModifierEvalContext *ctx, float(*vertexCos)[3], uint verts_num, Object *ob, Mesh *mesh)
 
static void deform_verts (ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
 
static bool is_disabled (const Scene *, ModifierData *md, bool)
 
static void panel_draw (const bContext *, Panel *panel)
 
static void panel_register (ARegionType *region_type)
 
static void blend_write (BlendWriter *writer, const ID *id_owner, const ModifierData *md)
 
static void blend_read (BlendDataReader *reader, ModifierData *md)
 

Variables

ModifierTypeInfo modifierType_SurfaceDeform
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
MOD_SDEF_BIND_RESULT_SUCCESS 
MOD_SDEF_BIND_RESULT_GENERIC_ERR 
MOD_SDEF_BIND_RESULT_MEM_ERR 
MOD_SDEF_BIND_RESULT_NONMANY_ERR 
MOD_SDEF_BIND_RESULT_CONCAVE_ERR 
MOD_SDEF_BIND_RESULT_OVERLAP_ERR 

Definition at line 176 of file MOD_surfacedeform.cc.

◆ anonymous enum

anonymous enum
Enumerator
MOD_SDEF_INFINITE_WEIGHT_ANGULAR 
MOD_SDEF_INFINITE_WEIGHT_DIST_PROJ 
MOD_SDEF_INFINITE_WEIGHT_DIST 

Definition at line 186 of file MOD_surfacedeform.cc.

Function Documentation

◆ bindVert()

◆ blend_read()

◆ blend_write()

◆ buildAdjacencyMap()

◆ compactSparseBinds()

◆ computeAngularWeight()

BLI_INLINE float computeAngularWeight ( const float point_angle,
const float edgemid_angle )

Definition at line 469 of file MOD_surfacedeform.cc.

References M_PI_2, min_ff(), and sinf.

Referenced by computeBindWeights().

◆ computeBindWeights()

BLI_INLINE SDefBindWeightData * computeBindWeights ( SDefBindCalcData *const data,
const float point_co[3] )

Definition at line 474 of file MOD_surfacedeform.cc.

References angle(), angle_normalized_v2v2(), angle_normalized_v3v3(), angle_signed_v2v2(), area_tri_v2(), SDefBindWeightData::bind_polys, SDefBindWeightData::binds_num, BLI_assert, SDefBindPoly::cent_edgemid_vecs_v2, SDefBindPoly::centroid, SDefBindPoly::centroid_v2, computeAngularWeight(), SDefBindPoly::coords, SDefBindPoly::coords_v2, copy_v3_v3(), SDefBindPoly::corner_edgemid_angles, SDefBindPoly::corner_ind, cross_v3_v3v3(), dist_to_line_v2(), SDefBindPoly::dominant_angle_weight, SDefBindPoly::dominant_edge, SDefBindPoly::edge_inds, SDefBindPoly::edge_vert_inds, SDefBindPoly::edgemid_angle, ELEM, fabsf, SDefBindWeightData::faces_num, freeBindData(), SDefAdjacency::index, SDefBindPoly::index, SDefBindPoly::inside, interpf(), isect_point_poly_v2(), isPolyValid(), len_v2v2(), len_v3v3(), SDefBindPoly::loopstart, M_PI, M_PI_2, madd_v2_v2fl(), map_to_plane_axis_angle_v2_v3v3fl(), max_ff(), MEM_calloc_arrayN, MEM_callocN, MEM_malloc_arrayN, mid_v2_v2v2(), mid_v3_v3_array(), min_ff(), MOD_SDEF_BIND_RESULT_GENERIC_ERR, MOD_SDEF_BIND_RESULT_MEM_ERR, MOD_SDEF_BIND_RESULT_SUCCESS, MOD_SDEF_INFINITE_WEIGHT_ANGULAR, MOD_SDEF_INFINITE_WEIGHT_DIST, MOD_SDEF_INFINITE_WEIGHT_DIST_PROJ, nearestVert(), SDefAdjacency::next, SDefBindPoly::normal, normal_poly_v3(), normalize_v2(), normalize_v3(), SDefEdgePolys::num, SDefBindPoly::point_edgemid_angles, SDefBindPoly::point_v2, SDefEdgePolys::polys, powf, SDefBindPoly::scale_mid, SDefBindPoly::scales, signf(), sinf, sqr(), sqrtf, sub_v2_v2(), sub_v2_v2v2(), SDefBindPoly::verts_num, SDefBindPoly::weight, SDefBindPoly::weight_angular, SDefBindPoly::weight_dist, SDefBindPoly::weight_dist_proj, and zero_v2().

Referenced by bindVert().

◆ computeNormalDisplacement()

BLI_INLINE float computeNormalDisplacement ( const float point_co[3],
const float point_co_proj[3],
const float normal[3] )

Definition at line 927 of file MOD_surfacedeform.cc.

References dot_v3v3(), len_v3(), and sub_v3_v3v3().

Referenced by bindVert().

◆ copy_data()

◆ deform_verts()

static void deform_verts ( ModifierData * md,
const ModifierEvalContext * ctx,
Mesh * mesh,
blender::MutableSpan< blender::float3 > positions )
static

◆ deformVert()

◆ foreach_ID_link()

static void foreach_ID_link ( ModifierData * md,
Object * ob,
IDWalkFunc walk,
void * user_data )
static

Definition at line 260 of file MOD_surfacedeform.cc.

References IDWALK_NOP, and SurfaceDeformModifierData::target.

◆ free_data()

◆ freeAdjacencyMap()

static void freeAdjacencyMap ( SDefAdjacencyArray *const vert_edges,
SDefAdjacency *const adj_ref,
SDefEdgePolys *const edge_polys )
static

Definition at line 276 of file MOD_surfacedeform.cc.

References MEM_freeN().

Referenced by surfacedeformBind().

◆ freeBindData()

◆ init_data()

static void init_data ( ModifierData * md)
static

◆ is_disabled()

static bool is_disabled ( const Scene * ,
ModifierData * md,
bool  )
static

◆ isPolyValid()

◆ nearestVert()

◆ panel_draw()

◆ panel_register()

static void panel_register ( ARegionType * region_type)
static

◆ required_data_mask()

static void required_data_mask ( ModifierData * md,
CustomData_MeshMasks * r_cddata_masks )
static

◆ sortPolyVertsEdge()

BLI_INLINE void sortPolyVertsEdge ( uint * indices,
const int *const corner_verts,
const int *const corner_edges,
const uint edge,
const uint num )

Definition at line 331 of file MOD_surfacedeform.cc.

Referenced by bindVert().

◆ sortPolyVertsTri()

BLI_INLINE void sortPolyVertsTri ( uint * indices,
const int *const corner_verts,
const uint loopstart,
const uint num )

Definition at line 356 of file MOD_surfacedeform.cc.

Referenced by bindVert().

◆ surfacedeformBind()

◆ surfacedeformModifier_do()

◆ update_depsgraph()

Variable Documentation

◆ modifierType_SurfaceDeform

ModifierTypeInfo modifierType_SurfaceDeform

Definition at line 1709 of file MOD_surfacedeform.cc.