Blender
V3.3
|
#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 |
|
static |
Definition at line 647 of file MOD_normal_edit.c.
|
static |
Definition at line 652 of file MOD_normal_edit.c.
References IDWALK_CB_NOP, and NormalEditModifierData::target.
|
static |
Definition at line 42 of file MOD_normal_edit.c.
References abs_v3_v3(), add_v3_v3(), CLAMP_MIN, copy_v3_v3(), KDL::diff(), INIT_MINMAX, invert_m4_m4(), is_zero_v3(), mesh, minmax_v3v3_v3(), mul_v3_m4v3(), Mesh::mvert, negate_v3(), negate_v3_v3(), NULL, Object::obmat, offset, Object::scale, sub_v3_v3v3(), and Mesh::totvert.
Referenced by normalEditModifier_do_directional(), and normalEditModifier_do_radial().
|
static |
Definition at line 624 of file MOD_normal_edit.c.
References BLI_assert, DNA_struct_default_get, MEMCMP_STRUCT_AFTER_IS_ZERO, and MEMCPY_STRUCT_AFTER.
|
static |
Definition at line 460 of file MOD_normal_edit.c.
References MOD_NORMALEDIT_MODE_DIRECTIONAL, MOD_NORMALEDIT_MODE_RADIAL, NormalEditModifierData::mode, and NormalEditModifierData::target.
Referenced by is_valid_target_with_error(), and isDisabled().
|
static |
Definition at line 471 of file MOD_normal_edit.c.
References BKE_modifier_set_error(), and is_valid_target().
Referenced by normalEditModifier_do().
|
static |
Definition at line 659 of file MOD_normal_edit.c.
References is_valid_target().
Definition at line 706 of file MOD_normal_edit.c.
References Panel::layout, modifier_panel_get_property_pointers(), modifier_vgroup_ui(), NULL, ptr, RNA_boolean_get(), uiItemR(), uiLayoutRow(), and uiLayoutSetPropSep().
Referenced by panelRegister().
|
static |
Definition at line 119 of file MOD_normal_edit.c.
References add_v3_v3(), angle_v3v3(), BKE_defvert_extract_vgroup_to_loopweights(), float(), interp_v3_v3v3_slerp_safe(), M_PI, MEM_malloc_arrayN, MEM_SAFE_FREE, min_ff(), MOD_NORMALEDIT_MIX_ADD, MOD_NORMALEDIT_MIX_COPY, MOD_NORMALEDIT_MIX_MUL, MOD_NORMALEDIT_MIX_SUB, mul_v3_v3(), normalize_v3(), NULL, and sub_v3_v3().
Referenced by normalEditModifier_do_directional(), and normalEditModifier_do_radial().
|
static |
Definition at line 677 of file MOD_normal_edit.c.
References mesh, normalEditModifier_do(), and ModifierEvalContext::object.
|
static |
Definition at line 480 of file MOD_normal_edit.c.
References BKE_id_copy_ex(), BKE_mesh_normals_loop_split(), BKE_mesh_poly_normals_ensure(), BKE_mesh_vertex_normals_ensure(), BKE_modifier_set_error(), CD_CALLOC, CD_CUSTOMLOOPNORMAL, CustomData_add_layer(), CustomData_duplicate_referenced_layer(), CustomData_get_layer(), Object::data, NormalEditModifierData::defgrp_name, Mesh::flag, NormalEditModifierData::flag, float(), Mesh::id, is_valid_target_with_error(), LIB_ID_COPY_LOCALIZE, M_PI, ME_AUTOSMOOTH, Mesh::medge, MEM_malloc_arrayN, MEM_SAFE_FREE, mesh, NormalEditModifierData::mix_factor, NormalEditModifierData::mix_limit, NormalEditModifierData::mix_mode, MOD_get_vgroup(), MOD_NORMALEDIT_INVERT_VGROUP, MOD_NORMALEDIT_MIX_COPY, MOD_NORMALEDIT_MODE_DIRECTIONAL, MOD_NORMALEDIT_MODE_RADIAL, NormalEditModifierData::mode, normalEditModifier_do_directional(), normalEditModifier_do_radial(), NULL, ModifierEvalContext::object, result, and Mesh::totloop.
Referenced by modifyMesh().
|
static |
Definition at line 348 of file MOD_normal_edit.c.
References 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, copy_v3_v3(), KDL::cos(), NormalEditModifierData::flag, float(), generate_vert_coordinates(), invert_m4_m4(), Mesh::ldata, MEM_freeN, MEM_malloc_arrayN, mesh, mix_normals(), MOD_NORMALEDIT_NO_POLYNORS_FIX, MOD_NORMALEDIT_USE_DIRECTION_PARALLEL, mul_m4_m4m4(), normalize_v3(), NULL, Object::obmat, NormalEditModifierData::offset, polygons_check_flip(), sub_v3_v3v3(), NormalEditModifierData::target, and MLoop::v.
Referenced by normalEditModifier_do().
|
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().
Definition at line 731 of file MOD_normal_edit.c.
References Panel::layout, MOD_NORMALEDIT_MODE_DIRECTIONAL, MOD_NORMALEDIT_MODE_RADIAL, modifier_panel_get_property_pointers(), NULL, ptr, RNA_boolean_get(), RNA_enum_get(), RNA_pointer_get(), RNA_pointer_is_null(), uiItemR(), uiLayoutSetActive(), and uiLayoutSetPropSep().
Referenced by panelRegister().
Definition at line 682 of file MOD_normal_edit.c.
References col, Panel::layout, MOD_NORMALEDIT_MODE_DIRECTIONAL, modifier_panel_end(), modifier_panel_get_property_pointers(), NULL, ptr, RNA_enum_get(), UI_ITEM_R_EXPAND, uiItemR(), uiLayoutColumn(), uiLayoutSetActive(), and uiLayoutSetPropSep().
Referenced by panelRegister().
|
static |
Definition at line 750 of file MOD_normal_edit.c.
References eModifierType_NormalEdit, mix_mode_panel_draw(), modifier_panel_register(), modifier_subpanel_register(), NULL, offset_panel_draw(), and panel_draw().
|
static |
Definition at line 175 of file MOD_normal_edit.c.
References add_v3_v3(), BKE_mesh_polygon_flip_ex(), CD_MDISPS, CustomData_get_layer(), dot_v3v3(), float(), MPoly::loopstart, negate_v3(), and normalize_v3().
Referenced by normalEditModifier_do_directional(), and normalEditModifier_do_radial().
|
static |
Definition at line 633 of file MOD_normal_edit.c.
References CD_MASK_CUSTOMLOOPNORMAL, CD_MASK_MDEFORMVERT, NormalEditModifierData::defgrp_name, CustomData_MeshMasks::lmask, and CustomData_MeshMasks::vmask.
|
static |
Definition at line 668 of file MOD_normal_edit.c.
References DEG_add_modifier_to_transform_relation(), DEG_add_object_relation(), DEG_OB_COMP_TRANSFORM, ModifierUpdateDepsgraphContext::node, and NormalEditModifierData::target.
ModifierTypeInfo modifierType_NormalEdit |
Definition at line 758 of file MOD_normal_edit.c.