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 = 0.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 FRS_add_linestyle_geometry_modifier(linestyle, LS_MODIFIER_SAMPLING);
99 linestyle->caps = LS_CAPS_BUTT;
102 FreestyleLineStyle *FRS_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 FRS_free_linestyle(FreestyleLineStyle *linestyle)
118 LineStyleModifier *m;
120 BKE_free_animdata(&linestyle->id);
121 while ((m = (LineStyleModifier *)linestyle->color_modifiers.first))
122 FRS_remove_linestyle_color_modifier(linestyle, m);
123 while ((m = (LineStyleModifier *)linestyle->alpha_modifiers.first))
124 FRS_remove_linestyle_alpha_modifier(linestyle, m);
125 while ((m = (LineStyleModifier *)linestyle->thickness_modifiers.first))
126 FRS_remove_linestyle_thickness_modifier(linestyle, m);
127 while ((m = (LineStyleModifier *)linestyle->geometry_modifiers.first))
128 FRS_remove_linestyle_geometry_modifier(linestyle, m);
131 FreestyleLineStyle *FRS_copy_linestyle(FreestyleLineStyle *linestyle)
133 FreestyleLineStyle *new_linestyle;
134 LineStyleModifier *m;
136 new_linestyle = FRS_new_linestyle(linestyle->id.name + 2, NULL);
137 FRS_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 FRS_copy_linestyle_color_modifier(new_linestyle, m);
164 for (m = (LineStyleModifier *)linestyle->alpha_modifiers.first; m; m = m->next)
165 FRS_copy_linestyle_alpha_modifier(new_linestyle, m);
166 for (m = (LineStyleModifier *)linestyle->thickness_modifiers.first; m; m = m->next)
167 FRS_copy_linestyle_thickness_modifier(new_linestyle, m);
168 for (m = (LineStyleModifier *)linestyle->geometry_modifiers.first; m; m = m->next)
169 FRS_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");
181 strcpy(m->name, modifier_name[type]);
183 m->flags = LS_MODIFIER_ENABLED | LS_MODIFIER_EXPANDED;
189 static void add_to_modifier_list(ListBase *lb, LineStyleModifier *m)
191 BLI_addtail(lb, (void *)m);
192 BLI_uniquename(lb, m, modifier_name[m->type], '.', offsetof(LineStyleModifier, name), sizeof(m->name));
195 static LineStyleModifier *alloc_color_modifier(int type)
200 case LS_MODIFIER_ALONG_STROKE:
201 size = sizeof(LineStyleColorModifier_AlongStroke);
203 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
204 size = sizeof(LineStyleColorModifier_DistanceFromCamera);
206 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
207 size = sizeof(LineStyleColorModifier_DistanceFromObject);
209 case LS_MODIFIER_MATERIAL:
210 size = sizeof(LineStyleColorModifier_Material);
213 return NULL; /* unknown modifier type */
216 return new_modifier(type, size);
219 LineStyleModifier *FRS_add_linestyle_color_modifier(FreestyleLineStyle *linestyle, int type)
221 LineStyleModifier *m;
223 m = alloc_color_modifier(type);
226 m->blend = MA_RAMP_BLEND;
229 case LS_MODIFIER_ALONG_STROKE:
230 ((LineStyleColorModifier_AlongStroke *)m)->color_ramp = add_colorband(1);
232 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
233 ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp = add_colorband(1);
234 ((LineStyleColorModifier_DistanceFromCamera *)m)->range_min = 0.0f;
235 ((LineStyleColorModifier_DistanceFromCamera *)m)->range_max = 10000.0f;
237 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
238 ((LineStyleColorModifier_DistanceFromObject *)m)->target = NULL;
239 ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp = add_colorband(1);
240 ((LineStyleColorModifier_DistanceFromObject *)m)->range_min = 0.0f;
241 ((LineStyleColorModifier_DistanceFromObject *)m)->range_max = 10000.0f;
243 case LS_MODIFIER_MATERIAL:
244 ((LineStyleColorModifier_Material *)m)->color_ramp = add_colorband(1);
245 ((LineStyleColorModifier_Material *)m)->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
248 return NULL; /* unknown modifier type */
250 add_to_modifier_list(&linestyle->color_modifiers, m);
255 LineStyleModifier *FRS_copy_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
257 LineStyleModifier *new_m;
259 new_m = alloc_color_modifier(m->type);
262 new_m->influence = m->influence;
263 new_m->flags = m->flags;
264 new_m->blend = m->blend;
267 case LS_MODIFIER_ALONG_STROKE:
269 LineStyleColorModifier_AlongStroke *p = (LineStyleColorModifier_AlongStroke *)m;
270 ((LineStyleColorModifier_AlongStroke *)new_m)->color_ramp = MEM_dupallocN(p->color_ramp);
273 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
275 LineStyleColorModifier_DistanceFromCamera *p = (LineStyleColorModifier_DistanceFromCamera *)m;
276 ((LineStyleColorModifier_DistanceFromCamera *)new_m)->color_ramp = MEM_dupallocN(p->color_ramp);
277 ((LineStyleColorModifier_DistanceFromCamera *)new_m)->range_min = p->range_min;
278 ((LineStyleColorModifier_DistanceFromCamera *)new_m)->range_max = p->range_max;
281 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
283 LineStyleColorModifier_DistanceFromObject *p = (LineStyleColorModifier_DistanceFromObject *)m;
286 ((LineStyleColorModifier_DistanceFromObject *)new_m)->target = p->target;
287 ((LineStyleColorModifier_DistanceFromObject *)new_m)->color_ramp = MEM_dupallocN(p->color_ramp);
288 ((LineStyleColorModifier_DistanceFromObject *)new_m)->range_min = p->range_min;
289 ((LineStyleColorModifier_DistanceFromObject *)new_m)->range_max = p->range_max;
292 case LS_MODIFIER_MATERIAL:
294 LineStyleColorModifier_Material *p = (LineStyleColorModifier_Material *)m;
295 ((LineStyleColorModifier_Material *)new_m)->color_ramp = MEM_dupallocN(p->color_ramp);
296 ((LineStyleColorModifier_Material *)new_m)->mat_attr = p->mat_attr;
300 return NULL; /* unknown modifier type */
302 add_to_modifier_list(&linestyle->color_modifiers, new_m);
307 void FRS_remove_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
310 case LS_MODIFIER_ALONG_STROKE:
311 MEM_freeN(((LineStyleColorModifier_AlongStroke *)m)->color_ramp);
313 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
314 MEM_freeN(((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp);
316 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
317 MEM_freeN(((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp);
319 case LS_MODIFIER_MATERIAL:
320 MEM_freeN(((LineStyleColorModifier_Material *)m)->color_ramp);
323 BLI_freelinkN(&linestyle->color_modifiers, m);
326 static LineStyleModifier *alloc_alpha_modifier(int type)
331 case LS_MODIFIER_ALONG_STROKE:
332 size = sizeof(LineStyleAlphaModifier_AlongStroke);
334 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
335 size = sizeof(LineStyleAlphaModifier_DistanceFromCamera);
337 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
338 size = sizeof(LineStyleAlphaModifier_DistanceFromObject);
340 case LS_MODIFIER_MATERIAL:
341 size = sizeof(LineStyleAlphaModifier_Material);
344 return NULL; /* unknown modifier type */
346 return new_modifier(type, size);
349 LineStyleModifier *FRS_add_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, int type)
351 LineStyleModifier *m;
353 m = alloc_alpha_modifier(type);
356 m->blend = LS_VALUE_BLEND;
359 case LS_MODIFIER_ALONG_STROKE:
360 ((LineStyleAlphaModifier_AlongStroke *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
362 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
363 ((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
364 ((LineStyleAlphaModifier_DistanceFromCamera *)m)->range_min = 0.0f;
365 ((LineStyleAlphaModifier_DistanceFromCamera *)m)->range_max = 10000.0f;
367 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
368 ((LineStyleAlphaModifier_DistanceFromObject *)m)->target = NULL;
369 ((LineStyleAlphaModifier_DistanceFromObject *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
370 ((LineStyleAlphaModifier_DistanceFromObject *)m)->range_min = 0.0f;
371 ((LineStyleAlphaModifier_DistanceFromObject *)m)->range_max = 10000.0f;
373 case LS_MODIFIER_MATERIAL:
374 ((LineStyleAlphaModifier_Material *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
375 ((LineStyleAlphaModifier_Material *)m)->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
378 return NULL; /* unknown modifier type */
380 add_to_modifier_list(&linestyle->alpha_modifiers, m);
385 LineStyleModifier *FRS_copy_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
387 LineStyleModifier *new_m;
389 new_m = alloc_alpha_modifier(m->type);
392 new_m->influence = m->influence;
393 new_m->flags = m->flags;
394 new_m->blend = m->blend;
397 case LS_MODIFIER_ALONG_STROKE:
399 LineStyleAlphaModifier_AlongStroke *p = (LineStyleAlphaModifier_AlongStroke *)m;
400 ((LineStyleAlphaModifier_AlongStroke *)new_m)->curve = curvemapping_copy(p->curve);
403 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
405 LineStyleAlphaModifier_DistanceFromCamera *p = (LineStyleAlphaModifier_DistanceFromCamera *)m;
406 ((LineStyleAlphaModifier_DistanceFromCamera *)new_m)->curve = curvemapping_copy(p->curve);
407 ((LineStyleAlphaModifier_DistanceFromCamera *)new_m)->range_min = p->range_min;
408 ((LineStyleAlphaModifier_DistanceFromCamera *)new_m)->range_max = p->range_max;
411 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
413 LineStyleAlphaModifier_DistanceFromObject *p = (LineStyleAlphaModifier_DistanceFromObject *)m;
416 ((LineStyleAlphaModifier_DistanceFromObject *)new_m)->target = p->target;
417 ((LineStyleAlphaModifier_DistanceFromObject *)new_m)->curve = curvemapping_copy(p->curve);
418 ((LineStyleAlphaModifier_DistanceFromObject *)new_m)->range_min = p->range_min;
419 ((LineStyleAlphaModifier_DistanceFromObject *)new_m)->range_max = p->range_max;
422 case LS_MODIFIER_MATERIAL:
424 LineStyleAlphaModifier_Material *p = (LineStyleAlphaModifier_Material *)m;
425 ((LineStyleAlphaModifier_Material *)new_m)->curve = curvemapping_copy(p->curve);
426 ((LineStyleAlphaModifier_Material *)new_m)->mat_attr = p->mat_attr;
430 return NULL; /* unknown modifier type */
432 add_to_modifier_list(&linestyle->alpha_modifiers, new_m);
437 void FRS_remove_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
440 case LS_MODIFIER_ALONG_STROKE:
441 curvemapping_free(((LineStyleAlphaModifier_AlongStroke *)m)->curve);
443 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
444 curvemapping_free(((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve);
446 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
447 curvemapping_free(((LineStyleAlphaModifier_DistanceFromObject *)m)->curve);
449 case LS_MODIFIER_MATERIAL:
450 curvemapping_free(((LineStyleAlphaModifier_Material *)m)->curve);
453 BLI_freelinkN(&linestyle->alpha_modifiers, m);
456 static LineStyleModifier *alloc_thickness_modifier(int type)
461 case LS_MODIFIER_ALONG_STROKE:
462 size = sizeof(LineStyleThicknessModifier_AlongStroke);
464 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
465 size = sizeof(LineStyleThicknessModifier_DistanceFromCamera);
467 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
468 size = sizeof(LineStyleThicknessModifier_DistanceFromObject);
470 case LS_MODIFIER_MATERIAL:
471 size = sizeof(LineStyleThicknessModifier_Material);
473 case LS_MODIFIER_CALLIGRAPHY:
474 size = sizeof(LineStyleThicknessModifier_Calligraphy);
477 return NULL; /* unknown modifier type */
480 return new_modifier(type, size);
483 LineStyleModifier *FRS_add_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, int type)
485 LineStyleModifier *m;
487 m = alloc_thickness_modifier(type);
490 m->blend = LS_VALUE_BLEND;
493 case LS_MODIFIER_ALONG_STROKE:
494 ((LineStyleThicknessModifier_AlongStroke *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
495 ((LineStyleThicknessModifier_AlongStroke *)m)->value_min = 0.0f;
496 ((LineStyleThicknessModifier_AlongStroke *)m)->value_max = 1.0f;
498 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
499 ((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
500 ((LineStyleThicknessModifier_DistanceFromCamera *)m)->range_min = 0.0f;
501 ((LineStyleThicknessModifier_DistanceFromCamera *)m)->range_max = 1000.0f;
502 ((LineStyleThicknessModifier_DistanceFromCamera *)m)->value_min = 0.0f;
503 ((LineStyleThicknessModifier_DistanceFromCamera *)m)->value_max = 1.0f;
505 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
506 ((LineStyleThicknessModifier_DistanceFromObject *)m)->target = NULL;
507 ((LineStyleThicknessModifier_DistanceFromObject *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
508 ((LineStyleThicknessModifier_DistanceFromObject *)m)->range_min = 0.0f;
509 ((LineStyleThicknessModifier_DistanceFromObject *)m)->range_max = 1000.0f;
510 ((LineStyleThicknessModifier_DistanceFromObject *)m)->value_min = 0.0f;
511 ((LineStyleThicknessModifier_DistanceFromObject *)m)->value_max = 1.0f;
513 case LS_MODIFIER_MATERIAL:
514 ((LineStyleThicknessModifier_Material *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
515 ((LineStyleThicknessModifier_Material *)m)->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
516 ((LineStyleThicknessModifier_Material *)m)->value_min = 0.0f;
517 ((LineStyleThicknessModifier_Material *)m)->value_max = 1.0f;
519 case LS_MODIFIER_CALLIGRAPHY:
520 ((LineStyleThicknessModifier_Calligraphy *)m)->min_thickness = 1.0f;
521 ((LineStyleThicknessModifier_Calligraphy *)m)->max_thickness = 10.0f;
522 ((LineStyleThicknessModifier_Calligraphy *)m)->orientation = DEG2RADF(60.0f);
525 return NULL; /* unknown modifier type */
527 add_to_modifier_list(&linestyle->thickness_modifiers, m);
532 LineStyleModifier *FRS_copy_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
534 LineStyleModifier *new_m;
536 new_m = alloc_thickness_modifier(m->type);
539 new_m->influence = m->influence;
540 new_m->flags = m->flags;
541 new_m->blend = m->blend;
544 case LS_MODIFIER_ALONG_STROKE:
546 LineStyleThicknessModifier_AlongStroke *p = (LineStyleThicknessModifier_AlongStroke *)m;
547 ((LineStyleThicknessModifier_AlongStroke *)new_m)->curve = curvemapping_copy(p->curve);
548 ((LineStyleThicknessModifier_AlongStroke *)new_m)->value_min = p->value_min;
549 ((LineStyleThicknessModifier_AlongStroke *)new_m)->value_max = p->value_max;
552 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
554 LineStyleThicknessModifier_DistanceFromCamera *p = (LineStyleThicknessModifier_DistanceFromCamera *)m;
555 ((LineStyleThicknessModifier_DistanceFromCamera *)new_m)->curve = curvemapping_copy(p->curve);
556 ((LineStyleThicknessModifier_DistanceFromCamera *)new_m)->range_min = p->range_min;
557 ((LineStyleThicknessModifier_DistanceFromCamera *)new_m)->range_max = p->range_max;
558 ((LineStyleThicknessModifier_DistanceFromCamera *)new_m)->value_min = p->value_min;
559 ((LineStyleThicknessModifier_DistanceFromCamera *)new_m)->value_max = p->value_max;
562 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
564 LineStyleThicknessModifier_DistanceFromObject *p = (LineStyleThicknessModifier_DistanceFromObject *)m;
567 ((LineStyleThicknessModifier_DistanceFromObject *)new_m)->target = p->target;
568 ((LineStyleThicknessModifier_DistanceFromObject *)new_m)->curve = curvemapping_copy(p->curve);
569 ((LineStyleThicknessModifier_DistanceFromObject *)new_m)->range_min = p->range_min;
570 ((LineStyleThicknessModifier_DistanceFromObject *)new_m)->range_max = p->range_max;
571 ((LineStyleThicknessModifier_DistanceFromObject *)new_m)->value_min = p->value_min;
572 ((LineStyleThicknessModifier_DistanceFromObject *)new_m)->value_max = p->value_max;
575 case LS_MODIFIER_MATERIAL:
577 LineStyleThicknessModifier_Material *p = (LineStyleThicknessModifier_Material *)m;
578 ((LineStyleThicknessModifier_Material *)new_m)->curve = curvemapping_copy(p->curve);
579 ((LineStyleThicknessModifier_Material *)new_m)->mat_attr = p->mat_attr;
580 ((LineStyleThicknessModifier_Material *)new_m)->value_min = p->value_min;
581 ((LineStyleThicknessModifier_Material *)new_m)->value_max = p->value_max;
584 case LS_MODIFIER_CALLIGRAPHY:
586 LineStyleThicknessModifier_Calligraphy *p = (LineStyleThicknessModifier_Calligraphy *)m;
587 ((LineStyleThicknessModifier_Calligraphy *)new_m)->min_thickness = p->min_thickness;
588 ((LineStyleThicknessModifier_Calligraphy *)new_m)->max_thickness = p->max_thickness;
589 ((LineStyleThicknessModifier_Calligraphy *)new_m)->orientation = p->orientation;
593 return NULL; /* unknown modifier type */
595 add_to_modifier_list(&linestyle->thickness_modifiers, new_m);
600 void FRS_remove_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
603 case LS_MODIFIER_ALONG_STROKE:
604 curvemapping_free(((LineStyleThicknessModifier_AlongStroke *)m)->curve);
606 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
607 curvemapping_free(((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve);
609 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
610 curvemapping_free(((LineStyleThicknessModifier_DistanceFromObject *)m)->curve);
612 case LS_MODIFIER_MATERIAL:
613 curvemapping_free(((LineStyleThicknessModifier_Material *)m)->curve);
615 case LS_MODIFIER_CALLIGRAPHY:
618 BLI_freelinkN(&linestyle->thickness_modifiers, m);
621 static LineStyleModifier *alloc_geometry_modifier(int type)
626 case LS_MODIFIER_SAMPLING:
627 size = sizeof(LineStyleGeometryModifier_Sampling);
629 case LS_MODIFIER_BEZIER_CURVE:
630 size = sizeof(LineStyleGeometryModifier_BezierCurve);
632 case LS_MODIFIER_SINUS_DISPLACEMENT:
633 size = sizeof(LineStyleGeometryModifier_SinusDisplacement);
635 case LS_MODIFIER_SPATIAL_NOISE:
636 size = sizeof(LineStyleGeometryModifier_SpatialNoise);
638 case LS_MODIFIER_PERLIN_NOISE_1D:
639 size = sizeof(LineStyleGeometryModifier_PerlinNoise1D);
641 case LS_MODIFIER_PERLIN_NOISE_2D:
642 size = sizeof(LineStyleGeometryModifier_PerlinNoise2D);
644 case LS_MODIFIER_BACKBONE_STRETCHER:
645 size = sizeof(LineStyleGeometryModifier_BackboneStretcher);
647 case LS_MODIFIER_TIP_REMOVER:
648 size = sizeof(LineStyleGeometryModifier_TipRemover);
650 case LS_MODIFIER_POLYGONIZATION:
651 size = sizeof(LineStyleGeometryModifier_Polygonalization);
653 case LS_MODIFIER_GUIDING_LINES:
654 size = sizeof(LineStyleGeometryModifier_GuidingLines);
656 case LS_MODIFIER_BLUEPRINT:
657 size = sizeof(LineStyleGeometryModifier_Blueprint);
659 case LS_MODIFIER_2D_OFFSET:
660 size = sizeof(LineStyleGeometryModifier_2DOffset);
662 case LS_MODIFIER_2D_TRANSFORM:
663 size = sizeof(LineStyleGeometryModifier_2DTransform);
666 return NULL; /* unknown modifier type */
669 return new_modifier(type, size);
672 LineStyleModifier *FRS_add_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, int type)
674 LineStyleModifier *m;
676 m = alloc_geometry_modifier(type);
681 case LS_MODIFIER_SAMPLING:
682 ((LineStyleGeometryModifier_Sampling *)m)->sampling = 10.0f;
684 case LS_MODIFIER_BEZIER_CURVE:
685 ((LineStyleGeometryModifier_BezierCurve *)m)->error = 10.0f;
687 case LS_MODIFIER_SINUS_DISPLACEMENT:
688 ((LineStyleGeometryModifier_SinusDisplacement *)m)->wavelength = 20.0f;
689 ((LineStyleGeometryModifier_SinusDisplacement *)m)->amplitude = 5.0f;
690 ((LineStyleGeometryModifier_SinusDisplacement *)m)->phase = 0.0f;
692 case LS_MODIFIER_SPATIAL_NOISE:
693 ((LineStyleGeometryModifier_SpatialNoise *)m)->amplitude = 5.0f;
694 ((LineStyleGeometryModifier_SpatialNoise *)m)->scale = 20.0f;
695 ((LineStyleGeometryModifier_SpatialNoise *)m)->octaves = 4;
696 ((LineStyleGeometryModifier_SpatialNoise *)m)->flags = LS_MODIFIER_SPATIAL_NOISE_SMOOTH | LS_MODIFIER_SPATIAL_NOISE_PURERANDOM;
698 case LS_MODIFIER_PERLIN_NOISE_1D:
699 ((LineStyleGeometryModifier_PerlinNoise1D *)m)->frequency = 10.0f;
700 ((LineStyleGeometryModifier_PerlinNoise1D *)m)->amplitude = 10.0f;
701 ((LineStyleGeometryModifier_PerlinNoise1D *)m)->octaves = 4;
702 ((LineStyleGeometryModifier_PerlinNoise1D *)m)->angle = DEG2RADF(45.0f);
704 case LS_MODIFIER_PERLIN_NOISE_2D:
705 ((LineStyleGeometryModifier_PerlinNoise2D *)m)->frequency = 10.0f;
706 ((LineStyleGeometryModifier_PerlinNoise2D *)m)->amplitude = 10.0f;
707 ((LineStyleGeometryModifier_PerlinNoise2D *)m)->octaves = 4;
708 ((LineStyleGeometryModifier_PerlinNoise2D *)m)->angle = DEG2RADF(45.0f);
710 case LS_MODIFIER_BACKBONE_STRETCHER:
711 ((LineStyleGeometryModifier_BackboneStretcher *)m)->backbone_length = 10.0f;
713 case LS_MODIFIER_TIP_REMOVER:
714 ((LineStyleGeometryModifier_TipRemover *)m)->tip_length = 10.0f;
716 case LS_MODIFIER_POLYGONIZATION:
717 ((LineStyleGeometryModifier_Polygonalization *)m)->error = 10.0f;
719 case LS_MODIFIER_GUIDING_LINES:
720 ((LineStyleGeometryModifier_GuidingLines *)m)->offset = 0.0f;
722 case LS_MODIFIER_BLUEPRINT:
723 ((LineStyleGeometryModifier_Blueprint *)m)->flags = LS_MODIFIER_BLUEPRINT_CIRCLES;
724 ((LineStyleGeometryModifier_Blueprint *)m)->rounds = 1;
725 ((LineStyleGeometryModifier_Blueprint *)m)->backbone_length = 10.0f;
726 ((LineStyleGeometryModifier_Blueprint *)m)->random_radius = 3;
727 ((LineStyleGeometryModifier_Blueprint *)m)->random_center = 5;
728 ((LineStyleGeometryModifier_Blueprint *)m)->random_backbone = 5;
730 case LS_MODIFIER_2D_OFFSET:
731 ((LineStyleGeometryModifier_2DOffset *)m)->start = 0.0f;
732 ((LineStyleGeometryModifier_2DOffset *)m)->end = 0.0f;
733 ((LineStyleGeometryModifier_2DOffset *)m)->x = 0.0f;
734 ((LineStyleGeometryModifier_2DOffset *)m)->y = 0.0f;
736 case LS_MODIFIER_2D_TRANSFORM:
737 ((LineStyleGeometryModifier_2DTransform *)m)->pivot = LS_MODIFIER_2D_TRANSFORM_PIVOT_CENTER;
738 ((LineStyleGeometryModifier_2DTransform *)m)->scale_x = 1.0f;
739 ((LineStyleGeometryModifier_2DTransform *)m)->scale_y = 1.0f;
740 ((LineStyleGeometryModifier_2DTransform *)m)->angle = DEG2RADF(0.0f);
741 ((LineStyleGeometryModifier_2DTransform *)m)->pivot_u = 0.5f;
742 ((LineStyleGeometryModifier_2DTransform *)m)->pivot_x = 0.0f;
743 ((LineStyleGeometryModifier_2DTransform *)m)->pivot_y = 0.0f;
746 return NULL; /* unknown modifier type */
748 add_to_modifier_list(&linestyle->geometry_modifiers, m);
753 LineStyleModifier *FRS_copy_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
755 LineStyleModifier *new_m;
757 new_m = alloc_geometry_modifier(m->type);
760 new_m->flags = m->flags;
763 case LS_MODIFIER_SAMPLING:
765 LineStyleGeometryModifier_Sampling *p = (LineStyleGeometryModifier_Sampling *)m;
766 ((LineStyleGeometryModifier_Sampling *)new_m)->sampling = p->sampling;
769 case LS_MODIFIER_BEZIER_CURVE:
771 LineStyleGeometryModifier_BezierCurve *p = (LineStyleGeometryModifier_BezierCurve *)m;
772 ((LineStyleGeometryModifier_BezierCurve *)new_m)->error = p->error;
775 case LS_MODIFIER_SINUS_DISPLACEMENT:
777 LineStyleGeometryModifier_SinusDisplacement *p = (LineStyleGeometryModifier_SinusDisplacement *)m;
778 ((LineStyleGeometryModifier_SinusDisplacement *)new_m)->wavelength = p->wavelength;
779 ((LineStyleGeometryModifier_SinusDisplacement *)new_m)->amplitude = p->amplitude;
780 ((LineStyleGeometryModifier_SinusDisplacement *)new_m)->phase = p->phase;
783 case LS_MODIFIER_SPATIAL_NOISE:
785 LineStyleGeometryModifier_SpatialNoise *p = (LineStyleGeometryModifier_SpatialNoise *)m;
786 ((LineStyleGeometryModifier_SpatialNoise *)new_m)->amplitude = p->amplitude;
787 ((LineStyleGeometryModifier_SpatialNoise *)new_m)->scale = p->scale;
788 ((LineStyleGeometryModifier_SpatialNoise *)new_m)->octaves = p->octaves;
789 ((LineStyleGeometryModifier_SpatialNoise *)new_m)->flags = p->flags;
792 case LS_MODIFIER_PERLIN_NOISE_1D:
794 LineStyleGeometryModifier_PerlinNoise1D *p = (LineStyleGeometryModifier_PerlinNoise1D *)m;
795 ((LineStyleGeometryModifier_PerlinNoise1D *)new_m)->frequency = p->frequency;
796 ((LineStyleGeometryModifier_PerlinNoise1D *)new_m)->amplitude = p->amplitude;
797 ((LineStyleGeometryModifier_PerlinNoise1D *)new_m)->octaves = p->octaves;
798 ((LineStyleGeometryModifier_PerlinNoise1D *)new_m)->angle = p->angle;
801 case LS_MODIFIER_PERLIN_NOISE_2D:
803 LineStyleGeometryModifier_PerlinNoise2D *p = (LineStyleGeometryModifier_PerlinNoise2D *)m;
804 ((LineStyleGeometryModifier_PerlinNoise2D *)new_m)->frequency = p->frequency;
805 ((LineStyleGeometryModifier_PerlinNoise2D *)new_m)->amplitude = p->amplitude;
806 ((LineStyleGeometryModifier_PerlinNoise2D *)new_m)->octaves = p->octaves;
807 ((LineStyleGeometryModifier_PerlinNoise2D *)new_m)->angle = p->angle;
810 case LS_MODIFIER_BACKBONE_STRETCHER:
812 LineStyleGeometryModifier_BackboneStretcher *p = (LineStyleGeometryModifier_BackboneStretcher *)m;
813 ((LineStyleGeometryModifier_BackboneStretcher *)new_m)->backbone_length = p->backbone_length;
816 case LS_MODIFIER_TIP_REMOVER:
818 LineStyleGeometryModifier_TipRemover *p = (LineStyleGeometryModifier_TipRemover *)m;
819 ((LineStyleGeometryModifier_TipRemover *)new_m)->tip_length = p->tip_length;
822 case LS_MODIFIER_POLYGONIZATION:
824 LineStyleGeometryModifier_Polygonalization *p = (LineStyleGeometryModifier_Polygonalization *)m;
825 ((LineStyleGeometryModifier_Polygonalization *)new_m)->error = p->error;
828 case LS_MODIFIER_GUIDING_LINES:
830 LineStyleGeometryModifier_GuidingLines *p = (LineStyleGeometryModifier_GuidingLines *)m;
831 ((LineStyleGeometryModifier_GuidingLines *)new_m)->offset = p->offset;
834 case LS_MODIFIER_BLUEPRINT:
836 LineStyleGeometryModifier_Blueprint *p = (LineStyleGeometryModifier_Blueprint *)m;
837 ((LineStyleGeometryModifier_Blueprint *)new_m)->flags = p->flags;
838 ((LineStyleGeometryModifier_Blueprint *)new_m)->rounds = p->rounds;
839 ((LineStyleGeometryModifier_Blueprint *)new_m)->backbone_length = p->backbone_length;
840 ((LineStyleGeometryModifier_Blueprint *)new_m)->random_radius = p->random_radius;
841 ((LineStyleGeometryModifier_Blueprint *)new_m)->random_center = p->random_center;
842 ((LineStyleGeometryModifier_Blueprint *)new_m)->random_backbone = p->random_backbone;
845 case LS_MODIFIER_2D_OFFSET:
847 LineStyleGeometryModifier_2DOffset *p = (LineStyleGeometryModifier_2DOffset *)m;
848 ((LineStyleGeometryModifier_2DOffset *)new_m)->start = p->start;
849 ((LineStyleGeometryModifier_2DOffset *)new_m)->end = p->end;
850 ((LineStyleGeometryModifier_2DOffset *)new_m)->x = p->x;
851 ((LineStyleGeometryModifier_2DOffset *)new_m)->y = p->y;
854 case LS_MODIFIER_2D_TRANSFORM:
856 LineStyleGeometryModifier_2DTransform *p = (LineStyleGeometryModifier_2DTransform *)m;
857 ((LineStyleGeometryModifier_2DTransform *)new_m)->pivot = p->pivot;
858 ((LineStyleGeometryModifier_2DTransform *)new_m)->scale_x = p->scale_x;
859 ((LineStyleGeometryModifier_2DTransform *)new_m)->scale_y = p->scale_y;
860 ((LineStyleGeometryModifier_2DTransform *)new_m)->angle = p->angle;
861 ((LineStyleGeometryModifier_2DTransform *)new_m)->pivot_u = p->pivot_u;
862 ((LineStyleGeometryModifier_2DTransform *)new_m)->pivot_x = p->pivot_x;
863 ((LineStyleGeometryModifier_2DTransform *)new_m)->pivot_y = p->pivot_y;
867 return NULL; /* unknown modifier type */
869 add_to_modifier_list(&linestyle->geometry_modifiers, new_m);
874 void FRS_remove_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
877 case LS_MODIFIER_SAMPLING:
879 case LS_MODIFIER_BEZIER_CURVE:
881 case LS_MODIFIER_SINUS_DISPLACEMENT:
883 case LS_MODIFIER_SPATIAL_NOISE:
885 case LS_MODIFIER_PERLIN_NOISE_1D:
887 case LS_MODIFIER_PERLIN_NOISE_2D:
889 case LS_MODIFIER_BACKBONE_STRETCHER:
891 case LS_MODIFIER_TIP_REMOVER:
893 case LS_MODIFIER_POLYGONIZATION:
895 case LS_MODIFIER_GUIDING_LINES:
897 case LS_MODIFIER_BLUEPRINT:
899 case LS_MODIFIER_2D_OFFSET:
901 case LS_MODIFIER_2D_TRANSFORM:
904 BLI_freelinkN(&linestyle->geometry_modifiers, m);
907 static void move_modifier(ListBase *lb, LineStyleModifier *modifier, int direction)
909 BLI_remlink(lb, modifier);
911 BLI_insertlinkbefore(lb, modifier->prev, modifier);
913 BLI_insertlinkafter(lb, modifier->next, modifier);
916 void FRS_move_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
918 move_modifier(&linestyle->color_modifiers, modifier, direction);
921 void FRS_move_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
923 move_modifier(&linestyle->alpha_modifiers, modifier, direction);
926 void FRS_move_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
928 move_modifier(&linestyle->thickness_modifiers, modifier, direction);
931 void FRS_move_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
933 move_modifier(&linestyle->geometry_modifiers, modifier, direction);
936 void FRS_list_modifier_color_ramps(FreestyleLineStyle *linestyle, ListBase *listbase)
938 LineStyleModifier *m;
939 ColorBand *color_ramp;
942 listbase->first = listbase->last = NULL;
943 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
945 case LS_MODIFIER_ALONG_STROKE:
946 color_ramp = ((LineStyleColorModifier_AlongStroke *)m)->color_ramp;
948 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
949 color_ramp = ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp;
951 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
952 color_ramp = ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp;
954 case LS_MODIFIER_MATERIAL:
955 color_ramp = ((LineStyleColorModifier_Material *)m)->color_ramp;
960 link = (LinkData *) MEM_callocN( sizeof(LinkData), "link to color ramp");
961 link->data = color_ramp;
962 BLI_addtail(listbase, link);
966 /* XXX Do we want to keep that goto? Or use a boolean var? */
967 char *FRS_path_from_ID_to_color_ramp(FreestyleLineStyle *linestyle, ColorBand *color_ramp)
969 LineStyleModifier *m;
971 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
973 case LS_MODIFIER_ALONG_STROKE:
974 if (color_ramp == ((LineStyleColorModifier_AlongStroke *)m)->color_ramp)
977 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
978 if (color_ramp == ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp)
981 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
982 if (color_ramp == ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp)
985 case LS_MODIFIER_MATERIAL:
986 if (color_ramp == ((LineStyleColorModifier_Material *)m)->color_ramp)
991 printf("FRS_path_from_ID_to_color_ramp: No color ramps correspond to the given pointer.\n");
995 return BLI_sprintfN("color_modifiers[\"%s\"].color_ramp", m->name);
998 void FRS_unlink_linestyle_target_object(FreestyleLineStyle *linestyle, struct Object *ob)
1000 LineStyleModifier *m;
1002 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
1003 if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
1004 if (((LineStyleColorModifier_DistanceFromObject *)m)->target == ob) {
1005 ((LineStyleColorModifier_DistanceFromObject *)m)->target = NULL;
1009 for (m = (LineStyleModifier *)linestyle->alpha_modifiers.first; m; m = m->next) {
1010 if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
1011 if (((LineStyleAlphaModifier_DistanceFromObject *)m)->target == ob) {
1012 ((LineStyleAlphaModifier_DistanceFromObject *)m)->target = NULL;
1016 for (m = (LineStyleModifier *)linestyle->thickness_modifiers.first; m; m = m->next) {
1017 if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) {
1018 if (((LineStyleThicknessModifier_DistanceFromObject *)m)->target == ob) {
1019 ((LineStyleThicknessModifier_DistanceFromObject *)m)->target = NULL;