37#include "RNA_prototypes.hh"
45 const float offset[3],
51 float min_co[3], max_co[3];
60 if (r_size !=
nullptr && ob_center ==
nullptr) {
67 if (r_size !=
nullptr) {
68 if (ob_center !=
nullptr) {
92 if (ob_center !=
nullptr) {
93 float inv_obmat[4][4];
104 else if (offset !=
nullptr && !
is_zero_v3(offset)) {
122 const int defgrp_index,
123 const bool use_invert_vgroup,
124 const float mix_limit,
125 const short mix_mode,
132 float *facs =
nullptr, *wfac;
139 dvert, defgrp_index, verts_num, corner_verts, use_invert_vgroup, facs);
142 for (
i = corner_verts.
size(), no_new = nos_new, no_old = nos_old, wfac = facs;
i--;
143 no_new++, no_old++, wfac++)
145 const float fac = facs ? *wfac * mix_factor : mix_factor;
186 float norsum[3] = {0.0f};
196 if (
dot_v3v3(face_normals[
i], norsum) < 0.0f) {
212 const short mix_mode,
213 const float mix_factor,
214 const float mix_limit,
216 const int defgrp_index,
217 const bool use_invert_vgroup,
270 const float m2 = (
b *
b) / (a * a);
271 const float n2 = (c * c) / (a * a);
275 const int vidx = corner_verts[
i];
276 float *co =
cos[vidx];
279 const float x2 = co[0] * co[0];
280 const float y2 = co[1] * co[1];
281 const float z2 = co[2] * co[2];
282 const float a2 = x2 + (y2 / m2) + (z2 / n2);
283 const float b2 = (m2 * x2) + y2 + (m2 * z2 / n2);
284 const float c2 = (n2 * x2) + (n2 * y2 / m2) + z2;
304 vert_positions.
size(),
306 corner_normals.
data(),
310 if (do_facenors_fix) {
319 mesh->vert_to_face_map(),
320 mesh->vert_normals_true(),
321 mesh->face_normals_true(),
337 const short mix_mode,
338 const float mix_factor,
339 const float mix_limit,
341 const int defgrp_index,
342 const bool use_invert_vgroup,
364 mul_m4_m4m4(mat, mat, ob_target->object_to_world().ptr());
367 if (use_parallel_normals) {
373 for (
i = corner_verts.
size();
i--;) {
385 const int vidx = corner_verts[
i];
386 float *co =
cos[vidx];
410 corner_normals.
data(),
414 if (do_facenors_fix) {
423 mesh->vert_to_face_map(),
424 mesh->vert_normals_true(),
425 mesh->face_normals_true(),
469 if (mesh->edges().data() == ((
Mesh *)ob->
data)->edges().data()) {
495 if (!custom_nors_dst) {
498 if (use_current_clnors) {
505 result->vert_to_face_map(),
506 result->face_normals_true(),
509 custom_nors_dst.span,
521 custom_nors_dst.span,
540 custom_nors_dst.span,
555 result->runtime->is_original_bmesh =
false;
557 custom_nors_dst.finish();
649 row = &layout->
row(
true);
689 "NormalEditModifierData",
691 &RNA_NormalEditModifier,
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
void(*)(void *user_data, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag cb_flag) IDWalkFunc
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
MINLINE float min_ff(float a, float b)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
float angle_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
MINLINE void mul_v3_v3(float r[3], const float a[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
void interp_v3_v3v3_slerp_safe(float target[3], const float a[3], const float b[3], float t)
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void negate_v3(float r[3])
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
#define INIT_MINMAX(min, max)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void DEG_add_depends_on_transform_relation(DepsNodeHandle *node_handle, const char *description)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ MOD_NORMALEDIT_MODE_RADIAL
@ MOD_NORMALEDIT_MODE_DIRECTIONAL
@ eModifierType_NormalEdit
@ MOD_NORMALEDIT_NO_POLYNORS_FIX
@ MOD_NORMALEDIT_INVERT_VGROUP
@ MOD_NORMALEDIT_USE_DIRECTION_PARALLEL
@ MOD_NORMALEDIT_MIX_COPY
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void required_data_mask(ModifierData *, CustomData_MeshMasks *r_cddata_masks)
static void panel_draw(const bContext *, Panel *panel)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void init_data(ModifierData *md)
static void mix_mode_panel_draw(const bContext *, Panel *panel)
static bool is_valid_target(NormalEditModifierData *enmd)
static void panel_register(ARegionType *region_type)
static void normalEditModifier_do_directional(NormalEditModifierData *enmd, const ModifierEvalContext *, Object *ob, Mesh *mesh, blender::MutableSpan< blender::short2 > clnors, blender::MutableSpan< blender::float3 > corner_normals, const short mix_mode, const float mix_factor, const float mix_limit, const MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, const blender::Span< blender::float3 > positions, blender::MutableSpan< bool > sharp_edges, blender::MutableSpan< int > corner_verts, blender::MutableSpan< int > corner_edges, const blender::OffsetIndices< int > faces)
static bool is_valid_target_with_error(const Object *ob, NormalEditModifierData *enmd)
ModifierTypeInfo modifierType_NormalEdit
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void generate_vert_coordinates(Mesh *mesh, Object *ob, Object *ob_center, const float offset[3], const int verts_num, float(*r_cos)[3], blender::float3 *r_size)
static Mesh * normalEditModifier_do(NormalEditModifierData *enmd, const ModifierEvalContext *ctx, Object *ob, Mesh *mesh)
static void faces_check_flip(Mesh &mesh, blender::MutableSpan< blender::float3 > nos, const blender::Span< blender::float3 > face_normals)
static void panel_draw(const bContext *, Panel *panel)
static void offset_panel_draw(const bContext *, Panel *panel)
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
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 normalEditModifier_do_radial(NormalEditModifierData *enmd, const ModifierEvalContext *, Object *ob, Mesh *mesh, blender::MutableSpan< blender::short2 > clnors, blender::MutableSpan< blender::float3 > corner_normals, const short mix_mode, const float mix_factor, const float mix_limit, const MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, blender::Span< blender::float3 > vert_positions, blender::MutableSpan< bool > sharp_edges, blender::MutableSpan< int > corner_verts, blender::MutableSpan< int > corner_edges, const blender::OffsetIndices< int > faces)
static void mix_normals(const float mix_factor, const MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, const float mix_limit, const short mix_mode, const int verts_num, const blender::Span< int > corner_verts, blender::float3 *nos_old, blender::float3 *nos_new)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const StringRefNull vgroup_prop, const std::optional< StringRefNull > invert_vgroup_prop, const std::optional< StringRefNull > text)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_error_message_draw(uiLayout *layout, PointerRNA *ptr)
void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, const MDeformVert **dvert, int *defgrp_index)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
void reinitialize(const int64_t new_size)
constexpr int64_t size() const
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
constexpr bool is_empty() const
constexpr T * data() const
constexpr void reverse() const
constexpr IndexRange index_range() const
constexpr int64_t size() const
GAttributeReader lookup(const StringRef attribute_id) const
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, AttrType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
VecBase< short, 2 > short2
VecBase< float, 3 > float3
static void update_depsgraph(tGraphSliderOp *gso)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void normals_calc_corners(Span< float3 > vert_positions, OffsetIndices< int > faces, Span< int > corner_verts, Span< int > corner_edges, GroupedSpan< int > vert_to_face_map, Span< float3 > face_normals, Span< bool > sharp_edges, Span< bool > sharp_faces, Span< short2 > custom_normals, CornerNormalSpaceArray *r_fan_spaces, MutableSpan< float3 > r_corner_normals)
void normals_corner_custom_set(Span< float3 > vert_positions, OffsetIndices< int > faces, Span< int > corner_verts, Span< int > corner_edges, GroupedSpan< int > vert_to_face_map, Span< float3 > vert_normals, Span< float3 > face_normals, Span< bool > sharp_faces, MutableSpan< bool > sharp_edges, MutableSpan< float3 > r_custom_corner_normals, MutableSpan< short2 > r_clnors_data)
void mesh_flip_faces(Mesh &mesh, const IndexMask &selection)
VecBase< float, 3 > float3
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
MutableVArraySpan< T > span
uiLayout & column(bool align)
void active_set(bool active)
uiLayout & row(bool align)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)