Blender V5.0
MOD_normal_edit.cc File Reference
#include <cstring>
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
#include "BLI_bitmap.h"
#include "BLI_math_matrix.h"
#include "BLI_math_vector.h"
#include "BLI_math_vector.hh"
#include "BLT_translation.hh"
#include "DNA_defaults.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
#include "BKE_attribute.hh"
#include "BKE_deform.hh"
#include "BKE_lib_id.hh"
#include "BKE_lib_query.hh"
#include "BKE_mesh.hh"
#include "UI_interface_layout.hh"
#include "UI_resources.hh"
#include "RNA_access.hh"
#include "RNA_prototypes.hh"
#include "MOD_ui_common.hh"
#include "MOD_util.hh"

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], blender::float3 *r_size)
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)
static void faces_check_flip (Mesh &mesh, blender::MutableSpan< blender::float3 > nos, const blender::Span< blender::float3 > face_normals)
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 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 (NormalEditModifierData *enmd)
static bool is_valid_target_with_error (const Object *ob, NormalEditModifierData *enmd)
static MeshnormalEditModifier_do (NormalEditModifierData *enmd, const ModifierEvalContext *ctx, Object *ob, Mesh *mesh)
static void init_data (ModifierData *md)
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 bool is_disabled (const Scene *, ModifierData *md, bool)
static void update_depsgraph (ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static Meshmodify_mesh (ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void panel_draw (const bContext *, Panel *panel)
static void mix_mode_panel_draw (const bContext *, Panel *panel)
static void offset_panel_draw (const bContext *, Panel *panel)
static void panel_register (ARegionType *region_type)

Variables

ModifierTypeInfo modifierType_NormalEdit

Function Documentation

◆ faces_check_flip()

◆ foreach_ID_link()

void foreach_ID_link ( ModifierData * md,
Object * ob,
IDWalkFunc walk,
void * user_data )
static

Definition at line 582 of file MOD_normal_edit.cc.

References IDWALK_CB_NOP, and NormalEditModifierData::target.

◆ generate_vert_coordinates()

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

◆ init_data()

void init_data ( ModifierData * md)
static

◆ is_disabled()

bool is_disabled ( const Scene * ,
ModifierData * md,
bool  )
static

Definition at line 589 of file MOD_normal_edit.cc.

References is_valid_target().

◆ is_valid_target()

◆ is_valid_target_with_error()

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

Definition at line 443 of file MOD_normal_edit.cc.

References BKE_modifier_set_error(), and is_valid_target().

Referenced by normalEditModifier_do().

◆ mix_mode_panel_draw()

◆ mix_normals()

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 )
static

◆ modify_mesh()

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

Definition at line 605 of file MOD_normal_edit.cc.

References normalEditModifier_do(), and ModifierEvalContext::object.

◆ normalEditModifier_do()

◆ normalEditModifier_do_directional()

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

◆ normalEditModifier_do_radial()

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

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 206 of file MOD_normal_edit.cc.

References Geometry::attributes, b, BLI_BITMAP_ENABLE, BLI_BITMAP_NEW, BLI_BITMAP_TEST, cos, blender::Array< T, InlineBufferCapacity, Allocator >::data(), blender::MutableSpan< T >::data(), blender::bke::Face, faces, faces_check_flip(), NormalEditModifierData::flag, float, generate_vert_coordinates(), i, blender::MutableSpan< T >::index_range(), blender::MutableSpan< T >::is_empty(), blender::bke::AttributeAccessor::lookup(), MEM_freeN(), MEM_malloc_arrayN(), mix_normals(), MOD_NORMALEDIT_NO_POLYNORS_FIX, normalize_v3(), blender::bke::mesh::normals_corner_custom_set(), NormalEditModifierData::offset, blender::MutableSpan< T >::size(), blender::Span< T >::size(), size(), and NormalEditModifierData::target.

Referenced by normalEditModifier_do().

◆ offset_panel_draw()

◆ panel_draw()

◆ panel_register()

◆ required_data_mask()

void required_data_mask ( ModifierData * md,
CustomData_MeshMasks * r_cddata_masks )
static

◆ update_depsgraph()

Variable Documentation

◆ modifierType_NormalEdit

ModifierTypeInfo modifierType_NormalEdit

Definition at line 686 of file MOD_normal_edit.cc.