Blender  V3.3
MOD_gpencilsimplify.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 #include <string.h> /* For #MEMCPY_STRUCT_AFTER. */
10 
11 #include "BLI_listbase.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_object_types.h"
20 #include "DNA_screen_types.h"
21 
22 #include "BKE_context.h"
23 #include "BKE_gpencil_geom.h"
24 #include "BKE_gpencil_modifier.h"
25 #include "BKE_lib_query.h"
26 #include "BKE_modifier.h"
27 #include "BKE_screen.h"
28 
29 #include "DEG_depsgraph.h"
30 
31 #include "UI_interface.h"
32 #include "UI_resources.h"
33 
34 #include "RNA_access.h"
35 
37 #include "MOD_gpencil_ui_common.h"
38 #include "MOD_gpencil_util.h"
39 
40 static void initData(GpencilModifierData *md)
41 {
43 
44  BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier));
45 
47 }
48 
49 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
50 {
52 }
53 
56  Object *ob,
57  bGPDlayer *gpl,
58  bGPDframe *gpf,
59  bGPDstroke *gps)
60 {
62 
64  mmd->layername,
65  mmd->material,
66  mmd->pass_index,
67  mmd->layer_pass,
68  mmd->mode == GP_SIMPLIFY_SAMPLE ? 2 : 3,
69  gpl,
70  gps,
75  return;
76  }
77  bGPdata *gpd = ob->data;
78  /* Select simplification mode. */
79  switch (mmd->mode) {
80  case GP_SIMPLIFY_FIXED: {
81  for (int i = 0; i < mmd->step; i++) {
83  }
84  break;
85  }
86  case GP_SIMPLIFY_ADAPTIVE: {
87  /* simplify stroke using Ramer-Douglas-Peucker algorithm */
89  break;
90  }
91  case GP_SIMPLIFY_SAMPLE: {
92  BKE_gpencil_stroke_sample(gpd, gps, mmd->length, false, mmd->sharp_threshold);
93  break;
94  }
95  case GP_SIMPLIFY_MERGE: {
96  BKE_gpencil_stroke_merge_distance(gpd, gpf, gps, mmd->distance, true);
97  break;
98  }
99  default:
100  break;
101  }
102 }
103 
104 static void bakeModifier(struct Main *UNUSED(bmain),
107  Object *ob)
108 {
110 }
111 
112 static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
113 {
115 
116  walk(userData, ob, (ID **)&mmd->material, IDWALK_CB_USER);
117 }
118 
119 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
120 {
121  uiLayout *layout = panel->layout;
122 
124 
125  int mode = RNA_enum_get(ptr, "mode");
126 
127  uiLayoutSetPropSep(layout, true);
128 
129  uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
130 
131  if (mode == GP_SIMPLIFY_FIXED) {
132  uiItemR(layout, ptr, "step", 0, NULL, ICON_NONE);
133  }
134  else if (mode == GP_SIMPLIFY_ADAPTIVE) {
135  uiItemR(layout, ptr, "factor", 0, NULL, ICON_NONE);
136  }
137  else if (mode == GP_SIMPLIFY_SAMPLE) {
138  uiItemR(layout, ptr, "length", 0, NULL, ICON_NONE);
139  uiItemR(layout, ptr, "sharp_threshold", 0, NULL, ICON_NONE);
140  }
141  else if (mode == GP_SIMPLIFY_MERGE) {
142  uiItemR(layout, ptr, "distance", 0, NULL, ICON_NONE);
143  }
144 
146 }
147 
148 static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
149 {
150  gpencil_modifier_masking_panel_draw(panel, true, false);
151 }
152 
153 static void panelRegister(ARegionType *region_type)
154 {
158  region_type, "mask", "Influence", NULL, mask_panel_draw, panel_type);
159 }
160 
162  /* name */ N_("Simplify"),
163  /* structName */ "SimplifyGpencilModifierData",
164  /* structSize */ sizeof(SimplifyGpencilModifierData),
167 
168  /* copyData */ copyData,
169 
170  /* deformStroke */ deformStroke,
171  /* generateStrokes */ NULL,
172  /* bakeModifier */ bakeModifier,
173  /* remapTime */ NULL,
174 
175  /* initData */ initData,
176  /* freeData */ NULL,
177  /* isDisabled */ NULL,
178  /* updateDepsgraph */ NULL,
179  /* dependsOnTime */ NULL,
180  /* foreachIDLink */ foreachIDLink,
181  /* foreachTexLink */ NULL,
182  /* panelRegister */ panelRegister,
183 };
void BKE_gpencil_stroke_simplify_adaptive(struct bGPdata *gpd, struct bGPDstroke *gps, float epsilon)
bool BKE_gpencil_stroke_sample(struct bGPdata *gpd, struct bGPDstroke *gps, const float dist, const bool select, const float sharp_threshold)
void BKE_gpencil_stroke_simplify_fixed(struct bGPdata *gpd, struct bGPDstroke *gps)
void BKE_gpencil_stroke_merge_distance(struct bGPdata *gpd, struct bGPDframe *gpf, struct bGPDstroke *gps, float threshold, bool use_unselected)
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
#define UNUSED(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:35
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
struct SimplifyGpencilModifierData SimplifyGpencilModifierData
@ GP_SIMPLIFY_INVERT_LAYER
@ GP_SIMPLIFY_INVERT_PASS
@ GP_SIMPLIFY_INVERT_MATERIAL
@ GP_SIMPLIFY_INVERT_LAYERPASS
@ eGpencilModifierType_Simplify
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 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 bakeModifier(struct Main *UNUSED(bmain), Depsgraph *depsgraph, GpencilModifierData *md, Object *ob)
GpencilModifierTypeInfo modifierType_Gpencil_Simplify
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)
static void panelRegister(ARegionType *region_type)
static void deformStroke(GpencilModifierData *md, Depsgraph *UNUSED(depsgraph), Object *ob, bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps)
static void initData(GpencilModifierData *md)
#define C
Definition: RandGen.cpp:25
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
const Depsgraph * depsgraph
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
Definition: DNA_ID.h:368
Definition: BKE_main.h:121
void * data
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480