Blender  V3.3
Functions | Variables
MOD_normal_edit.c File Reference
#include <string.h>
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
#include "BLI_bitmap.h"
#include "BLI_math.h"
#include "BLT_translation.h"
#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_context.h"
#include "BKE_deform.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_screen.h"
#include "UI_interface.h"
#include "UI_resources.h"
#include "RNA_access.h"
#include "RNA_prototypes.h"
#include "DEG_depsgraph_query.h"
#include "MOD_ui_common.h"
#include "MOD_util.h"

Go to the source code of this file.

Functions

static void generate_vert_coordinates (Mesh *mesh, Object *ob, Object *ob_center, const float offset[3], const int verts_num, float(*r_cos)[3], float r_size[3])
 
static void mix_normals (const float mix_factor, MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, const float mix_limit, const short mix_mode, const int verts_num, MLoop *mloop, float(*nos_old)[3], float(*nos_new)[3], const int loops_num)
 
static bool polygons_check_flip (MLoop *mloop, float(*nos)[3], CustomData *ldata, MPoly *mpoly, float(*polynors)[3], const int polys_num)
 
static void normalEditModifier_do_radial (NormalEditModifierData *enmd, const ModifierEvalContext *UNUSED(ctx), Object *ob, Mesh *mesh, short(*clnors)[2], float(*loopnors)[3], const float(*polynors)[3], const short mix_mode, const float mix_factor, const float mix_limit, MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, MVert *mvert, const int verts_num, MEdge *medge, const int edges_num, MLoop *mloop, const int loops_num, MPoly *mpoly, const int polys_num)
 
static void normalEditModifier_do_directional (NormalEditModifierData *enmd, const ModifierEvalContext *UNUSED(ctx), Object *ob, Mesh *mesh, short(*clnors)[2], float(*loopnors)[3], const float(*polynors)[3], const short mix_mode, const float mix_factor, const float mix_limit, MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, MVert *mvert, const int verts_num, MEdge *medge, const int edges_num, MLoop *mloop, const int loops_num, MPoly *mpoly, const int polys_num)
 
static bool is_valid_target (NormalEditModifierData *enmd)
 
static bool is_valid_target_with_error (const Object *ob, NormalEditModifierData *enmd)
 
static Mesh * normalEditModifier_do (NormalEditModifierData *enmd, const ModifierEvalContext *ctx, Object *ob, Mesh *mesh)
 
static void initData (ModifierData *md)
 
