Blender  V2.93
MOD_gpencillineart.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2017, Blender Foundation
17  * This is a new part of Blender
18  */
19 
24 #include <stdio.h>
25 
26 #include "BLI_utildefines.h"
27 
28 #include "BLI_math_vector.h"
29 
30 #include "BLT_translation.h"
31 
32 #include "DNA_collection_types.h"
33 #include "DNA_defaults.h"
35 #include "DNA_gpencil_types.h"
36 #include "DNA_material_types.h"
37 #include "DNA_object_types.h"
38 #include "DNA_scene_types.h"
39 #include "DNA_screen_types.h"
40 
41 #include "lineart/MOD_lineart.h"
42 
43 #include "BKE_collection.h"
44 #include "BKE_context.h"
45 #include "BKE_global.h"
46 #include "BKE_gpencil.h"
47 #include "BKE_gpencil_modifier.h"
48 #include "BKE_lib_query.h"
49 #include "BKE_main.h"
50 #include "BKE_screen.h"
51 
52 #include "UI_interface.h"
53 #include "UI_resources.h"
54 
55 #include "BKE_modifier.h"
56 #include "RNA_access.h"
57 
58 #include "DEG_depsgraph.h"
59 #include "DEG_depsgraph_query.h"
60 
62 #include "MOD_gpencil_ui_common.h"
63 
64 #include "WM_api.h"
65 #include "WM_types.h"
66 
67 static void initData(GpencilModifierData *md)
68 {
70 
71  BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier));
72 
74 }
75 
76 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
77 {
79 }
80 
83 {
85 
86  if (G.debug_value == 4000) {
87  printf("LRT: Generating from modifier.\n");
88  }
89 
91  lmd->render_buffer,
92  depsgraph,
93  ob,
94  gpl,
95  gpf,
96  lmd->source_type,
97  lmd->source_type == LRT_SOURCE_OBJECT ? (void *)lmd->source_object :
98  (void *)lmd->source_collection,
99  lmd->level_start,
100  lmd->use_multiple_levels ? lmd->level_end : lmd->level_start,
102  lmd->edge_types,
103  lmd->transparency_flags,
104  lmd->transparency_mask,
105  lmd->thickness,
106  lmd->opacity,
107  lmd->source_vertex_group,
108  lmd->vgname,
109  lmd->flags);
110 }
111 
113 {
115 
116  if ((lmd->target_layer[0] == '\0') || (lmd->target_material == NULL)) {
117  return true;
118  }
119 
120  if (lmd->source_type == LRT_SOURCE_OBJECT && !lmd->source_object) {
121  return true;
122  }
123 
124  if (lmd->source_type == LRT_SOURCE_COLLECTION && !lmd->source_collection) {
125  return true;
126  }
127 
128  /* Preventing calculation in depsgraph when baking frames. */
129  if (lmd->flags & LRT_GPENCIL_IS_BAKED) {
130  return true;
131  }
132 
133  return false;
134 }
136 {
138  bGPdata *gpd = ob->data;
139 
140  /* Guard early, don't trigger calculation when no grease-pencil frame is present.
141  * Probably should disable in the #isModifierDisabled() function
142  * but we need additional argument for depsgraph and `gpd`. */
144  if (gpl == NULL) {
145  return;
146  }
147  /* Need to call this or we don't get active frame (user may haven't selected any one). */
149  bGPDframe *gpf = gpl->actframe;
150  if (gpf == NULL) {
151  return;
152  }
153 
154  /* Check all parameters required are filled. */
155  if (isModifierDisabled(md)) {
156  return;
157  }
158 
160 
161  generate_strokes_actual(md, depsgraph, ob, gpl, gpf);
162 
164 
166 }
167 
168 static void bakeModifier(Main *UNUSED(bmain),
171  Object *ob)
172 {
173  bGPdata *gpd = ob->data;
175 
177  if (gpl == NULL) {
178  return;
179  }
180  bGPDframe *gpf = gpl->actframe;
181  if (gpf == NULL) {
182  return;
183  }
184 
186 
187  generate_strokes_actual(md, depsgraph, ob, gpl, gpf);
188 
190 }
191 
192 static bool isDisabled(GpencilModifierData *md, int UNUSED(userRenderParams))
193 {
194  return isModifierDisabled(md);
195 }
196 
199  const int mode)
200 {
201  if (!c) {
202  return;
203  }
205  if (ELEM(ob->type, OB_MESH, OB_MBALL, OB_CURVE, OB_SURF, OB_FONT)) {
206  if (ob->lineart.usage != OBJECT_LRT_EXCLUDE) {
207  DEG_add_object_relation(ctx->node, ob, DEG_OB_COMP_GEOMETRY, "Line Art Modifier");
208  DEG_add_object_relation(ctx->node, ob, DEG_OB_COMP_TRANSFORM, "Line Art Modifier");
209  }
210  }
211  if (ob->type == OB_EMPTY && (ob->transflag & OB_DUPLICOLLECTION)) {
212  add_this_collection(ob->instance_collection, ctx, mode);
213  }
214  }
216 }
217 
220  const int mode)
221 {
222  DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Line Art Modifier");
223 
225  if (lmd->source_type == LRT_SOURCE_OBJECT && lmd->source_object) {
227  ctx->node, lmd->source_object, DEG_OB_COMP_GEOMETRY, "Line Art Modifier");
229  ctx->node, lmd->source_object, DEG_OB_COMP_TRANSFORM, "Line Art Modifier");
230  }
231  else {
232  add_this_collection(ctx->scene->master_collection, ctx, mode);
233  }
235  ctx->node, ctx->scene->camera, DEG_OB_COMP_TRANSFORM, "Line Art Modifier");
237  ctx->node, ctx->scene->camera, DEG_OB_COMP_PARAMETERS, "Line Art Modifier");
238 }
239 
240 static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
241 {
243 
244  walk(userData, ob, (ID **)&lmd->target_material, IDWALK_CB_USER);
245  walk(userData, ob, (ID **)&lmd->source_collection, IDWALK_CB_NOP);
246 
247  walk(userData, ob, (ID **)&lmd->source_object, IDWALK_CB_NOP);
248 }
249 
250 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
251 {
252  uiLayout *layout = panel->layout;
253 
254  PointerRNA ob_ptr;
256 
257  PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
258 
259  const int source_type = RNA_enum_get(ptr, "source_type");
260  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
261 
262  uiLayoutSetPropSep(layout, true);
263  uiLayoutSetEnabled(layout, !is_baked);
264 
265  uiItemR(layout, ptr, "source_type", 0, NULL, ICON_NONE);
266 
267  if (source_type == LRT_SOURCE_OBJECT) {
268  uiItemR(layout, ptr, "source_object", 0, NULL, ICON_OBJECT_DATA);
269  }
270  else if (source_type == LRT_SOURCE_COLLECTION) {
271  uiItemR(layout, ptr, "source_collection", 0, NULL, ICON_OUTLINER_COLLECTION);
272  }
273  else {
274  /* Source is Scene. */
275  }
276 
277  uiLayout *col = uiLayoutColumnWithHeading(layout, true, IFACE_("Edge Types"));
278 
279  uiItemR(col, ptr, "use_contour", 0, IFACE_("Contour"), ICON_NONE);
280  uiItemR(col, ptr, "use_material", 0, IFACE_("Material Borders"), ICON_NONE);
281  uiItemR(col, ptr, "use_edge_mark", 0, IFACE_("Edge Marks"), ICON_NONE);
282  uiItemR(col, ptr, "use_intersection", 0, IFACE_("Intersections"), ICON_NONE);
283  uiItemR(col, ptr, "use_crease", 0, IFACE_("Crease"), ICON_NONE);
284  uiLayout *sub = uiLayoutRow(col, true);
285  uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_crease"));
286  uiLayoutSetPropSep(sub, true);
287 
288  uiItemR(sub, ptr, "crease_threshold", UI_ITEM_R_SLIDER, " ", ICON_NONE);
289 
290  uiItemPointerR(layout, ptr, "target_layer", &obj_data_ptr, "layers", NULL, ICON_GREASEPENCIL);
291 
292  /* Material has to be used by grease pencil object already, it was possible to assign materials
293  * without this requirement in earlier versions of blender. */
294  bool material_valid = false;
295  PointerRNA material_ptr = RNA_pointer_get(ptr, "target_material");
296  if (!RNA_pointer_is_null(&material_ptr)) {
297  Material *current_material = material_ptr.data;
298  Object *ob = ob_ptr.data;
299  material_valid = BKE_gpencil_object_material_index_get(ob, current_material) != -1;
300  }
301  uiLayout *row = uiLayoutRow(layout, true);
302  uiLayoutSetRedAlert(row, !material_valid);
303  uiItemPointerR(row,
304  ptr,
305  "target_material",
306  &obj_data_ptr,
307  "materials",
308  NULL,
309  material_valid ? ICON_SHADING_TEXTURE : ICON_ERROR);
310 
311  uiItemR(layout, ptr, "use_remove_doubles", 0, NULL, ICON_NONE);
312  uiItemR(layout, ptr, "use_edge_overlap", 0, IFACE_("Overlapping Edges As Contour"), ICON_NONE);
313  uiItemR(layout, ptr, "use_object_instances", 0, NULL, ICON_NONE);
314  uiItemR(layout, ptr, "use_clip_plane_boundaries", 0, NULL, ICON_NONE);
315 
317 }
318 
319 static void style_panel_draw(const bContext *UNUSED(C), Panel *panel)
320 {
321  uiLayout *layout = panel->layout;
323 
324  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
325 
326  uiLayoutSetPropSep(layout, true);
327  uiLayoutSetEnabled(layout, !is_baked);
328 
329  uiItemR(layout, ptr, "thickness", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
330 
331  uiItemR(layout, ptr, "opacity", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
332 }
333 
334 static void occlusion_panel_draw(const bContext *UNUSED(C), Panel *panel)
335 {
336  uiLayout *layout = panel->layout;
338 
339  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
340 
341  uiLayoutSetPropSep(layout, true);
342  uiLayoutSetEnabled(layout, !is_baked);
343 
344  const bool use_multiple_levels = RNA_boolean_get(ptr, "use_multiple_levels");
345 
346  uiItemR(layout, ptr, "use_multiple_levels", 0, IFACE_("Range"), ICON_NONE);
347 
348  if (use_multiple_levels) {
349  uiLayout *col = uiLayoutColumn(layout, true);
350  uiItemR(col, ptr, "level_start", 0, NULL, ICON_NONE);
351  uiItemR(col, ptr, "level_end", 0, NULL, ICON_NONE);
352  }
353  else {
354  uiItemR(layout, ptr, "level_start", 0, IFACE_("Level"), ICON_NONE);
355  }
356 }
357 
359 {
360  uiLayout *layout = panel->layout;
362 
363  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
364  uiLayoutSetEnabled(layout, !is_baked);
365 
366  uiItemR(layout, ptr, "use_transparency", 0, IFACE_("Transparency"), ICON_NONE);
367 }
368 
369 static void transparency_panel_draw(const bContext *UNUSED(C), Panel *panel)
370 {
371  uiLayout *layout = panel->layout;
373 
374  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
375  uiLayoutSetEnabled(layout, !is_baked);
376 
377  uiLayoutSetPropSep(layout, true);
378 
379  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_transparency"));
380 
381  uiLayout *row = uiLayoutRow(layout, true);
382  uiLayoutSetPropDecorate(row, false);
383  uiLayout *sub = uiLayoutRow(row, true);
384  char text[2] = "0";
385 
386  PropertyRNA *prop = RNA_struct_find_property(ptr, "use_transparency_mask");
387  for (int i = 0; i < 8; i++, text[0]++) {
388  uiItemFullR(sub, ptr, prop, i, 0, UI_ITEM_R_TOGGLE, text, ICON_NONE);
389  }
390  uiItemL(row, "", ICON_BLANK1); /* Space for decorator. */
391 
392  uiLayout *col = uiLayoutColumn(layout, true);
393  uiItemR(col, ptr, "use_transparency_match", 0, IFACE_("Match All Masks"), ICON_NONE);
394 }
395 
396 static void chaining_panel_draw(const bContext *UNUSED(C), Panel *panel)
397 {
399 
400  uiLayout *layout = panel->layout;
401 
402  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
403 
404  uiLayoutSetPropSep(layout, true);
405  uiLayoutSetEnabled(layout, !is_baked);
406 
407  uiLayout *col = uiLayoutColumnWithHeading(layout, true, IFACE_("Chain"));
408  uiItemR(col, ptr, "use_fuzzy_intersections", 0, NULL, ICON_NONE);
409  uiItemR(col, ptr, "use_fuzzy_all", 0, NULL, ICON_NONE);
410 
411  uiItemR(layout, ptr, "chaining_image_threshold", 0, NULL, ICON_NONE);
412 
413  uiItemR(layout, ptr, "split_angle", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
414 }
415 
416 static void vgroup_panel_draw(const bContext *UNUSED(C), Panel *panel)
417 {
418  PointerRNA ob_ptr;
420 
421  uiLayout *layout = panel->layout;
422 
423  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
424 
425  uiLayoutSetPropSep(layout, true);
426  uiLayoutSetEnabled(layout, !is_baked);
427 
428  uiLayout *col = uiLayoutColumn(layout, true);
429 
430  uiLayout *row = uiLayoutRow(col, true);
431  uiItemR(row, ptr, "source_vertex_group", 0, IFACE_("Filter Source"), ICON_GROUP_VERTEX);
432  uiItemR(row, ptr, "invert_source_vertex_group", UI_ITEM_R_TOGGLE, "", ICON_ARROW_LEFTRIGHT);
433 
434  uiItemR(col, ptr, "use_output_vertex_group_match_by_name", 0, NULL, ICON_NONE);
435 
436  const bool match_output = RNA_boolean_get(ptr, "use_output_vertex_group_match_by_name");
437  if (!match_output) {
439  col, ptr, "vertex_group", &ob_ptr, "vertex_groups", IFACE_("Target"), ICON_NONE);
440  }
441 }
442 
443 static void baking_panel_draw(const bContext *UNUSED(C), Panel *panel)
444 {
445  uiLayout *layout = panel->layout;
446  PointerRNA ob_ptr;
448 
449  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
450 
451  uiLayoutSetPropSep(layout, true);
452 
453  if (is_baked) {
454  uiLayout *col = uiLayoutColumn(layout, false);
455  uiLayoutSetPropSep(col, false);
456  uiItemL(col, IFACE_("Modifier has baked data"), ICON_NONE);
457  uiItemR(
458  col, ptr, "is_baked", UI_ITEM_R_TOGGLE, IFACE_("Continue Without Clearing"), ICON_NONE);
459  }
460 
461  uiLayout *col = uiLayoutColumn(layout, false);
462  uiLayoutSetEnabled(col, !is_baked);
463  uiItemO(col, NULL, ICON_NONE, "OBJECT_OT_lineart_bake_strokes");
464  uiItemO(col, NULL, ICON_NONE, "OBJECT_OT_lineart_bake_strokes_all");
465 
466  col = uiLayoutColumn(layout, false);
467  uiItemO(col, NULL, ICON_NONE, "OBJECT_OT_lineart_clear");
468  uiItemO(col, NULL, ICON_NONE, "OBJECT_OT_lineart_clear_all");
469 }
470 
471 static void panelRegister(ARegionType *region_type)
472 {
475 
477  region_type, "style", "Style", NULL, style_panel_draw, panel_type);
479  region_type, "occlusion", "Occlusion", NULL, occlusion_panel_draw, panel_type);
481  "transparency",
482  "",
485  occlusion_panel);
487  region_type, "chaining", "Chaining", NULL, chaining_panel_draw, panel_type);
489  region_type, "vgroup", "Vertex Weight Transfer", NULL, vgroup_panel_draw, panel_type);
491  region_type, "baking", "Baking", NULL, baking_panel_draw, panel_type);
492 }
493 
495  /* name. */ "Line Art",
496  /* structName. */ "LineartGpencilModifierData",
497  /* structSize. */ sizeof(LineartGpencilModifierData),
500 
501  /* copyData. */ copyData,
502 
503  /* deformStroke. */ NULL,
504  /* generateStrokes. */ generateStrokes,
505  /* bakeModifier. */ bakeModifier,
506  /* remapTime. */ NULL,
507 
508  /* initData. */ initData,
509  /* freeData. */ NULL,
510  /* isDisabled. */ isDisabled,
511  /* updateDepsgraph. */ updateDepsgraph,
512  /* dependsOnTime. */ NULL,
513  /* foreachIDLink. */ foreachIDLink,
514  /* foreachTexLink. */ NULL,
515  /* panelRegister. */ panelRegister,
516 };
#define FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN(_collection, _object, _mode)
#define FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_END
void BKE_gpencil_frame_active_set(struct Depsgraph *depsgraph, struct bGPdata *gpd)
int BKE_gpencil_object_material_index_get(struct Object *ob, struct Material *ma)
Definition: gpencil.c:2437
struct bGPDlayer * BKE_gpencil_layer_get_by_name(struct bGPdata *gpd, char *name, int first_if_not_found)
Definition: gpencil.c:1668
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:87
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:47
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:120
#define BLI_assert(a)
Definition: BLI_assert.h:58
#define UNUSED(x)
#define ELEM(...)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define IFACE_(msgid)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
@ DEG_OB_COMP_GEOMETRY
@ DEG_OB_COMP_TRANSFORM
@ DEG_OB_COMP_PARAMETERS
Object groups, one object can be in many groups at once.
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
struct LineartGpencilModifierData LineartGpencilModifierData
@ eGpencilModifierType_Lineart
Object is a sort of wrapper for general info.
@ OB_DUPLICOLLECTION
@ OBJECT_LRT_EXCLUDE
@ OB_MBALL
@ OB_EMPTY
@ OB_SURF
@ OB_FONT
@ OB_MESH
@ OB_CURVE
PointerRNA * gpencil_modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
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)
static bool isDisabled(GpencilModifierData *md, int UNUSED(userRenderParams))
static void chaining_panel_draw(const bContext *UNUSED(C), Panel *panel)
static bool isModifierDisabled(GpencilModifierData *md)
static void occlusion_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void transparency_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
static void vgroup_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void transparency_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void style_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void bakeModifier(Main *UNUSED(bmain), Depsgraph *depsgraph, GpencilModifierData *md, Object *ob)
static void add_this_collection(Collection *c, const ModifierUpdateDepsgraphContext *ctx, const int mode)
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 initData(GpencilModifierData *md)
static void generateStrokes(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob)
GpencilModifierTypeInfo modifierType_Gpencil_Lineart
static void generate_strokes_actual(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx, const int mode)
static void baking_panel_draw(const bContext *UNUSED(C), Panel *panel)
#define C
Definition: RandGen.cpp:39
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_ITEM_R_TOGGLE
@ UI_ITEM_R_SLIDER
uiLayout * uiLayoutColumnWithHeading(uiLayout *layout, bool align, const char *heading)
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemL(uiLayout *layout, const char *name, int icon)
void uiLayoutSetRedAlert(uiLayout *layout, bool redalert)
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)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, const char *name, int icon)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
#define NA_EDITED
Definition: WM_types.h:462
#define NC_GPENCIL
Definition: WM_types.h:300
const Depsgraph * depsgraph
uint col
void MOD_lineart_destroy_render_data(LineartGpencilModifierData *lmd)
Definition: lineart_cpu.c:2629
bool MOD_lineart_compute_feature_lines(Depsgraph *depsgraph, LineartGpencilModifierData *lmd)
Definition: lineart_cpu.c:3651
void MOD_lineart_gpencil_generate(LineartRenderBuffer *rb, Depsgraph *depsgraph, Object *ob, bGPDlayer *gpl, bGPDframe *gpf, char source_type, void *source_reference, int level_start, int level_end, int mat_nr, short edge_types, uchar transparency_flags, uchar transparency_mask, short thickness, float opacity, const char *source_vgname, const char *vgname, int modifier_flags)
Definition: lineart_cpu.c:3932
static unsigned c
Definition: RandGen.cpp:97
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6562
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:866
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition: rna_access.c:174
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6261
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
Definition: DNA_ID.h:273
Definition: BKE_main.h:116
struct DepsNodeHandle * node
Definition: BKE_modifier.h:147
void * data
struct uiLayout * layout
void * data
Definition: RNA_types.h:52
struct Collection * master_collection
struct Object * camera
bGPDframe * actframe
#define G(x, y, z)
void WM_main_add_notifier(unsigned int type, void *reference)
PointerRNA * ptr
Definition: wm_files.c:3157