37#include "RNA_prototypes.hh"
45 const float offset[3],
51 float min_co[3], max_co[3];
58 for (
int i = 0; i < mesh->verts_num; i++) {
60 if (r_size !=
nullptr && ob_center ==
nullptr) {
67 if (r_size !=
nullptr) {
68 if (ob_center !=
nullptr) {
83 r_size[0] = r_size[1] = r_size[2] = 1.0f;
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;
137 facs =
static_cast<float *
>(
148 for (i = corner_verts.
size(), no_new = nos_new, no_old = nos_old, wfac = facs; i--;
149 no_new++, no_old++, wfac++)
151 const float fac = facs ? *wfac * mix_factor : mix_factor;
187 const OffsetIndices faces = mesh.faces();
188 IndexMaskMemory memory;
189 const IndexMask faces_to_flip = IndexMask::from_predicate(
190 faces.index_range(),
GrainSize(1024), memory, [&](
const int i) {
192 float norsum[3] = {0.0f};
202 if (
dot_v3v3(face_normals[i], norsum) < 0.0f) {
209 bke::mesh_flip_faces(mesh, faces_to_flip);
218 const short mix_mode,
219 const float mix_factor,
220 const float mix_limit,
222 const int defgrp_index,
223 const bool use_invert_vgroup,
236 float(*
cos)[3] =
static_cast<float(*)[3]
>(
277 const float a = size[0],
b = size[1], c = size[2];
278 const float m2 = (
b *
b) / (a * a);
279 const float n2 = (c * c) / (a * a);
283 const int vidx = corner_verts[i];
284 float *co =
cos[vidx];
287 const float x2 = co[0] * co[0];
288 const float y2 = co[1] * co[1];
289 const float z2 = co[2] * co[2];
290 const float a2 = x2 + (y2 / m2) + (z2 / n2);
291 const float b2 = (m2 * x2) + y2 + (m2 * z2 / n2);
292 const float c2 = (n2 * x2) + (n2 * y2 / m2) + z2;
312 vert_positions.
size(),
314 corner_normals.
data(),
318 if (do_facenors_fix) {
322 const VArraySpan sharp_faces = *attributes.lookup<
bool>(
"sharp_face", bke::AttrDomain::Face);
323 bke::mesh::normals_corner_custom_set(vert_positions,
328 mesh->vert_normals(),
329 mesh->face_normals(),
345 const short mix_mode,
346 const float mix_factor,
347 const float mix_limit,
349 const int defgrp_index,
350 const bool use_invert_vgroup,
373 mul_m4_m4m4(mat, mat, ob_target->object_to_world().ptr());
376 if (use_parallel_normals) {
382 for (i = corner_verts.
size(); i--;) {
387 float(*
cos)[3] =
static_cast<float(*)[3]
>(
395 const int vidx = corner_verts[i];
396 float *co =
cos[vidx];
420 corner_normals.
data(),
424 if (do_facenors_fix) {
428 const VArraySpan sharp_faces = *attributes.lookup<
bool>(
"sharp_face", bke::AttrDomain::Face);
429 bke::mesh::normals_corner_custom_set(positions,
434 mesh->vert_normals(),
435 mesh->face_normals(),
479 if (mesh->edges().data() == ((
Mesh *)ob->
data)->edges().data()) {
491 const OffsetIndices faces = result->faces();
504 "sharp_edge", bke::AttrDomain::Edge);
508 if (use_current_clnors) {
512 const VArraySpan sharp_faces = *attributes.lookup<
bool>(
"sharp_face", bke::AttrDomain::Face);
518 result->corner_to_face_map(),
519 result->vert_normals(),
520 result->face_normals(),
528 if (clnors ==
nullptr) {
540 {clnors, result->corners_num},
560 {clnors, result->corners_num},
576 result->runtime->is_original_bmesh =
false;
712 "NormalEditModifierData",
714 &RNA_NormalEditModifier,
CustomData interface, see also DNA_customdata_types.h.
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
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 abs_v3_v3(float r[3], const float a[3])
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 CD_MASK_CUSTOMLOOPNORMAL
#define DNA_struct_default_get(struct_name)
struct NormalEditModifierData NormalEditModifierData
@ eModifierType_NormalEdit
@ MOD_NORMALEDIT_NO_POLYNORS_FIX
@ MOD_NORMALEDIT_INVERT_VGROUP
@ MOD_NORMALEDIT_USE_DIRECTION_PARALLEL
@ MOD_NORMALEDIT_MODE_RADIAL
@ MOD_NORMALEDIT_MODE_DIRECTIONAL
@ 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 mix_mode_panel_draw(const bContext *, Panel *panel)
static bool is_valid_target(NormalEditModifierData *enmd)
static void panel_register(ARegionType *region_type)
static bool is_valid_target_with_error(const Object *ob, NormalEditModifierData *enmd)
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, const blender::Span< blender::int2 > edges, blender::MutableSpan< bool > sharp_edges, blender::MutableSpan< int > corner_verts, blender::MutableSpan< int > corner_edges, const blender::OffsetIndices< int > faces)
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], float r_size[3])
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, const blender::Span< blender::int2 > edges, blender::MutableSpan< bool > sharp_edges, blender::MutableSpan< int > corner_verts, blender::MutableSpan< int > corner_edges, const blender::OffsetIndices< int > faces)
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 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)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
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_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, const MDeformVert **dvert, int *defgrp_index)
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
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 const T * data() const
constexpr int64_t size() const
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float3 cos(float3 v)
void normals_calc_corners(Span< float3 > vert_positions, Span< int2 > edges, OffsetIndices< int > faces, Span< int > corner_verts, Span< int > corner_edges, Span< int > corner_to_face_map, Span< float3 > vert_normals, Span< float3 > face_normals, Span< bool > sharp_edges, Span< bool > sharp_faces, const short2 *clnors_data, CornerNormalSpaceArray *r_lnors_spacearr, MutableSpan< float3 > r_corner_normals)
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