Blender  V3.3
MOD_gpencilthick.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2017 Blender Foundation. */
3 
8 #include <stdio.h>
9 
10 #include "BLI_listbase.h"
11 #include "BLI_math_vector.h"
12 #include "BLI_utildefines.h"
13 
14 #include "BLT_translation.h"
15 
16 #include "DNA_defaults.h"
18 #include "DNA_gpencil_types.h"
19 #include "DNA_meshdata_types.h"
20 #include "DNA_object_types.h"
21 #include "DNA_screen_types.h"
22 
23 #include "BKE_colortools.h"
24 #include "BKE_context.h"
25 #include "BKE_deform.h"
26 #include "BKE_gpencil_modifier.h"
27 #include "BKE_lib_query.h"
28 #include "BKE_modifier.h"
29 #include "BKE_screen.h"
30 
31 #include "DEG_depsgraph.h"
32 
33 #include "UI_interface.h"
34 #include "UI_resources.h"
35 
36 #include "RNA_access.h"
37 
39 #include "MOD_gpencil_ui_common.h"
40 #include "MOD_gpencil_util.h"
41 
42 static void initData(GpencilModifierData *md)
43 {
45 
46  BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier));
47 
49 
50  gpmd->curve_thickness = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
52 }
53 
54 static void freeData(GpencilModifierData *md)
55 {
57 
58  if (gpmd->curve_thickness) {
60  }
61 }
62 
63 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
64 {
67 
68  if (tgmd->curve_thickness != NULL) {
70  tgmd->curve_thickness = NULL;
71  }
72 
74 
76 }
77 
78 /* change stroke thickness */
81  Object *ob,
82  bGPDlayer *gpl,
83  bGPDframe *UNUSED(gpf),
84  bGPDstroke *gps)
85 {
87  const int def_nr = BKE_object_defgroup_name_index(ob, mmd->vgname);
88 
90  mmd->layername,
91  mmd->material,
92  mmd->pass_index,
93  mmd->layer_pass,
94  1,
95  gpl,
96  gps,
100  mmd->flag & GP_THICK_INVERT_MATERIAL)) {
101  return;
102  }
103 
104  float stroke_thickness_inv = 1.0f / max_ii(gps->thickness, 1);
105  const bool is_normalized = (mmd->flag & GP_THICK_NORMALIZE);
106  bool is_inverted = ((mmd->flag & GP_THICK_WEIGHT_FACTOR) == 0) &&
107  ((mmd->flag & GP_THICK_INVERT_VGROUP) != 0);
108 
109  for (int i = 0; i < gps->totpoints; i++) {
110  bGPDspoint *pt = &gps->points[i];
111  MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL;
112  /* Verify point is part of vertex group. */
113  float weight = get_modifier_point_weight(dvert, is_inverted, def_nr);
114  if (weight < 0.0f) {
115  continue;
116  }
117 
118  /* Apply weight directly. */
119  if ((!is_normalized) && (mmd->flag & GP_THICK_WEIGHT_FACTOR)) {
120  pt->pressure *= ((mmd->flag & GP_THICK_INVERT_VGROUP) ? 1.0f - weight : weight);
121  CLAMP_MIN(pt->pressure, 0.0f);
122  continue;
123  }
124 
125  float curvef = 1.0f;
126 
127  if ((mmd->flag & GP_THICK_CUSTOM_CURVE) && (mmd->curve_thickness)) {
128  /* Normalize value to evaluate curve. */
129  float value = (float)i / (gps->totpoints - 1);
130  curvef = BKE_curvemapping_evaluateF(mmd->curve_thickness, 0, value);
131  }
132 
133  float target;
134  if (is_normalized) {
135  target = mmd->thickness * stroke_thickness_inv;
136  target *= curvef;
137  }
138  else {
139  target = pt->pressure * mmd->thickness_fac;
140  weight *= curvef;
141  }
142 
143  pt->pressure = interpf(target, pt->pressure, weight);
144 
145  CLAMP_MIN(pt->pressure, 0.0f);
146  }
147 }
148 
149 static void bakeModifier(struct Main *UNUSED(bmain),
152  Object *ob)
153 {
155 }
156 
157 static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
158 {
160 
161  walk(userData, ob, (ID **)&mmd->material, IDWALK_CB_USER);
162 }
163 
164 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
165 {
166  uiLayout *layout = panel->layout;
167 
169 
170  uiLayoutSetPropSep(layout, true);
171 
172  uiItemR(layout, ptr, "use_normalized_thickness", 0, NULL, ICON_NONE);
173  if (RNA_boolean_get(ptr, "use_normalized_thickness")) {
174  uiItemR(layout, ptr, "thickness", 0, NULL, ICON_NONE);
175  }
176  else {
177  const bool is_weighted = !RNA_boolean_get(ptr, "use_weight_factor");
178  uiLayout *row = uiLayoutRow(layout, true);
179  uiLayoutSetActive(row, is_weighted);
180  uiItemR(row, ptr, "thickness_factor", 0, NULL, ICON_NONE);
181  uiLayout *sub = uiLayoutRow(row, true);
182  uiLayoutSetActive(sub, true);
183  uiItemR(row, ptr, "use_weight_factor", 0, "", ICON_MOD_VERTEX_WEIGHT);
184  }
185 
187 }
188 
189 static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
190 {
191  gpencil_modifier_masking_panel_draw(panel, true, true);
192 }
193 
194 static void panelRegister(ARegionType *region_type)
195 {
197  region_type, eGpencilModifierType_Thick, panel_draw);
199  region_type, "mask", "Influence", NULL, mask_panel_draw, panel_type);
201  "curve",
202  "",
205  mask_panel_type);
206 }
207 
209  /* name */ N_("Thickness"),
210  /* structName */ "ThickGpencilModifierData",
211  /* structSize */ sizeof(ThickGpencilModifierData),
214 
215  /* copyData */ copyData,
216 
217  /* deformStroke */ deformStroke,
218  /* generateStrokes */ NULL,
219  /* bakeModifier */ bakeModifier,
220  /* remapTime */ NULL,
221 
222  /* initData */ initData,
223  /* freeData */ freeData,
224  /* isDisabled */ NULL,
225  /* updateDepsgraph */ NULL,
226  /* dependsOnTime */ NULL,
227  /* foreachIDLink */ foreachIDLink,
228  /* foreachTexLink */ NULL,
229  /* panelRegister */ panelRegister,
230 };
typedef float(TangentPoint)[2]
void BKE_curvemapping_init(struct CurveMapping *cumap)
Definition: colortools.c:1235
struct CurveMapping * BKE_curvemapping_copy(const struct CurveMapping *cumap)
float BKE_curvemapping_evaluateF(const struct CurveMapping *cumap, int cur, float value)
void BKE_curvemapping_free(struct CurveMapping *cumap)
Definition: colortools.c:103
struct CurveMapping * BKE_curvemapping_add(int tot, float minx, float miny, float maxx, float maxy)
Definition: colortools.c:72
support for deformation groups and hooks.
int BKE_object_defgroup_name_index(const struct Object *ob, const char *name)
void BKE_gpencil_modifier_copydata_generic(const struct GpencilModifierData *md_src, struct GpencilModifierData *md_dst)
@ eGpencilModifierTypeFlag_SupportsEditmode
@ eGpencilModifierTypeType_Gpencil
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:73
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:107
#define BLI_assert(a)
Definition: BLI_assert.h:46
MINLINE int max_ii(int a, int b)
MINLINE float interpf(float a, float b, float t)
#define UNUSED(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define CLAMP_MIN(a, b)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:35
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ GP_THICK_WEIGHT_FACTOR
@ GP_THICK_INVERT_VGROUP
@ GP_THICK_INVERT_MATERIAL
@ GP_THICK_INVERT_LAYERPASS
struct ThickGpencilModifierData ThickGpencilModifierData
@ eGpencilModifierType_Thick
Object is a sort of wrapper for general info.
PointerRNA * gpencil_modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void gpencil_modifier_masking_panel_draw(Panel *panel, bool use_material, bool use_vertex)
void gpencil_modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * gpencil_modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
PanelType * gpencil_modifier_panel_register(ARegionType *region_type, GpencilModifierType type, PanelDrawFn draw)
void gpencil_modifier_curve_header_draw(const bContext *UNUSED(C), Panel *panel)
void gpencil_modifier_curve_panel_draw(const bContext *UNUSED(C), Panel *panel)
float get_modifier_point_weight(MDeformVert *dvert, bool inverse, int def_nr)
void generic_bake_deform_stroke(Depsgraph *depsgraph, GpencilModifierData *md, Object *ob, const bool retime, gpBakeCb bake_cb)
bool is_stroke_affected_by_modifier(Object *ob, char *mlayername, Material *material, const int mpassindex, const int gpl_passindex, const int minpoints, bGPDlayer *gpl, bGPDstroke *gps, const bool inv1, const bool inv2, const bool inv3, const bool inv4)
static void deformStroke(GpencilModifierData *md, Depsgraph *UNUSED(depsgraph), Object *ob, bGPDlayer *gpl, bGPDframe *UNUSED(gpf), bGPDstroke *gps)
static void freeData(GpencilModifierData *md)
static void bakeModifier(struct Main *UNUSED(bmain), Depsgraph *depsgraph, GpencilModifierData *md, Object *ob)
static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
GpencilModifierTypeInfo modifierType_Gpencil_Thick
static void panelRegister(ARegionType *region_type)
static void initData(GpencilModifierData *md)
#define C
Definition: RandGen.cpp:25
void uiLayoutSetActive(uiLayout *layout, bool active)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
const Depsgraph * depsgraph
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4863
Definition: DNA_ID.h:368
Definition: BKE_main.h:121
struct uiLayout * layout
struct CurveMapping * curve_thickness
bGPDspoint * points
struct MDeformVert * dvert
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480