2 * ***** BEGIN GPL LICENSE BLOCK *****
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * The Original Code is Copyright (C) 2010 Blender Foundation.
19 * All rights reserved.
21 * The Original Code is: all of this file.
23 * Contributor(s): none yet.
25 * ***** END GPL LICENSE BLOCK *****
28 /** \file blender/blenkernel/intern/linestyle.c
36 #include "MEM_guardedalloc.h"
38 #include "DNA_object_types.h"
39 #include "DNA_material_types.h" /* for ramp blend */
40 #include "DNA_texture_types.h"
42 #include "BLI_blenlib.h"
44 #include "BLI_utildefines.h"
46 #include "BKE_global.h"
47 #include "BKE_library.h"
48 #include "BKE_linestyle.h"
50 #include "BKE_texture.h"
51 #include "BKE_colortools.h"
52 #include "BKE_animsys.h"
54 static const char *modifier_name[LS_MODIFIER_NUM] = {
57 "Distance from Camera",
58 "Distance from Object",
76 static void default_linestyle_settings(FreestyleLineStyle *linestyle)
78 linestyle->panel = LS_PANEL_STROKES;
79 linestyle->r = linestyle->g = linestyle->b = 1.0f;
80 linestyle->alpha = 1.0f;
81 linestyle->thickness = 1.0f;
82 linestyle->thickness_position = LS_THICKNESS_CENTER;
83 linestyle->thickness_ratio = 0.5f;
84 linestyle->chaining = LS_CHAINING_PLAIN;
85 linestyle->rounds = 3;
86 linestyle->min_angle = DEG2RADF(0.0f);
87 linestyle->max_angle = DEG2RADF(0.0f);
88 linestyle->min_length = 0.0f;
89 linestyle->max_length = 10000.0f;
90 linestyle->split_length = 100;
92 linestyle->color_modifiers.first = linestyle->color_modifiers.last = NULL;
93 linestyle->alpha_modifiers.first = linestyle->alpha_modifiers.last = NULL;
94 linestyle->thickness_modifiers.first = linestyle->thickness_modifiers.last = NULL;
95 linestyle->geometry_modifiers.first = linestyle->geometry_modifiers.last = NULL;
97 BKE_add_linestyle_geometry_modifier(linestyle, LS_MODIFIER_SAMPLING);
99 linestyle->caps = LS_CAPS_BUTT;
102 FreestyleLineStyle *BKE_new_linestyle(const char *name, struct Main *main)
104 FreestyleLineStyle *linestyle;
109 linestyle = (FreestyleLineStyle *)BKE_libblock_alloc(&main->linestyle, ID_LS, name);
111 default_linestyle_settings(linestyle);
116 void BKE_free_linestyle(FreestyleLineStyle *linestyle)
118 LineStyleModifier *m;
120 BKE_free_animdata(&linestyle->id);
121 while ((m = (LineStyleModifier *)linestyle->color_modifiers.first))
122 BKE_remove_linestyle_color_modifier(linestyle, m);
123 while ((m = (LineStyleModifier *)linestyle->alpha_modifiers.first))
124 BKE_remove_linestyle_alpha_modifier(linestyle, m);
125 while ((m = (LineStyleModifier *)linestyle->thickness_modifiers.first))
126 BKE_remove_linestyle_thickness_modifier(linestyle, m);
127 while ((m = (LineStyleModifier *)linestyle->geometry_modifiers.first))
128 BKE_remove_linestyle_geometry_modifier(linestyle, m);
131 FreestyleLineStyle *BKE_copy_linestyle(FreestyleLineStyle *linestyle)
133 FreestyleLineStyle *new_linestyle;
134 LineStyleModifier *m;
136 new_linestyle = BKE_new_linestyle(linestyle->id.name + 2, NULL);
137 BKE_free_linestyle(new_linestyle);
139 new_linestyle->r = linestyle->r;
140 new_linestyle->g = linestyle->g;
141 new_linestyle->b = linestyle->b;
142 new_linestyle->alpha = linestyle->alpha;
143 new_linestyle->thickness = linestyle->thickness;
144 new_linestyle->thickness_position = linestyle->thickness_position;
145 new_linestyle->thickness_ratio = linestyle->thickness_ratio;
146 new_linestyle->flag = linestyle->flag;
147 new_linestyle->caps = linestyle->caps;
148 new_linestyle->chaining = linestyle->chaining;
149 new_linestyle->rounds = linestyle->rounds;
150 new_linestyle->min_angle = linestyle->min_angle;
151 new_linestyle->max_angle = linestyle->max_angle;
152 new_linestyle->min_length = linestyle->min_length;
153 new_linestyle->max_length = linestyle->max_length;
154 new_linestyle->split_length = linestyle->split_length;
155 new_linestyle->dash1 = linestyle->dash1;
156 new_linestyle->gap1 = linestyle->gap1;
157 new_linestyle->dash2 = linestyle->dash2;
158 new_linestyle->gap2 = linestyle->gap2;
159 new_linestyle->dash3 = linestyle->dash3;
160 new_linestyle->gap3 = linestyle->gap3;
161 new_linestyle->panel = linestyle->panel;
162 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next)
163 BKE_copy_linestyle_color_modifier(new_linestyle, m);
164 for (m = (LineStyleModifier *)linestyle->alpha_modifiers.first; m; m = m->next)
165 BKE_copy_linestyle_alpha_modifier(new_linestyle, m);
166 for (m = (LineStyleModifier *)linestyle->thickness_modifiers.first; m; m = m->next)
167 BKE_copy_linestyle_thickness_modifier(new_linestyle, m);
168 for (m = (LineStyleModifier *)linestyle->geometry_modifiers.first; m; m = m->next)
169 BKE_copy_linestyle_geometry_modifier(new_linestyle, m);
171 return new_linestyle;
174 static LineStyleModifier *new_modifier(int type, size_t size)
176 LineStyleModifier *m;
178 m = (LineStyleModifier *)MEM_callocN(size, "line style modifier");
180 strcpy(m->name, modifier_name[type]);
182 m->flags = LS_MODIFIER_ENABLED | LS_MODIFIER_EXPANDED;
187 static void add_to_modifier_list(ListBase *lb, LineStyleModifier *m)
189 BLI_addtail(lb, (void *)m);
190 BLI_uniquename(lb, m, modifier_name[m->type], '.', offsetof(LineStyleModifier, name), sizeof(m->name));
193 static LineStyleModifier *alloc_color_modifier(int type)
198 case LS_MODIFIER_ALONG_STROKE:
199 size = sizeof(LineStyleColorModifier_AlongStroke);
201 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
202 size = sizeof(LineStyleColorModifier_DistanceFromCamera);
204 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
205 size = sizeof(LineStyleColorModifier_DistanceFromObject);
207 case LS_MODIFIER_MATERIAL:
208 size = sizeof(LineStyleColorModifier_Material);
211 return NULL; /* unknown modifier type */
214 return new_modifier(type, size);
217 LineStyleModifier *BKE_add_linestyle_color_modifier(FreestyleLineStyle *linestyle, int type)
219 LineStyleModifier *m;
221 m = alloc_color_modifier(type);
222 m->blend = MA_RAMP_BLEND;
225 case LS_MODIFIER_ALONG_STROKE:
226 ((LineStyleColorModifier_AlongStroke *)m)->color_ramp = add_colorband(1);
228 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
229 ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp = add_colorband(1);
230 ((LineStyleColorModifier_DistanceFromCamera *)m)->range_min = 0.0f;
231 ((LineStyleColorModifier_DistanceFromCamera *)m)->range_max = 10000.0f;
233 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
234 ((LineStyleColorModifier_DistanceFromObject *)m)->target = NULL;
235 ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp = add_colorband(1);
236 ((LineStyleColorModifier_DistanceFromObject *)m)->range_min = 0.0f;
237 ((LineStyleColorModifier_DistanceFromObject *)m)->range_max = 10000.0f;
239 case LS_MODIFIER_MATERIAL:
240 ((LineStyleColorModifier_Material *)m)->color_ramp = add_colorband(1);
241 ((LineStyleColorModifier_Material *)m)->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
244 return NULL; /* unknown modifier type */
246 add_to_modifier_list(&linestyle->color_modifiers, m);
251 LineStyleModifier *BKE_copy_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
253 LineStyleModifier *new_m;
255 new_m = alloc_color_modifier(m->type);
256 new_m->influence = m->influence;
257 new_m->flags = m->flags;
258 new_m->blend = m->blend;
261 case LS_MODIFIER_ALONG_STROKE:
263 LineStyleColorModifier_AlongStroke *p = (LineStyleColorModifier_AlongStroke *)m;
264 LineStyleColorModifier_AlongStroke *q = (LineStyleColorModifier_AlongStroke *)new_m;
265 q->color_ramp = MEM_dupallocN(p->color_ramp);
268 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
270 LineStyleColorModifier_DistanceFromCamera *p = (LineStyleColorModifier_DistanceFromCamera *)m;
271 LineStyleColorModifier_DistanceFromCamera *q = (LineStyleColorModifier_DistanceFromCamera *)new_m;
272 q->color_ramp = MEM_dupallocN(p->color_ramp);
273 q->range_min = p->range_min;
274 q->range_max = p->range_max;
277 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
279 LineStyleColorModifier_DistanceFromObject *p = (LineStyleColorModifier_DistanceFromObject *)m;
280 LineStyleColorModifier_DistanceFromObject *q = (LineStyleColorModifier_DistanceFromObject *)new_m;
283 q->target = p->target;
284 q->color_ramp = MEM_dupallocN(p->color_ramp);
285 q->range_min = p->range_min;
286 q->range_max = p->range_max;
289 case LS_MODIFIER_MATERIAL:
291 LineStyleColorModifier_Material *p = (LineStyleColorModifier_Material *)m;
292 LineStyleColorModifier_Material *q = (LineStyleColorModifier_Material *)new_m;
293 q->color_ramp = MEM_dupallocN(p->color_ramp);
294 q->mat_attr = p->mat_attr;
298 return NULL; /* unknown modifier type */
300 add_to_modifier_list(&linestyle->color_modifiers, new_m);
305 void BKE_remove_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
308 case LS_MODIFIER_ALONG_STROKE:
309 MEM_freeN(((LineStyleColorModifier_AlongStroke *)m)->color_ramp);
311 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
312 MEM_freeN(((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp);
314 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
315 MEM_freeN(((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp);
317 case LS_MODIFIER_MATERIAL:
318 MEM_freeN(((LineStyleColorModifier_Material *)m)->color_ramp);
321 BLI_freelinkN(&linestyle->color_modifiers, m);
324 static LineStyleModifier *alloc_alpha_modifier(int type)
329 case LS_MODIFIER_ALONG_STROKE:
330 size = sizeof(LineStyleAlphaModifier_AlongStroke);
332 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
333 size = sizeof(LineStyleAlphaModifier_DistanceFromCamera);
335 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
336 size = sizeof(LineStyleAlphaModifier_DistanceFromObject);
338 case LS_MODIFIER_MATERIAL:
339 size = sizeof(LineStyleAlphaModifier_Material);
342 return NULL; /* unknown modifier type */
344 return new_modifier(type, size);
347 LineStyleModifier *BKE_add_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, int type)
349 LineStyleModifier *m;
351 m = alloc_alpha_modifier(type);
352 m->blend = LS_VALUE_BLEND;
355 case LS_MODIFIER_ALONG_STROKE:
357 LineStyleAlphaModifier_AlongStroke *p = (LineStyleAlphaModifier_AlongStroke *)m;
358 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
361 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
363 LineStyleAlphaModifier_DistanceFromCamera *p = (LineStyleAlphaModifier_DistanceFromCamera *)m;
364 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
366 p->range_max = 10000.0f;
369 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
371 LineStyleAlphaModifier_DistanceFromObject *p = (LineStyleAlphaModifier_DistanceFromObject *)m;
373 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
375 p->range_max = 10000.0f;
378 case LS_MODIFIER_MATERIAL:
380 LineStyleAlphaModifier_Material *p = (LineStyleAlphaModifier_Material *)m;
381 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
382 p->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
386 return NULL; /* unknown modifier type */
388 add_to_modifier_list(&linestyle->alpha_modifiers, m);
393 LineStyleModifier *BKE_copy_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
395 LineStyleModifier *new_m;
397 new_m = alloc_alpha_modifier(m->type);
398 new_m->influence = m->influence;
399 new_m->flags = m->flags;
400 new_m->blend = m->blend;
403 case LS_MODIFIER_ALONG_STROKE:
405 LineStyleAlphaModifier_AlongStroke *p = (LineStyleAlphaModifier_AlongStroke *)m;
406 LineStyleAlphaModifier_AlongStroke *q = (LineStyleAlphaModifier_AlongStroke *)new_m;
407 q->curve = curvemapping_copy(p->curve);
410 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
412 LineStyleAlphaModifier_DistanceFromCamera *p = (LineStyleAlphaModifier_DistanceFromCamera *)m;
413 LineStyleAlphaModifier_DistanceFromCamera *q = (LineStyleAlphaModifier_DistanceFromCamera *)new_m;
414 q->curve = curvemapping_copy(p->curve);
415 q->range_min = p->range_min;
416 q->range_max = p->range_max;
419 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
421 LineStyleAlphaModifier_DistanceFromObject *p = (LineStyleAlphaModifier_DistanceFromObject *)m;
422 LineStyleAlphaModifier_DistanceFromObject *q = (LineStyleAlphaModifier_DistanceFromObject *)new_m;
425 q->target = p->target;
426 q->curve = curvemapping_copy(p->curve);
427 q->range_min = p->range_min;
428 q->range_max = p->range_max;
431 case LS_MODIFIER_MATERIAL:
433 LineStyleAlphaModifier_Material *p = (LineStyleAlphaModifier_Material *)m;
434 LineStyleAlphaModifier_Material *q = (LineStyleAlphaModifier_Material *)new_m;
435 q->curve = curvemapping_copy(p->curve);
436 q->mat_attr = p->mat_attr;
440 return NULL; /* unknown modifier type */
442 add_to_modifier_list(&linestyle->alpha_modifiers, new_m);
447 void BKE_remove_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
450 case LS_MODIFIER_ALONG_STROKE:
451 curvemapping_free(((LineStyleAlphaModifier_AlongStroke *)m)->curve);
453 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
454 curvemapping_free(((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve);
456 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
457 curvemapping_free(((LineStyleAlphaModifier_DistanceFromObject *)m)->curve);
459 case LS_MODIFIER_MATERIAL:
460 curvemapping_free(((LineStyleAlphaModifier_Material *)m)->curve);
463 BLI_freelinkN(&linestyle->alpha_modifiers, m);
466 static LineStyleModifier *alloc_thickness_modifier(int type)
471 case LS_MODIFIER_ALONG_STROKE:
472 size = sizeof(LineStyleThicknessModifier_AlongStroke);
474 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
475 size = sizeof(LineStyleThicknessModifier_DistanceFromCamera);
477 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
478 size = sizeof(LineStyleThicknessModifier_DistanceFromObject);
480 case LS_MODIFIER_MATERIAL:
481 size = sizeof(LineStyleThicknessModifier_Material);
483 case LS_MODIFIER_CALLIGRAPHY:
484 size = sizeof(LineStyleThicknessModifier_Calligraphy);
487 return NULL; /* unknown modifier type */
490 return new_modifier(type, size);
493 LineStyleModifier *BKE_add_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, int type)
495 LineStyleModifier *m;
497 m = alloc_thickness_modifier(type);
498 m->blend = LS_VALUE_BLEND;
501 case LS_MODIFIER_ALONG_STROKE:
503 LineStyleThicknessModifier_AlongStroke *p = (LineStyleThicknessModifier_AlongStroke *)m;
504 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
509 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
511 LineStyleThicknessModifier_DistanceFromCamera *p = (LineStyleThicknessModifier_DistanceFromCamera *)m;
512 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
514 p->range_max = 1000.0f;
519 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
521 LineStyleThicknessModifier_DistanceFromObject *p = (LineStyleThicknessModifier_DistanceFromObject *)m;
523 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
525 p->range_max = 1000.0f;
530 case LS_MODIFIER_MATERIAL:
532 LineStyleThicknessModifier_Material *p = (LineStyleThicknessModifier_Material *)m;
533 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
534 p->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
539 case LS_MODIFIER_CALLIGRAPHY:
541 LineStyleThicknessModifier_Calligraphy *p = (LineStyleThicknessModifier_Calligraphy *)m;
542 p->min_thickness = 1.0f;
543 p->max_thickness = 10.0f;
544 p->orientation = DEG2RADF(60.0f);
548 return NULL; /* unknown modifier type */
550 add_to_modifier_list(&linestyle->thickness_modifiers, m);
555 LineStyleModifier *BKE_copy_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
557 LineStyleModifier *new_m;
559 new_m = alloc_thickness_modifier(m->type);
562 new_m->influence = m->influence;
563 new_m->flags = m->flags;
564 new_m->blend = m->blend;
567 case LS_MODIFIER_ALONG_STROKE:
569 LineStyleThicknessModifier_AlongStroke *p = (LineStyleThicknessModifier_AlongStroke *)m;
570 LineStyleThicknessModifier_AlongStroke *q = (LineStyleThicknessModifier_AlongStroke *)new_m;
571 q->curve = curvemapping_copy(p->curve);
572 q->value_min = p->value_min;
573 q->value_max = p->value_max;
576 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
578 LineStyleThicknessModifier_DistanceFromCamera *p = (LineStyleThicknessModifier_DistanceFromCamera *)m;
579 LineStyleThicknessModifier_DistanceFromCamera *q = (LineStyleThicknessModifier_DistanceFromCamera *)new_m;
580 q->curve = curvemapping_copy(p->curve);
581 q->range_min = p->range_min;
582 q->range_max = p->range_max;
583 q->value_min = p->value_min;
584 q->value_max = p->value_max;
587 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
589 LineStyleThicknessModifier_DistanceFromObject *p = (LineStyleThicknessModifier_DistanceFromObject *)m;
590 LineStyleThicknessModifier_DistanceFromObject *q = (LineStyleThicknessModifier_DistanceFromObject *)new_m;
593 q->target = p->target;
594 q->curve = curvemapping_copy(p->curve);
595 q->range_min = p->range_min;
596 q->range_max = p->range_max;
597 q->value_min = p->value_min;
598 q->value_max = p->value_max;
601 case LS_MODIFIER_MATERIAL:
603 LineStyleThicknessModifier_Material *p = (LineStyleThicknessModifier_Material *)m;
604 LineStyleThicknessModifier_Material *q = (LineStyleThicknessModifier_Material *)new_m;
605 q->curve = curvemapping_copy(p->curve);
606 q->mat_attr = p->mat_attr;
607 q->value_min = p->value_min;
608 q->value_max = p->value_max;
611 case LS_MODIFIER_CALLIGRAPHY:
613 LineStyleThicknessModifier_Calligraphy *p = (LineStyleThicknessModifier_Calligraphy *)m;
614 LineStyleThicknessModifier_Calligraphy *q = (LineStyleThicknessModifier_Calligraphy *)new_m;
615 q->min_thickness = p->min_thickness;
616 q->max_thickness = p->max_thickness;
617 q->orientation = p->orientation;
621 return NULL; /* unknown modifier type */
623 add_to_modifier_list(&linestyle->thickness_modifiers, new_m);
628 void BKE_remove_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
631 case LS_MODIFIER_ALONG_STROKE:
632 curvemapping_free(((LineStyleThicknessModifier_AlongStroke *)m)->curve);
634 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
635 curvemapping_free(((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve);
637 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
638 curvemapping_free(((LineStyleThicknessModifier_DistanceFromObject *)m)->curve);
640 case LS_MODIFIER_MATERIAL:
641 curvemapping_free(((LineStyleThicknessModifier_Material *)m)->curve);
643 case LS_MODIFIER_CALLIGRAPHY:
646 BLI_freelinkN(&linestyle->thickness_modifiers, m);
649 static LineStyleModifier *alloc_geometry_modifier(int type)
654 case LS_MODIFIER_SAMPLING:
655 size = sizeof(LineStyleGeometryModifier_Sampling);
657 case LS_MODIFIER_BEZIER_CURVE:
658 size = sizeof(LineStyleGeometryModifier_BezierCurve);
660 case LS_MODIFIER_SINUS_DISPLACEMENT:
661 size = sizeof(LineStyleGeometryModifier_SinusDisplacement);
663 case LS_MODIFIER_SPATIAL_NOISE:
664 size = sizeof(LineStyleGeometryModifier_SpatialNoise);
666 case LS_MODIFIER_PERLIN_NOISE_1D:
667 size = sizeof(LineStyleGeometryModifier_PerlinNoise1D);
669 case LS_MODIFIER_PERLIN_NOISE_2D:
670 size = sizeof(LineStyleGeometryModifier_PerlinNoise2D);
672 case LS_MODIFIER_BACKBONE_STRETCHER:
673 size = sizeof(LineStyleGeometryModifier_BackboneStretcher);
675 case LS_MODIFIER_TIP_REMOVER:
676 size = sizeof(LineStyleGeometryModifier_TipRemover);
678 case LS_MODIFIER_POLYGONIZATION:
679 size = sizeof(LineStyleGeometryModifier_Polygonalization);
681 case LS_MODIFIER_GUIDING_LINES:
682 size = sizeof(LineStyleGeometryModifier_GuidingLines);
684 case LS_MODIFIER_BLUEPRINT:
685 size = sizeof(LineStyleGeometryModifier_Blueprint);
687 case LS_MODIFIER_2D_OFFSET:
688 size = sizeof(LineStyleGeometryModifier_2DOffset);
690 case LS_MODIFIER_2D_TRANSFORM:
691 size = sizeof(LineStyleGeometryModifier_2DTransform);
694 return NULL; /* unknown modifier type */
697 return new_modifier(type, size);
700 LineStyleModifier *BKE_add_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, int type)
702 LineStyleModifier *m;
704 m = alloc_geometry_modifier(type);
707 case LS_MODIFIER_SAMPLING:
709 LineStyleGeometryModifier_Sampling *p = (LineStyleGeometryModifier_Sampling *)m;
713 case LS_MODIFIER_BEZIER_CURVE:
715 LineStyleGeometryModifier_BezierCurve *p = (LineStyleGeometryModifier_BezierCurve *)m;
719 case LS_MODIFIER_SINUS_DISPLACEMENT:
721 LineStyleGeometryModifier_SinusDisplacement *p = (LineStyleGeometryModifier_SinusDisplacement *)m;
722 p->wavelength = 20.0f;
727 case LS_MODIFIER_SPATIAL_NOISE:
729 LineStyleGeometryModifier_SpatialNoise *p = (LineStyleGeometryModifier_SpatialNoise *)m;
733 p->flags = LS_MODIFIER_SPATIAL_NOISE_SMOOTH | LS_MODIFIER_SPATIAL_NOISE_PURERANDOM;
736 case LS_MODIFIER_PERLIN_NOISE_1D:
738 LineStyleGeometryModifier_PerlinNoise1D *p = (LineStyleGeometryModifier_PerlinNoise1D *)m;
739 p->frequency = 10.0f;
740 p->amplitude = 10.0f;
742 p->angle = DEG2RADF(45.0f);
745 case LS_MODIFIER_PERLIN_NOISE_2D:
747 LineStyleGeometryModifier_PerlinNoise2D *p = (LineStyleGeometryModifier_PerlinNoise2D *)m;
748 p->frequency = 10.0f;
749 p->amplitude = 10.0f;
751 p->angle = DEG2RADF(45.0f);
754 case LS_MODIFIER_BACKBONE_STRETCHER:
756 LineStyleGeometryModifier_BackboneStretcher *p = (LineStyleGeometryModifier_BackboneStretcher *)m;
757 p->backbone_length = 10.0f;
760 case LS_MODIFIER_TIP_REMOVER:
762 LineStyleGeometryModifier_TipRemover *p = (LineStyleGeometryModifier_TipRemover *)m;
763 p->tip_length = 10.0f;
766 case LS_MODIFIER_POLYGONIZATION:
768 LineStyleGeometryModifier_Polygonalization *p = (LineStyleGeometryModifier_Polygonalization *)m;
772 case LS_MODIFIER_GUIDING_LINES:
774 LineStyleGeometryModifier_GuidingLines *p = (LineStyleGeometryModifier_GuidingLines *)m;
778 case LS_MODIFIER_BLUEPRINT:
780 LineStyleGeometryModifier_Blueprint *p = (LineStyleGeometryModifier_Blueprint *)m;
781 p->flags = LS_MODIFIER_BLUEPRINT_CIRCLES;
783 p->backbone_length = 10.0f;
784 p->random_radius = 3;
785 p->random_center = 5;
786 p->random_backbone = 5;
789 case LS_MODIFIER_2D_OFFSET:
791 LineStyleGeometryModifier_2DOffset *p = (LineStyleGeometryModifier_2DOffset *)m;
798 case LS_MODIFIER_2D_TRANSFORM:
800 LineStyleGeometryModifier_2DTransform *p = (LineStyleGeometryModifier_2DTransform *)m;
801 p->pivot = LS_MODIFIER_2D_TRANSFORM_PIVOT_CENTER;
804 p->angle = DEG2RADF(0.0f);
811 return NULL; /* unknown modifier type */
813 add_to_modifier_list(&linestyle->geometry_modifiers, m);
818 LineStyleModifier *BKE_copy_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
820 LineStyleModifier *new_m;
822 new_m = alloc_geometry_modifier(m->type);
823 new_m->flags = m->flags;
826 case LS_MODIFIER_SAMPLING:
828 LineStyleGeometryModifier_Sampling *p = (LineStyleGeometryModifier_Sampling *)m;
829 LineStyleGeometryModifier_Sampling *q = (LineStyleGeometryModifier_Sampling *)new_m;
830 q->sampling = p->sampling;
833 case LS_MODIFIER_BEZIER_CURVE:
835 LineStyleGeometryModifier_BezierCurve *p = (LineStyleGeometryModifier_BezierCurve *)m;
836 LineStyleGeometryModifier_BezierCurve *q = (LineStyleGeometryModifier_BezierCurve *)new_m;
840 case LS_MODIFIER_SINUS_DISPLACEMENT:
842 LineStyleGeometryModifier_SinusDisplacement *p = (LineStyleGeometryModifier_SinusDisplacement *)m;
843 LineStyleGeometryModifier_SinusDisplacement *q = (LineStyleGeometryModifier_SinusDisplacement *)new_m;
844 q->wavelength = p->wavelength;
845 q->amplitude = p->amplitude;
849 case LS_MODIFIER_SPATIAL_NOISE:
851 LineStyleGeometryModifier_SpatialNoise *p = (LineStyleGeometryModifier_SpatialNoise *)m;
852 LineStyleGeometryModifier_SpatialNoise *q = (LineStyleGeometryModifier_SpatialNoise *)new_m;
853 q->amplitude = p->amplitude;
855 q->octaves = p->octaves;
859 case LS_MODIFIER_PERLIN_NOISE_1D:
861 LineStyleGeometryModifier_PerlinNoise1D *p = (LineStyleGeometryModifier_PerlinNoise1D *)m;
862 LineStyleGeometryModifier_PerlinNoise1D *q = (LineStyleGeometryModifier_PerlinNoise1D *)new_m;
863 q->frequency = p->frequency;
864 q->amplitude = p->amplitude;
865 q->octaves = p->octaves;
869 case LS_MODIFIER_PERLIN_NOISE_2D:
871 LineStyleGeometryModifier_PerlinNoise2D *p = (LineStyleGeometryModifier_PerlinNoise2D *)m;
872 LineStyleGeometryModifier_PerlinNoise2D *q = (LineStyleGeometryModifier_PerlinNoise2D *)new_m;
873 q->frequency = p->frequency;
874 q->amplitude = p->amplitude;
875 q->octaves = p->octaves;
879 case LS_MODIFIER_BACKBONE_STRETCHER:
881 LineStyleGeometryModifier_BackboneStretcher *p = (LineStyleGeometryModifier_BackboneStretcher *)m;
882 LineStyleGeometryModifier_BackboneStretcher *q = (LineStyleGeometryModifier_BackboneStretcher *)new_m;
883 q->backbone_length = p->backbone_length;
886 case LS_MODIFIER_TIP_REMOVER:
888 LineStyleGeometryModifier_TipRemover *p = (LineStyleGeometryModifier_TipRemover *)m;
889 LineStyleGeometryModifier_TipRemover *q = (LineStyleGeometryModifier_TipRemover *)new_m;
890 q->tip_length = p->tip_length;
893 case LS_MODIFIER_POLYGONIZATION:
895 LineStyleGeometryModifier_Polygonalization *p = (LineStyleGeometryModifier_Polygonalization *)m;
896 LineStyleGeometryModifier_Polygonalization *q = (LineStyleGeometryModifier_Polygonalization *)new_m;
900 case LS_MODIFIER_GUIDING_LINES:
902 LineStyleGeometryModifier_GuidingLines *p = (LineStyleGeometryModifier_GuidingLines *)m;
903 LineStyleGeometryModifier_GuidingLines *q = (LineStyleGeometryModifier_GuidingLines *)new_m;
904 q->offset = p->offset;
907 case LS_MODIFIER_BLUEPRINT:
909 LineStyleGeometryModifier_Blueprint *p = (LineStyleGeometryModifier_Blueprint *)m;
910 LineStyleGeometryModifier_Blueprint *q = (LineStyleGeometryModifier_Blueprint *)new_m;
912 q->rounds = p->rounds;
913 q->backbone_length = p->backbone_length;
914 q->random_radius = p->random_radius;
915 q->random_center = p->random_center;
916 q->random_backbone = p->random_backbone;
919 case LS_MODIFIER_2D_OFFSET:
921 LineStyleGeometryModifier_2DOffset *p = (LineStyleGeometryModifier_2DOffset *)m;
922 LineStyleGeometryModifier_2DOffset *q = (LineStyleGeometryModifier_2DOffset *)new_m;
929 case LS_MODIFIER_2D_TRANSFORM:
931 LineStyleGeometryModifier_2DTransform *p = (LineStyleGeometryModifier_2DTransform *)m;
932 LineStyleGeometryModifier_2DTransform *q = (LineStyleGeometryModifier_2DTransform *)new_m;
934 q->scale_x = p->scale_x;
935 q->scale_y = p->scale_y;
937 q->pivot_u = p->pivot_u;
938 q->pivot_x = p->pivot_x;
939 q->pivot_y = p->pivot_y;
943 return NULL; /* unknown modifier type */
945 add_to_modifier_list(&linestyle->geometry_modifiers, new_m);
950 void BKE_remove_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
952 BLI_freelinkN(&linestyle->geometry_modifiers, m);
955 static void move_modifier(ListBase *lb, LineStyleModifier *modifier, int direction)
957 BLI_remlink(lb, modifier);
959 BLI_insertlinkbefore(lb, modifier->prev, modifier);
961 BLI_insertlinkafter(lb, modifier->next, modifier);
964 void BKE_move_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
966 move_modifier(&linestyle->color_modifiers, modifier, direction);
969 void BKE_move_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
971 move_modifier(&linestyle->alpha_modifiers, modifier, direction);
974 void BKE_move_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
976 move_modifier(&linestyle->thickness_modifiers, modifier, direction);
979 void BKE_move_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
981 move_modifier(&linestyle->geometry_modifiers, modifier, direction);
984 void BKE_list_modifier_color_ramps(FreestyleLineStyle *linestyle, ListBase *listbase)
986 LineStyleModifier *m;
987 ColorBand *color_ramp;
990 listbase->first = listbase->last = NULL;
991 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
993 case LS_MODIFIER_ALONG_STROKE:
994 color_ramp = ((LineStyleColorModifier_AlongStroke *)m)->color_ramp;
996 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
997 color_ramp = ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp;
999 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
1000 color_ramp = ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp;
1002 case LS_MODIFIER_MATERIAL:
1003 color_ramp = ((LineStyleColorModifier_Material *)m)->color_ramp;
1008 link = (LinkData *) MEM_callocN( sizeof(LinkData), "link to color ramp");
1009 link->data = color_ramp;
1010 BLI_addtail(listbase, link);
1014 char *BKE_path_from_ID_to_color_ramp(FreestyleLineStyle *linestyle, ColorBand *color_ramp)
1016 LineStyleModifier *m;
1019 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
1021 case LS_MODIFIER_ALONG_STROKE:
1022 if (color_ramp == ((LineStyleColorModifier_AlongStroke *)m)->color_ramp)
1025 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
1026 if (color_ramp == ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp)
1029 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
1030 if (color_ramp == ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp)
1033 case LS_MODIFIER_MATERIAL:
1034 if (color_ramp == ((LineStyleColorModifier_Material *)m)->color_ramp)
1039 return BLI_sprintfN("color_modifiers[\"%s\"].color_ramp", m->name);
1041 printf("BKE_path_from_ID_to_color_ramp: No color ramps correspond to the given pointer.\n");
1045 void BKE_unlink_linestyle_target_object(FreestyleLineStyle *linestyle, struct Object *ob)
1047 LineStyleModifier *m;
1049 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
1050 if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
1051 if (((LineStyleColorModifier_DistanceFromObject *)m)->target == ob) {
1052 ((LineStyleColorModifier_DistanceFromObject *)m)->target = NULL;
1056 for (m = (LineStyleModifier *)linestyle->alpha_modifiers.first; m; m = m->next) {
1057 if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
1058 if (((LineStyleAlphaModifier_DistanceFromObject *)m)->target == ob) {
1059 ((LineStyleAlphaModifier_DistanceFromObject *)m)->target = NULL;
1063 for (m = (LineStyleModifier *)linestyle->thickness_modifiers.first; m; m = m->next) {
1064 if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
1065 if (((LineStyleThicknessModifier_DistanceFromObject *)m)->target == ob) {
1066 ((LineStyleThicknessModifier_DistanceFromObject *)m)->target = NULL;