Blender  V2.93
linestyle.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) 2010 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 
28 #include "MEM_guardedalloc.h"
29 
30 #include "DNA_defaults.h"
31 #include "DNA_material_types.h" /* for ramp blend */
32 #include "DNA_object_types.h"
33 #include "DNA_texture_types.h"
34 
35 #include "BLI_blenlib.h"
36 #include "BLI_math.h"
37 #include "BLI_string_utils.h"
38 #include "BLI_utildefines.h"
39 
40 #include "BLT_translation.h"
41 
42 #include "BKE_anim_data.h"
43 #include "BKE_colorband.h"
44 #include "BKE_colortools.h"
45 #include "BKE_context.h"
46 #include "BKE_freestyle.h"
47 #include "BKE_idtype.h"
48 #include "BKE_lib_id.h"
49 #include "BKE_lib_query.h"
50 #include "BKE_linestyle.h"
51 #include "BKE_main.h"
52 #include "BKE_node.h"
53 #include "BKE_texture.h"
54 
55 #include "BLO_read_write.h"
56 
57 static void linestyle_init_data(ID *id)
58 {
60 
62 
64 
66 }
67 
68 static void linestyle_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag)
69 {
70  FreestyleLineStyle *linestyle_dst = (FreestyleLineStyle *)id_dst;
71  const FreestyleLineStyle *linestyle_src = (const FreestyleLineStyle *)id_src;
72 
73  /* We never handle usercount here for own data. */
74  const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT;
75  /* We always need allocation of our private ID data. */
76  const int flag_private_id_data = flag & ~LIB_ID_CREATE_NO_ALLOCATE;
77 
78  for (int a = 0; a < MAX_MTEX; a++) {
79  if (linestyle_src->mtex[a]) {
80  linestyle_dst->mtex[a] = MEM_mallocN(sizeof(*linestyle_dst->mtex[a]), __func__);
81  *linestyle_dst->mtex[a] = *linestyle_src->mtex[a];
82  }
83  }
84 
85  if (linestyle_src->nodetree) {
86  BKE_id_copy_ex(bmain,
87  (ID *)linestyle_src->nodetree,
88  (ID **)&linestyle_dst->nodetree,
89  flag_private_id_data);
90  }
91 
92  LineStyleModifier *linestyle_modifier;
93  BLI_listbase_clear(&linestyle_dst->color_modifiers);
94  for (linestyle_modifier = (LineStyleModifier *)linestyle_src->color_modifiers.first;
95  linestyle_modifier;
96  linestyle_modifier = linestyle_modifier->next) {
97  BKE_linestyle_color_modifier_copy(linestyle_dst, linestyle_modifier, flag_subdata);
98  }
99 
100  BLI_listbase_clear(&linestyle_dst->alpha_modifiers);
101  for (linestyle_modifier = (LineStyleModifier *)linestyle_src->alpha_modifiers.first;
102  linestyle_modifier;
103  linestyle_modifier = linestyle_modifier->next) {
104  BKE_linestyle_alpha_modifier_copy(linestyle_dst, linestyle_modifier, flag_subdata);
105  }
106 
107  BLI_listbase_clear(&linestyle_dst->thickness_modifiers);
108  for (linestyle_modifier = (LineStyleModifier *)linestyle_src->thickness_modifiers.first;
109  linestyle_modifier;
110  linestyle_modifier = linestyle_modifier->next) {
111  BKE_linestyle_thickness_modifier_copy(linestyle_dst, linestyle_modifier, flag_subdata);
112  }
113 
114  BLI_listbase_clear(&linestyle_dst->geometry_modifiers);
115  for (linestyle_modifier = (LineStyleModifier *)linestyle_src->geometry_modifiers.first;
116  linestyle_modifier;
117  linestyle_modifier = linestyle_modifier->next) {
118  BKE_linestyle_geometry_modifier_copy(linestyle_dst, linestyle_modifier, flag_subdata);
119  }
120 }
121 
122 static void linestyle_free_data(ID *id)
123 {
125  LineStyleModifier *linestyle_modifier;
126 
127  for (int material_slot_index = 0; material_slot_index < MAX_MTEX; material_slot_index++) {
128  MEM_SAFE_FREE(linestyle->mtex[material_slot_index]);
129  }
130 
131  /* is no lib link block, but linestyle extension */
132  if (linestyle->nodetree) {
136  }
137 
138  while ((linestyle_modifier = (LineStyleModifier *)linestyle->color_modifiers.first)) {
139  BKE_linestyle_color_modifier_remove(linestyle, linestyle_modifier);
140  }
141  while ((linestyle_modifier = (LineStyleModifier *)linestyle->alpha_modifiers.first)) {
142  BKE_linestyle_alpha_modifier_remove(linestyle, linestyle_modifier);
143  }
144  while ((linestyle_modifier = (LineStyleModifier *)linestyle->thickness_modifiers.first)) {
146  }
147  while ((linestyle_modifier = (LineStyleModifier *)linestyle->geometry_modifiers.first)) {
149  }
150 }
151 
153 {
155 
156  for (int i = 0; i < MAX_MTEX; i++) {
157  if (linestyle->mtex[i]) {
159  }
160  }
161  if (linestyle->nodetree) {
162  /* nodetree **are owned by IDs**, treat them as mere sub-data and not real ID! */
164  }
165 
167  if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
169  lsm;
170  if (p->target) {
172  }
173  }
174  }
176  if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
178  lsm;
179  if (p->target) {
181  }
182  }
183  }
185  if (lsm->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
188  if (p->target) {
190  }
191  }
192  }
193 }
194 
195 static void write_linestyle_color_modifiers(BlendWriter *writer, ListBase *modifiers)
196 {
198 
199  for (m = modifiers->first; m; m = m->next) {
200  int struct_nr;
201  switch (m->type) {
203  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_AlongStroke);
204  break;
206  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_DistanceFromCamera);
207  break;
209  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_DistanceFromObject);
210  break;
212  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_Material);
213  break;
214  case LS_MODIFIER_TANGENT:
215  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_Tangent);
216  break;
217  case LS_MODIFIER_NOISE:
218  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_Noise);
219  break;
221  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_CreaseAngle);
222  break;
224  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleColorModifier_Curvature_3D);
225  break;
226  default:
227  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleModifier); /* this should not happen */
228  }
229  BLO_write_struct_by_id(writer, struct_nr, m);
230  }
231  for (m = modifiers->first; m; m = m->next) {
232  switch (m->type) {
235  break;
238  writer, ColorBand, ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp);
239  break;
242  writer, ColorBand, ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp);
243  break;
245  BLO_write_struct(writer, ColorBand, ((LineStyleColorModifier_Material *)m)->color_ramp);
246  break;
247  case LS_MODIFIER_TANGENT:
248  BLO_write_struct(writer, ColorBand, ((LineStyleColorModifier_Tangent *)m)->color_ramp);
249  break;
250  case LS_MODIFIER_NOISE:
251  BLO_write_struct(writer, ColorBand, ((LineStyleColorModifier_Noise *)m)->color_ramp);
252  break;
255  break;
258  writer, ColorBand, ((LineStyleColorModifier_Curvature_3D *)m)->color_ramp);
259  break;
260  }
261  }
262 }
263 
264 static void write_linestyle_alpha_modifiers(BlendWriter *writer, ListBase *modifiers)
265 {
267 
268  for (m = modifiers->first; m; m = m->next) {
269  int struct_nr;
270  switch (m->type) {
272  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_AlongStroke);
273  break;
275  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_DistanceFromCamera);
276  break;
278  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_DistanceFromObject);
279  break;
281  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_Material);
282  break;
283  case LS_MODIFIER_TANGENT:
284  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_Tangent);
285  break;
286  case LS_MODIFIER_NOISE:
287  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_Noise);
288  break;
290  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_CreaseAngle);
291  break;
293  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleAlphaModifier_Curvature_3D);
294  break;
295  default:
296  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleModifier); /* this should not happen */
297  }
298  BLO_write_struct_by_id(writer, struct_nr, m);
299  }
300  for (m = modifiers->first; m; m = m->next) {
301  switch (m->type) {
304  break;
308  break;
312  break;
315  break;
316  case LS_MODIFIER_TANGENT:
318  break;
319  case LS_MODIFIER_NOISE:
321  break;
324  break;
327  break;
328  }
329  }
330 }
331 
333 {
335 
336  for (m = modifiers->first; m; m = m->next) {
337  int struct_nr;
338  switch (m->type) {
340  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_AlongStroke);
341  break;
343  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_DistanceFromCamera);
344  break;
346  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_DistanceFromObject);
347  break;
349  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Material);
350  break;
352  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Calligraphy);
353  break;
354  case LS_MODIFIER_TANGENT:
355  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Tangent);
356  break;
357  case LS_MODIFIER_NOISE:
358  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Noise);
359  break;
361  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_CreaseAngle);
362  break;
364  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleThicknessModifier_Curvature_3D);
365  break;
366  default:
367  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleModifier); /* this should not happen */
368  }
369  BLO_write_struct_by_id(writer, struct_nr, m);
370  }
371  for (m = modifiers->first; m; m = m->next) {
372  switch (m->type) {
375  break;
379  break;
383  break;
386  break;
387  case LS_MODIFIER_TANGENT:
389  break;
392  break;
396  break;
397  }
398  }
399 }
400 
402 {
404 
405  for (m = modifiers->first; m; m = m->next) {
406  int struct_nr;
407  switch (m->type) {
409  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_Sampling);
410  break;
412  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_BezierCurve);
413  break;
415  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_SinusDisplacement);
416  break;
418  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_SpatialNoise);
419  break;
421  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_PerlinNoise1D);
422  break;
424  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_PerlinNoise2D);
425  break;
427  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_BackboneStretcher);
428  break;
430  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_TipRemover);
431  break;
433  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_Polygonalization);
434  break;
436  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_GuidingLines);
437  break;
439  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_Blueprint);
440  break;
442  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_2DOffset);
443  break;
445  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_2DTransform);
446  break;
448  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleGeometryModifier_Simplification);
449  break;
450  default:
451  struct_nr = SDNA_TYPE_FROM_STRUCT(LineStyleModifier); /* this should not happen */
452  }
453  BLO_write_struct_by_id(writer, struct_nr, m);
454  }
455 }
456 
457 static void linestyle_blend_write(BlendWriter *writer, ID *id, const void *id_address)
458 {
460  if (linestyle->id.us > 0 || BLO_write_is_undo(writer)) {
461  BLO_write_id_struct(writer, FreestyleLineStyle, id_address, &linestyle->id);
462  BKE_id_blend_write(writer, &linestyle->id);
463 
464  if (linestyle->adt) {
466  }
467 
472  for (int a = 0; a < MAX_MTEX; a++) {
473  if (linestyle->mtex[a]) {
474  BLO_write_struct(writer, MTex, linestyle->mtex[a]);
475  }
476  }
477  if (linestyle->nodetree) {
480  }
481  }
482 }
483 
485  LineStyleModifier *modifier)
486 {
487  switch (modifier->type) {
490  BLO_read_data_address(reader, &m->color_ramp);
491  break;
492  }
495  modifier;
496  BLO_read_data_address(reader, &m->color_ramp);
497  break;
498  }
501  modifier;
502  BLO_read_data_address(reader, &m->color_ramp);
503  break;
504  }
505  case LS_MODIFIER_MATERIAL: {
507  BLO_read_data_address(reader, &m->color_ramp);
508  break;
509  }
510  case LS_MODIFIER_TANGENT: {
512  BLO_read_data_address(reader, &m->color_ramp);
513  break;
514  }
515  case LS_MODIFIER_NOISE: {
517  BLO_read_data_address(reader, &m->color_ramp);
518  break;
519  }
522  BLO_read_data_address(reader, &m->color_ramp);
523  break;
524  }
527  BLO_read_data_address(reader, &m->color_ramp);
528  break;
529  }
530  }
531 }
532 
534  LineStyleModifier *modifier)
535 {
536  switch (modifier->type) {
539  BLO_read_data_address(reader, &m->curve);
541  break;
542  }
545  modifier;
546  BLO_read_data_address(reader, &m->curve);
548  break;
549  }
552  modifier;
553  BLO_read_data_address(reader, &m->curve);
555  break;
556  }
557  case LS_MODIFIER_MATERIAL: {
559  BLO_read_data_address(reader, &m->curve);
561  break;
562  }
563  case LS_MODIFIER_TANGENT: {
565  BLO_read_data_address(reader, &m->curve);
567  break;
568  }
569  case LS_MODIFIER_NOISE: {
571  BLO_read_data_address(reader, &m->curve);
573  break;
574  }
577  BLO_read_data_address(reader, &m->curve);
579  break;
580  }
583  BLO_read_data_address(reader, &m->curve);
585  break;
586  }
587  }
588 }
589 
591  LineStyleModifier *modifier)
592 {
593  switch (modifier->type) {
596  modifier;
597  BLO_read_data_address(reader, &m->curve);
599  break;
600  }
604  BLO_read_data_address(reader, &m->curve);
606  break;
607  }
611  BLO_read_data_address(reader, &m->curve);
613  break;
614  }
615  case LS_MODIFIER_MATERIAL: {
617  BLO_read_data_address(reader, &m->curve);
619  break;
620  }
621  case LS_MODIFIER_TANGENT: {
623  BLO_read_data_address(reader, &m->curve);
625  break;
626  }
629  modifier;
630  BLO_read_data_address(reader, &m->curve);
632  break;
633  }
636  modifier;
637  BLO_read_data_address(reader, &m->curve);
639  break;
640  }
641  }
642 }
643 
645  LineStyleModifier *UNUSED(modifier))
646 {
647 }
648 
650 {
652 
657  direct_link_linestyle_color_modifier(reader, modifier);
658  }
661  direct_link_linestyle_alpha_modifier(reader, modifier);
662  }
666  }
669  direct_link_linestyle_geometry_modifier(reader, modifier);
670  }
671  for (int a = 0; a < MAX_MTEX; a++) {
673  }
674 }
675 
676 static void linestyle_blend_read_lib(BlendLibReader *reader, ID *id)
677 {
679 
681  switch (m->type) {
685  BLO_read_id_address(reader, linestyle->id.lib, &cm->target);
686  break;
687  }
688  }
689  }
691  switch (m->type) {
695  BLO_read_id_address(reader, linestyle->id.lib, &am->target);
696  break;
697  }
698  }
699  }
701  switch (m->type) {
705  BLO_read_id_address(reader, linestyle->id.lib, &tm->target);
706  break;
707  }
708  }
709  }
710  for (int a = 0; a < MAX_MTEX; a++) {
711  MTex *mtex = linestyle->mtex[a];
712  if (mtex) {
713  BLO_read_id_address(reader, linestyle->id.lib, &mtex->tex);
714  BLO_read_id_address(reader, linestyle->id.lib, &mtex->object);
715  }
716  }
717 }
718 
719 static void linestyle_blend_read_expand(BlendExpander *expander, ID *id)
720 {
722 
723  for (int a = 0; a < MAX_MTEX; a++) {
724  if (linestyle->mtex[a]) {
725  BLO_expand(expander, linestyle->mtex[a]->tex);
726  BLO_expand(expander, linestyle->mtex[a]->object);
727  }
728  }
729 
731  if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
732  BLO_expand(expander, ((LineStyleColorModifier_DistanceFromObject *)m)->target);
733  }
734  }
736  if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
737  BLO_expand(expander, ((LineStyleAlphaModifier_DistanceFromObject *)m)->target);
738  }
739  }
741  if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
743  }
744  }
745 }
746 
748  .id_code = ID_LS,
749  .id_filter = FILTER_ID_LS,
750  .main_listbase_index = INDEX_ID_LS,
751  .struct_size = sizeof(FreestyleLineStyle),
752  .name = "FreestyleLineStyle",
753  .name_plural = "linestyles",
754  .translation_context = BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE,
755  .flags = 0,
756 
758  .copy_data = linestyle_copy_data,
759  .free_data = linestyle_free_data,
760  .make_local = NULL,
761  .foreach_id = linestyle_foreach_id,
762  .foreach_cache = NULL,
763  .owner_get = NULL,
764 
765  .blend_write = linestyle_blend_write,
766  .blend_read_data = linestyle_blend_read_data,
767  .blend_read_lib = linestyle_blend_read_lib,
768  .blend_read_expand = linestyle_blend_read_expand,
769 
770  .blend_read_undo_preserve = NULL,
771 
772  .lib_override_apply_post = NULL,
773 };
774 
775 static const char *modifier_name[LS_MODIFIER_NUM] = {
776  NULL,
777  "Along Stroke",
778  "Distance from Camera",
779  "Distance from Object",
780  "Material",
781  "Sampling",
782  "Bezier Curve",
783  "Sinus Displacement",
784  "Spatial Noise",
785  "Perlin Noise 1D",
786  "Perlin Noise 2D",
787  "Backbone Stretcher",
788  "Tip Remover",
789  "Calligraphy",
790  "Polygonalization",
791  "Guiding Lines",
792  "Blueprint",
793  "2D Offset",
794  "2D Transform",
795  "Tangent",
796  "Noise",
797  "Crease Angle",
798  "Simplification",
799  "3D Curvature",
800 };
801 
803 {
805 }
806 
807 FreestyleLineStyle *BKE_linestyle_new(struct Main *bmain, const char *name)
808 {
810 
812 
814 
815  return linestyle;
816 }
817 
819 {
820  FreestyleConfig *config = &view_layer->freestyle_config;
822  return (lineset) ? lineset->linestyle : NULL;
823 }
824 
825 static LineStyleModifier *new_modifier(const char *name, int type, size_t size)
826 {
828 
829  if (!name) {
830  name = modifier_name[type];
831  }
832  m = (LineStyleModifier *)MEM_callocN(size, "line style modifier");
833  m->type = type;
834  BLI_strncpy(m->name, name, sizeof(m->name));
835  m->influence = 1.0f;
837 
838  return m;
839 }
840 
842 {
843  BLI_addtail(lb, (void *)m);
845  lb, m, modifier_name[m->type], '.', offsetof(LineStyleModifier, name), sizeof(m->name));
846 }
847 
848 static LineStyleModifier *alloc_color_modifier(const char *name, int type)
849 {
850  size_t size;
851 
852  switch (type) {
855  break;
858  break;
861  break;
864  break;
865  case LS_MODIFIER_TANGENT:
867  break;
868  case LS_MODIFIER_NOISE:
870  break;
873  break;
876  break;
877  default:
878  return NULL; /* unknown modifier type */
879  }
880 
881  return new_modifier(name, type, size);
882 }
883 
885  const char *name,
886  int type)
887 {
889 
890  m = alloc_color_modifier(name, type);
891  if (UNLIKELY(m == NULL)) {
892  return NULL;
893  }
894  m->blend = MA_RAMP_BLEND;
895 
896  switch (type) {
898  ((LineStyleColorModifier_AlongStroke *)m)->color_ramp = BKE_colorband_add(true);
899  break;
902  ((LineStyleColorModifier_DistanceFromCamera *)m)->range_min = 0.0f;
903  ((LineStyleColorModifier_DistanceFromCamera *)m)->range_max = 10000.0f;
904  break;
908  ((LineStyleColorModifier_DistanceFromObject *)m)->range_min = 0.0f;
909  ((LineStyleColorModifier_DistanceFromObject *)m)->range_max = 10000.0f;
910  break;
912  ((LineStyleColorModifier_Material *)m)->color_ramp = BKE_colorband_add(true);
914  break;
915  case LS_MODIFIER_TANGENT:
916  ((LineStyleColorModifier_Tangent *)m)->color_ramp = BKE_colorband_add(true);
917  break;
918  case LS_MODIFIER_NOISE:
919  ((LineStyleColorModifier_Noise *)m)->color_ramp = BKE_colorband_add(true);
920  ((LineStyleColorModifier_Noise *)m)->amplitude = 10.0f;
921  ((LineStyleColorModifier_Noise *)m)->period = 10.0f;
922  ((LineStyleColorModifier_Noise *)m)->seed = 512;
923  break;
925  ((LineStyleColorModifier_CreaseAngle *)m)->color_ramp = BKE_colorband_add(true);
926  ((LineStyleColorModifier_CreaseAngle *)m)->min_angle = 0.0f;
927  ((LineStyleColorModifier_CreaseAngle *)m)->max_angle = DEG2RADF(180.0f);
928  break;
930  ((LineStyleColorModifier_Curvature_3D *)m)->color_ramp = BKE_colorband_add(true);
931  ((LineStyleColorModifier_Curvature_3D *)m)->min_curvature = 0.0f;
932  ((LineStyleColorModifier_Curvature_3D *)m)->max_curvature = 0.5f;
933  break;
934  default:
935  return NULL; /* unknown modifier type */
936  }
938 
939  return m;
940 }
941 
943  const LineStyleModifier *m,
944  const int flag)
945 {
946  LineStyleModifier *new_m;
947 
948  new_m = alloc_color_modifier(m->name, m->type);
949  if (UNLIKELY(new_m == NULL)) {
950  return NULL;
951  }
952  new_m->influence = m->influence;
953  new_m->flags = m->flags;
954  new_m->blend = m->blend;
955 
956  switch (m->type) {
961  break;
962  }
965  m;
967  new_m;
969  q->range_min = p->range_min;
970  q->range_max = p->range_max;
971  break;
972  }
975  m;
977  new_m;
978  q->target = p->target;
979  if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
980  id_us_plus((ID *)q->target);
981  }
983  q->range_min = p->range_min;
984  q->range_max = p->range_max;
985  break;
986  }
987  case LS_MODIFIER_MATERIAL: {
991  q->flags = p->flags;
992  q->mat_attr = p->mat_attr;
993  break;
994  }
995  case LS_MODIFIER_TANGENT: {
999  break;
1000  }
1001  case LS_MODIFIER_NOISE: {
1005  q->amplitude = p->amplitude;
1006  q->period = p->period;
1007  q->seed = p->seed;
1008  break;
1009  }
1010  case LS_MODIFIER_CREASE_ANGLE: {
1014  q->min_angle = p->min_angle;
1015  q->max_angle = p->max_angle;
1016  break;
1017  }
1018  case LS_MODIFIER_CURVATURE_3D: {
1022  q->min_curvature = p->min_curvature;
1023  q->max_curvature = p->max_curvature;
1024  break;
1025  }
1026  default:
1027  return NULL; /* unknown modifier type */
1028  }
1030 
1031  return new_m;
1032 }
1033 
1035 {
1036  if (BLI_findindex(&linestyle->color_modifiers, m) == -1) {
1037  return -1;
1038  }
1039  switch (m->type) {
1041  MEM_freeN(((LineStyleColorModifier_AlongStroke *)m)->color_ramp);
1042  break;
1045  break;
1048  break;
1049  case LS_MODIFIER_MATERIAL:
1050  MEM_freeN(((LineStyleColorModifier_Material *)m)->color_ramp);
1051  break;
1052  case LS_MODIFIER_TANGENT:
1053  MEM_freeN(((LineStyleColorModifier_Tangent *)m)->color_ramp);
1054  break;
1055  case LS_MODIFIER_NOISE:
1056  MEM_freeN(((LineStyleColorModifier_Noise *)m)->color_ramp);
1057  break;
1059  MEM_freeN(((LineStyleColorModifier_CreaseAngle *)m)->color_ramp);
1060  break;
1062  MEM_freeN(((LineStyleColorModifier_Curvature_3D *)m)->color_ramp);
1063  break;
1064  }
1066  return 0;
1067 }
1068 
1069 static LineStyleModifier *alloc_alpha_modifier(const char *name, int type)
1070 {
1071  size_t size;
1072 
1073  switch (type) {
1076  break;
1079  break;
1082  break;
1083  case LS_MODIFIER_MATERIAL:
1085  break;
1086  case LS_MODIFIER_TANGENT:
1088  break;
1089  case LS_MODIFIER_NOISE:
1091  break;
1094  break;
1097  break;
1098  default:
1099  return NULL; /* unknown modifier type */
1100  }
1101  return new_modifier(name, type, size);
1102 }
1103 
1105  const char *name,
1106  int type)
1107 {
1108  LineStyleModifier *m;
1109 
1110  m = alloc_alpha_modifier(name, type);
1111  m->blend = LS_VALUE_BLEND;
1112 
1113  switch (type) {
1114  case LS_MODIFIER_ALONG_STROKE: {
1116  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1117  break;
1118  }
1121  m;
1122  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1123  p->range_min = 0.0f;
1124  p->range_max = 10000.0f;
1125  break;
1126  }
1129  m;
1130  p->target = NULL;
1131  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1132  p->range_min = 0.0f;
1133  p->range_max = 10000.0f;
1134  break;
1135  }
1136  case LS_MODIFIER_MATERIAL: {
1138  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1140  break;
1141  }
1142  case LS_MODIFIER_TANGENT: {
1144  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1145  break;
1146  }
1147  case LS_MODIFIER_NOISE: {
1149  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1150  ((LineStyleAlphaModifier_Noise *)m)->amplitude = 10.0f;
1151  ((LineStyleAlphaModifier_Noise *)m)->period = 10.0f;
1152  ((LineStyleAlphaModifier_Noise *)m)->seed = 512;
1153  break;
1154  }
1155  case LS_MODIFIER_CREASE_ANGLE: {
1157  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1158  ((LineStyleAlphaModifier_CreaseAngle *)m)->min_angle = 0.0f;
1159  ((LineStyleAlphaModifier_CreaseAngle *)m)->max_angle = DEG2RADF(180.0f);
1160  break;
1161  }
1162  case LS_MODIFIER_CURVATURE_3D: {
1164  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1165  ((LineStyleAlphaModifier_Curvature_3D *)m)->min_curvature = 0.0f;
1166  ((LineStyleAlphaModifier_Curvature_3D *)m)->max_curvature = 0.5f;
1167  break;
1168  }
1169  default:
1170  return NULL; /* unknown modifier type */
1171  }
1173 
1174  return m;
1175 }
1176 
1178  const LineStyleModifier *m,
1179  const int UNUSED(flag))
1180 {
1181  LineStyleModifier *new_m;
1182 
1183  new_m = alloc_alpha_modifier(m->name, m->type);
1184  new_m->influence = m->influence;
1185  new_m->flags = m->flags;
1186  new_m->blend = m->blend;
1187 
1188  switch (m->type) {
1189  case LS_MODIFIER_ALONG_STROKE: {
1193  q->flags = p->flags;
1194  break;
1195  }
1198  m;
1200  new_m;
1202  q->flags = p->flags;
1203  q->range_min = p->range_min;
1204  q->range_max = p->range_max;
1205  break;
1206  }
1209  m;
1211  new_m;
1212  if (p->target) {
1213  id_us_plus(&p->target->id);
1214  }
1215  q->target = p->target;
1217  q->flags = p->flags;
1218  q->range_min = p->range_min;
1219  q->range_max = p->range_max;
1220  break;
1221  }
1222  case LS_MODIFIER_MATERIAL: {
1226  q->flags = p->flags;
1227  q->mat_attr = p->mat_attr;
1228  break;
1229  }
1230  case LS_MODIFIER_TANGENT: {
1234  q->flags = p->flags;
1235  break;
1236  }
1237  case LS_MODIFIER_NOISE: {
1241  q->flags = p->flags;
1242  q->amplitude = p->amplitude;
1243  q->period = p->period;
1244  q->seed = p->seed;
1245  break;
1246  }
1247  case LS_MODIFIER_CREASE_ANGLE: {
1251  q->flags = p->flags;
1252  q->min_angle = p->min_angle;
1253  q->max_angle = p->max_angle;
1254  break;
1255  }
1256  case LS_MODIFIER_CURVATURE_3D: {
1260  q->flags = p->flags;
1261  q->min_curvature = p->min_curvature;
1262  q->max_curvature = p->max_curvature;
1263  break;
1264  }
1265  default:
1266  return NULL; /* unknown modifier type */
1267  }
1269 
1270  return new_m;
1271 }
1272 
1274 {
1275  if (BLI_findindex(&linestyle->alpha_modifiers, m) == -1) {
1276  return -1;
1277  }
1278  switch (m->type) {
1281  break;
1284  break;
1287  break;
1288  case LS_MODIFIER_MATERIAL:
1290  break;
1291  case LS_MODIFIER_TANGENT:
1293  break;
1294  case LS_MODIFIER_NOISE:
1296  break;
1299  break;
1302  break;
1303  }
1305  return 0;
1306 }
1307 
1308 static LineStyleModifier *alloc_thickness_modifier(const char *name, int type)
1309 {
1310  size_t size;
1311 
1312  switch (type) {
1315  break;
1318  break;
1321  break;
1322  case LS_MODIFIER_MATERIAL:
1324  break;
1327  break;
1328  case LS_MODIFIER_TANGENT:
1330  break;
1331  case LS_MODIFIER_NOISE:
1333  break;
1336  break;
1339  break;
1340  default:
1341  return NULL; /* unknown modifier type */
1342  }
1343 
1344  return new_modifier(name, type, size);
1345 }
1346 
1348  const char *name,
1349  int type)
1350 {
1351  LineStyleModifier *m;
1352 
1353  m = alloc_thickness_modifier(name, type);
1354  m->blend = LS_VALUE_BLEND;
1355 
1356  switch (type) {
1357  case LS_MODIFIER_ALONG_STROKE: {
1359  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1360  p->value_min = 0.0f;
1361  p->value_max = 1.0f;
1362  break;
1363  }
1367  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1368  p->range_min = 0.0f;
1369  p->range_max = 1000.0f;
1370  p->value_min = 0.0f;
1371  p->value_max = 1.0f;
1372  break;
1373  }
1377  p->target = NULL;
1378  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1379  p->range_min = 0.0f;
1380  p->range_max = 1000.0f;
1381  p->value_min = 0.0f;
1382  p->value_max = 1.0f;
1383  break;
1384  }
1385  case LS_MODIFIER_MATERIAL: {
1387  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1389  p->value_min = 0.0f;
1390  p->value_max = 1.0f;
1391  break;
1392  }
1393  case LS_MODIFIER_CALLIGRAPHY: {
1395  p->min_thickness = 1.0f;
1396  p->max_thickness = 10.0f;
1397  p->orientation = DEG2RADF(60.0f);
1398  break;
1399  }
1400  case LS_MODIFIER_TANGENT: {
1402  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1403  p->min_thickness = 1.0f;
1404  p->max_thickness = 10.0f;
1405  break;
1406  }
1407  case LS_MODIFIER_NOISE: {
1409  p->period = 10.0f;
1410  p->amplitude = 10.0f;
1411  p->seed = 512;
1413  break;
1414  }
1415  case LS_MODIFIER_CREASE_ANGLE: {
1417  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1418  p->min_angle = 0.0f;
1419  p->max_angle = DEG2RADF(180.0f);
1420  p->min_thickness = 1.0f;
1421  p->max_thickness = 10.0f;
1422  break;
1423  }
1424  case LS_MODIFIER_CURVATURE_3D: {
1426  p->curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
1427  p->min_curvature = 0.0f;
1428  p->max_curvature = 0.5f;
1429  p->min_thickness = 1.0f;
1430  p->max_thickness = 10.0f;
1431  break;
1432  }
1433  default:
1434  return NULL; /* unknown modifier type */
1435  }
1437 
1438  return m;
1439 }
1440 
1442  const LineStyleModifier *m,
1443  const int flag)
1444 {
1445  LineStyleModifier *new_m;
1446 
1447  new_m = alloc_thickness_modifier(m->name, m->type);
1448  if (!new_m) {
1449  return NULL;
1450  }
1451  new_m->influence = m->influence;
1452  new_m->flags = m->flags;
1453  new_m->blend = m->blend;
1454 
1455  switch (m->type) {
1456  case LS_MODIFIER_ALONG_STROKE: {
1460  q->flags = p->flags;
1461  q->value_min = p->value_min;
1462  q->value_max = p->value_max;
1463  break;
1464  }
1471  q->flags = p->flags;
1472  q->range_min = p->range_min;
1473  q->range_max = p->range_max;
1474  q->value_min = p->value_min;
1475  q->value_max = p->value_max;
1476  break;
1477  }
1483  q->target = p->target;
1484  if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
1485  id_us_plus((ID *)q->target);
1486  }
1488  q->flags = p->flags;
1489  q->range_min = p->range_min;
1490  q->range_max = p->range_max;
1491  q->value_min = p->value_min;
1492  q->value_max = p->value_max;
1493  break;
1494  }
1495  case LS_MODIFIER_MATERIAL: {
1499  q->flags = p->flags;
1500  q->mat_attr = p->mat_attr;
1501  q->value_min = p->value_min;
1502  q->value_max = p->value_max;
1503  break;
1504  }
1505  case LS_MODIFIER_CALLIGRAPHY: {
1508  q->min_thickness = p->min_thickness;
1509  q->max_thickness = p->max_thickness;
1510  q->orientation = p->orientation;
1511  break;
1512  }
1513  case LS_MODIFIER_TANGENT: {
1517  q->flags = p->flags;
1518  q->min_thickness = p->min_thickness;
1519  q->max_thickness = p->max_thickness;
1520  break;
1521  }
1522  case LS_MODIFIER_NOISE: {
1525  q->amplitude = p->amplitude;
1526  q->period = p->period;
1527  q->seed = p->seed;
1528  q->flags = p->flags;
1529  break;
1530  }
1531  case LS_MODIFIER_CURVATURE_3D: {
1534  new_m;
1536  q->flags = p->flags;
1537  q->min_curvature = p->min_curvature;
1538  q->max_curvature = p->max_curvature;
1539  q->min_thickness = p->min_thickness;
1540  q->max_thickness = p->max_thickness;
1541  break;
1542  }
1543  case LS_MODIFIER_CREASE_ANGLE: {
1547  q->flags = p->flags;
1548  q->min_angle = p->min_angle;
1549  q->max_angle = p->max_angle;
1550  q->min_thickness = p->min_thickness;
1551  q->max_thickness = p->max_thickness;
1552  break;
1553  }
1554  default:
1555  return NULL; /* unknown modifier type */
1556  }
1558 
1559  return new_m;
1560 }
1561 
1563 {
1564  if (BLI_findindex(&linestyle->thickness_modifiers, m) == -1) {
1565  return -1;
1566  }
1567  switch (m->type) {
1570  break;
1573  break;
1576  break;
1577  case LS_MODIFIER_MATERIAL:
1579  break;
1581  break;
1582  case LS_MODIFIER_TANGENT:
1584  break;
1585  case LS_MODIFIER_NOISE:
1586  break;
1588  break;
1590  break;
1591  }
1593  return 0;
1594 }
1595 
1596 static LineStyleModifier *alloc_geometry_modifier(const char *name, int type)
1597 {
1598  size_t size;
1599 
1600  switch (type) {
1601  case LS_MODIFIER_SAMPLING:
1603  break;
1606  break;
1609  break;
1612  break;
1615  break;
1618  break;
1621  break;
1624  break;
1627  break;
1630  break;
1631  case LS_MODIFIER_BLUEPRINT:
1633  break;
1634  case LS_MODIFIER_2D_OFFSET:
1636  break;
1639  break;
1642  break;
1643  default:
1644  return NULL; /* unknown modifier type */
1645  }
1646 
1647  return new_modifier(name, type, size);
1648 }
1649 
1651  const char *name,
1652  int type)
1653 {
1654  LineStyleModifier *m;
1655 
1656  m = alloc_geometry_modifier(name, type);
1657 
1658  switch (type) {
1659  case LS_MODIFIER_SAMPLING: {
1661  p->sampling = 10.0f;
1662  break;
1663  }
1664  case LS_MODIFIER_BEZIER_CURVE: {
1666  p->error = 10.0f;
1667  break;
1668  }
1672  p->wavelength = 20.0f;
1673  p->amplitude = 5.0f;
1674  p->phase = 0.0f;
1675  break;
1676  }
1679  p->amplitude = 5.0f;
1680  p->scale = 20.0f;
1681  p->octaves = 4;
1683  break;
1684  }
1687  p->frequency = 10.0f;
1688  p->amplitude = 10.0f;
1689  p->octaves = 4;
1690  p->angle = DEG2RADF(45.0f);
1691  break;
1692  }
1695  p->frequency = 10.0f;
1696  p->amplitude = 10.0f;
1697  p->octaves = 4;
1698  p->angle = DEG2RADF(45.0f);
1699  break;
1700  }
1704  p->backbone_length = 10.0f;
1705  break;
1706  }
1707  case LS_MODIFIER_TIP_REMOVER: {
1709  p->tip_length = 10.0f;
1710  break;
1711  }
1715  p->error = 10.0f;
1716  break;
1717  }
1720  p->offset = 0.0f;
1721  break;
1722  }
1723  case LS_MODIFIER_BLUEPRINT: {
1726  p->rounds = 1;
1727  p->backbone_length = 10.0f;
1728  p->random_radius = 3;
1729  p->random_center = 5;
1730  p->random_backbone = 5;
1731  break;
1732  }
1733  case LS_MODIFIER_2D_OFFSET: {
1735  p->start = 0.0f;
1736  p->end = 0.0f;
1737  p->x = 0.0f;
1738  p->y = 0.0f;
1739  break;
1740  }
1741  case LS_MODIFIER_2D_TRANSFORM: {
1744  p->scale_x = 1.0f;
1745  p->scale_y = 1.0f;
1746  p->angle = DEG2RADF(0.0f);
1747  p->pivot_u = 0.5f;
1748  p->pivot_x = 0.0f;
1749  p->pivot_y = 0.0f;
1750  break;
1751  }
1754  p->tolerance = 0.1f;
1755  break;
1756  }
1757  default:
1758  return NULL; /* unknown modifier type */
1759  }
1761 
1762  return m;
1763 }
1764 
1766  const LineStyleModifier *m,
1767  const int UNUSED(flag))
1768 {
1769  LineStyleModifier *new_m;
1770 
1771  new_m = alloc_geometry_modifier(m->name, m->type);
1772  new_m->flags = m->flags;
1773 
1774  switch (m->type) {
1775  case LS_MODIFIER_SAMPLING: {
1778  q->sampling = p->sampling;
1779  break;
1780  }
1781  case LS_MODIFIER_BEZIER_CURVE: {
1784  q->error = p->error;
1785  break;
1786  }
1792  q->wavelength = p->wavelength;
1793  q->amplitude = p->amplitude;
1794  q->phase = p->phase;
1795  break;
1796  }
1800  q->amplitude = p->amplitude;
1801  q->scale = p->scale;
1802  q->octaves = p->octaves;
1803  q->flags = p->flags;
1804  break;
1805  }
1809  new_m;
1810  q->frequency = p->frequency;
1811  q->amplitude = p->amplitude;
1812  q->angle = p->angle;
1813  q->octaves = p->octaves;
1814  q->seed = p->seed;
1815  break;
1816  }
1820  new_m;
1821  q->frequency = p->frequency;
1822  q->amplitude = p->amplitude;
1823  q->angle = p->angle;
1824  q->octaves = p->octaves;
1825  q->seed = p->seed;
1826  break;
1827  }
1834  break;
1835  }
1836  case LS_MODIFIER_TIP_REMOVER: {
1839  q->tip_length = p->tip_length;
1840  break;
1841  }
1847  q->error = p->error;
1848  break;
1849  }
1853  q->offset = p->offset;
1854  break;
1855  }
1856  case LS_MODIFIER_BLUEPRINT: {
1859  q->flags = p->flags;
1860  q->rounds = p->rounds;
1862  q->random_radius = p->random_radius;
1863  q->random_center = p->random_center;
1865  break;
1866  }
1867  case LS_MODIFIER_2D_OFFSET: {
1870  q->start = p->start;
1871  q->end = p->end;
1872  q->x = p->x;
1873  q->y = p->y;
1874  break;
1875  }
1876  case LS_MODIFIER_2D_TRANSFORM: {
1879  q->pivot = p->pivot;
1880  q->scale_x = p->scale_x;
1881  q->scale_y = p->scale_y;
1882  q->angle = p->angle;
1883  q->pivot_u = p->pivot_u;
1884  q->pivot_x = p->pivot_x;
1885  q->pivot_y = p->pivot_y;
1886  break;
1887  }
1891  new_m;
1892  q->tolerance = p->tolerance;
1893  break;
1894  }
1895  default:
1896  return NULL; /* unknown modifier type */
1897  }
1899 
1900  return new_m;
1901 }
1902 
1904 {
1905  if (BLI_findindex(&linestyle->geometry_modifiers, m) == -1) {
1906  return -1;
1907  }
1909  return 0;
1910 }
1911 
1917  LineStyleModifier *modifier,
1918  int direction)
1919 {
1920  return BLI_listbase_link_move(&linestyle->color_modifiers, modifier, direction);
1921 }
1923  LineStyleModifier *modifier,
1924  int direction)
1925 {
1926  return BLI_listbase_link_move(&linestyle->alpha_modifiers, modifier, direction);
1927 }
1929  LineStyleModifier *modifier,
1930  int direction)
1931 {
1932  return BLI_listbase_link_move(&linestyle->thickness_modifiers, modifier, direction);
1933 }
1935  LineStyleModifier *modifier,
1936  int direction)
1937 {
1938  return BLI_listbase_link_move(&linestyle->geometry_modifiers, modifier, direction);
1939 }
1940 
1942 {
1943  LineStyleModifier *m;
1944  ColorBand *color_ramp;
1945  LinkData *link;
1946 
1947  BLI_listbase_clear(listbase);
1948 
1949  for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
1950  switch (m->type) {
1952  color_ramp = ((LineStyleColorModifier_AlongStroke *)m)->color_ramp;
1953  break;
1955  color_ramp = ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp;
1956  break;
1958  color_ramp = ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp;
1959  break;
1960  case LS_MODIFIER_MATERIAL:
1961  color_ramp = ((LineStyleColorModifier_Material *)m)->color_ramp;
1962  break;
1963  default:
1964  continue;
1965  }
1966  link = (LinkData *)MEM_callocN(sizeof(LinkData), "link to color ramp");
1967  link->data = color_ramp;
1968  BLI_addtail(listbase, link);
1969  }
1970 }
1971 
1973 {
1974  LineStyleModifier *m;
1975  bool found = false;
1976 
1977  for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
1978  switch (m->type) {
1980  if (color_ramp == ((LineStyleColorModifier_AlongStroke *)m)->color_ramp) {
1981  found = true;
1982  }
1983  break;
1985  if (color_ramp == ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp) {
1986  found = true;
1987  }
1988  break;
1990  if (color_ramp == ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp) {
1991  found = true;
1992  }
1993  break;
1994  case LS_MODIFIER_MATERIAL:
1995  if (color_ramp == ((LineStyleColorModifier_Material *)m)->color_ramp) {
1996  found = true;
1997  }
1998  break;
1999  case LS_MODIFIER_TANGENT:
2000  if (color_ramp == ((LineStyleColorModifier_Tangent *)m)->color_ramp) {
2001  found = true;
2002  }
2003  break;
2004  case LS_MODIFIER_NOISE:
2005  if (color_ramp == ((LineStyleColorModifier_Noise *)m)->color_ramp) {
2006  found = true;
2007  }
2008  break;
2010  if (color_ramp == ((LineStyleColorModifier_CreaseAngle *)m)->color_ramp) {
2011  found = true;
2012  }
2013  break;
2015  if (color_ramp == ((LineStyleColorModifier_Curvature_3D *)m)->color_ramp) {
2016  found = true;
2017  }
2018  break;
2019  }
2020 
2021  if (found) {
2022  char name_esc[sizeof(m->name) * 2];
2023  BLI_str_escape(name_esc, m->name, sizeof(name_esc));
2024  return BLI_sprintfN("color_modifiers[\"%s\"].color_ramp", name_esc);
2025  }
2026  }
2027  printf("BKE_linestyle_path_to_color_ramp: No color ramps correspond to the given pointer.\n");
2028  return NULL;
2029 }
2030 
2031 bool BKE_linestyle_use_textures(FreestyleLineStyle *linestyle, const bool use_shading_nodes)
2032 {
2033  if (use_shading_nodes) {
2035  bNode *node;
2036 
2037  for (node = linestyle->nodetree->nodes.first; node; node = node->next) {
2038  if (node->typeinfo->nclass == NODE_CLASS_TEXTURE) {
2039  return true;
2040  }
2041  }
2042  }
2043  }
2044  else {
2045  if (linestyle && (linestyle->flag & LS_TEXTURE)) {
2046  return (linestyle->mtex[0] != NULL);
2047  }
2048  }
2049  return false;
2050 }
2051 
2053 {
2054  bNode *uv_along_stroke, *input_texure, *output_linestyle;
2055  bNodeSocket *fromsock, *tosock;
2056  bNodeTree *ntree;
2057 
2059 
2060  ntree = ntreeAddTree(NULL, "stroke_shader", "ShaderNodeTree");
2061 
2063 
2064  uv_along_stroke = nodeAddStaticNode(C, ntree, SH_NODE_UVALONGSTROKE);
2065  uv_along_stroke->locx = 0.0f;
2066  uv_along_stroke->locy = 300.0f;
2067  uv_along_stroke->custom1 = 0; /* use_tips */
2068 
2069  input_texure = nodeAddStaticNode(C, ntree, SH_NODE_TEX_IMAGE);
2070  input_texure->locx = 200.0f;
2071  input_texure->locy = 300.0f;
2072 
2073  output_linestyle = nodeAddStaticNode(C, ntree, SH_NODE_OUTPUT_LINESTYLE);
2074  output_linestyle->locx = 400.0f;
2075  output_linestyle->locy = 300.0f;
2076  output_linestyle->custom1 = MA_RAMP_BLEND;
2077  output_linestyle->custom2 = 0; /* use_clamp */
2078 
2079  nodeSetActive(ntree, input_texure);
2080 
2081  fromsock = BLI_findlink(&uv_along_stroke->outputs, 0); /* UV */
2082  tosock = BLI_findlink(&input_texure->inputs, 0); /* UV */
2083  nodeAddLink(ntree, uv_along_stroke, fromsock, input_texure, tosock);
2084 
2085  fromsock = BLI_findlink(&input_texure->outputs, 0); /* Color */
2086  tosock = BLI_findlink(&output_linestyle->inputs, 0); /* Color */
2087  nodeAddLink(ntree, input_texure, fromsock, output_linestyle, tosock);
2088 
2090 }
void BKE_animdata_blend_read_data(struct BlendDataReader *reader, struct AnimData *adt)
Definition: anim_data.c:1574
void BKE_animdata_blend_write(struct BlendWriter *writer, struct AnimData *adt)
Definition: anim_data.c:1552
struct ColorBand * BKE_colorband_add(bool rangetype)
Definition: colorband.c:312
struct CurveMapping * BKE_curvemapping_copy(const struct CurveMapping *cumap)
void BKE_curvemapping_blend_read(struct BlendDataReader *reader, struct CurveMapping *cumap)
Definition: colortools.c:1252
void BKE_curvemapping_blend_write(struct BlendWriter *writer, const struct CurveMapping *cumap)
void BKE_curvemapping_free(struct CurveMapping *cumap)
Definition: colortools.c:119
struct CurveMapping * BKE_curvemapping_add(int tot, float minx, float miny, float maxx, float maxy)
Definition: colortools.c:88
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1018
struct FreestyleLineSet * BKE_freestyle_lineset_get_active(struct FreestyleConfig *config)
Definition: freestyle.c:233
@ LIB_ID_CREATE_NO_ALLOCATE
Definition: BKE_lib_id.h:96
@ LIB_ID_CREATE_NO_USER_REFCOUNT
Definition: BKE_lib_id.h:92
void * BKE_libblock_alloc(struct Main *bmain, short type, const char *name, const int flag) ATTR_WARN_UNUSED_RESULT
Definition: lib_id.c:1062
struct ID * BKE_id_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, const int flag)
void id_us_plus(struct ID *id)
Definition: lib_id.c:288
void BKE_id_blend_write(struct BlendWriter *writer, struct ID *id)
Definition: lib_id.c:2395
#define BKE_LIB_FOREACHID_PROCESS(_data, _id_super, _cb_flag)
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:47
bool BKE_library_foreach_ID_embedded(struct LibraryForeachIDData *data, struct ID **id_pp)
Definition: lib_query.c:161
Blender kernel freestyle line style functionality.
void ntreeBlendWrite(struct BlendWriter *writer, struct bNodeTree *ntree)
Definition: node.cc:472
#define SH_NODE_UVALONGSTROKE
Definition: BKE_node.h:1056
void ntreeUpdateTree(struct Main *main, struct bNodeTree *ntree)
Definition: node.cc:4262
void ntreeFreeEmbeddedTree(struct bNodeTree *ntree)
Definition: node.cc:3021
struct bNodeLink * nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock)
Definition: node.cc:2189
struct bNodeTree * ntreeAddTree(struct Main *bmain, const char *name, const char *idname)
Definition: node.cc:2529
struct bNode * nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntree, int type)
Definition: node.cc:2004
#define NODE_CLASS_TEXTURE
Definition: BKE_node.h:346
void nodeSetActive(struct bNodeTree *ntree, struct bNode *node)
Definition: node.cc:3694
void BKE_texture_mtex_foreach_id(struct LibraryForeachIDData *data, struct MTex *mtex)
Definition: texture.c:235
#define BLI_assert(a)
Definition: BLI_assert.h:58
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:281
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:128
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
void void void bool BLI_listbase_link_move(ListBase *listbase, void *vlink, int step) ATTR_NONNULL()
Definition: listbase.c:475
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define DEG2RADF(_deg)
size_t size_t char * BLI_sprintfN(const char *__restrict format,...) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_PRINTF_FORMAT(1
size_t size_t char size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy) ATTR_NONNULL()
Definition: string.c:333
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
bool BLI_uniquename(struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t len)
Definition: string_utils.c:381
#define UNUSED(x)
#define UNLIKELY(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_read_data_address(reader, ptr_p)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_list(BlendDataReader *reader, struct ListBase *list)
Definition: readfile.c:5654
#define BLO_read_id_address(reader, lib, id_ptr_p)
#define BLO_expand(expander, id)
bool BLO_write_is_undo(BlendWriter *writer)
Definition: writefile.c:1412
void BLO_write_struct_by_id(BlendWriter *writer, int struct_id, const void *data_ptr)
Definition: writefile.c:1309
#define BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE
#define FILTER_ID_LS
Definition: DNA_ID.h:714
@ INDEX_ID_LS
Definition: DNA_ID.h:814
@ ID_LS
Definition: DNA_ID_enums.h:87
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
struct LineStyleColorModifier_Curvature_3D LineStyleColorModifier_Curvature_3D
struct LineStyleGeometryModifier_SinusDisplacement LineStyleGeometryModifier_SinusDisplacement
struct FreestyleLineStyle FreestyleLineStyle
struct LineStyleThicknessModifier_Curvature_3D LineStyleThicknessModifier_Curvature_3D
#define LS_MODIFIER_PERLIN_NOISE_1D
#define LS_THICKNESS_ASYMMETRIC
struct LineStyleThicknessModifier_CreaseAngle LineStyleThicknessModifier_CreaseAngle
struct LineStyleGeometryModifier_Simplification LineStyleGeometryModifier_Simplification
struct LineStyleThicknessModifier_Noise LineStyleThicknessModifier_Noise
struct LineStyleColorModifier_DistanceFromCamera LineStyleColorModifier_DistanceFromCamera
#define LS_MODIFIER_ENABLED
struct LineStyleGeometryModifier_2DOffset LineStyleGeometryModifier_2DOffset
struct LineStyleAlphaModifier_CreaseAngle LineStyleAlphaModifier_CreaseAngle
struct LineStyleAlphaModifier_DistanceFromCamera LineStyleAlphaModifier_DistanceFromCamera
#define LS_VALUE_BLEND
struct LineStyleColorModifier_AlongStroke LineStyleColorModifier_AlongStroke
#define LS_MODIFIER_SPATIAL_NOISE_SMOOTH
struct LineStyleColorModifier_Material LineStyleColorModifier_Material
#define LS_MODIFIER_2D_TRANSFORM_PIVOT_CENTER
struct LineStyleThicknessModifier_DistanceFromCamera LineStyleThicknessModifier_DistanceFromCamera
#define LS_MODIFIER_TIP_REMOVER
struct LineStyleGeometryModifier_2DTransform LineStyleGeometryModifier_2DTransform
struct LineStyleGeometryModifier_PerlinNoise2D LineStyleGeometryModifier_PerlinNoise2D
#define LS_MODIFIER_DISTANCE_FROM_CAMERA
struct LineStyleThicknessModifier_AlongStroke LineStyleThicknessModifier_AlongStroke
struct LineStyleGeometryModifier_GuidingLines LineStyleGeometryModifier_GuidingLines
struct LineStyleGeometryModifier_SpatialNoise LineStyleGeometryModifier_SpatialNoise
#define LS_MODIFIER_SPATIAL_NOISE_PURERANDOM
struct LineStyleThicknessModifier_DistanceFromObject LineStyleThicknessModifier_DistanceFromObject
struct LineStyleThicknessModifier_Material LineStyleThicknessModifier_Material
struct LineStyleColorModifier_Tangent LineStyleColorModifier_Tangent
#define LS_MODIFIER_TANGENT
#define LS_MODIFIER_CREASE_ANGLE
#define LS_MODIFIER_BACKBONE_STRETCHER
struct LineStyleColorModifier_CreaseAngle LineStyleColorModifier_CreaseAngle
#define LS_MODIFIER_MATERIAL_LINE_A
struct LineStyleAlphaModifier_AlongStroke LineStyleAlphaModifier_AlongStroke
struct LineStyleAlphaModifier_Tangent LineStyleAlphaModifier_Tangent
#define LS_MODIFIER_SAMPLING
#define LS_MODIFIER_2D_OFFSET
#define LS_MODIFIER_DISTANCE_FROM_OBJECT
struct LineStyleColorModifier_Noise LineStyleColorModifier_Noise
#define LS_MODIFIER_NOISE
#define LS_MODIFIER_ALONG_STROKE
struct LineStyleGeometryModifier_BackboneStretcher LineStyleGeometryModifier_BackboneStretcher
struct LineStyleGeometryModifier_PerlinNoise1D LineStyleGeometryModifier_PerlinNoise1D
#define LS_MODIFIER_NUM
#define LS_TEXTURE
struct LineStyleAlphaModifier_Curvature_3D LineStyleAlphaModifier_Curvature_3D
#define LS_MODIFIER_POLYGONIZATION
#define LS_MODIFIER_CURVATURE_3D
#define LS_MODIFIER_MATERIAL_LINE
#define LS_MODIFIER_CALLIGRAPHY
#define LS_MODIFIER_BLUEPRINT
struct LineStyleColorModifier_DistanceFromObject LineStyleColorModifier_DistanceFromObject
#define LS_MODIFIER_BLUEPRINT_CIRCLES
struct LineStyleThicknessModifier_Tangent LineStyleThicknessModifier_Tangent
struct LineStyleGeometryModifier_Blueprint LineStyleGeometryModifier_Blueprint
#define LS_MODIFIER_2D_TRANSFORM
#define LS_MODIFIER_SPATIAL_NOISE
#define LS_MODIFIER_BEZIER_CURVE
#define LS_MODIFIER_PERLIN_NOISE_2D
#define LS_MODIFIER_SIMPLIFICATION
struct LineStyleAlphaModifier_Noise LineStyleAlphaModifier_Noise
#define LS_MODIFIER_SINUS_DISPLACEMENT
#define LS_MODIFIER_EXPANDED
struct LineStyleAlphaModifier_Material LineStyleAlphaModifier_Material
struct LineStyleAlphaModifier_DistanceFromObject LineStyleAlphaModifier_DistanceFromObject
struct LineStyleGeometryModifier_Sampling LineStyleGeometryModifier_Sampling
struct LineStyleGeometryModifier_Polygonalization LineStyleGeometryModifier_Polygonalization
#define LS_MODIFIER_MATERIAL
struct LineStyleThicknessModifier_Calligraphy LineStyleThicknessModifier_Calligraphy
#define LS_MODIFIER_GUIDING_LINES
struct LineStyleGeometryModifier_TipRemover LineStyleGeometryModifier_TipRemover
struct LineStyleGeometryModifier_BezierCurve LineStyleGeometryModifier_BezierCurve
#define MA_RAMP_BLEND
Object is a sort of wrapper for general info.
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
static void init_data(ModifierData *md)
Group RGB to Bright Vector Camera Vector Combine Material Light SH_NODE_OUTPUT_LINESTYLE
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume SH_NODE_TEX_IMAGE
#define C
Definition: RandGen.cpp:39
#define MAX_MTEX
Definition: Stroke.h:45
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
OperationNode * node
Curve curve
FreestyleLineStyle linestyle
bNodeTree * ntree
static void direct_link_linestyle_alpha_modifier(BlendDataReader *reader, LineStyleModifier *modifier)
Definition: linestyle.c:533
static void linestyle_free_data(ID *id)
Definition: linestyle.c:122
void BKE_linestyle_default_shader(const bContext *C, FreestyleLineStyle *linestyle)
Definition: linestyle.c:2052
bool BKE_linestyle_use_textures(FreestyleLineStyle *linestyle, const bool use_shading_nodes)
Definition: linestyle.c:2031
static void linestyle_init_data(ID *id)
Definition: linestyle.c:57
FreestyleLineStyle * BKE_linestyle_active_from_view_layer(ViewLayer *view_layer)
Definition: linestyle.c:818
void BKE_linestyle_modifier_list_color_ramps(FreestyleLineStyle *linestyle, ListBase *listbase)
Definition: linestyle.c:1941
LineStyleModifier * BKE_linestyle_geometry_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
Definition: linestyle.c:1650
static void linestyle_blend_read_lib(BlendLibReader *reader, ID *id)
Definition: linestyle.c:676
bool BKE_linestyle_thickness_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
Definition: linestyle.c:1928
static void direct_link_linestyle_color_modifier(BlendDataReader *reader, LineStyleModifier *modifier)
Definition: linestyle.c:484
void BKE_linestyle_init(FreestyleLineStyle *linestyle)
Definition: linestyle.c:802
static void write_linestyle_geometry_modifiers(BlendWriter *writer, ListBase *modifiers)
Definition: linestyle.c:401
int BKE_linestyle_thickness_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
Definition: linestyle.c:1562
LineStyleModifier * BKE_linestyle_color_modifier_copy(FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int flag)
Definition: linestyle.c:942
bool BKE_linestyle_color_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
Definition: linestyle.c:1916
static void direct_link_linestyle_geometry_modifier(BlendDataReader *UNUSED(reader), LineStyleModifier *UNUSED(modifier))
Definition: linestyle.c:644
LineStyleModifier * BKE_linestyle_thickness_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
Definition: linestyle.c:1347
static void write_linestyle_alpha_modifiers(BlendWriter *writer, ListBase *modifiers)
Definition: linestyle.c:264
static LineStyleModifier * alloc_geometry_modifier(const char *name, int type)
Definition: linestyle.c:1596
LineStyleModifier * BKE_linestyle_color_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
Definition: linestyle.c:884
static void direct_link_linestyle_thickness_modifier(BlendDataReader *reader, LineStyleModifier *modifier)
Definition: linestyle.c:590
static LineStyleModifier * alloc_thickness_modifier(const char *name, int type)
Definition: linestyle.c:1308
static void write_linestyle_thickness_modifiers(BlendWriter *writer, ListBase *modifiers)
Definition: linestyle.c:332
LineStyleModifier * BKE_linestyle_geometry_modifier_copy(FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int UNUSED(flag))
Definition: linestyle.c:1765
static LineStyleModifier * alloc_alpha_modifier(const char *name, int type)
Definition: linestyle.c:1069
static void write_linestyle_color_modifiers(BlendWriter *writer, ListBase *modifiers)
Definition: linestyle.c:195
int BKE_linestyle_color_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
Definition: linestyle.c:1034
static void linestyle_blend_read_data(BlendDataReader *reader, ID *id)
Definition: linestyle.c:649
static void linestyle_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition: linestyle.c:457
LineStyleModifier * BKE_linestyle_alpha_modifier_copy(FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int UNUSED(flag))
Definition: linestyle.c:1177
bool BKE_linestyle_alpha_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
Definition: linestyle.c:1922
FreestyleLineStyle * BKE_linestyle_new(struct Main *bmain, const char *name)
Definition: linestyle.c:807
bool BKE_linestyle_geometry_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
Definition: linestyle.c:1934
LineStyleModifier * BKE_linestyle_thickness_modifier_copy(FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int flag)
Definition: linestyle.c:1441
static void linestyle_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag)
Definition: linestyle.c:68
LineStyleModifier * BKE_linestyle_alpha_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
Definition: linestyle.c:1104
int BKE_linestyle_alpha_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
Definition: linestyle.c:1273
static LineStyleModifier * alloc_color_modifier(const char *name, int type)
Definition: linestyle.c:848
static void linestyle_foreach_id(ID *id, LibraryForeachIDData *data)
Definition: linestyle.c:152
static LineStyleModifier * new_modifier(const char *name, int type, size_t size)
Definition: linestyle.c:825
static const char * modifier_name[LS_MODIFIER_NUM]
Definition: linestyle.c:775
int BKE_linestyle_geometry_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
Definition: linestyle.c:1903
static void add_to_modifier_list(ListBase *lb, LineStyleModifier *m)
Definition: linestyle.c:841
char * BKE_linestyle_path_to_color_ramp(FreestyleLineStyle *linestyle, ColorBand *color_ramp)
Definition: linestyle.c:1972
static void linestyle_blend_read_expand(BlendExpander *expander, ID *id)
Definition: linestyle.c:719
IDTypeInfo IDType_ID_LS
Definition: linestyle.c:747
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:42
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
static unsigned a[3]
Definition: RandGen.cpp:92
struct FreestyleLineStyle * linestyle
struct AnimData * adt
struct bNodeTree * nodetree
struct MTex * mtex[18]
short id_code
Definition: BKE_idtype.h:120
Definition: DNA_ID.h:273
struct Library * lib
Definition: DNA_ID.h:277
int us
Definition: DNA_ID.h:293
struct LineStyleModifier * next
void * data
Definition: DNA_listBase.h:42
void * first
Definition: DNA_listBase.h:47
struct Object * object
struct Tex * tex
Definition: BKE_main.h:116
struct FreestyleConfig freestyle_config
ListBase nodes
short custom1
float locy
ListBase inputs
float locx
short custom2
ListBase outputs