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_string_utils.h"
45 #include "BLI_utildefines.h"
47 #include "BKE_colorband.h"
48 #include "BKE_context.h"
49 #include "BKE_freestyle.h"
50 #include "BKE_global.h"
51 #include "BKE_library.h"
52 #include "BKE_linestyle.h"
54 #include "BKE_colortools.h"
55 #include "BKE_animsys.h"
57 static const char *modifier_name[LS_MODIFIER_NUM] = {
60 "Distance from Camera",
61 "Distance from Object",
84 void BKE_linestyle_init(FreestyleLineStyle *linestyle)
86 BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(linestyle, id));
88 linestyle->panel = LS_PANEL_STROKES;
89 linestyle->r = linestyle->g = linestyle->b = 0.0f;
90 linestyle->alpha = 1.0f;
91 linestyle->thickness = 3.0f;
92 linestyle->thickness_position = LS_THICKNESS_CENTER;
93 linestyle->thickness_ratio = 0.5f;
94 linestyle->flag = LS_SAME_OBJECT | LS_NO_SORTING | LS_TEXTURE;
95 linestyle->chaining = LS_CHAINING_PLAIN;
96 linestyle->rounds = 3;
97 linestyle->min_angle = DEG2RADF(0.0f);
98 linestyle->max_angle = DEG2RADF(0.0f);
99 linestyle->min_length = 0.0f;
100 linestyle->max_length = 10000.0f;
101 linestyle->split_length = 100;
102 linestyle->chain_count = 10;
103 linestyle->sort_key = LS_SORT_KEY_DISTANCE_FROM_CAMERA;
104 linestyle->integration_type = LS_INTEGRATION_MEAN;
105 linestyle->texstep = 1.0f;
106 linestyle->pr_texture = TEX_PR_TEXTURE;
108 BLI_listbase_clear(&linestyle->color_modifiers);
109 BLI_listbase_clear(&linestyle->alpha_modifiers);
110 BLI_listbase_clear(&linestyle->thickness_modifiers);
111 BLI_listbase_clear(&linestyle->geometry_modifiers);
113 BKE_linestyle_geometry_modifier_add(linestyle, NULL, LS_MODIFIER_SAMPLING);
115 linestyle->caps = LS_CAPS_BUTT;
118 FreestyleLineStyle *BKE_linestyle_new(struct Main *bmain, const char *name)
120 FreestyleLineStyle *linestyle;
122 linestyle = (FreestyleLineStyle *)BKE_libblock_alloc(bmain, ID_LS, name, 0);
124 BKE_linestyle_init(linestyle);
129 /** Free (or release) any data used by this linestyle (does not free the linestyle itself). */
130 void BKE_linestyle_free(FreestyleLineStyle *linestyle)
132 LineStyleModifier *m;
135 BKE_animdata_free(&linestyle->id, false);
137 for (a = 0; a < MAX_MTEX; a++) {
138 MEM_SAFE_FREE(linestyle->mtex[a]);
141 /* is no lib link block, but linestyle extension */
142 if (linestyle->nodetree) {
143 ntreeFreeTree(linestyle->nodetree);
144 MEM_freeN(linestyle->nodetree);
145 linestyle->nodetree = NULL;
148 while ((m = (LineStyleModifier *)linestyle->color_modifiers.first))
149 BKE_linestyle_color_modifier_remove(linestyle, m);
150 while ((m = (LineStyleModifier *)linestyle->alpha_modifiers.first))
151 BKE_linestyle_alpha_modifier_remove(linestyle, m);
152 while ((m = (LineStyleModifier *)linestyle->thickness_modifiers.first))
153 BKE_linestyle_thickness_modifier_remove(linestyle, m);
154 while ((m = (LineStyleModifier *)linestyle->geometry_modifiers.first))
155 BKE_linestyle_geometry_modifier_remove(linestyle, m);
159 * Only copy internal data of Linestyle ID from source to already allocated/initialized destination.
160 * You probably nerver want to use that directly, use id_copy or BKE_id_copy_ex for typical needs.
162 * WARNING! This function will not handle ID user count!
164 * \param flag Copying options (see BKE_library.h's LIB_ID_COPY_... flags for more).
166 void BKE_linestyle_copy_data(
167 struct Main *bmain, FreestyleLineStyle *linestyle_dst, const FreestyleLineStyle *linestyle_src, const int flag)
169 /* We never handle usercount here for own data. */
170 const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT;
172 for (int a = 0; a < MAX_MTEX; a++) {
173 if (linestyle_src->mtex[a]) {
174 linestyle_dst->mtex[a] = MEM_mallocN(sizeof(*linestyle_dst->mtex[a]), __func__);
175 *linestyle_dst->mtex[a] = *linestyle_src->mtex[a];
179 if (linestyle_src->nodetree) {
180 /* Note: nodetree is *not* in bmain, however this specific case is handled at lower level
181 * (see BKE_libblock_copy_ex()). */
182 BKE_id_copy_ex(bmain, (ID *)linestyle_src->nodetree, (ID **)&linestyle_dst->nodetree, flag, false);
185 LineStyleModifier *m;
186 BLI_listbase_clear(&linestyle_dst->color_modifiers);
187 for (m = (LineStyleModifier *)linestyle_src->color_modifiers.first; m; m = m->next) {
188 BKE_linestyle_color_modifier_copy(linestyle_dst, m, flag_subdata);
190 BLI_listbase_clear(&linestyle_dst->alpha_modifiers);
191 for (m = (LineStyleModifier *)linestyle_src->alpha_modifiers.first; m; m = m->next) {
192 BKE_linestyle_alpha_modifier_copy(linestyle_dst, m, flag_subdata);
194 BLI_listbase_clear(&linestyle_dst->thickness_modifiers);
195 for (m = (LineStyleModifier *)linestyle_src->thickness_modifiers.first; m; m = m->next) {
196 BKE_linestyle_thickness_modifier_copy(linestyle_dst, m, flag_subdata);
198 BLI_listbase_clear(&linestyle_dst->geometry_modifiers);
199 for (m = (LineStyleModifier *)linestyle_src->geometry_modifiers.first; m; m = m->next) {
200 BKE_linestyle_geometry_modifier_copy(linestyle_dst, m, flag_subdata);
204 FreestyleLineStyle *BKE_linestyle_copy(struct Main *bmain, const FreestyleLineStyle *linestyle)
206 FreestyleLineStyle *linestyle_copy;
207 BKE_id_copy_ex(bmain, &linestyle->id, (ID **)&linestyle_copy, 0, false);
208 return linestyle_copy;
211 void BKE_linestyle_make_local(struct Main *bmain, FreestyleLineStyle *linestyle, const bool lib_local)
213 BKE_id_make_local_generic(bmain, &linestyle->id, true, lib_local);
216 FreestyleLineStyle *BKE_linestyle_active_from_scene(Scene *scene)
218 SceneRenderLayer *actsrl = BLI_findlink(&scene->r.layers, scene->r.actlay);
223 FreestyleConfig *config = &actsrl->freestyleConfig;
224 FreestyleLineSet *lineset = BKE_freestyle_lineset_get_active(config);
227 return lineset->linestyle;
232 static LineStyleModifier *new_modifier(const char *name, int type, size_t size)
234 LineStyleModifier *m;
237 name = modifier_name[type];
239 m = (LineStyleModifier *)MEM_callocN(size, "line style modifier");
241 BLI_strncpy(m->name, name, sizeof(m->name));
243 m->flags = LS_MODIFIER_ENABLED | LS_MODIFIER_EXPANDED;
248 static void add_to_modifier_list(ListBase *lb, LineStyleModifier *m)
250 BLI_addtail(lb, (void *)m);
251 BLI_uniquename(lb, m, modifier_name[m->type], '.', offsetof(LineStyleModifier, name), sizeof(m->name));
254 static LineStyleModifier *alloc_color_modifier(const char *name, int type)
259 case LS_MODIFIER_ALONG_STROKE:
260 size = sizeof(LineStyleColorModifier_AlongStroke);
262 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
263 size = sizeof(LineStyleColorModifier_DistanceFromCamera);
265 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
266 size = sizeof(LineStyleColorModifier_DistanceFromObject);
268 case LS_MODIFIER_MATERIAL:
269 size = sizeof(LineStyleColorModifier_Material);
271 case LS_MODIFIER_TANGENT:
272 size = sizeof(LineStyleColorModifier_Tangent);
274 case LS_MODIFIER_NOISE:
275 size = sizeof(LineStyleColorModifier_Noise);
277 case LS_MODIFIER_CREASE_ANGLE:
278 size = sizeof(LineStyleColorModifier_CreaseAngle);
280 case LS_MODIFIER_CURVATURE_3D:
281 size = sizeof(LineStyleColorModifier_Curvature_3D);
284 return NULL; /* unknown modifier type */
287 return new_modifier(name, type, size);
290 LineStyleModifier *BKE_linestyle_color_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
292 LineStyleModifier *m;
294 m = alloc_color_modifier(name, type);
295 if (UNLIKELY(m == NULL)) {
298 m->blend = MA_RAMP_BLEND;
301 case LS_MODIFIER_ALONG_STROKE:
302 ((LineStyleColorModifier_AlongStroke *)m)->color_ramp = BKE_colorband_add(true);
304 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
305 ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp = BKE_colorband_add(true);
306 ((LineStyleColorModifier_DistanceFromCamera *)m)->range_min = 0.0f;
307 ((LineStyleColorModifier_DistanceFromCamera *)m)->range_max = 10000.0f;
309 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
310 ((LineStyleColorModifier_DistanceFromObject *)m)->target = NULL;
311 ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp = BKE_colorband_add(true);
312 ((LineStyleColorModifier_DistanceFromObject *)m)->range_min = 0.0f;
313 ((LineStyleColorModifier_DistanceFromObject *)m)->range_max = 10000.0f;
315 case LS_MODIFIER_MATERIAL:
316 ((LineStyleColorModifier_Material *)m)->color_ramp = BKE_colorband_add(true);
317 ((LineStyleColorModifier_Material *)m)->mat_attr = LS_MODIFIER_MATERIAL_LINE;
319 case LS_MODIFIER_TANGENT:
320 ((LineStyleColorModifier_Tangent *)m)->color_ramp = BKE_colorband_add(true);
322 case LS_MODIFIER_NOISE:
323 ((LineStyleColorModifier_Noise *)m)->color_ramp = BKE_colorband_add(true);
324 ((LineStyleColorModifier_Noise *)m)->amplitude = 10.0f;
325 ((LineStyleColorModifier_Noise *)m)->period = 10.0f;
326 ((LineStyleColorModifier_Noise *)m)->seed = 512;
328 case LS_MODIFIER_CREASE_ANGLE:
329 ((LineStyleColorModifier_CreaseAngle *)m)->color_ramp = BKE_colorband_add(true);
330 ((LineStyleColorModifier_CreaseAngle *)m)->min_angle = 0.0f;
331 ((LineStyleColorModifier_CreaseAngle *)m)->max_angle = DEG2RADF(180.0f);
333 case LS_MODIFIER_CURVATURE_3D:
334 ((LineStyleColorModifier_Curvature_3D *)m)->color_ramp = BKE_colorband_add(true);
335 ((LineStyleColorModifier_Curvature_3D *)m)->min_curvature = 0.0f;
336 ((LineStyleColorModifier_Curvature_3D *)m)->max_curvature = 0.5f;
339 return NULL; /* unknown modifier type */
341 add_to_modifier_list(&linestyle->color_modifiers, m);
346 LineStyleModifier *BKE_linestyle_color_modifier_copy(
347 FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int flag)
349 LineStyleModifier *new_m;
351 new_m = alloc_color_modifier(m->name, m->type);
352 if (UNLIKELY(new_m == NULL)) {
355 new_m->influence = m->influence;
356 new_m->flags = m->flags;
357 new_m->blend = m->blend;
360 case LS_MODIFIER_ALONG_STROKE:
362 LineStyleColorModifier_AlongStroke *p = (LineStyleColorModifier_AlongStroke *)m;
363 LineStyleColorModifier_AlongStroke *q = (LineStyleColorModifier_AlongStroke *)new_m;
364 q->color_ramp = MEM_dupallocN(p->color_ramp);
367 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
369 LineStyleColorModifier_DistanceFromCamera *p = (LineStyleColorModifier_DistanceFromCamera *)m;
370 LineStyleColorModifier_DistanceFromCamera *q = (LineStyleColorModifier_DistanceFromCamera *)new_m;
371 q->color_ramp = MEM_dupallocN(p->color_ramp);
372 q->range_min = p->range_min;
373 q->range_max = p->range_max;
376 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
378 LineStyleColorModifier_DistanceFromObject *p = (LineStyleColorModifier_DistanceFromObject *)m;
379 LineStyleColorModifier_DistanceFromObject *q = (LineStyleColorModifier_DistanceFromObject *)new_m;
380 q->target = p->target;
381 if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
382 id_us_plus((ID *)q->target);
384 q->color_ramp = MEM_dupallocN(p->color_ramp);
385 q->range_min = p->range_min;
386 q->range_max = p->range_max;
389 case LS_MODIFIER_MATERIAL:
391 LineStyleColorModifier_Material *p = (LineStyleColorModifier_Material *)m;
392 LineStyleColorModifier_Material *q = (LineStyleColorModifier_Material *)new_m;
393 q->color_ramp = MEM_dupallocN(p->color_ramp);
395 q->mat_attr = p->mat_attr;
398 case LS_MODIFIER_TANGENT:
400 LineStyleColorModifier_Tangent *p = (LineStyleColorModifier_Tangent *)m;
401 LineStyleColorModifier_Tangent *q = (LineStyleColorModifier_Tangent *)new_m;
402 q->color_ramp = MEM_dupallocN(p->color_ramp);
405 case LS_MODIFIER_NOISE:
407 LineStyleColorModifier_Noise *p = (LineStyleColorModifier_Noise *)m;
408 LineStyleColorModifier_Noise *q = (LineStyleColorModifier_Noise *)new_m;
409 q->color_ramp = MEM_dupallocN(p->color_ramp);
410 q->amplitude = p->amplitude;
411 q->period = p->period;
415 case LS_MODIFIER_CREASE_ANGLE:
417 LineStyleColorModifier_CreaseAngle *p = (LineStyleColorModifier_CreaseAngle *)m;
418 LineStyleColorModifier_CreaseAngle *q = (LineStyleColorModifier_CreaseAngle *)new_m;
419 q->color_ramp = MEM_dupallocN(p->color_ramp);
420 q->min_angle = p->min_angle;
421 q->max_angle = p->max_angle;
424 case LS_MODIFIER_CURVATURE_3D:
426 LineStyleColorModifier_Curvature_3D *p = (LineStyleColorModifier_Curvature_3D *)m;
427 LineStyleColorModifier_Curvature_3D *q = (LineStyleColorModifier_Curvature_3D *)new_m;
428 q->color_ramp = MEM_dupallocN(p->color_ramp);
429 q->min_curvature = p->min_curvature;
430 q->max_curvature = p->max_curvature;
434 return NULL; /* unknown modifier type */
436 add_to_modifier_list(&linestyle->color_modifiers, new_m);
441 int BKE_linestyle_color_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
443 if (BLI_findindex(&linestyle->color_modifiers, m) == -1)
446 case LS_MODIFIER_ALONG_STROKE:
447 MEM_freeN(((LineStyleColorModifier_AlongStroke *)m)->color_ramp);
449 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
450 MEM_freeN(((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp);
452 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
453 MEM_freeN(((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp);
455 case LS_MODIFIER_MATERIAL:
456 MEM_freeN(((LineStyleColorModifier_Material *)m)->color_ramp);
458 case LS_MODIFIER_TANGENT:
459 MEM_freeN(((LineStyleColorModifier_Tangent *)m)->color_ramp);
461 case LS_MODIFIER_NOISE:
462 MEM_freeN(((LineStyleColorModifier_Noise *)m)->color_ramp);
464 case LS_MODIFIER_CREASE_ANGLE:
465 MEM_freeN(((LineStyleColorModifier_CreaseAngle *)m)->color_ramp);
467 case LS_MODIFIER_CURVATURE_3D:
468 MEM_freeN(((LineStyleColorModifier_Curvature_3D *)m)->color_ramp);
471 BLI_freelinkN(&linestyle->color_modifiers, m);
475 static LineStyleModifier *alloc_alpha_modifier(const char *name, int type)
480 case LS_MODIFIER_ALONG_STROKE:
481 size = sizeof(LineStyleAlphaModifier_AlongStroke);
483 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
484 size = sizeof(LineStyleAlphaModifier_DistanceFromCamera);
486 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
487 size = sizeof(LineStyleAlphaModifier_DistanceFromObject);
489 case LS_MODIFIER_MATERIAL:
490 size = sizeof(LineStyleAlphaModifier_Material);
492 case LS_MODIFIER_TANGENT:
493 size = sizeof(LineStyleAlphaModifier_Tangent);
495 case LS_MODIFIER_NOISE:
496 size = sizeof(LineStyleAlphaModifier_Noise);
498 case LS_MODIFIER_CREASE_ANGLE:
499 size = sizeof(LineStyleAlphaModifier_CreaseAngle);
501 case LS_MODIFIER_CURVATURE_3D:
502 size = sizeof(LineStyleAlphaModifier_Curvature_3D);
505 return NULL; /* unknown modifier type */
507 return new_modifier(name, type, size);
510 LineStyleModifier *BKE_linestyle_alpha_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
512 LineStyleModifier *m;
514 m = alloc_alpha_modifier(name, type);
515 m->blend = LS_VALUE_BLEND;
518 case LS_MODIFIER_ALONG_STROKE:
520 LineStyleAlphaModifier_AlongStroke *p = (LineStyleAlphaModifier_AlongStroke *)m;
521 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
524 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
526 LineStyleAlphaModifier_DistanceFromCamera *p = (LineStyleAlphaModifier_DistanceFromCamera *)m;
527 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
529 p->range_max = 10000.0f;
532 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
534 LineStyleAlphaModifier_DistanceFromObject *p = (LineStyleAlphaModifier_DistanceFromObject *)m;
536 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
538 p->range_max = 10000.0f;
541 case LS_MODIFIER_MATERIAL:
543 LineStyleAlphaModifier_Material *p = (LineStyleAlphaModifier_Material *)m;
544 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
545 p->mat_attr = LS_MODIFIER_MATERIAL_LINE_A;
548 case LS_MODIFIER_TANGENT:
550 LineStyleAlphaModifier_Tangent *p = (LineStyleAlphaModifier_Tangent *)m;
551 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
554 case LS_MODIFIER_NOISE:
556 LineStyleAlphaModifier_Noise *p = (LineStyleAlphaModifier_Noise *)m;
557 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
558 ((LineStyleAlphaModifier_Noise *)m)->amplitude = 10.0f;
559 ((LineStyleAlphaModifier_Noise *)m)->period = 10.0f;
560 ((LineStyleAlphaModifier_Noise *)m)->seed = 512;
563 case LS_MODIFIER_CREASE_ANGLE:
565 LineStyleAlphaModifier_CreaseAngle *p = (LineStyleAlphaModifier_CreaseAngle *)m;
566 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
567 ((LineStyleAlphaModifier_CreaseAngle *)m)->min_angle = 0.0f;
568 ((LineStyleAlphaModifier_CreaseAngle *)m)->max_angle = DEG2RADF(180.0f);
571 case LS_MODIFIER_CURVATURE_3D:
573 LineStyleAlphaModifier_Curvature_3D *p = (LineStyleAlphaModifier_Curvature_3D *)m;
574 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
575 ((LineStyleAlphaModifier_Curvature_3D *)m)->min_curvature = 0.0f;
576 ((LineStyleAlphaModifier_Curvature_3D *)m)->max_curvature = 0.5f;
580 return NULL; /* unknown modifier type */
582 add_to_modifier_list(&linestyle->alpha_modifiers, m);
587 LineStyleModifier *BKE_linestyle_alpha_modifier_copy(
588 FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int UNUSED(flag))
590 LineStyleModifier *new_m;
592 new_m = alloc_alpha_modifier(m->name, m->type);
593 new_m->influence = m->influence;
594 new_m->flags = m->flags;
595 new_m->blend = m->blend;
598 case LS_MODIFIER_ALONG_STROKE:
600 LineStyleAlphaModifier_AlongStroke *p = (LineStyleAlphaModifier_AlongStroke *)m;
601 LineStyleAlphaModifier_AlongStroke *q = (LineStyleAlphaModifier_AlongStroke *)new_m;
602 q->curve = curvemapping_copy(p->curve);
606 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
608 LineStyleAlphaModifier_DistanceFromCamera *p = (LineStyleAlphaModifier_DistanceFromCamera *)m;
609 LineStyleAlphaModifier_DistanceFromCamera *q = (LineStyleAlphaModifier_DistanceFromCamera *)new_m;
610 q->curve = curvemapping_copy(p->curve);
612 q->range_min = p->range_min;
613 q->range_max = p->range_max;
616 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
618 LineStyleAlphaModifier_DistanceFromObject *p = (LineStyleAlphaModifier_DistanceFromObject *)m;
619 LineStyleAlphaModifier_DistanceFromObject *q = (LineStyleAlphaModifier_DistanceFromObject *)new_m;
621 id_us_plus(&p->target->id);
622 q->target = p->target;
623 q->curve = curvemapping_copy(p->curve);
625 q->range_min = p->range_min;
626 q->range_max = p->range_max;
629 case LS_MODIFIER_MATERIAL:
631 LineStyleAlphaModifier_Material *p = (LineStyleAlphaModifier_Material *)m;
632 LineStyleAlphaModifier_Material *q = (LineStyleAlphaModifier_Material *)new_m;
633 q->curve = curvemapping_copy(p->curve);
635 q->mat_attr = p->mat_attr;
638 case LS_MODIFIER_TANGENT:
640 LineStyleAlphaModifier_Tangent *p = (LineStyleAlphaModifier_Tangent *)m;
641 LineStyleAlphaModifier_Tangent *q = (LineStyleAlphaModifier_Tangent *)new_m;
642 q->curve = curvemapping_copy(p->curve);
646 case LS_MODIFIER_NOISE:
648 LineStyleAlphaModifier_Noise *p = (LineStyleAlphaModifier_Noise *)m;
649 LineStyleAlphaModifier_Noise *q = (LineStyleAlphaModifier_Noise *)new_m;
650 q->curve = curvemapping_copy(p->curve);
652 q->amplitude = p->amplitude;
653 q->period = p->period;
657 case LS_MODIFIER_CREASE_ANGLE:
659 LineStyleAlphaModifier_CreaseAngle *p = (LineStyleAlphaModifier_CreaseAngle *)m;
660 LineStyleAlphaModifier_CreaseAngle *q = (LineStyleAlphaModifier_CreaseAngle *)new_m;
661 q->curve = curvemapping_copy(p->curve);
663 q->min_angle = p->min_angle;
664 q->max_angle = p->max_angle;
667 case LS_MODIFIER_CURVATURE_3D:
669 LineStyleAlphaModifier_Curvature_3D *p = (LineStyleAlphaModifier_Curvature_3D *)m;
670 LineStyleAlphaModifier_Curvature_3D *q = (LineStyleAlphaModifier_Curvature_3D *)new_m;
671 q->curve = curvemapping_copy(p->curve);
673 q->min_curvature = p->min_curvature;
674 q->max_curvature = p->max_curvature;
678 return NULL; /* unknown modifier type */
680 add_to_modifier_list(&linestyle->alpha_modifiers, new_m);
685 int BKE_linestyle_alpha_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
687 if (BLI_findindex(&linestyle->alpha_modifiers, m) == -1)
690 case LS_MODIFIER_ALONG_STROKE:
691 curvemapping_free(((LineStyleAlphaModifier_AlongStroke *)m)->curve);
693 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
694 curvemapping_free(((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve);
696 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
697 curvemapping_free(((LineStyleAlphaModifier_DistanceFromObject *)m)->curve);
699 case LS_MODIFIER_MATERIAL:
700 curvemapping_free(((LineStyleAlphaModifier_Material *)m)->curve);
702 case LS_MODIFIER_TANGENT:
703 curvemapping_free(((LineStyleAlphaModifier_Tangent *)m)->curve);
705 case LS_MODIFIER_NOISE:
706 curvemapping_free(((LineStyleAlphaModifier_Noise *)m)->curve);
708 case LS_MODIFIER_CREASE_ANGLE:
709 curvemapping_free(((LineStyleAlphaModifier_CreaseAngle *)m)->curve);
711 case LS_MODIFIER_CURVATURE_3D:
712 curvemapping_free(((LineStyleAlphaModifier_Curvature_3D *)m)->curve);
715 BLI_freelinkN(&linestyle->alpha_modifiers, m);
719 static LineStyleModifier *alloc_thickness_modifier(const char *name, int type)
724 case LS_MODIFIER_ALONG_STROKE:
725 size = sizeof(LineStyleThicknessModifier_AlongStroke);
727 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
728 size = sizeof(LineStyleThicknessModifier_DistanceFromCamera);
730 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
731 size = sizeof(LineStyleThicknessModifier_DistanceFromObject);
733 case LS_MODIFIER_MATERIAL:
734 size = sizeof(LineStyleThicknessModifier_Material);
736 case LS_MODIFIER_CALLIGRAPHY:
737 size = sizeof(LineStyleThicknessModifier_Calligraphy);
739 case LS_MODIFIER_TANGENT:
740 size = sizeof(LineStyleThicknessModifier_Tangent);
742 case LS_MODIFIER_NOISE:
743 size = sizeof(LineStyleThicknessModifier_Noise);
745 case LS_MODIFIER_CREASE_ANGLE:
746 size = sizeof(LineStyleThicknessModifier_CreaseAngle);
748 case LS_MODIFIER_CURVATURE_3D:
749 size = sizeof(LineStyleThicknessModifier_Curvature_3D);
752 return NULL; /* unknown modifier type */
755 return new_modifier(name, type, size);
758 LineStyleModifier *BKE_linestyle_thickness_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
760 LineStyleModifier *m;
762 m = alloc_thickness_modifier(name, type);
763 m->blend = LS_VALUE_BLEND;
766 case LS_MODIFIER_ALONG_STROKE:
768 LineStyleThicknessModifier_AlongStroke *p = (LineStyleThicknessModifier_AlongStroke *)m;
769 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
774 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
776 LineStyleThicknessModifier_DistanceFromCamera *p = (LineStyleThicknessModifier_DistanceFromCamera *)m;
777 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
779 p->range_max = 1000.0f;
784 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
786 LineStyleThicknessModifier_DistanceFromObject *p = (LineStyleThicknessModifier_DistanceFromObject *)m;
788 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
790 p->range_max = 1000.0f;
795 case LS_MODIFIER_MATERIAL:
797 LineStyleThicknessModifier_Material *p = (LineStyleThicknessModifier_Material *)m;
798 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
799 p->mat_attr = LS_MODIFIER_MATERIAL_LINE;
804 case LS_MODIFIER_CALLIGRAPHY:
806 LineStyleThicknessModifier_Calligraphy *p = (LineStyleThicknessModifier_Calligraphy *)m;
807 p->min_thickness = 1.0f;
808 p->max_thickness = 10.0f;
809 p->orientation = DEG2RADF(60.0f);
812 case LS_MODIFIER_TANGENT:
814 LineStyleThicknessModifier_Tangent *p = (LineStyleThicknessModifier_Tangent *)m;
815 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
816 p->min_thickness = 1.0f;
817 p->max_thickness = 10.0f;
820 case LS_MODIFIER_NOISE:
822 LineStyleThicknessModifier_Noise *p = (LineStyleThicknessModifier_Noise *)m;
824 p->amplitude = 10.0f;
826 p->flags = LS_THICKNESS_ASYMMETRIC;
829 case LS_MODIFIER_CREASE_ANGLE:
831 LineStyleThicknessModifier_CreaseAngle *p = (LineStyleThicknessModifier_CreaseAngle *)m;
832 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
834 p->max_angle = DEG2RADF(180.0f);
835 p->min_thickness = 1.0f;
836 p->max_thickness = 10.0f;
839 case LS_MODIFIER_CURVATURE_3D:
841 LineStyleThicknessModifier_Curvature_3D *p = (LineStyleThicknessModifier_Curvature_3D *)m;
842 p->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
843 p->min_curvature = 0.0f;
844 p->max_curvature = 0.5f;
845 p->min_thickness = 1.0f;
846 p->max_thickness = 10.0f;
850 return NULL; /* unknown modifier type */
852 add_to_modifier_list(&linestyle->thickness_modifiers, m);
857 LineStyleModifier *BKE_linestyle_thickness_modifier_copy(
858 FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int flag)
860 LineStyleModifier *new_m;
862 new_m = alloc_thickness_modifier(m->name, m->type);
865 new_m->influence = m->influence;
866 new_m->flags = m->flags;
867 new_m->blend = m->blend;
870 case LS_MODIFIER_ALONG_STROKE:
872 LineStyleThicknessModifier_AlongStroke *p = (LineStyleThicknessModifier_AlongStroke *)m;
873 LineStyleThicknessModifier_AlongStroke *q = (LineStyleThicknessModifier_AlongStroke *)new_m;
874 q->curve = curvemapping_copy(p->curve);
876 q->value_min = p->value_min;
877 q->value_max = p->value_max;
880 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
882 LineStyleThicknessModifier_DistanceFromCamera *p = (LineStyleThicknessModifier_DistanceFromCamera *)m;
883 LineStyleThicknessModifier_DistanceFromCamera *q = (LineStyleThicknessModifier_DistanceFromCamera *)new_m;
884 q->curve = curvemapping_copy(p->curve);
886 q->range_min = p->range_min;
887 q->range_max = p->range_max;
888 q->value_min = p->value_min;
889 q->value_max = p->value_max;
892 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
894 LineStyleThicknessModifier_DistanceFromObject *p = (LineStyleThicknessModifier_DistanceFromObject *)m;
895 LineStyleThicknessModifier_DistanceFromObject *q = (LineStyleThicknessModifier_DistanceFromObject *)new_m;
896 q->target = p->target;
897 if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
898 id_us_plus((ID *)q->target);
900 q->curve = curvemapping_copy(p->curve);
902 q->range_min = p->range_min;
903 q->range_max = p->range_max;
904 q->value_min = p->value_min;
905 q->value_max = p->value_max;
908 case LS_MODIFIER_MATERIAL:
910 LineStyleThicknessModifier_Material *p = (LineStyleThicknessModifier_Material *)m;
911 LineStyleThicknessModifier_Material *q = (LineStyleThicknessModifier_Material *)new_m;
912 q->curve = curvemapping_copy(p->curve);
914 q->mat_attr = p->mat_attr;
915 q->value_min = p->value_min;
916 q->value_max = p->value_max;
919 case LS_MODIFIER_CALLIGRAPHY:
921 LineStyleThicknessModifier_Calligraphy *p = (LineStyleThicknessModifier_Calligraphy *)m;
922 LineStyleThicknessModifier_Calligraphy *q = (LineStyleThicknessModifier_Calligraphy *)new_m;
923 q->min_thickness = p->min_thickness;
924 q->max_thickness = p->max_thickness;
925 q->orientation = p->orientation;
928 case LS_MODIFIER_TANGENT:
930 LineStyleThicknessModifier_Tangent *p = (LineStyleThicknessModifier_Tangent *)m;
931 LineStyleThicknessModifier_Tangent *q = (LineStyleThicknessModifier_Tangent *)new_m;
932 q->curve = curvemapping_copy(p->curve);
934 q->min_thickness = p->min_thickness;
935 q->max_thickness = p->max_thickness;
938 case LS_MODIFIER_NOISE:
940 LineStyleThicknessModifier_Noise *p = (LineStyleThicknessModifier_Noise *)m;
941 LineStyleThicknessModifier_Noise *q = (LineStyleThicknessModifier_Noise *)new_m;
942 q->amplitude = p->amplitude;
943 q->period = p->period;
948 case LS_MODIFIER_CURVATURE_3D:
950 LineStyleThicknessModifier_Curvature_3D *p = (LineStyleThicknessModifier_Curvature_3D *)m;
951 LineStyleThicknessModifier_Curvature_3D *q = (LineStyleThicknessModifier_Curvature_3D *)new_m;
952 q->curve = curvemapping_copy(p->curve);
954 q->min_curvature = p->min_curvature;
955 q->max_curvature = p->max_curvature;
956 q->min_thickness = p->min_thickness;
957 q->max_thickness = p->max_thickness;
960 case LS_MODIFIER_CREASE_ANGLE:
962 LineStyleThicknessModifier_CreaseAngle *p = (LineStyleThicknessModifier_CreaseAngle *)m;
963 LineStyleThicknessModifier_CreaseAngle *q = (LineStyleThicknessModifier_CreaseAngle *)new_m;
964 q->curve = curvemapping_copy(p->curve);
966 q->min_angle = p->min_angle;
967 q->max_angle = p->max_angle;
968 q->min_thickness = p->min_thickness;
969 q->max_thickness = p->max_thickness;
973 return NULL; /* unknown modifier type */
975 add_to_modifier_list(&linestyle->thickness_modifiers, new_m);
980 int BKE_linestyle_thickness_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
982 if (BLI_findindex(&linestyle->thickness_modifiers, m) == -1)
985 case LS_MODIFIER_ALONG_STROKE:
986 curvemapping_free(((LineStyleThicknessModifier_AlongStroke *)m)->curve);
988 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
989 curvemapping_free(((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve);
991 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
992 curvemapping_free(((LineStyleThicknessModifier_DistanceFromObject *)m)->curve);
994 case LS_MODIFIER_MATERIAL:
995 curvemapping_free(((LineStyleThicknessModifier_Material *)m)->curve);
997 case LS_MODIFIER_CALLIGRAPHY:
999 case LS_MODIFIER_TANGENT:
1000 curvemapping_free(((LineStyleThicknessModifier_Tangent *)m)->curve);
1002 case LS_MODIFIER_NOISE:
1004 case LS_MODIFIER_CREASE_ANGLE:
1006 case LS_MODIFIER_CURVATURE_3D:
1009 BLI_freelinkN(&linestyle->thickness_modifiers, m);
1013 static LineStyleModifier *alloc_geometry_modifier(const char *name, int type)
1018 case LS_MODIFIER_SAMPLING:
1019 size = sizeof(LineStyleGeometryModifier_Sampling);
1021 case LS_MODIFIER_BEZIER_CURVE:
1022 size = sizeof(LineStyleGeometryModifier_BezierCurve);
1024 case LS_MODIFIER_SINUS_DISPLACEMENT:
1025 size = sizeof(LineStyleGeometryModifier_SinusDisplacement);
1027 case LS_MODIFIER_SPATIAL_NOISE:
1028 size = sizeof(LineStyleGeometryModifier_SpatialNoise);
1030 case LS_MODIFIER_PERLIN_NOISE_1D:
1031 size = sizeof(LineStyleGeometryModifier_PerlinNoise1D);
1033 case LS_MODIFIER_PERLIN_NOISE_2D:
1034 size = sizeof(LineStyleGeometryModifier_PerlinNoise2D);
1036 case LS_MODIFIER_BACKBONE_STRETCHER:
1037 size = sizeof(LineStyleGeometryModifier_BackboneStretcher);
1039 case LS_MODIFIER_TIP_REMOVER:
1040 size = sizeof(LineStyleGeometryModifier_TipRemover);
1042 case LS_MODIFIER_POLYGONIZATION:
1043 size = sizeof(LineStyleGeometryModifier_Polygonalization);
1045 case LS_MODIFIER_GUIDING_LINES:
1046 size = sizeof(LineStyleGeometryModifier_GuidingLines);
1048 case LS_MODIFIER_BLUEPRINT:
1049 size = sizeof(LineStyleGeometryModifier_Blueprint);
1051 case LS_MODIFIER_2D_OFFSET:
1052 size = sizeof(LineStyleGeometryModifier_2DOffset);
1054 case LS_MODIFIER_2D_TRANSFORM:
1055 size = sizeof(LineStyleGeometryModifier_2DTransform);
1057 case LS_MODIFIER_SIMPLIFICATION:
1058 size = sizeof(LineStyleGeometryModifier_Simplification);
1061 return NULL; /* unknown modifier type */
1064 return new_modifier(name, type, size);
1067 LineStyleModifier *BKE_linestyle_geometry_modifier_add(FreestyleLineStyle *linestyle, const char *name, int type)
1069 LineStyleModifier *m;
1071 m = alloc_geometry_modifier(name, type);
1074 case LS_MODIFIER_SAMPLING:
1076 LineStyleGeometryModifier_Sampling *p = (LineStyleGeometryModifier_Sampling *)m;
1077 p->sampling = 10.0f;
1080 case LS_MODIFIER_BEZIER_CURVE:
1082 LineStyleGeometryModifier_BezierCurve *p = (LineStyleGeometryModifier_BezierCurve *)m;
1086 case LS_MODIFIER_SINUS_DISPLACEMENT:
1088 LineStyleGeometryModifier_SinusDisplacement *p = (LineStyleGeometryModifier_SinusDisplacement *)m;
1089 p->wavelength = 20.0f;
1090 p->amplitude = 5.0f;
1094 case LS_MODIFIER_SPATIAL_NOISE:
1096 LineStyleGeometryModifier_SpatialNoise *p = (LineStyleGeometryModifier_SpatialNoise *)m;
1097 p->amplitude = 5.0f;
1100 p->flags = LS_MODIFIER_SPATIAL_NOISE_SMOOTH | LS_MODIFIER_SPATIAL_NOISE_PURERANDOM;
1103 case LS_MODIFIER_PERLIN_NOISE_1D:
1105 LineStyleGeometryModifier_PerlinNoise1D *p = (LineStyleGeometryModifier_PerlinNoise1D *)m;
1106 p->frequency = 10.0f;
1107 p->amplitude = 10.0f;
1109 p->angle = DEG2RADF(45.0f);
1112 case LS_MODIFIER_PERLIN_NOISE_2D:
1114 LineStyleGeometryModifier_PerlinNoise2D *p = (LineStyleGeometryModifier_PerlinNoise2D *)m;
1115 p->frequency = 10.0f;
1116 p->amplitude = 10.0f;
1118 p->angle = DEG2RADF(45.0f);
1121 case LS_MODIFIER_BACKBONE_STRETCHER:
1123 LineStyleGeometryModifier_BackboneStretcher *p = (LineStyleGeometryModifier_BackboneStretcher *)m;
1124 p->backbone_length = 10.0f;
1127 case LS_MODIFIER_TIP_REMOVER:
1129 LineStyleGeometryModifier_TipRemover *p = (LineStyleGeometryModifier_TipRemover *)m;
1130 p->tip_length = 10.0f;
1133 case LS_MODIFIER_POLYGONIZATION:
1135 LineStyleGeometryModifier_Polygonalization *p = (LineStyleGeometryModifier_Polygonalization *)m;
1139 case LS_MODIFIER_GUIDING_LINES:
1141 LineStyleGeometryModifier_GuidingLines *p = (LineStyleGeometryModifier_GuidingLines *)m;
1145 case LS_MODIFIER_BLUEPRINT:
1147 LineStyleGeometryModifier_Blueprint *p = (LineStyleGeometryModifier_Blueprint *)m;
1148 p->flags = LS_MODIFIER_BLUEPRINT_CIRCLES;
1150 p->backbone_length = 10.0f;
1151 p->random_radius = 3;
1152 p->random_center = 5;
1153 p->random_backbone = 5;
1156 case LS_MODIFIER_2D_OFFSET:
1158 LineStyleGeometryModifier_2DOffset *p = (LineStyleGeometryModifier_2DOffset *)m;
1165 case LS_MODIFIER_2D_TRANSFORM:
1167 LineStyleGeometryModifier_2DTransform *p = (LineStyleGeometryModifier_2DTransform *)m;
1168 p->pivot = LS_MODIFIER_2D_TRANSFORM_PIVOT_CENTER;
1171 p->angle = DEG2RADF(0.0f);
1177 case LS_MODIFIER_SIMPLIFICATION:
1179 LineStyleGeometryModifier_Simplification *p = (LineStyleGeometryModifier_Simplification *)m;
1180 p->tolerance = 0.1f;
1184 return NULL; /* unknown modifier type */
1186 add_to_modifier_list(&linestyle->geometry_modifiers, m);
1191 LineStyleModifier *BKE_linestyle_geometry_modifier_copy(
1192 FreestyleLineStyle *linestyle, const LineStyleModifier *m, const int UNUSED(flag))
1194 LineStyleModifier *new_m;
1196 new_m = alloc_geometry_modifier(m->name, m->type);
1197 new_m->flags = m->flags;
1200 case LS_MODIFIER_SAMPLING:
1202 LineStyleGeometryModifier_Sampling *p = (LineStyleGeometryModifier_Sampling *)m;
1203 LineStyleGeometryModifier_Sampling *q = (LineStyleGeometryModifier_Sampling *)new_m;
1204 q->sampling = p->sampling;
1207 case LS_MODIFIER_BEZIER_CURVE:
1209 LineStyleGeometryModifier_BezierCurve *p = (LineStyleGeometryModifier_BezierCurve *)m;
1210 LineStyleGeometryModifier_BezierCurve *q = (LineStyleGeometryModifier_BezierCurve *)new_m;
1211 q->error = p->error;
1214 case LS_MODIFIER_SINUS_DISPLACEMENT:
1216 LineStyleGeometryModifier_SinusDisplacement *p = (LineStyleGeometryModifier_SinusDisplacement *)m;
1217 LineStyleGeometryModifier_SinusDisplacement *q = (LineStyleGeometryModifier_SinusDisplacement *)new_m;
1218 q->wavelength = p->wavelength;
1219 q->amplitude = p->amplitude;
1220 q->phase = p->phase;
1223 case LS_MODIFIER_SPATIAL_NOISE:
1225 LineStyleGeometryModifier_SpatialNoise *p = (LineStyleGeometryModifier_SpatialNoise *)m;
1226 LineStyleGeometryModifier_SpatialNoise *q = (LineStyleGeometryModifier_SpatialNoise *)new_m;
1227 q->amplitude = p->amplitude;
1228 q->scale = p->scale;
1229 q->octaves = p->octaves;
1230 q->flags = p->flags;
1233 case LS_MODIFIER_PERLIN_NOISE_1D:
1235 LineStyleGeometryModifier_PerlinNoise1D *p = (LineStyleGeometryModifier_PerlinNoise1D *)m;
1236 LineStyleGeometryModifier_PerlinNoise1D *q = (LineStyleGeometryModifier_PerlinNoise1D *)new_m;
1237 q->frequency = p->frequency;
1238 q->amplitude = p->amplitude;
1239 q->angle = p->angle;
1240 q->octaves = p->octaves;
1244 case LS_MODIFIER_PERLIN_NOISE_2D:
1246 LineStyleGeometryModifier_PerlinNoise2D *p = (LineStyleGeometryModifier_PerlinNoise2D *)m;
1247 LineStyleGeometryModifier_PerlinNoise2D *q = (LineStyleGeometryModifier_PerlinNoise2D *)new_m;
1248 q->frequency = p->frequency;
1249 q->amplitude = p->amplitude;
1250 q->angle = p->angle;
1251 q->octaves = p->octaves;
1255 case LS_MODIFIER_BACKBONE_STRETCHER:
1257 LineStyleGeometryModifier_BackboneStretcher *p = (LineStyleGeometryModifier_BackboneStretcher *)m;
1258 LineStyleGeometryModifier_BackboneStretcher *q = (LineStyleGeometryModifier_BackboneStretcher *)new_m;
1259 q->backbone_length = p->backbone_length;
1262 case LS_MODIFIER_TIP_REMOVER:
1264 LineStyleGeometryModifier_TipRemover *p = (LineStyleGeometryModifier_TipRemover *)m;
1265 LineStyleGeometryModifier_TipRemover *q = (LineStyleGeometryModifier_TipRemover *)new_m;
1266 q->tip_length = p->tip_length;
1269 case LS_MODIFIER_POLYGONIZATION:
1271 LineStyleGeometryModifier_Polygonalization *p = (LineStyleGeometryModifier_Polygonalization *)m;
1272 LineStyleGeometryModifier_Polygonalization *q = (LineStyleGeometryModifier_Polygonalization *)new_m;
1273 q->error = p->error;
1276 case LS_MODIFIER_GUIDING_LINES:
1278 LineStyleGeometryModifier_GuidingLines *p = (LineStyleGeometryModifier_GuidingLines *)m;
1279 LineStyleGeometryModifier_GuidingLines *q = (LineStyleGeometryModifier_GuidingLines *)new_m;
1280 q->offset = p->offset;
1283 case LS_MODIFIER_BLUEPRINT:
1285 LineStyleGeometryModifier_Blueprint *p = (LineStyleGeometryModifier_Blueprint *)m;
1286 LineStyleGeometryModifier_Blueprint *q = (LineStyleGeometryModifier_Blueprint *)new_m;
1287 q->flags = p->flags;
1288 q->rounds = p->rounds;
1289 q->backbone_length = p->backbone_length;
1290 q->random_radius = p->random_radius;
1291 q->random_center = p->random_center;
1292 q->random_backbone = p->random_backbone;
1295 case LS_MODIFIER_2D_OFFSET:
1297 LineStyleGeometryModifier_2DOffset *p = (LineStyleGeometryModifier_2DOffset *)m;
1298 LineStyleGeometryModifier_2DOffset *q = (LineStyleGeometryModifier_2DOffset *)new_m;
1299 q->start = p->start;
1305 case LS_MODIFIER_2D_TRANSFORM:
1307 LineStyleGeometryModifier_2DTransform *p = (LineStyleGeometryModifier_2DTransform *)m;
1308 LineStyleGeometryModifier_2DTransform *q = (LineStyleGeometryModifier_2DTransform *)new_m;
1309 q->pivot = p->pivot;
1310 q->scale_x = p->scale_x;
1311 q->scale_y = p->scale_y;
1312 q->angle = p->angle;
1313 q->pivot_u = p->pivot_u;
1314 q->pivot_x = p->pivot_x;
1315 q->pivot_y = p->pivot_y;
1318 case LS_MODIFIER_SIMPLIFICATION:
1320 LineStyleGeometryModifier_Simplification *p = (LineStyleGeometryModifier_Simplification *)m;
1321 LineStyleGeometryModifier_Simplification *q = (LineStyleGeometryModifier_Simplification *)new_m;
1322 q->tolerance = p->tolerance;
1326 return NULL; /* unknown modifier type */
1328 add_to_modifier_list(&linestyle->geometry_modifiers, new_m);
1333 int BKE_linestyle_geometry_modifier_remove(FreestyleLineStyle *linestyle, LineStyleModifier *m)
1335 if (BLI_findindex(&linestyle->geometry_modifiers, m) == -1)
1337 BLI_freelinkN(&linestyle->geometry_modifiers, m);
1342 * Reinsert \a modifier in modifier list with an offset of \a direction.
1343 * \return if position of \a modifier has changed.
1345 bool BKE_linestyle_color_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
1347 return BLI_listbase_link_move(&linestyle->color_modifiers, modifier, direction);
1349 bool BKE_linestyle_alpha_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
1351 return BLI_listbase_link_move(&linestyle->alpha_modifiers, modifier, direction);
1353 bool BKE_linestyle_thickness_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
1355 return BLI_listbase_link_move(&linestyle->thickness_modifiers, modifier, direction);
1357 bool BKE_linestyle_geometry_modifier_move(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
1359 return BLI_listbase_link_move(&linestyle->geometry_modifiers, modifier, direction);
1362 void BKE_linestyle_modifier_list_color_ramps(FreestyleLineStyle *linestyle, ListBase *listbase)
1364 LineStyleModifier *m;
1365 ColorBand *color_ramp;
1368 BLI_listbase_clear(listbase);
1370 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
1372 case LS_MODIFIER_ALONG_STROKE:
1373 color_ramp = ((LineStyleColorModifier_AlongStroke *)m)->color_ramp;
1375 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
1376 color_ramp = ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp;
1378 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
1379 color_ramp = ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp;
1381 case LS_MODIFIER_MATERIAL:
1382 color_ramp = ((LineStyleColorModifier_Material *)m)->color_ramp;
1387 link = (LinkData *) MEM_callocN(sizeof(LinkData), "link to color ramp");
1388 link->data = color_ramp;
1389 BLI_addtail(listbase, link);
1393 char *BKE_linestyle_path_to_color_ramp(FreestyleLineStyle *linestyle, ColorBand *color_ramp)
1395 LineStyleModifier *m;
1398 for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
1400 case LS_MODIFIER_ALONG_STROKE:
1401 if (color_ramp == ((LineStyleColorModifier_AlongStroke *)m)->color_ramp)
1404 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
1405 if (color_ramp == ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp)
1408 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
1409 if (color_ramp == ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp)
1412 case LS_MODIFIER_MATERIAL:
1413 if (color_ramp == ((LineStyleColorModifier_Material *)m)->color_ramp)
1416 case LS_MODIFIER_TANGENT:
1417 if (color_ramp == ((LineStyleColorModifier_Tangent *)m)->color_ramp)
1420 case LS_MODIFIER_NOISE:
1421 if (color_ramp == ((LineStyleColorModifier_Noise *)m)->color_ramp)
1424 case LS_MODIFIER_CREASE_ANGLE:
1425 if (color_ramp == ((LineStyleColorModifier_CreaseAngle *)m)->color_ramp)
1428 case LS_MODIFIER_CURVATURE_3D:
1429 if (color_ramp == ((LineStyleColorModifier_Curvature_3D *)m)->color_ramp)
1435 char name_esc[sizeof(m->name) * 2];
1436 BLI_strescape(name_esc, m->name, sizeof(name_esc));
1437 return BLI_sprintfN("color_modifiers[\"%s\"].color_ramp", name_esc);
1440 printf("BKE_linestyle_path_to_color_ramp: No color ramps correspond to the given pointer.\n");
1444 bool BKE_linestyle_use_textures(FreestyleLineStyle *linestyle, const bool use_shading_nodes)
1446 if (use_shading_nodes) {
1447 if (linestyle && linestyle->use_nodes && linestyle->nodetree) {
1450 for (node = linestyle->nodetree->nodes.first; node; node = node->next) {
1451 if (node->typeinfo->nclass == NODE_CLASS_TEXTURE) {
1458 if (linestyle && (linestyle->flag & LS_TEXTURE)) {
1459 return (linestyle->mtex[0] != NULL);
1465 void BKE_linestyle_default_shader(const bContext *C, FreestyleLineStyle *linestyle)
1467 bNode *uv_along_stroke, *input_texure, *output_linestyle;
1468 bNodeSocket *fromsock, *tosock;
1471 BLI_assert(linestyle->nodetree == NULL);
1473 ntree = ntreeAddTree(NULL, "stroke_shader", "ShaderNodeTree");
1475 linestyle->nodetree = ntree;
1477 uv_along_stroke = nodeAddStaticNode(C, ntree, SH_NODE_UVALONGSTROKE);
1478 uv_along_stroke->locx = 0.0f;
1479 uv_along_stroke->locy = 300.0f;
1480 uv_along_stroke->custom1 = 0; // use_tips
1482 input_texure = nodeAddStaticNode(C, ntree, SH_NODE_TEX_IMAGE);
1483 input_texure->locx = 200.0f;
1484 input_texure->locy = 300.0f;
1486 output_linestyle = nodeAddStaticNode(C, ntree, SH_NODE_OUTPUT_LINESTYLE);
1487 output_linestyle->locx = 400.0f;
1488 output_linestyle->locy = 300.0f;
1489 output_linestyle->custom1 = MA_RAMP_BLEND;
1490 output_linestyle->custom2 = 0; // use_clamp
1492 nodeSetActive(ntree, input_texure);
1494 fromsock = BLI_findlink(&uv_along_stroke->outputs, 0); // UV
1495 tosock = BLI_findlink(&input_texure->inputs, 0); // UV
1496 nodeAddLink(ntree, uv_along_stroke, fromsock, input_texure, tosock);
1498 fromsock = BLI_findlink(&input_texure->outputs, 0); // Color
1499 tosock = BLI_findlink(&output_linestyle->inputs, 0); // Color
1500 nodeAddLink(ntree, input_texure, fromsock, output_linestyle, tosock);
1502 ntreeUpdateTree(CTX_data_main(C), ntree);