Blender  V3.3
Classes | Typedefs | Enumerations | Functions | Variables
MOD_laplaciandeform.c File Reference
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "BLI_string.h"
#include "BLI_utildefines_stack.h"
#include "MEM_guardedalloc.h"
#include "BLT_translation.h"
#include "DNA_defaults.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_screen_types.h"
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_runtime.h"
#include "BKE_mesh_wrapper.h"
#include "BKE_particle.h"
#include "BKE_screen.h"
#include "UI_interface.h"
#include "UI_resources.h"
#include "BLO_read_write.h"
#include "RNA_access.h"
#include "RNA_prototypes.h"
#include "MOD_ui_common.h"
#include "MOD_util.h"
#include "eigen_capi.h"

Go to the source code of this file.

Classes

struct  LaplacianSystem
 

Typedefs

typedef struct LaplacianSystem LaplacianSystem
 

Enumerations

enum  {
  LAPDEFORM_SYSTEM_NOT_CHANGE = 0 , LAPDEFORM_SYSTEM_IS_DIFFERENT , LAPDEFORM_SYSTEM_ONLY_CHANGE_ANCHORS , LAPDEFORM_SYSTEM_ONLY_CHANGE_GROUP ,
  LAPDEFORM_SYSTEM_ONLY_CHANGE_MESH , LAPDEFORM_SYSTEM_CHANGE_VERTEXES , LAPDEFORM_SYSTEM_CHANGE_EDGES , LAPDEFORM_SYSTEM_CHANGE_NOT_VALID_GROUP
}
 

Functions

static LaplacianSystemnewLaplacianSystem (void)
 
static LaplacianSysteminitLaplacianSystem (int verts_num, int edges_num, int tris_num, int anchors_num, const char defgrpName[64], int iterations)
 
static void deleteLaplacianSystem (LaplacianSystem *sys)
 
static void createFaceRingMap (const int mvert_tot, const MLoopTri *mlooptri, const int mtri_tot, const MLoop *mloop, MeshElemMap **r_map, int **r_indices)
 
static void createVertRingMap (const int mvert_tot, const MEdge *medge, const int medge_tot, MeshElemMap **r_map, int **r_indices)
 
static void initLaplacianMatrix (LaplacianSystem *sys)
 
static void computeImplictRotations (LaplacianSystem *sys)
 
static void rotateDifferentialCoordinates (LaplacianSystem *sys)
 
static void laplacianDeformPreview (LaplacianSystem *sys, float(*vertexCos)[3])
 
static bool isValidVertexGroup (LaplacianDeformModifierData *lmd, Object *ob, Mesh *mesh)
 
static void initSystem (LaplacianDeformModifierData *lmd, Object *ob, Mesh *mesh, float(*vertexCos)[3], int verts_num)
 
static int isSystemDifferent (LaplacianDeformModifierData *lmd, Object *ob, Mesh *mesh, int verts_num)
 
static void LaplacianDeformModifier_do (LaplacianDeformModifierData *lmd, Object *ob, Mesh *mesh, float(*vertexCos)[3], int verts_num)
 
static void initData (ModifierData *md)
 
static void copyData (const ModifierData *md, ModifierData *target, const int flag)
 