static void requiredDataMask (Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
 
static bool dependsOnNormals (ModifierData *UNUSED(md))
 
static void foreachIDLink (ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
 
static bool isDisabled (const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
 
static void updateDepsgraph (ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
 
static Mesh * modifyMesh (ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
 
static void panel_draw (const bContext *UNUSED(C), Panel *panel)
 
static void mix_mode_panel_draw (const bContext *UNUSED(C), Panel *panel)
 
static void offset_panel_draw (const bContext *UNUSED(C), Panel *panel)
 
static void panelRegister (ARegionType *region_type)
 

Variables

ModifierTypeInfo modifierType_NormalEdit
 

Function Documentation

◆ dependsOnNormals()

static bool dependsOnNormals ( ModifierData *  UNUSEDmd)
static

Definition at line 647 of file MOD_normal_edit.c.

◆ foreachIDLink()

static void foreachIDLink ( ModifierData *  md,
Object *  ob,
IDWalkFunc  walk,
void *  userData 
)
static

Definition at line 652 of file MOD_normal_edit.c.

References IDWALK_CB_NOP, and NormalEditModifierData::target.

◆ generate_vert_coordinates()

static void generate_vert_coordinates ( Mesh *  mesh,
Object *  ob,
Object *  ob_center,
const float  offset[3],
const int  verts_num,
float(*)  r_cos[3],
float  r_size[3] 
)
static

◆ initData()

static void initData ( ModifierData *  md)
static

◆ is_valid_target()

static bool is_valid_target ( NormalEditModifierData *  enmd)
static

◆ is_valid_target_with_error()

static bool is_valid_target_with_error ( const Object *  ob,
NormalEditModifierData *  enmd 
)
static

Definition at line 471 of file MOD_normal_edit.c.

References BKE_modifier_set_error(), and is_valid_target().

Referenced by normalEditModifier_do().

◆ isDisabled()

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

Definition at line 659 of file MOD_normal_edit.c.

References is_valid_target().

◆ mix_mode_panel_draw()

static void mix_mode_panel_draw ( const bContext *  UNUSEDC,
Panel *  panel 
)
static

◆ mix_normals()

static void mix_normals ( const float  mix_factor,
MDeformVert *  dvert,
const int  defgrp_index,
const bool  use_invert_vgroup,
const float  mix_limit,
const short  mix_mode,
const int  verts_num,
MLoop *  mloop,
float(*)  nos_old[3],
float(*)  nos_new[3],
const int  loops_num 
)
static

◆ modifyMesh()

static Mesh* modifyMesh ( ModifierData *  md,
const ModifierEvalContext *  ctx,
Mesh *  mesh 
)
static

Definition at line 677 of file MOD_normal_edit.c.

References mesh, normalEditModifier_do(), and ModifierEvalContext::object.

◆ normalEditModifier_do()

static Mesh* normalEditModifier_do ( NormalEditModifierData *  enmd,
const ModifierEvalContext *  ctx,
Object *  ob,
Mesh *  mesh 
)
static

◆ normalEditModifier_do_directional()

static void normalEditModifier_do_directional ( NormalEditModifierData *  enmd,
const ModifierEvalContext *  UNUSEDctx,
Object *  ob,
Mesh *  mesh,
short(*)  clnors[2],
float(*)  loopnors[3],
const float(*)  polynors[3],
const short  mix_mode,
const float  mix_factor,
const float  mix_limit,
MDeformVert *  dvert,
const int  defgrp_index,
const bool  use_invert_vgroup,
MVert *  mvert,
const int  verts_num,
MEdge *  medge,
const int  edges_num,
MLoop *  mloop,
const int  loops_num,
MPoly *  mpoly,
const int  polys_num 
)
static

◆ normalEditModifier_do_radial()

static void normalEditModifier_do_radial ( NormalEditModifierData *  enmd,
const ModifierEvalContext *  UNUSEDctx,
Object *  ob,
Mesh *  mesh,
short(*)  clnors[2],
float(*)  loopnors[3],
const float(*)  polynors[3],
const short  mix_mode,
const float  mix_factor,
const float  mix_limit,
MDeformVert *  dvert,
const int  defgrp_index,
const bool  use_invert_vgroup,
MVert *  mvert,
const int  verts_num,
MEdge *  medge,
const int  edges_num,
MLoop *  mloop,
const int  loops_num,
MPoly *  mpoly,
const int  polys_num 
)
static

size gives us our spheroid coefficients (A, B, C). Then, we want to find out for each vert its (a, b, c) triple (proportional to (A, B, C) one).

Ellipsoid basic equation: (x^2/a^2) + (y^2/b^2) + (z^2/c^2) = 1. Since we want to find (a, b, c) matching this equation and proportional to (A, B, C), we can do:

    m = B / A
    n = C / A

hence:

    (x^2/a^2) + (y^2/b^2) + (z^2/c^2) = 1
 -> b^2*c^2*x^2 + a^2*c^2*y^2 + a^2*b^2*z^2 = a^2*b^2*c^2
    b = ma
    c = na
 -> m^2*a^2*n^2*a^2*x^2 + a^2*n^2*a^2*y^2 + a^2*m^2*a^2*z^2 = a^2*m^2*a^2*n^2*a^2
 -> m^2*n^2*a^4*x^2 + n^2*a^4*y^2 + m^2*a^4*z^2 = m^2*n^2*a^6
 -> a^2 = (m^2*n^2*x^2 + n^2y^2 + m^2z^2) / (m^2*n^2) = x^2 + (y^2 / m^2) + (z^2 / n^2)
 -> b^2 = (m^2*n^2*x^2 + n^2y^2 + m^2z^2) / (n^2)     = (m^2 * x^2) + y^2 + (m^2 * z^2 / n^2)
 -> c^2 = (m^2*n^2*x^2 + n^2y^2 + m^2z^2) / (m^2)     = (n^2 * x^2) + (n^2 * y^2 / m^2) + z^2

All we have to do now is compute normal of the spheroid at that point:

    n = (x / a^2, y / b^2, z / c^2)

And we are done!

Definition at line 211 of file MOD_normal_edit.c.

References Freestyle::a, usdtokens::b(), BKE_mesh_normals_loop_custom_set(), BKE_mesh_normals_tag_dirty(), BKE_mesh_poly_normals_for_write(), BKE_mesh_vertex_normals_ensure(), BLI_BITMAP_ENABLE, BLI_BITMAP_NEW, BLI_BITMAP_TEST, Freestyle::c, copy_v3_v3(), KDL::cos(), NormalEditModifierData::flag, float(), generate_vert_coordinates(), Mesh::ldata, MEM_freeN, MEM_malloc_arrayN, mesh, mix_normals(), MOD_NORMALEDIT_NO_POLYNORS_FIX, normalize_v3(), NormalEditModifierData::offset, polygons_check_flip(), size(), NormalEditModifierData::target, MLoop::v, and x2.

Referenced by normalEditModifier_do().

◆ offset_panel_draw()

static void offset_panel_draw ( const bContext *  UNUSEDC,
Panel *  panel 
)
static

◆ panel_draw()

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

◆ panelRegister()

static void panelRegister ( ARegionType *  region_type)
static

◆ polygons_check_flip()

static bool polygons_check_flip ( MLoop *  mloop,
float(*)  nos[3],
CustomData *  ldata,
MPoly *  mpoly,
float(*)  polynors[3],
const int  polys_num 
)
static

◆ requiredDataMask()

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

◆ updateDepsgraph()

static void updateDepsgraph ( ModifierData *  md,
const ModifierUpdateDepsgraphContext *  ctx 
)
static

Variable Documentation

◆ modifierType_NormalEdit

ModifierTypeInfo modifierType_NormalEdit

Definition at line 758 of file MOD_normal_edit.c.