32 #include "RNA_prototypes.h"
40 #define CLNORS_VALID_VEC_LEN (1e-6f)
53 return (r1->
val < r2->
val) ? 1 : ((r1->
val > r2->
val) ? -1 : 0);
66 #define NUM_CACHED_INVERSE_POWERS_OF_WEIGHT 128
131 const float curr_val,
132 const bool use_face_influence)
140 const float weight = wn_data->
weight;
144 const bool has_vgroup = dvert !=
NULL;
145 const bool vert_of_group = has_vgroup &&
149 ((vert_of_group && use_invert_vgroup) || (!vert_of_group && !use_invert_vgroup))) {
169 const int loops_num = item_data->
loops_num;
171 cached_inverse_powers_of_weight[loops_num] == 0.0f) {
172 cached_inverse_powers_of_weight[loops_num] = 1.0f /
powf(weight, loops_num);
175 cached_inverse_powers_of_weight[loops_num] :
176 1.0f /
powf(weight, loops_num);
184 const int verts_num = wn_data->
verts_num;
185 const int edges_num = wn_data->
edges_num;
186 const int loops_num = wn_data->
loops_num;
187 const int polys_num = wn_data->
polys_num;
193 short(*clnors)[2] = wn_data->
clnors;
202 const short mode = wn_data->
mode;
211 poly_strength !=
NULL;
212 const bool has_vgroup = dvert !=
NULL;
223 loop_normals =
MEM_calloc_arrayN((
size_t)loops_num,
sizeof(*loop_normals), __func__);
238 has_clnors ? clnors :
NULL,
242 items_data =
MEM_calloc_arrayN((
size_t)items_num,
sizeof(*items_data), __func__);
249 for (mp = mpoly, mp_index = 0, item_index = 0; mp_index < polys_num; mp++, mp_index++) {
251 const int ml_end_index = ml_index + mp->
totloop;
253 for (; ml_index < ml_end_index; ml_index++) {
283 items_num = verts_num;
284 items_data =
MEM_calloc_arrayN((
size_t)items_num,
sizeof(*items_data), __func__);
285 if (use_face_influence) {
286 for (
int item_index = 0; item_index < items_num; item_index++) {
295 for (
int i = 0; i < polys_num; i++) {
296 const int mp_index = mode_pair[i].
index;
297 const float mp_val = mode_pair[i].
val;
299 int ml_index = mpoly[mp_index].
loopstart;
300 const int ml_index_end = ml_index + mpoly[mp_index].
totloop;
301 for (; ml_index < ml_index_end; ml_index++) {
302 const int mv_index = mloop[ml_index].
v;
307 wnmd, wn_data, item_data, mv_index, mp_index, mp_val, use_face_influence);
315 for (
int i = 0; i < loops_num; i++) {
316 const int ml_index = mode_pair[i].
index;
317 const float ml_val = mode_pair[i].
val;
319 const int mp_index = loop_to_poly[ml_index];
320 const int mv_index = mloop[ml_index].
v;
325 wnmd, wn_data, item_data, mv_index, mp_index, ml_val, use_face_influence);
333 for (
int item_index = 0; item_index < items_num; item_index++) {
344 for (
int ml_index = 0; ml_index < loops_num; ml_index++) {
375 (
size_t)verts_num,
sizeof(*loop_normals), __func__);
377 for (
int ml_index = 0; ml_index < loops_num; ml_index++) {
378 const int mv_index = mloop[ml_index].
v;
398 loop_normals =
MEM_calloc_arrayN((
size_t)loops_num,
sizeof(*loop_normals), __func__);
414 has_clnors ? clnors :
NULL,
417 for (
int ml_index = 0; ml_index < loops_num; ml_index++) {
418 const int item_index = mloop[ml_index].
v;
447 const int polys_num = wn_data->
polys_num;
459 for (mp_index = 0, mp = mpoly; mp_index < polys_num; mp_index++, mp++, f_area++) {
461 f_area->
index = mp_index;
472 const int loops_num = wn_data->
loops_num;
473 const int polys_num = wn_data->
polys_num;
482 int *loop_to_poly =
MEM_malloc_arrayN((
size_t)loops_num,
sizeof(*loop_to_poly), __func__);
486 for (mp_index = 0, mp = mpoly; mp_index < polys_num; mp_index++, mp++) {
493 float *angl = index_angle;
495 ml_index++, c_angl++, angl++) {
497 c_angl->
index = ml_index;
499 loop_to_poly[ml_index] = mp_index;
513 const int loops_num = wn_data->
loops_num;
514 const int polys_num = wn_data->
polys_num;
523 int *loop_to_poly =
MEM_malloc_arrayN((
size_t)loops_num,
sizeof(*loop_to_poly), __func__);
527 for (mp_index = 0, mp = mpoly; mp_index < polys_num; mp_index++, mp++) {
535 float *angl = index_angle;
537 ml_index++, cmbnd++, angl++) {
540 cmbnd->
index = ml_index;
542 loop_to_poly[ml_index] = mp_index;
578 const int verts_num =
result->totvert;
579 const int edges_num =
result->totedge;
580 const int loops_num =
result->totloop;
581 const int polys_num =
result->totpoly;
595 if (wnmd->
weight == 100) {
596 weight = (
float)SHRT_MAX;
598 else if (wnmd->
weight == 1) {
599 weight = 1 / (
float)SHRT_MAX;
601 else if ((weight - 1) * 25 > 1) {
602 weight = (weight - 1) * 25;
610 const bool has_clnors = clnors !=
NULL;
621 .edges_num = edges_num,
622 .loops_num = loops_num,
623 .polys_num = polys_num,
631 .has_clnors = has_clnors,
632 .split_angle = split_angle,
640 .defgrp_index = defgrp_index,
647 switch (wnmd->
mode) {
663 result->runtime.is_original =
false;
729 N_(
"WeightedNormal"),
730 "WeightedNormalModifierData",
732 &RNA_WeightedNormalModifier,
typedef float(TangentPoint)[2]
void * CustomData_get_layer_named(const struct CustomData *data, int type, const char *name)
void * CustomData_get_layer(const struct CustomData *data, int type)
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
struct ID * BKE_id_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, int flag)
const float(* BKE_mesh_poly_normals_ensure(const struct Mesh *mesh))[3]
void BKE_mesh_calc_poly_angles(const struct MPoly *mpoly, const struct MLoop *loopstart, const struct MVert *mvarray, float angles[])
void BKE_mesh_normals_loop_custom_set(const struct MVert *mverts, const float(*vert_normals)[3], int numVerts, struct MEdge *medges, int numEdges, struct MLoop *mloops, float(*r_custom_loopnors)[3], int numLoops, struct MPoly *mpolys, const float(*polynors)[3], int numPolys, short(*r_clnors_data)[2])
void BKE_mesh_normals_loop_custom_from_vertices_set(const struct MVert *mverts, const float(*vert_normals)[3], float(*r_custom_vertnors)[3], int numVerts, struct MEdge *medges, int numEdges, struct MLoop *mloops, int numLoops, struct MPoly *mpolys, const float(*polynors)[3], int numPolys, short(*r_clnors_data)[2])
const float(* BKE_mesh_vertex_normals_ensure(const struct Mesh *mesh))[3]
void BKE_mesh_normals_loop_split(const struct MVert *mverts, const float(*vert_normals)[3], int numVerts, struct MEdge *medges, int numEdges, struct MLoop *mloops, float(*r_loopnors)[3], int numLoops, struct MPoly *mpolys, const float(*polynors)[3], int numPolys, bool use_split_normals, float split_angle, MLoopNorSpaceArray *r_lnors_spacearr, short(*clnors_data)[2], int *r_loop_to_poly)
void BKE_lnor_spacearr_free(MLoopNorSpaceArray *lnors_spacearr)
float BKE_mesh_calc_poly_area(const struct MPoly *mpoly, const struct MLoop *loopstart, const struct MVert *mvarray)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_Constructive
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
#define BLI_assert_unreachable()
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
MINLINE int compare_ff(float a, float b, float max_diff)
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float normalize_v3(float r[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE bool is_zero_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v3(float r[3])
#define POINTER_AS_INT(i)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define CD_MASK_MDEFORMVERT
#define CD_MASK_PROP_INT32
#define CD_MASK_CUSTOMLOOPNORMAL
#define DNA_struct_default_get(struct_name)
struct WeightedNormalModifierData WeightedNormalModifierData
@ eModifierType_WeightedNormal
#define MOD_WEIGHTEDNORMALS_FACEWEIGHT_CDLAYER_ID
@ MOD_WEIGHTEDNORMAL_KEEP_SHARP
@ MOD_WEIGHTEDNORMAL_FACE_INFLUENCE
@ MOD_WEIGHTEDNORMAL_INVERT_VGROUP
@ MOD_WEIGHTEDNORMAL_MODE_FACE
@ MOD_WEIGHTEDNORMAL_MODE_FACE_ANGLE
@ MOD_WEIGHTEDNORMAL_MODE_ANGLE
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
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(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static bool check_item_poly_strength(WeightedNormalData *wn_data, WeightedNormalDataAggregateItem *item_data, const int mp_index)
static void wn_corner_angle(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data)
static void wn_face_area(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data)
#define NUM_CACHED_INVERSE_POWERS_OF_WEIGHT
static bool dependsOnNormals(ModifierData *UNUSED(md))
ModifierTypeInfo modifierType_WeightedNormal
struct WeightedNormalData WeightedNormalData
static int modepair_cmp_by_val_inverse(const void *p1, const void *p2)
struct WeightedNormalDataAggregateItem WeightedNormalDataAggregateItem
#define CLNORS_VALID_VEC_LEN
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static void wn_face_with_angle(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data)
static void aggregate_item_normal(WeightedNormalModifierData *wnmd, WeightedNormalData *wn_data, WeightedNormalDataAggregateItem *item_data, const int mv_index, const int mp_index, const float curr_val, const bool use_face_influence)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
IconTextureDrawCall normal
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
MLoopNorSpace ** lspacearr
const float(* vert_normals)[3]
WeightedNormalDataAggregateItem * items_data
const bool use_invert_vgroup
const float(* polynors)[3]
const int * poly_strength
float cached_inverse_powers_of_weight[NUM_CACHED_INVERSE_POWERS_OF_WEIGHT]