static bool isDisabled (const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
 
static void requiredDataMask (Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
 
static void deformVerts (ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], int verts_num)
 
static void deformVertsEM (ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, Mesh *mesh, float(*vertexCos)[3], int verts_num)
 
static void freeData (ModifierData *md)
 
static void panel_draw (const bContext *UNUSED(C), Panel *panel)
 
static void panelRegister (ARegionType *region_type)
 
static void blendWrite (BlendWriter *writer, const ID *id_owner, const ModifierData *md)
 
static void blendRead (BlendDataReader *reader, ModifierData *md)
 

Variables

ModifierTypeInfo modifierType_LaplacianDeform
 

Typedef Documentation

◆ LaplacianSystem

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
LAPDEFORM_SYSTEM_NOT_CHANGE 
LAPDEFORM_SYSTEM_IS_DIFFERENT 
LAPDEFORM_SYSTEM_ONLY_CHANGE_ANCHORS 
LAPDEFORM_SYSTEM_ONLY_CHANGE_GROUP 
LAPDEFORM_SYSTEM_ONLY_CHANGE_MESH 
LAPDEFORM_SYSTEM_CHANGE_VERTEXES 
LAPDEFORM_SYSTEM_CHANGE_EDGES 
LAPDEFORM_SYSTEM_CHANGE_NOT_VALID_GROUP 

Definition at line 47 of file MOD_laplaciandeform.c.

Function Documentation

◆ blendRead()

static void blendRead ( BlendDataReader reader,
ModifierData md 
)
static

◆ blendWrite()

static void blendWrite ( BlendWriter writer,
const ID id_owner,
const ModifierData md 
)
static

◆ computeImplictRotations()

static void computeImplictRotations ( LaplacianSystem sys)
static

◆ copyData()

static void copyData ( const ModifierData md,
ModifierData target,
const int  flag 
)
static

◆ createFaceRingMap()

static void createFaceRingMap ( const int  mvert_tot,
const MLoopTri mlooptri,
const int  mtri_tot,
const MLoop mloop,
MeshElemMap **  r_map,
int **  r_indices 
)
static

Definition at line 142 of file MOD_laplaciandeform.c.

References indices, map, MEM_calloc_arrayN, MLoopTri::tri, and MLoop::v.

Referenced by initSystem().

◆ createVertRingMap()

static void createVertRingMap ( const int  mvert_tot,
const MEdge medge,
const int  medge_tot,
MeshElemMap **  r_map,
int **  r_indices 
)
static

Definition at line 180 of file MOD_laplaciandeform.c.

References indices, map, MEM_calloc_arrayN, MEdge::v1, and MEdge::v2.

Referenced by initSystem().

◆ deformVerts()

static void deformVerts ( ModifierData md,
const ModifierEvalContext ctx,
Mesh mesh,
float(*)  vertexCos[3],
int  verts_num 
)
static

◆ deformVertsEM()

static void deformVertsEM ( ModifierData md,
const ModifierEvalContext ctx,
struct BMEditMesh editData,
Mesh mesh,
float(*)  vertexCos[3],
int  verts_num 
)
static

◆ deleteLaplacianSystem()

static void deleteLaplacianSystem ( LaplacianSystem sys)
static

◆ freeData()

static void freeData ( ModifierData md)
static

◆ initData()

static void initData ( ModifierData md)
static

◆ initLaplacianMatrix()

static void initLaplacianMatrix ( LaplacianSystem sys)
static

This method computes the Laplacian Matrix and Differential Coordinates for all vertex in the mesh.. The Linear system is LV = d Where L is Laplacian Matrix, V as the vertices in Mesh, d is the differential coordinates The Laplacian Matrix is computes as a Lij = sum(Wij) (if i == j) Lij = Wij (if i != j) Wij is weight between vertex Vi and vertex Vj, we use cotangent weight

The Differential Coordinate is computes as a di = Vi * sum(Wij) - sum(Wij * Vj) Where : di is the Differential Coordinate i sum (Wij) is the sum of all weights between vertex Vi and its vertices neighbors (Vj) sum (Wij * Vj) is the sum of the product between vertex neighbor Vj and weight Wij for all neighborhood.

This Laplacian Matrix is described in the paper: Desbrun M. et.al, Implicit fairing of irregular meshes using diffusion and curvature flow, SIGGRAPH '99, page 317-324, New York, USA

The computation of Laplace Beltrami operator on Hybrid Triangle/Quad Meshes is described in the paper: Pinzon A., Romero E., Shape Inflation With an Adapted Laplacian Operator For Hybrid Quad/Triangle Meshes, Conference on Graphics Patterns and Images, SIBGRAPI, 2013

The computation of Differential Coordinates is described in the paper: Sorkine, O. Laplacian Surface Editing. Proceedings of the EUROGRAPHICS/ACM SIGGRAPH Symposium on Geometry Processing,

  1. p. 179-188.

Definition at line 249 of file MOD_laplaciandeform.c.

References add_v3_v3(), LaplacianSystem::co, LaplacianSystem::context, cotangent_tri_weight_v3(), LaplacianSystem::delta, EIG_linear_solver_matrix_add(), LaplacianSystem::no, normal_tri_v3(), LaplacianSystem::tris, LaplacianSystem::tris_num, UNPACK3, v1, and v2.

Referenced by laplacianDeformPreview().

◆ initLaplacianSystem()

static LaplacianSystem* initLaplacianSystem ( int  verts_num,
int  edges_num,
int  tris_num,
int  anchors_num,
const char  defgrpName[64],
int  iterations 
)
static

◆ initSystem()

static void initSystem ( LaplacianDeformModifierData lmd,
Object ob,
Mesh mesh,
float(*)  vertexCos[3],
int  verts_num 
)
static

◆ isDisabled()

static bool isDisabled ( const struct Scene UNUSEDscene,
ModifierData md,
bool   UNUSEDuseRenderParams 
)
static

◆ isSystemDifferent()

static int isSystemDifferent ( LaplacianDeformModifierData lmd,
Object ob,
Mesh mesh,
int  verts_num 
)
static

◆ isValidVertexGroup()

static bool isValidVertexGroup ( LaplacianDeformModifierData lmd,
Object ob,
Mesh mesh 
)
static

◆ LaplacianDeformModifier_do()

static void LaplacianDeformModifier_do ( LaplacianDeformModifierData lmd,
Object ob,
Mesh mesh,
float(*)  vertexCos[3],
int  verts_num 
)
static

◆ laplacianDeformPreview()

static void laplacianDeformPreview ( LaplacianSystem sys,
float(*)  vertexCos[3] 
)
static

◆ newLaplacianSystem()

static LaplacianSystem* newLaplacianSystem ( void  )
static

◆ panel_draw()

static void panel_draw ( const bContext UNUSEDC,
Panel panel 
)
static

◆ panelRegister()

static void panelRegister ( ARegionType region_type)
static

◆ requiredDataMask()

static void requiredDataMask ( Object UNUSEDob,
ModifierData md,
CustomData_MeshMasks r_cddata_masks 
)
static

◆ rotateDifferentialCoordinates()

static void rotateDifferentialCoordinates ( LaplacianSystem sys)
static

Variable Documentation

◆ modifierType_LaplacianDeform

ModifierTypeInfo modifierType_LaplacianDeform

Definition at line 877 of file MOD_laplaciandeform.c.