Blender V4.3
linestyle.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2010 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstdio>
10#include <cstdlib>
11#include <cstring>
12#include <optional>
13
14#include <fmt/format.h>
15
16#include "MEM_guardedalloc.h"
17
18#include "DNA_defaults.h"
19#include "DNA_material_types.h" /* for ramp blend */
20#include "DNA_object_types.h"
21#include "DNA_texture_types.h"
22
23#include "BLI_blenlib.h"
24#include "BLI_math_rotation.h"
25#include "BLI_string_utils.hh"
26#include "BLI_utildefines.h"
27
28#include "BLT_translation.hh"
29
30#include "BKE_colorband.hh"
31#include "BKE_colortools.hh"
32#include "BKE_context.hh"
33#include "BKE_freestyle.h"
34#include "BKE_idtype.hh"
35#include "BKE_lib_id.hh"
36#include "BKE_lib_query.hh"
37#include "BKE_linestyle.h"
38#include "BKE_node.hh"
40#include "BKE_texture.h"
41
42#include "BLO_read_write.hh"
43
54
55static void linestyle_copy_data(Main *bmain,
56 std::optional<Library *> owner_library,
57 ID *id_dst,
58 const ID *id_src,
59 const int flag)
60{
61 FreestyleLineStyle *linestyle_dst = (FreestyleLineStyle *)id_dst;
62 const FreestyleLineStyle *linestyle_src = (const FreestyleLineStyle *)id_src;
63
64 /* Never handle user-count here for own sub-data. */
65 const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT;
66 /* Always need allocation of the embedded ID data. */
67 const int flag_embedded_id_data = flag_subdata & ~LIB_ID_CREATE_NO_ALLOCATE;
68
69 for (int a = 0; a < MAX_MTEX; a++) {
70 if (linestyle_src->mtex[a]) {
71 linestyle_dst->mtex[a] = static_cast<MTex *>(MEM_callocN(sizeof(MTex), __func__));
72 *linestyle_dst->mtex[a] = blender::dna::shallow_copy(*linestyle_src->mtex[a]);
73 }
74 }
75
76 if (linestyle_src->nodetree) {
78 owner_library,
79 &linestyle_src->nodetree->id,
80 &linestyle_dst->id,
81 reinterpret_cast<ID **>(&linestyle_dst->nodetree),
82 flag_embedded_id_data);
83 }
84
85 BLI_listbase_clear(&linestyle_dst->color_modifiers);
86 LISTBASE_FOREACH (LineStyleModifier *, linestyle_modifier, &linestyle_src->color_modifiers) {
87 BKE_linestyle_color_modifier_copy(linestyle_dst, linestyle_modifier, flag_subdata);
88 }
89
90 BLI_listbase_clear(&linestyle_dst->alpha_modifiers);
91 LISTBASE_FOREACH (LineStyleModifier *, linestyle_modifier, &linestyle_src->alpha_modifiers) {
92 BKE_linestyle_alpha_modifier_copy(linestyle_dst, linestyle_modifier, flag_subdata);
93 }
94
96 LISTBASE_FOREACH (LineStyleModifier *, linestyle_modifier, &linestyle_src->thickness_modifiers) {
97 BKE_linestyle_thickness_modifier_copy(linestyle_dst, linestyle_modifier, flag_subdata);
98 }
99
100 BLI_listbase_clear(&linestyle_dst->geometry_modifiers);
101 LISTBASE_FOREACH (LineStyleModifier *, linestyle_modifier, &linestyle_src->geometry_modifiers) {
102 BKE_linestyle_geometry_modifier_copy(linestyle_dst, linestyle_modifier, flag_subdata);
103 }
104}
105
106static void linestyle_free_data(ID *id)
107{
109 LineStyleModifier *linestyle_modifier;
110
111 for (int material_slot_index = 0; material_slot_index < MAX_MTEX; material_slot_index++) {
112 MEM_SAFE_FREE(linestyle->mtex[material_slot_index]);
113 }
114
115 /* is no lib link block, but linestyle extension */
116 if (linestyle->nodetree) {
119 linestyle->nodetree = nullptr;
120 }
121
122 while ((linestyle_modifier = (LineStyleModifier *)linestyle->color_modifiers.first)) {
124 }
125 while ((linestyle_modifier = (LineStyleModifier *)linestyle->alpha_modifiers.first)) {
127 }
128 while ((linestyle_modifier = (LineStyleModifier *)linestyle->thickness_modifiers.first)) {
130 }
131 while ((linestyle_modifier = (LineStyleModifier *)linestyle->geometry_modifiers.first)) {
133 }
134}
135
137{
139
140 for (int i = 0; i < MAX_MTEX; i++) {
141 if (linestyle->mtex[i]) {
144 }
145 }
146 if (linestyle->nodetree) {
147 /* nodetree **are owned by IDs**, treat them as mere sub-data and not real ID! */
150 }
151
153 if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
155 lsm;
157 }
158 }
160 if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
162 lsm;
164 }
165 }
167 if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
171 }
172 }
173}
174
176{
177 LISTBASE_FOREACH (LineStyleModifier *, m, modifiers) {
178 int struct_nr;
179 switch (m->type) {
181 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_AlongStroke);
182 break;
184 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_DistanceFromCamera);
185 break;
187 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_DistanceFromObject);
188 break;
190 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_Material);
191 break;
193 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_Tangent);
194 break;
196 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_Noise);
197 break;
199 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_CreaseAngle);
200 break;
202 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_Curvature_3D);
203 break;
204 default:
205 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleModifier); /* this should not happen */
206 }
207 BLO_write_struct_by_id(writer, struct_nr, m);
208 }
209 LISTBASE_FOREACH (LineStyleModifier *, m, modifiers) {
210 switch (m->type) {
213 break;
216 writer, ColorBand, ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp);
217 break;
220 writer, ColorBand, ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp);
221 break;
224 break;
226 BLO_write_struct(writer, ColorBand, ((LineStyleColorModifier_Tangent *)m)->color_ramp);
227 break;
229 BLO_write_struct(writer, ColorBand, ((LineStyleColorModifier_Noise *)m)->color_ramp);
230 break;
233 break;
236 writer, ColorBand, ((LineStyleColorModifier_Curvature_3D *)m)->color_ramp);
237 break;
238 }
239 }
240}
241
243{
244 LISTBASE_FOREACH (LineStyleModifier *, m, modifiers) {
245 int struct_nr;
246 switch (m->type) {
248 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_AlongStroke);
249 break;
251 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_DistanceFromCamera);
252 break;
254 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_DistanceFromObject);
255 break;
257 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_Material);
258 break;
260 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_Tangent);
261 break;
263 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_Noise);
264 break;
266 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_CreaseAngle);
267 break;
269 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_Curvature_3D);
270 break;
271 default:
272 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleModifier); /* this should not happen */
273 }
274 BLO_write_struct_by_id(writer, struct_nr, m);
275 }
276 LISTBASE_FOREACH (LineStyleModifier *, m, modifiers) {
277 switch (m->type) {
280 break;
284 break;
288 break;
291 break;
294 break;
297 break;
300 break;
303 break;
304 }
305 }
306}
307
309{
310 LISTBASE_FOREACH (LineStyleModifier *, m, modifiers) {
311 int struct_nr;
312 switch (m->type) {
314 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_AlongStroke);
315 break;
317 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_DistanceFromCamera);
318 break;
320 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_DistanceFromObject);
321 break;
323 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Material);
324 break;
326 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Calligraphy);
327 break;
329 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Tangent);
330 break;
332 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Noise);
333 break;
335 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_CreaseAngle);
336 break;
338 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Curvature_3D);
339 break;
340 default:
341 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleModifier); /* this should not happen */
342 }
343 BLO_write_struct_by_id(writer, struct_nr, m);
344 }
345 LISTBASE_FOREACH (LineStyleModifier *, m, modifiers) {
346 switch (m->type) {
349 break;
353 break;
357 break;
360 break;
363 break;
366 break;
370 break;
371 }
372 }
373}
374
376{
377 LISTBASE_FOREACH (LineStyleModifier *, m, modifiers) {
378 int struct_nr;
379 switch (m->type) {
381 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_Sampling);
382 break;
384 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_BezierCurve);
385 break;
387 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_SinusDisplacement);
388 break;
390 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_SpatialNoise);
391 break;
393 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_PerlinNoise1D);
394 break;
396 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_PerlinNoise2D);
397 break;
399 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_BackboneStretcher);
400 break;
402 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_TipRemover);
403 break;
405 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_Polygonalization);
406 break;
408 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_GuidingLines);
409 break;
411 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_Blueprint);
412 break;
414 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_2DOffset);
415 break;
417 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_2DTransform);
418 break;
420 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_Simplification);
421 break;
422 default:
423 struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleModifier); /* this should not happen */
424 }
425 BLO_write_struct_by_id(writer, struct_nr, m);
426 }
427}
428
429static void linestyle_blend_write(BlendWriter *writer, ID *id, const void *id_address)
430{
432
433 BLO_write_id_struct(writer, FreestyleLineStyle, id_address, &linestyle->id);
435
440 for (int a = 0; a < MAX_MTEX; a++) {
441 if (linestyle->mtex[a]) {
442 BLO_write_struct(writer, MTex, linestyle->mtex[a]);
443 }
444 }
445 if (linestyle->nodetree) {
446 BLO_Write_IDBuffer *temp_embedded_id_buffer = BLO_write_allocate_id_buffer();
448 temp_embedded_id_buffer, &linestyle->nodetree->id, BLO_write_is_undo(writer));
450 bNodeTree,
452 BLO_write_get_id_buffer_temp_id(temp_embedded_id_buffer));
454 writer,
455 reinterpret_cast<bNodeTree *>(BLO_write_get_id_buffer_temp_id(temp_embedded_id_buffer)));
456 BLO_write_destroy_id_buffer(&temp_embedded_id_buffer);
457 }
458}
459
461 LineStyleModifier *modifier)
462{
463 switch (modifier->type) {
467 break;
468 }
471 modifier;
473 break;
474 }
477 modifier;
479 break;
480 }
484 break;
485 }
486 case LS_MODIFIER_TANGENT: {
489 break;
490 }
491 case LS_MODIFIER_NOISE: {
494 break;
495 }
499 break;
500 }
504 break;
505 }
506 }
507}
508
510 LineStyleModifier *modifier)
511{
512 switch (modifier->type) {
515 BLO_read_struct(reader, CurveMapping, &m->curve);
517 break;
518 }
521 modifier;
522 BLO_read_struct(reader, CurveMapping, &m->curve);
524 break;
525 }
528 modifier;
529 BLO_read_struct(reader, CurveMapping, &m->curve);
531 break;
532 }
535 BLO_read_struct(reader, CurveMapping, &m->curve);
537 break;
538 }
539 case LS_MODIFIER_TANGENT: {
541 BLO_read_struct(reader, CurveMapping, &m->curve);
543 break;
544 }
545 case LS_MODIFIER_NOISE: {
547 BLO_read_struct(reader, CurveMapping, &m->curve);
549 break;
550 }
553 BLO_read_struct(reader, CurveMapping, &m->curve);
555 break;
556 }
559 BLO_read_struct(reader, CurveMapping, &m->curve);
561 break;
562 }
563 }
564}
565
567 LineStyleModifier *modifier)
568{
569 switch (modifier->type) {
572 modifier;
573 BLO_read_struct(reader, CurveMapping, &m->curve);
575 break;
576 }
580 BLO_read_struct(reader, CurveMapping, &m->curve);
582 break;
583 }
587 BLO_read_struct(reader, CurveMapping, &m->curve);
589 break;
590 }
593 BLO_read_struct(reader, CurveMapping, &m->curve);
595 break;
596 }
597 case LS_MODIFIER_TANGENT: {
599 BLO_read_struct(reader, CurveMapping, &m->curve);
601 break;
602 }
605 modifier;
606 BLO_read_struct(reader, CurveMapping, &m->curve);
608 break;
609 }
612 modifier;
613 BLO_read_struct(reader, CurveMapping, &m->curve);
615 break;
616 }
617 }
618}
619
621 LineStyleModifier * /*modifier*/)
622{
623}
624
649
651 /*id_code*/ ID_LS,
652 /*id_filter*/ FILTER_ID_LS,
653 /*dependencies_id_types*/ FILTER_ID_TE | FILTER_ID_OB,
654 /*main_listbase_index*/ INDEX_ID_LS,
655 /*struct_size*/ sizeof(FreestyleLineStyle),
656 /*name*/ "FreestyleLineStyle",
657 /*name_plural*/ N_("linestyles"),
658 /*translation_context*/ BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE,
660 /*asset_type_info*/ nullptr,
661
662 /*init_data*/ linestyle_init_data,
663 /*copy_data*/ linestyle_copy_data,
664 /*free_data*/ linestyle_free_data,
665 /*make_local*/ nullptr,
666 /*foreach_id*/ linestyle_foreach_id,
667 /*foreach_cache*/ nullptr,
668 /*foreach_path*/ nullptr,
669 /*owner_pointer_get*/ nullptr,
670
671 /*blend_write*/ linestyle_blend_write,
672 /*blend_read_data*/ linestyle_blend_read_data,
673 /*blend_read_after_liblink*/ nullptr,
674
675 /*blend_read_undo_preserve*/ nullptr,
676
677 /*lib_override_apply_post*/ nullptr,
678};
679
680static const char *modifier_name[LS_MODIFIER_NUM] = {
681 nullptr, "Along Stroke", "Distance from Camera", "Distance from Object",
682 "Material", "Sampling", "Bézier Curve", "Sinus Displacement",
683 "Spatial Noise", "Perlin Noise 1D", "Perlin Noise 2D", "Backbone Stretcher",
684 "Tip Remover", "Calligraphy", "Polygonalization", "Guiding Lines",
685 "Blueprint", "2D Offset", "2D Transform", "Tangent",
686 "Noise", "Crease Angle", "Simplification", "Curvature 3D",
687};
688
693
694FreestyleLineStyle *BKE_linestyle_new(Main *bmain, const char *name)
695{
697
699
701
702 return linestyle;
703}
704
706{
707 FreestyleConfig *config = &view_layer->freestyle_config;
709 return (lineset) ? lineset->linestyle : nullptr;
710}
711
712static LineStyleModifier *new_modifier(const char *name, int type, size_t size)
713{
715
716 if (!name) {
717 name = modifier_name[type];
718 }
719 m = (LineStyleModifier *)MEM_callocN(size, "line style modifier");
720 m->type = type;
721 STRNCPY(m->name, DATA_(name));
722 m->influence = 1.0f;
724
725 return m;
726}
727
729{
730 BLI_addtail(lb, (void *)m);
732 lb, m, modifier_name[m->type], '.', offsetof(LineStyleModifier, name), sizeof(m->name));
733}
734
735static LineStyleModifier *alloc_color_modifier(const char *name, int type)
736{
737 size_t size;
738
739 switch (type) {
742 break;
745 break;
748 break;
750 size = sizeof(LineStyleColorModifier_Material);
751 break;
753 size = sizeof(LineStyleColorModifier_Tangent);
754 break;
756 size = sizeof(LineStyleColorModifier_Noise);
757 break;
760 break;
763 break;
764 default:
765 return nullptr; /* unknown modifier type */
766 }
767
768 return new_modifier(name, type, size);
769}
770
772 const char *name,
773 int type)
774{
776
777 m = alloc_color_modifier(name, type);
778 if (UNLIKELY(m == nullptr)) {
779 return nullptr;
780 }
781 m->blend = MA_RAMP_BLEND;
782
783 switch (type) {
785 ((LineStyleColorModifier_AlongStroke *)m)->color_ramp = BKE_colorband_add(true);
786 break;
789 ((LineStyleColorModifier_DistanceFromCamera *)m)->range_min = 0.0f;
790 ((LineStyleColorModifier_DistanceFromCamera *)m)->range_max = 10000.0f;
791 break;
793 ((LineStyleColorModifier_DistanceFromObject *)m)->target = nullptr;
795 ((LineStyleColorModifier_DistanceFromObject *)m)->range_min = 0.0f;
796 ((LineStyleColorModifier_DistanceFromObject *)m)->range_max = 10000.0f;
797 break;
799 ((LineStyleColorModifier_Material *)m)->color_ramp = BKE_colorband_add(true);
801 break;
803 ((LineStyleColorModifier_Tangent *)m)->color_ramp = BKE_colorband_add(true);
804 break;
806 ((LineStyleColorModifier_Noise *)m)->color_ramp = BKE_colorband_add(true);
807 ((LineStyleColorModifier_Noise *)m)->amplitude = 10.0f;
808 ((LineStyleColorModifier_Noise *)m)->period = 10.0f;
809 ((LineStyleColorModifier_Noise *)m)->seed = 512;
810 break;
812 ((LineStyleColorModifier_CreaseAngle *)m)->color_ramp = BKE_colorband_add(true);
813 ((LineStyleColorModifier_CreaseAngle *)m)->min_angle = 0.0f;
814 ((LineStyleColorModifier_CreaseAngle *)m)->max_angle = DEG2RADF(180.0f);
815 break;
818 ((LineStyleColorModifier_Curvature_3D *)m)->min_curvature = 0.0f;
819 ((LineStyleColorModifier_Curvature_3D *)m)->max_curvature = 0.5f;
820 break;
821 default:
822 return nullptr; /* unknown modifier type */
823 }
825
826 return m;
827}
828
830 const LineStyleModifier *m,
831 const int flag)
832{
833 LineStyleModifier *new_m;
834
835 new_m = alloc_color_modifier(m->name, m->type);
836 if (UNLIKELY(new_m == nullptr)) {
837 return nullptr;
838 }
839 new_m->influence = m->influence;
840 new_m->flags = m->flags;
841 new_m->blend = m->blend;
842
843 switch (m->type) {
847 q->color_ramp = static_cast<ColorBand *>(MEM_dupallocN(p->color_ramp));
848 break;
849 }
852 m;
854 new_m;
855 q->color_ramp = static_cast<ColorBand *>(MEM_dupallocN(p->color_ramp));
856 q->range_min = p->range_min;
857 q->range_max = p->range_max;
858 break;
859 }
862 m;
864 new_m;
865 q->target = p->target;
867 id_us_plus((ID *)q->target);
868 }
869 q->color_ramp = static_cast<ColorBand *>(MEM_dupallocN(p->color_ramp));
870 q->range_min = p->range_min;
871 q->range_max = p->range_max;
872 break;
873 }
877 q->color_ramp = static_cast<ColorBand *>(MEM_dupallocN(p->color_ramp));
878 q->flags = p->flags;
879 q->mat_attr = p->mat_attr;
880 break;
881 }
882 case LS_MODIFIER_TANGENT: {
885 q->color_ramp = static_cast<ColorBand *>(MEM_dupallocN(p->color_ramp));
886 break;
887 }
888 case LS_MODIFIER_NOISE: {
891 q->color_ramp = static_cast<ColorBand *>(MEM_dupallocN(p->color_ramp));
892 q->amplitude = p->amplitude;
893 q->period = p->period;
894 q->seed = p->seed;
895 break;
896 }
900 q->color_ramp = static_cast<ColorBand *>(MEM_dupallocN(p->color_ramp));
901 q->min_angle = p->min_angle;
902 q->max_angle = p->max_angle;
903 break;
904 }
908 q->color_ramp = static_cast<ColorBand *>(MEM_dupallocN(p->color_ramp));
911 break;
912 }
913 default:
914 return nullptr; /* unknown modifier type */
915 }
917
918 return new_m;
919}
920
922{
923 if (BLI_findindex(&linestyle->color_modifiers, m) == -1) {
924 return -1;
925 }
926 switch (m->type) {
929 break;
932 break;
935 break;
937 MEM_freeN(((LineStyleColorModifier_Material *)m)->color_ramp);
938 break;
940 MEM_freeN(((LineStyleColorModifier_Tangent *)m)->color_ramp);
941 break;
943 MEM_freeN(((LineStyleColorModifier_Noise *)m)->color_ramp);
944 break;
947 break;
950 break;
951 }
953 return 0;
954}
955
956static LineStyleModifier *alloc_alpha_modifier(const char *name, int type)
957{
958 size_t size;
959
960 switch (type) {
963 break;
966 break;
969 break;
971 size = sizeof(LineStyleAlphaModifier_Material);
972 break;
974 size = sizeof(LineStyleAlphaModifier_Tangent);
975 break;
977 size = sizeof(LineStyleAlphaModifier_Noise);
978 break;
981 break;
984 break;
985 default:
986 return nullptr; /* unknown modifier type */
987 }
988 return new_modifier(name, type, size);
989}
990
992 const char *name,
993 int type)
994{
996
997 m = alloc_alpha_modifier(name, type);
999
1000 switch (type) {
1003 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1004 break;
1005 }
1008 m;
1009 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1010 p->range_min = 0.0f;
1011 p->range_max = 10000.0f;
1012 break;
1013 }
1016 m;
1017 p->target = nullptr;
1018 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1019 p->range_min = 0.0f;
1020 p->range_max = 10000.0f;
1021 break;
1022 }
1023 case LS_MODIFIER_MATERIAL: {
1025 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1027 break;
1028 }
1029 case LS_MODIFIER_TANGENT: {
1031 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1032 break;
1033 }
1034 case LS_MODIFIER_NOISE: {
1036 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1037 ((LineStyleAlphaModifier_Noise *)m)->amplitude = 10.0f;
1038 ((LineStyleAlphaModifier_Noise *)m)->period = 10.0f;
1039 ((LineStyleAlphaModifier_Noise *)m)->seed = 512;
1040 break;
1041 }
1044 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1045 ((LineStyleAlphaModifier_CreaseAngle *)m)->min_angle = 0.0f;
1046 ((LineStyleAlphaModifier_CreaseAngle *)m)->max_angle = DEG2RADF(180.0f);
1047 break;
1048 }
1051 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1052 ((LineStyleAlphaModifier_Curvature_3D *)m)->min_curvature = 0.0f;
1053 ((LineStyleAlphaModifier_Curvature_3D *)m)->max_curvature = 0.5f;
1054 break;
1055 }
1056 default:
1057 return nullptr; /* unknown modifier type */
1058 }
1060
1061 return m;
1062}
1063
1065 const LineStyleModifier *m,
1066 const int /*flag*/)
1067{
1068 LineStyleModifier *new_m;
1069
1070 new_m = alloc_alpha_modifier(m->name, m->type);
1071 new_m->influence = m->influence;
1072 new_m->flags = m->flags;
1073 new_m->blend = m->blend;
1074
1075 switch (m->type) {
1080 q->flags = p->flags;
1081 break;
1082 }
1085 m;
1087 new_m;
1089 q->flags = p->flags;
1090 q->range_min = p->range_min;
1091 q->range_max = p->range_max;
1092 break;
1093 }
1096 m;
1098 new_m;
1099 if (p->target) {
1100 id_us_plus(&p->target->id);
1101 }
1102 q->target = p->target;
1104 q->flags = p->flags;
1105 q->range_min = p->range_min;
1106 q->range_max = p->range_max;
1107 break;
1108 }
1109 case LS_MODIFIER_MATERIAL: {
1113 q->flags = p->flags;
1114 q->mat_attr = p->mat_attr;
1115 break;
1116 }
1117 case LS_MODIFIER_TANGENT: {
1121 q->flags = p->flags;
1122 break;
1123 }
1124 case LS_MODIFIER_NOISE: {
1128 q->flags = p->flags;
1129 q->amplitude = p->amplitude;
1130 q->period = p->period;
1131 q->seed = p->seed;
1132 break;
1133 }
1138 q->flags = p->flags;
1139 q->min_angle = p->min_angle;
1140 q->max_angle = p->max_angle;
1141 break;
1142 }
1147 q->flags = p->flags;
1150 break;
1151 }
1152 default:
1153 return nullptr; /* unknown modifier type */
1154 }
1156
1157 return new_m;
1158}
1159
1194
1195static LineStyleModifier *alloc_thickness_modifier(const char *name, int type)
1196{
1197 size_t size;
1198
1199 switch (type) {
1202 break;
1205 break;
1208 break;
1211 break;
1214 break;
1217 break;
1218 case LS_MODIFIER_NOISE:
1219 size = sizeof(LineStyleThicknessModifier_Noise);
1220 break;
1223 break;
1226 break;
1227 default:
1228 return nullptr; /* unknown modifier type */
1229 }
1230
1231 return new_modifier(name, type, size);
1232}
1233
1235 const char *name,
1236 int type)
1237{
1239
1240 m = alloc_thickness_modifier(name, type);
1241 m->blend = LS_VALUE_BLEND;
1242
1243 switch (type) {
1246 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1247 p->value_min = 0.0f;
1248 p->value_max = 1.0f;
1249 break;
1250 }
1254 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1255 p->range_min = 0.0f;
1256 p->range_max = 1000.0f;
1257 p->value_min = 0.0f;
1258 p->value_max = 1.0f;
1259 break;
1260 }
1264 p->target = nullptr;
1265 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1266 p->range_min = 0.0f;
1267 p->range_max = 1000.0f;
1268 p->value_min = 0.0f;
1269 p->value_max = 1.0f;
1270 break;
1271 }
1272 case LS_MODIFIER_MATERIAL: {
1274 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1276 p->value_min = 0.0f;
1277 p->value_max = 1.0f;
1278 break;
1279 }
1282 p->min_thickness = 1.0f;
1283 p->max_thickness = 10.0f;
1284 p->orientation = DEG2RADF(60.0f);
1285 break;
1286 }
1287 case LS_MODIFIER_TANGENT: {
1289 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1290 p->min_thickness = 1.0f;
1291 p->max_thickness = 10.0f;
1292 break;
1293 }
1294 case LS_MODIFIER_NOISE: {
1296 p->period = 10.0f;
1297 p->amplitude = 10.0f;
1298 p->seed = 512;
1300 break;
1301 }
1304 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1305 p->min_angle = 0.0f;
1306 p->max_angle = DEG2RADF(180.0f);
1307 p->min_thickness = 1.0f;
1308 p->max_thickness = 10.0f;
1309 break;
1310 }
1313 p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1314 p->min_curvature = 0.0f;
1315 p->max_curvature = 0.5f;
1316 p->min_thickness = 1.0f;
1317 p->max_thickness = 10.0f;
1318 break;
1319 }
1320 default:
1321 return nullptr; /* unknown modifier type */
1322 }
1324
1325 return m;
1326}
1327
1329 const LineStyleModifier *m,
1330 const int flag)
1331{
1332 LineStyleModifier *new_m;
1333
1334 new_m = alloc_thickness_modifier(m->name, m->type);
1335 if (!new_m) {
1336 return nullptr;
1337 }
1338 new_m->influence = m->influence;
1339 new_m->flags = m->flags;
1340 new_m->blend = m->blend;
1341
1342 switch (m->type) {
1347 q->flags = p->flags;
1348 q->value_min = p->value_min;
1349 q->value_max = p->value_max;
1350 break;
1351 }
1358 q->flags = p->flags;
1359 q->range_min = p->range_min;
1360 q->range_max = p->range_max;
1361 q->value_min = p->value_min;
1362 q->value_max = p->value_max;
1363 break;
1364 }
1370 q->target = p->target;
1371 if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
1372 id_us_plus((ID *)q->target);
1373 }
1375 q->flags = p->flags;
1376 q->range_min = p->range_min;
1377 q->range_max = p->range_max;
1378 q->value_min = p->value_min;
1379 q->value_max = p->value_max;
1380 break;
1381 }
1382 case LS_MODIFIER_MATERIAL: {
1386 q->flags = p->flags;
1387 q->mat_attr = p->mat_attr;
1388 q->value_min = p->value_min;
1389 q->value_max = p->value_max;
1390 break;
1391 }
1397 q->orientation = p->orientation;
1398 break;
1399 }
1400 case LS_MODIFIER_TANGENT: {
1404 q->flags = p->flags;
1407 break;
1408 }
1409 case LS_MODIFIER_NOISE: {
1412 q->amplitude = p->amplitude;
1413 q->period = p->period;
1414 q->seed = p->seed;
1415 q->flags = p->flags;
1416 break;
1417 }
1421 new_m;
1423 q->flags = p->flags;
1428 break;
1429 }
1434 q->flags = p->flags;
1435 q->min_angle = p->min_angle;
1436 q->max_angle = p->max_angle;
1439 break;
1440 }
1441 default:
1442 return nullptr; /* unknown modifier type */
1443 }
1445
1446 return new_m;
1447}
1448
1450{
1452 return -1;
1453 }
1454 switch (m->type) {
1457 break;
1460 break;
1463 break;
1466 break;
1468 break;
1471 break;
1472 case LS_MODIFIER_NOISE:
1473 break;
1475 break;
1477 break;
1478 }
1480 return 0;
1481}
1482
1483static LineStyleModifier *alloc_geometry_modifier(const char *name, int type)
1484{
1485 size_t size;
1486
1487 switch (type) {
1490 break;
1493 break;
1496 break;
1499 break;
1502 break;
1505 break;
1508 break;
1511 break;
1514 break;
1517 break;
1520 break;
1523 break;
1526 break;
1529 break;
1530 default:
1531 return nullptr; /* unknown modifier type */
1532 }
1533
1534 return new_modifier(name, type, size);
1535}
1536
1538 const char *name,
1539 int type)
1540{
1542
1543 m = alloc_geometry_modifier(name, type);
1544
1545 switch (type) {
1546 case LS_MODIFIER_SAMPLING: {
1548 p->sampling = 10.0f;
1549 break;
1550 }
1553 p->error = 10.0f;
1554 break;
1555 }
1559 p->wavelength = 20.0f;
1560 p->amplitude = 5.0f;
1561 p->phase = 0.0f;
1562 break;
1563 }
1566 p->amplitude = 5.0f;
1567 p->scale = 20.0f;
1568 p->octaves = 4;
1570 break;
1571 }
1574 p->frequency = 10.0f;
1575 p->amplitude = 10.0f;
1576 p->octaves = 4;
1577 p->angle = DEG2RADF(45.0f);
1578 break;
1579 }
1582 p->frequency = 10.0f;
1583 p->amplitude = 10.0f;
1584 p->octaves = 4;
1585 p->angle = DEG2RADF(45.0f);
1586 break;
1587 }
1591 p->backbone_length = 10.0f;
1592 break;
1593 }
1596 p->tip_length = 10.0f;
1597 break;
1598 }
1602 p->error = 10.0f;
1603 break;
1604 }
1607 p->offset = 0.0f;
1608 break;
1609 }
1610 case LS_MODIFIER_BLUEPRINT: {
1613 p->rounds = 1;
1614 p->backbone_length = 10.0f;
1615 p->random_radius = 3;
1616 p->random_center = 5;
1617 p->random_backbone = 5;
1618 break;
1619 }
1620 case LS_MODIFIER_2D_OFFSET: {
1622 p->start = 0.0f;
1623 p->end = 0.0f;
1624 p->x = 0.0f;
1625 p->y = 0.0f;
1626 break;
1627 }
1631 p->scale_x = 1.0f;
1632 p->scale_y = 1.0f;
1633 p->angle = DEG2RADF(0.0f);
1634 p->pivot_u = 0.5f;
1635 p->pivot_x = 0.0f;
1636 p->pivot_y = 0.0f;
1637 break;
1638 }
1641 p->tolerance = 0.1f;
1642 break;
1643 }
1644 default:
1645 return nullptr; /* unknown modifier type */
1646 }
1648
1649 return m;
1650}
1651
1653 const LineStyleModifier *m,
1654 const int /*flag*/)
1655{
1656 LineStyleModifier *new_m;
1657
1658 new_m = alloc_geometry_modifier(m->name, m->type);
1659 new_m->flags = m->flags;
1660
1661 switch (m->type) {
1662 case LS_MODIFIER_SAMPLING: {
1665 q->sampling = p->sampling;
1666 break;
1667 }
1671 q->error = p->error;
1672 break;
1673 }
1679 q->wavelength = p->wavelength;
1680 q->amplitude = p->amplitude;
1681 q->phase = p->phase;
1682 break;
1683 }
1687 q->amplitude = p->amplitude;
1688 q->scale = p->scale;
1689 q->octaves = p->octaves;
1690 q->flags = p->flags;
1691 break;
1692 }
1696 new_m;
1697 q->frequency = p->frequency;
1698 q->amplitude = p->amplitude;
1699 q->angle = p->angle;
1700 q->octaves = p->octaves;
1701 q->seed = p->seed;
1702 break;
1703 }
1707 new_m;
1708 q->frequency = p->frequency;
1709 q->amplitude = p->amplitude;
1710 q->angle = p->angle;
1711 q->octaves = p->octaves;
1712 q->seed = p->seed;
1713 break;
1714 }
1721 break;
1722 }
1726 q->tip_length = p->tip_length;
1727 break;
1728 }
1734 q->error = p->error;
1735 break;
1736 }
1740 q->offset = p->offset;
1741 break;
1742 }
1743 case LS_MODIFIER_BLUEPRINT: {
1746 q->flags = p->flags;
1747 q->rounds = p->rounds;
1752 break;
1753 }
1754 case LS_MODIFIER_2D_OFFSET: {
1757 q->start = p->start;
1758 q->end = p->end;
1759 q->x = p->x;
1760 q->y = p->y;
1761 break;
1762 }
1766 q->pivot = p->pivot;
1767 q->scale_x = p->scale_x;
1768 q->scale_y = p->scale_y;
1769 q->angle = p->angle;
1770 q->pivot_u = p->pivot_u;
1771 q->pivot_x = p->pivot_x;
1772 q->pivot_y = p->pivot_y;
1773 break;
1774 }
1778 new_m;
1779 q->tolerance = p->tolerance;
1780 break;
1781 }
1782 default:
1783 return nullptr; /* unknown modifier type */
1784 }
1786
1787 return new_m;
1788}
1789
1798
1800 LineStyleModifier *modifier,
1801 int direction)
1802{
1803 return BLI_listbase_link_move(&linestyle->color_modifiers, modifier, direction);
1804}
1806 LineStyleModifier *modifier,
1807 int direction)
1808{
1809 return BLI_listbase_link_move(&linestyle->alpha_modifiers, modifier, direction);
1810}
1812 LineStyleModifier *modifier,
1813 int direction)
1814{
1815 return BLI_listbase_link_move(&linestyle->thickness_modifiers, modifier, direction);
1816}
1818 LineStyleModifier *modifier,
1819 int direction)
1820{
1821 return BLI_listbase_link_move(&linestyle->geometry_modifiers, modifier, direction);
1822}
1823
1825{
1826 ColorBand *color_ramp;
1827 LinkData *link;
1828
1829 BLI_listbase_clear(listbase);
1830
1832 switch (m->type) {
1834 color_ramp = ((LineStyleColorModifier_AlongStroke *)m)->color_ramp;
1835 break;
1837 color_ramp = ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp;
1838 break;
1840 color_ramp = ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp;
1841 break;
1843 color_ramp = ((LineStyleColorModifier_Material *)m)->color_ramp;
1844 break;
1845 default:
1846 continue;
1847 }
1848 link = (LinkData *)MEM_callocN(sizeof(LinkData), "link to color ramp");
1849 link->data = color_ramp;
1850 BLI_addtail(listbase, link);
1851 }
1852}
1853
1855 const ColorBand *color_ramp)
1856{
1857 bool found = false;
1858
1860 switch (m->type) {
1862 if (color_ramp == ((LineStyleColorModifier_AlongStroke *)m)->color_ramp) {
1863 found = true;
1864 }
1865 break;
1867 if (color_ramp == ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp) {
1868 found = true;
1869 }
1870 break;
1872 if (color_ramp == ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp) {
1873 found = true;
1874 }
1875 break;
1877 if (color_ramp == ((LineStyleColorModifier_Material *)m)->color_ramp) {
1878 found = true;
1879 }
1880 break;
1882 if (color_ramp == ((LineStyleColorModifier_Tangent *)m)->color_ramp) {
1883 found = true;
1884 }
1885 break;
1886 case LS_MODIFIER_NOISE:
1887 if (color_ramp == ((LineStyleColorModifier_Noise *)m)->color_ramp) {
1888 found = true;
1889 }
1890 break;
1892 if (color_ramp == ((LineStyleColorModifier_CreaseAngle *)m)->color_ramp) {
1893 found = true;
1894 }
1895 break;
1897 if (color_ramp == ((LineStyleColorModifier_Curvature_3D *)m)->color_ramp) {
1898 found = true;
1899 }
1900 break;
1901 }
1902
1903 if (found) {
1904 char name_esc[sizeof(m->name) * 2];
1905 BLI_str_escape(name_esc, m->name, sizeof(name_esc));
1906 return fmt::format("color_modifiers[\"{}\"].color_ramp", name_esc);
1907 }
1908 }
1909 printf("BKE_linestyle_path_to_color_ramp: No color ramps correspond to the given pointer.\n");
1910 return std::nullopt;
1911}
1912
1913bool BKE_linestyle_use_textures(FreestyleLineStyle *linestyle, const bool use_shading_nodes)
1914{
1915 if (use_shading_nodes) {
1918 if (node->typeinfo->nclass == NODE_CLASS_TEXTURE) {
1919 return true;
1920 }
1921 }
1922 }
1923 }
1924 else {
1925 if (linestyle && (linestyle->flag & LS_TEXTURE)) {
1926 return (linestyle->mtex[0] != nullptr);
1927 }
1928 }
1929 return false;
1930}
1931
1933{
1934 bNode *uv_along_stroke, *input_texture, *output_linestyle;
1935 bNodeSocket *fromsock, *tosock;
1936 bNodeTree *ntree;
1937
1938 BLI_assert(linestyle->nodetree == nullptr);
1939
1941 nullptr, &linestyle->id, "stroke_shader", "ShaderNodeTree");
1942
1943 uv_along_stroke = blender::bke::node_add_static_node(C, ntree, SH_NODE_UVALONGSTROKE);
1944 uv_along_stroke->locx = 0.0f;
1945 uv_along_stroke->locy = 300.0f;
1946 uv_along_stroke->custom1 = 0; /* use_tips */
1947
1948 input_texture = blender::bke::node_add_static_node(C, ntree, SH_NODE_TEX_IMAGE);
1949 input_texture->locx = 200.0f;
1950 input_texture->locy = 300.0f;
1951
1953 output_linestyle->locx = 400.0f;
1954 output_linestyle->locy = 300.0f;
1955 output_linestyle->custom1 = MA_RAMP_BLEND;
1956 output_linestyle->custom2 = 0; /* use_clamp */
1957
1958 blender::bke::node_set_active(ntree, input_texture);
1959
1960 fromsock = static_cast<bNodeSocket *>(BLI_findlink(&uv_along_stroke->outputs, 0)); /* UV */
1961 tosock = static_cast<bNodeSocket *>(BLI_findlink(&input_texture->inputs, 0)); /* UV */
1962 blender::bke::node_add_link(ntree, uv_along_stroke, fromsock, input_texture, tosock);
1963
1964 fromsock = static_cast<bNodeSocket *>(BLI_findlink(&input_texture->outputs, 0)); /* Color */
1965 tosock = static_cast<bNodeSocket *>(BLI_findlink(&output_linestyle->inputs, 0)); /* Color */
1966 blender::bke::node_add_link(ntree, input_texture, fromsock, output_linestyle, tosock);
1967
1968 BKE_ntree_update_main_tree(CTX_data_main(C), ntree, nullptr);
1969}
ColorBand * BKE_colorband_add(bool rangetype)
Definition colorband.cc:298
void BKE_curvemapping_blend_read(BlendDataReader *reader, CurveMapping *cumap)
CurveMapping * BKE_curvemapping_copy(const CurveMapping *cumap)
CurveMapping * BKE_curvemapping_add(int tot, float minx, float miny, float maxx, float maxy)
Definition colortools.cc:90
void BKE_curvemapping_free(CurveMapping *cumap)
void BKE_curvemapping_blend_write(BlendWriter *writer, const CurveMapping *cumap)
Main * CTX_data_main(const bContext *C)
struct FreestyleLineSet * BKE_freestyle_lineset_get_active(struct FreestyleConfig *config)
Definition freestyle.cc:212
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
Definition BKE_idtype.hh:39
void * BKE_libblock_alloc(Main *bmain, short type, const char *name, int flag) ATTR_WARN_UNUSED_RESULT
Definition lib_id.cc:1415
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void id_us_plus(ID *id)
Definition lib_id.cc:351
struct ID * BKE_id_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, const ID *new_owner_id, ID **new_id_p, int flag)
Definition lib_id.cc:656
void BKE_id_blend_write(BlendWriter *writer, ID *id)
Definition lib_id.cc:2560
#define BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data_, func_call_)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
void BKE_library_foreach_ID_embedded(LibraryForeachIDData *data, ID **id_pp)
Definition lib_query.cc:163
@ IDWALK_CB_NOP
Blender kernel freestyle line style functionality.
#define SH_NODE_TEX_IMAGE
Definition BKE_node.hh:930
#define SH_NODE_UVALONGSTROKE
Definition BKE_node.hh:974
#define NODE_CLASS_TEXTURE
Definition BKE_node.hh:414
#define SH_NODE_OUTPUT_LINESTYLE
Definition BKE_node.hh:973
void BKE_ntree_update_main_tree(Main *bmain, bNodeTree *ntree, NodeTreeUpdateExtraParams *params)
void BKE_texture_mtex_foreach_id(struct LibraryForeachIDData *data, struct MTex *mtex)
Definition texture.cc:230
#define BLI_assert(a)
Definition BLI_assert.h:50
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:269
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
void void void bool BLI_listbase_link_move(ListBase *listbase, void *vlink, int step) ATTR_NONNULL()
Definition listbase.cc:435
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define DEG2RADF(_deg)
#define STRNCPY(dst, src)
Definition BLI_string.h:593
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
#define UNLIKELY(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
BLO_Write_IDBuffer * BLO_write_allocate_id_buffer()
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_write_init_id_buffer_from_id(BLO_Write_IDBuffer *id_buffer, ID *id, const bool is_undo)
void BLO_write_destroy_id_buffer(BLO_Write_IDBuffer **id_buffer)
ID * BLO_write_get_id_buffer_temp_id(BLO_Write_IDBuffer *id_buffer)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_read_struct(reader, struct_name, ptr_p)
bool BLO_write_is_undo(BlendWriter *writer)
void BLO_write_struct_by_id(BlendWriter *writer, int struct_id, const void *data_ptr)
#define BLO_write_struct_at_address(writer, struct_name, address, data_ptr)
#define BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE
#define DATA_(msgid)
#define FILTER_ID_OB
Definition DNA_ID.h:1181
#define FILTER_ID_TE
Definition DNA_ID.h:1187
#define FILTER_ID_LS
Definition DNA_ID.h:1173
@ INDEX_ID_LS
Definition DNA_ID.h:1281
@ ID_LS
#define DNA_struct_default_get(struct_name)
struct LineStyleColorModifier_Curvature_3D LineStyleColorModifier_Curvature_3D
struct LineStyleGeometryModifier_SinusDisplacement LineStyleGeometryModifier_SinusDisplacement
struct FreestyleLineStyle FreestyleLineStyle
struct LineStyleThicknessModifier_Curvature_3D LineStyleThicknessModifier_Curvature_3D
struct LineStyleThicknessModifier_CreaseAngle LineStyleThicknessModifier_CreaseAngle
struct LineStyleGeometryModifier_Simplification LineStyleGeometryModifier_Simplification
struct LineStyleThicknessModifier_Noise LineStyleThicknessModifier_Noise
struct LineStyleColorModifier_DistanceFromCamera LineStyleColorModifier_DistanceFromCamera
struct LineStyleGeometryModifier_2DOffset LineStyleGeometryModifier_2DOffset
struct LineStyleAlphaModifier_CreaseAngle LineStyleAlphaModifier_CreaseAngle
struct LineStyleAlphaModifier_DistanceFromCamera LineStyleAlphaModifier_DistanceFromCamera
struct LineStyleColorModifier_AlongStroke LineStyleColorModifier_AlongStroke
@ LS_THICKNESS_ASYMMETRIC
struct LineStyleColorModifier_Material LineStyleColorModifier_Material
struct LineStyleThicknessModifier_DistanceFromCamera LineStyleThicknessModifier_DistanceFromCamera
struct LineStyleGeometryModifier_2DTransform LineStyleGeometryModifier_2DTransform
struct LineStyleGeometryModifier_PerlinNoise2D LineStyleGeometryModifier_PerlinNoise2D
@ LS_MODIFIER_MATERIAL_LINE
@ LS_MODIFIER_MATERIAL_LINE_A
struct LineStyleThicknessModifier_AlongStroke LineStyleThicknessModifier_AlongStroke
struct LineStyleGeometryModifier_GuidingLines LineStyleGeometryModifier_GuidingLines
struct LineStyleGeometryModifier_SpatialNoise LineStyleGeometryModifier_SpatialNoise
struct LineStyleThicknessModifier_DistanceFromObject LineStyleThicknessModifier_DistanceFromObject
struct LineStyleThicknessModifier_Material LineStyleThicknessModifier_Material
struct LineStyleColorModifier_Tangent LineStyleColorModifier_Tangent
struct LineStyleColorModifier_CreaseAngle LineStyleColorModifier_CreaseAngle
@ LS_MODIFIER_SAMPLING
@ LS_MODIFIER_BEZIER_CURVE
@ LS_MODIFIER_NOISE
@ LS_MODIFIER_BACKBONE_STRETCHER
@ LS_MODIFIER_SPATIAL_NOISE
@ LS_MODIFIER_PERLIN_NOISE_2D
@ LS_MODIFIER_POLYGONIZATION
@ LS_MODIFIER_GUIDING_LINES
@ LS_MODIFIER_SIMPLIFICATION
@ LS_MODIFIER_TANGENT
@ LS_MODIFIER_CREASE_ANGLE
@ LS_MODIFIER_NUM
@ LS_MODIFIER_2D_TRANSFORM
@ LS_MODIFIER_DISTANCE_FROM_OBJECT
@ LS_MODIFIER_BLUEPRINT
@ LS_MODIFIER_CALLIGRAPHY
@ LS_MODIFIER_CURVATURE_3D
@ LS_MODIFIER_SINUS_DISPLACEMENT
@ LS_MODIFIER_ALONG_STROKE
@ LS_MODIFIER_MATERIAL
@ LS_MODIFIER_DISTANCE_FROM_CAMERA
@ LS_MODIFIER_PERLIN_NOISE_1D
@ LS_MODIFIER_2D_OFFSET
@ LS_MODIFIER_TIP_REMOVER
struct LineStyleAlphaModifier_AlongStroke LineStyleAlphaModifier_AlongStroke
struct LineStyleAlphaModifier_Tangent LineStyleAlphaModifier_Tangent
struct LineStyleColorModifier_Noise LineStyleColorModifier_Noise
@ LS_VALUE_BLEND
struct LineStyleGeometryModifier_BackboneStretcher LineStyleGeometryModifier_BackboneStretcher
struct LineStyleGeometryModifier_PerlinNoise1D LineStyleGeometryModifier_PerlinNoise1D
struct LineStyleAlphaModifier_Curvature_3D LineStyleAlphaModifier_Curvature_3D
struct LineStyleColorModifier_DistanceFromObject LineStyleColorModifier_DistanceFromObject
@ LS_MODIFIER_BLUEPRINT_CIRCLES
struct LineStyleThicknessModifier_Tangent LineStyleThicknessModifier_Tangent
struct LineStyleGeometryModifier_Blueprint LineStyleGeometryModifier_Blueprint
@ LS_MODIFIER_2D_TRANSFORM_PIVOT_CENTER
@ LS_MODIFIER_SPATIAL_NOISE_PURERANDOM
@ LS_MODIFIER_SPATIAL_NOISE_SMOOTH
struct LineStyleAlphaModifier_Noise LineStyleAlphaModifier_Noise
struct LineStyleAlphaModifier_Material LineStyleAlphaModifier_Material
struct LineStyleAlphaModifier_DistanceFromObject LineStyleAlphaModifier_DistanceFromObject
struct LineStyleGeometryModifier_Sampling LineStyleGeometryModifier_Sampling
struct LineStyleGeometryModifier_Polygonalization LineStyleGeometryModifier_Polygonalization
struct LineStyleThicknessModifier_Calligraphy LineStyleThicknessModifier_Calligraphy
@ LS_MODIFIER_EXPANDED
@ LS_MODIFIER_ENABLED
struct LineStyleGeometryModifier_TipRemover LineStyleGeometryModifier_TipRemover
struct LineStyleGeometryModifier_BezierCurve LineStyleGeometryModifier_BezierCurve
@ MA_RAMP_BLEND
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
#define MAX_MTEX
Definition Stroke.h:33
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
#define printf
FreestyleLineStyle linestyle
#define offsetof(t, d)
static void direct_link_linestyle_alpha_modifier(BlendDataReader *reader, LineStyleModifier *modifier)
Definition linestyle.cc:509
static void linestyle_free_data(ID *id)
Definition linestyle.cc:106
void BKE_linestyle_default_shader(const bContext *C, FreestyleLineStyle *linestyle)
bool BKE_linestyle_use_textures(FreestyleLineStyle *linestyle, const bool use_shading_nodes)
FreestyleLineStyle * BKE_linestyle_new(Main *bmain, const char *name)
Definition linestyle.cc:694
static void linestyle_init_data(ID *id)
Definition linestyle.cc:44
void BKE_linestyle_modifier_list_color_ramps(FreestyleLineStyle *linestyle, ListBase *listbase)
bool BKE_linestyle_thickness_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
static void direct_link_linestyle_color_modifier(BlendDataReader *reader, LineStyleModifier *modifier)
Definition linestyle.cc:460
LineStyleModifier * BKE_linestyle_geometry_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
void BKE_linestyle_init(FreestyleLineStyle *linestyle)
Definition linestyle.cc:689
static void write_linestyle_geometry_modifiers(BlendWriter *writer, ListBase *modifiers)
Definition linestyle.cc:375
int BKE_linestyle_thickness_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
bool BKE_linestyle_color_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
static void write_linestyle_alpha_modifiers(BlendWriter *writer, ListBase *modifiers)
Definition linestyle.cc:242
LineStyleModifier * BKE_linestyle_color_modifier_copy(FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int flag)
Definition linestyle.cc:829
static void direct_link_linestyle_thickness_modifier(BlendDataReader *reader, LineStyleModifier *modifier)
Definition linestyle.cc:566
LineStyleModifier * BKE_linestyle_alpha_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
Definition linestyle.cc:991
static LineStyleModifier * alloc_geometry_modifier(const char *name, int type)
FreestyleLineStyle * BKE_linestyle_active_from_view_layer(ViewLayer *view_layer)
Definition linestyle.cc:705
LineStyleModifier * BKE_linestyle_color_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
Definition linestyle.cc:771
static void write_linestyle_thickness_modifiers(BlendWriter *writer, ListBase *modifiers)
Definition linestyle.cc:308
static void write_linestyle_color_modifiers(BlendWriter *writer, ListBase *modifiers)
Definition linestyle.cc:175
int BKE_linestyle_color_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
Definition linestyle.cc:921
static void linestyle_blend_read_data(BlendDataReader *reader, ID *id)
Definition linestyle.cc:625
static LineStyleModifier * new_modifier(const char *name, int type, size_t size)
Definition linestyle.cc:712
static void linestyle_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition linestyle.cc:429
bool BKE_linestyle_alpha_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
bool BKE_linestyle_geometry_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
LineStyleModifier * BKE_linestyle_geometry_modifier_copy(FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int)
static LineStyleModifier * alloc_alpha_modifier(const char *name, int type)
Definition linestyle.cc:956
int BKE_linestyle_alpha_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
static LineStyleModifier * alloc_color_modifier(const char *name, int type)
Definition linestyle.cc:735
LineStyleModifier * BKE_linestyle_thickness_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
std::optional< std::string > BKE_linestyle_path_to_color_ramp(FreestyleLineStyle *linestyle, const ColorBand *color_ramp)
LineStyleModifier * BKE_linestyle_thickness_modifier_copy(FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int flag)
static void linestyle_foreach_id(ID *id, LibraryForeachIDData *data)
Definition linestyle.cc:136
static const char * modifier_name[LS_MODIFIER_NUM]
Definition linestyle.cc:680
static LineStyleModifier * alloc_thickness_modifier(const char *name, int type)
static void linestyle_copy_data(Main *bmain, std::optional< Library * > owner_library, ID *id_dst, const ID *id_src, const int flag)
Definition linestyle.cc:55
int BKE_linestyle_geometry_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
static void add_to_modifier_list(ListBase *lb, LineStyleModifier *m)
Definition linestyle.cc:728
IDTypeInfo IDType_ID_LS
Definition linestyle.cc:650
LineStyleModifier * BKE_linestyle_alpha_modifier_copy(FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int)
static void direct_link_linestyle_geometry_modifier(BlendDataReader *, LineStyleModifier *)
Definition linestyle.cc:620
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
void *(* MEM_dupallocN)(const void *vmemh)
Definition mallocn.cc:39
void node_set_active(bNodeTree *ntree, bNode *node)
Definition node.cc:3896
void node_tree_blend_write(BlendWriter *writer, bNodeTree *ntree)
Definition node.cc:760
bNode * node_add_static_node(const bContext *C, bNodeTree *ntree, int type)
Definition node.cc:2642
bNodeLink * node_add_link(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
Definition node.cc:2912
bNodeTree * node_tree_add_tree_embedded(Main *bmain, ID *owner_id, const char *name, const char *idname)
Definition node.cc:3239
void node_tree_free_embedded_tree(bNodeTree *ntree)
Definition node.cc:3632
struct FreestyleLineStyle * linestyle
struct bNodeTree * nodetree
struct MTex * mtex[18]
Definition DNA_ID.h:413
void * data
void * first
struct FreestyleConfig freestyle_config
ListBase nodes
int16_t custom1
float locy
ListBase inputs
float locx
ListBase outputs
int16_t custom2
#define N_(msgid)
uint8_t flag
Definition wm_window.cc:138