Cleanup: style, use braces for gpencil modifiers
[blender.git] / source / blender / gpencil_modifiers / intern / MOD_gpencilcolor.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software  Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2017, Blender Foundation
17  * This is a new part of Blender
18  */
19
20 /** \file
21  * \ingroup modifiers
22  */
23
24 #include <stdio.h>
25
26 #include "BLI_utildefines.h"
27
28 #include "BLI_blenlib.h"
29 #include "BLI_ghash.h"
30 #include "BLI_math_color.h"
31 #include "BLI_math_vector.h"
32
33 #include "DNA_scene_types.h"
34 #include "DNA_object_types.h"
35 #include "DNA_gpencil_types.h"
36 #include "DNA_gpencil_modifier_types.h"
37
38 #include "BKE_gpencil.h"
39 #include "BKE_gpencil_modifier.h"
40 #include "BKE_main.h"
41 #include "BKE_material.h"
42
43 #include "DEG_depsgraph.h"
44
45 #include "MOD_gpencil_util.h"
46 #include "MOD_gpencil_modifiertypes.h"
47
48 static void initData(GpencilModifierData *md)
49 {
50   ColorGpencilModifierData *gpmd = (ColorGpencilModifierData *)md;
51   gpmd->pass_index = 0;
52   ARRAY_SET_ITEMS(gpmd->hsv, 1.0f, 1.0f, 1.0f);
53   gpmd->layername[0] = '\0';
54   gpmd->flag |= GP_COLOR_CREATE_COLORS;
55   gpmd->modify_color = GP_MODIFY_COLOR_BOTH;
56 }
57
58 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
59 {
60   BKE_gpencil_modifier_copyData_generic(md, target);
61 }
62
63 /* color correction strokes */
64 static void deformStroke(GpencilModifierData *md,
65                          Depsgraph *UNUSED(depsgraph),
66                          Object *ob,
67                          bGPDlayer *gpl,
68                          bGPDstroke *gps)
69 {
70
71   ColorGpencilModifierData *mmd = (ColorGpencilModifierData *)md;
72   float hsv[3], factor[3];
73
74   if (!is_stroke_affected_by_modifier(ob,
75                                       mmd->layername,
76                                       mmd->pass_index,
77                                       mmd->layer_pass,
78                                       1,
79                                       gpl,
80                                       gps,
81                                       mmd->flag & GP_COLOR_INVERT_LAYER,
82                                       mmd->flag & GP_COLOR_INVERT_PASS,
83                                       mmd->flag & GP_COLOR_INVERT_LAYERPASS)) {
84     return;
85   }
86
87   copy_v3_v3(factor, mmd->hsv);
88   add_v3_fl(factor, -1.0f);
89
90   if (mmd->modify_color != GP_MODIFY_COLOR_FILL) {
91     rgb_to_hsv_v(gps->runtime.tmp_stroke_rgba, hsv);
92     add_v3_v3(hsv, factor);
93     CLAMP3(hsv, 0.0f, 1.0f);
94     hsv_to_rgb_v(hsv, gps->runtime.tmp_stroke_rgba);
95   }
96
97   if (mmd->modify_color != GP_MODIFY_COLOR_STROKE) {
98     rgb_to_hsv_v(gps->runtime.tmp_fill_rgba, hsv);
99     add_v3_v3(hsv, factor);
100     CLAMP3(hsv, 0.0f, 1.0f);
101     hsv_to_rgb_v(hsv, gps->runtime.tmp_fill_rgba);
102   }
103 }
104
105 static void bakeModifier(Main *bmain, Depsgraph *depsgraph, GpencilModifierData *md, Object *ob)
106 {
107   ColorGpencilModifierData *mmd = (ColorGpencilModifierData *)md;
108   bGPdata *gpd = ob->data;
109
110   GHash *gh_color = BLI_ghash_str_new("GP_Color modifier");
111   for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
112     for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
113       for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
114
115         Material *mat = give_current_material(ob, gps->mat_nr + 1);
116         if (mat == NULL) {
117           continue;
118         }
119         MaterialGPencilStyle *gp_style = mat->gp_style;
120         /* skip stroke if it doesn't have color info */
121         if (ELEM(NULL, gp_style)) {
122           continue;
123         }
124
125         copy_v4_v4(gps->runtime.tmp_stroke_rgba, gp_style->stroke_rgba);
126         copy_v4_v4(gps->runtime.tmp_fill_rgba, gp_style->fill_rgba);
127
128         deformStroke(md, depsgraph, ob, gpl, gps);
129
130         gpencil_apply_modifier_material(
131             bmain, ob, mat, gh_color, gps, (bool)(mmd->flag & GP_COLOR_CREATE_COLORS));
132       }
133     }
134   }
135   /* free hash buffers */
136   if (gh_color) {
137     BLI_ghash_free(gh_color, NULL, NULL);
138     gh_color = NULL;
139   }
140 }
141
142 GpencilModifierTypeInfo modifierType_Gpencil_Color = {
143     /* name */ "Hue/Saturation",
144     /* structName */ "ColorGpencilModifierData",
145     /* structSize */ sizeof(ColorGpencilModifierData),
146     /* type */ eGpencilModifierTypeType_Gpencil,
147     /* flags */ eGpencilModifierTypeFlag_SupportsEditmode,
148
149     /* copyData */ copyData,
150
151     /* deformStroke */ deformStroke,
152     /* generateStrokes */ NULL,
153     /* bakeModifier */ bakeModifier,
154     /* remapTime */ NULL,
155
156     /* initData */ initData,
157     /* freeData */ NULL,
158     /* isDisabled */ NULL,
159     /* updateDepsgraph */ NULL,
160     /* dependsOnTime */ NULL,
161     /* foreachObjectLink */ NULL,
162     /* foreachIDLink */ NULL,
163     /* foreachTexLink */ NULL,
164     /* getDuplicationFactor */ NULL,
165 };