Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesdna / DNA_dynamicpaint_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
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.
8  *
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.
13  *
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.
17  *
18  * Contributor(s): Miika Hämäläinen
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  *
22  */
23
24 /** \file DNA_dynamicpaint_types.h
25  *  \ingroup DNA
26  */
27
28 #ifndef __DNA_DYNAMICPAINT_TYPES_H__
29 #define __DNA_DYNAMICPAINT_TYPES_H__
30
31 #include "DNA_listBase.h"
32 struct PaintSurfaceData;
33
34 /* surface format */
35 enum {
36         MOD_DPAINT_SURFACE_F_PTEX     = 0,
37         MOD_DPAINT_SURFACE_F_VERTEX   = 1,
38         MOD_DPAINT_SURFACE_F_IMAGESEQ = 2,
39 };
40
41 /* surface type */
42 enum {
43         MOD_DPAINT_SURFACE_T_PAINT    = 0,
44         MOD_DPAINT_SURFACE_T_DISPLACE = 1,
45         MOD_DPAINT_SURFACE_T_WEIGHT   = 2,
46         MOD_DPAINT_SURFACE_T_WAVE     = 3,
47 };
48
49 /* surface flags */
50 enum {
51         MOD_DPAINT_ACTIVE             = 1 << 0,  /* Is surface enabled */
52
53         MOD_DPAINT_ANTIALIAS          = 1 << 1,  /* do antialiasing */
54         MOD_DPAINT_DISSOLVE           = 1 << 2,  /* do dissolve */
55         MOD_DPAINT_MULALPHA           = 1 << 3,  /* Multiply color by alpha when saving image */
56         MOD_DPAINT_DISSOLVE_LOG       = 1 << 4,  /* Use 1/x for surface dissolve */
57         MOD_DPAINT_DRY_LOG            = 1 << 5,  /* Use 1/x for drying paint */
58         MOD_DPAINT_PREVIEW            = 1 << 6,  /* preview this surface on viewport*/
59
60         MOD_DPAINT_WAVE_OPEN_BORDERS  = 1 << 7,  /* passes waves through mesh edges */
61         MOD_DPAINT_DISP_INCREMENTAL   = 1 << 8,  /* builds displace on top of earlier values */
62         MOD_DPAINT_USE_DRYING         = 1 << 9,  /* use drying */
63
64         MOD_DPAINT_OUT1               = 1 << 10,  /* output primary surface */
65         MOD_DPAINT_OUT2               = 1 << 11,  /* output secondary surface */
66 };
67
68 /* image_fileformat */
69 enum {
70         MOD_DPAINT_IMGFORMAT_PNG      = 0,
71         MOD_DPAINT_IMGFORMAT_OPENEXR  = 1,
72 };
73
74 /* disp_format */
75 enum {
76         MOD_DPAINT_DISP_DISPLACE      = 0,  /* displacement output displace map */
77         MOD_DPAINT_DISP_DEPTH         = 1,  /* displacement output depth data */
78 };
79
80 /* effect */
81 enum {
82         MOD_DPAINT_EFFECT_DO_SPREAD   = 1 << 0,  /* do spread effect */
83         MOD_DPAINT_EFFECT_DO_DRIP     = 1 << 1,  /* do drip effect */
84         MOD_DPAINT_EFFECT_DO_SHRINK   = 1 << 2,  /* do shrink effect */
85 };
86
87 /* preview_id */
88 enum {
89         MOD_DPAINT_SURFACE_PREV_PAINT  = 0,
90         MOD_DPAINT_SURFACE_PREV_WETMAP = 1,
91 };
92
93 /* init_color_type */
94 enum {
95         MOD_DPAINT_INITIAL_NONE        = 0,
96         MOD_DPAINT_INITIAL_COLOR       = 1,
97         MOD_DPAINT_INITIAL_TEXTURE     = 2,
98         MOD_DPAINT_INITIAL_VERTEXCOLOR = 3,
99 };
100
101 typedef struct DynamicPaintSurface {
102         
103         struct DynamicPaintSurface *next, *prev;
104         struct DynamicPaintCanvasSettings *canvas; /* for fast RNA access */
105         struct PaintSurfaceData *data;
106
107         struct Group *brush_group;
108         struct EffectorWeights *effector_weights;
109
110         /* cache */
111         struct PointCache *pointcache;
112         struct ListBase ptcaches;
113         int current_frame;
114
115         /* surface */
116         char name[64];
117         short format, type;
118         short disp_type, image_fileformat;
119         short effect_ui;        /* ui selection box */
120         short preview_id;       /* surface output id to preview */
121         short init_color_type, pad_s;
122         int flags, effect;
123
124         int image_resolution, substeps;
125         int start_frame, end_frame, pad;
126
127         /* initial color */
128         float init_color[4];
129         struct Tex *init_texture;
130         char init_layername[64];  /* MAX_CUSTOMDATA_LAYER_NAME */
131
132         int dry_speed, diss_speed;
133         float color_dry_threshold;
134         float depth_clamp, disp_factor;
135
136         float spread_speed, color_spread_speed, shrink_speed;
137         float drip_vel, drip_acc;
138
139         /* per surface brush settings */
140         float influence_scale, radius_scale;
141
142         /* wave settings */
143         float wave_damping, wave_speed, wave_timescale, wave_spring, wave_smoothness;
144         int pad2;
145
146         char uvlayer_name[64];  /* MAX_CUSTOMDATA_LAYER_NAME */
147         char image_output_path[1024];  /* 1024 = FILE_MAX */
148         char output_name[64];  /* MAX_CUSTOMDATA_LAYER_NAME */
149         char output_name2[64]; /* MAX_CUSTOMDATA_LAYER_NAME */ /* some surfaces have 2 outputs */
150
151 } DynamicPaintSurface;
152
153 /* canvas flags */
154 enum {
155         /* This should not be needed, having a valid WEIGHT_MCOL layer should be enough.
156          * And if not, should be a general flag. But seems unnecessary for now... */
157 #if 0
158         MOD_DPAINT_PREVIEW_READY      = 1 << 0,  /* if viewport preview is ready */
159 #endif
160         MOD_DPAINT_BAKING             = 1 << 1,  /* surface is already baking, so it wont get updated (loop) */
161 };
162
163 /* Canvas settings */
164 typedef struct DynamicPaintCanvasSettings {
165         struct DynamicPaintModifierData *pmd; /* for fast RNA access */
166         struct DerivedMesh *dm;
167
168         struct ListBase surfaces;
169         short active_sur, flags;
170         int pad;
171
172         char error[64];         /* Bake error description */
173
174 } DynamicPaintCanvasSettings;
175
176
177 /* flags */
178 enum {
179         MOD_DPAINT_PART_RAD           = 1 << 0,  /* use particle radius */
180         MOD_DPAINT_USE_MATERIAL       = 1 << 1,  /* use object material */
181         MOD_DPAINT_ABS_ALPHA          = 1 << 2,  /* don't increase alpha unless paint alpha is higher than existing */
182         MOD_DPAINT_ERASE              = 1 << 3,  /* removes paint */
183
184         MOD_DPAINT_RAMP_ALPHA         = 1 << 4,  /* only read falloff ramp alpha */
185         MOD_DPAINT_PROX_PROJECT       = 1 << 5,  /* do proximity check only in defined dir */
186         MOD_DPAINT_INVERSE_PROX       = 1 << 6,  /* inverse proximity painting */
187         MOD_DPAINT_NEGATE_VOLUME      = 1 << 7,  /* negates volume influence on "volume + prox" mode */
188
189         MOD_DPAINT_DO_SMUDGE          = 1 << 8,  /* brush smudges existing paint */
190         MOD_DPAINT_VELOCITY_ALPHA     = 1 << 9,  /* multiply brush influence by velocity */
191         MOD_DPAINT_VELOCITY_COLOR     = 1 << 10,  /* replace brush color by velocity color ramp */
192         MOD_DPAINT_VELOCITY_DEPTH     = 1 << 11,  /* multiply brush intersection depth by velocity */
193
194         MOD_DPAINT_USES_VELOCITY      = (MOD_DPAINT_DO_SMUDGE | MOD_DPAINT_VELOCITY_ALPHA |
195                                          MOD_DPAINT_VELOCITY_COLOR | MOD_DPAINT_VELOCITY_DEPTH),
196 };
197
198 /* collision type */
199 enum {
200         MOD_DPAINT_COL_VOLUME         = 0,  /* paint with mesh volume */
201         MOD_DPAINT_COL_DIST           = 1,  /* paint using distance to mesh surface */
202         MOD_DPAINT_COL_VOLDIST        = 2,  /* use both volume and distance */
203         MOD_DPAINT_COL_PSYS           = 3,  /* use particle system */
204         MOD_DPAINT_COL_POINT          = 4,  /* use distance to object center point */
205 };
206
207 /* proximity_falloff */
208 enum {
209         MOD_DPAINT_PRFALL_CONSTANT    = 0,  /* no-falloff */
210         MOD_DPAINT_PRFALL_SMOOTH      = 1,  /* smooth, linear falloff */
211         MOD_DPAINT_PRFALL_RAMP        = 2,  /* use color ramp */
212 };
213
214 /* wave_brush_type */
215 enum {
216         MOD_DPAINT_WAVEB_DEPTH        = 0,  /* use intersection depth */
217         MOD_DPAINT_WAVEB_FORCE        = 1,  /* act as a force on intersection area */
218         MOD_DPAINT_WAVEB_REFLECT      = 2,  /* obstacle that reflects waves */
219         MOD_DPAINT_WAVEB_CHANGE       = 3,  /* use change of intersection depth from previous frame */
220 };
221
222 /* brush ray_dir */
223 enum {
224         MOD_DPAINT_RAY_CANVAS         = 0,
225         MOD_DPAINT_RAY_BRUSH_AVG      = 1,
226         MOD_DPAINT_RAY_ZPLUS          = 2,
227 };
228
229 /* Brush settings */
230 typedef struct DynamicPaintBrushSettings {
231         struct DynamicPaintModifierData *pmd; /* for fast RNA access */
232         struct DerivedMesh *dm;
233         struct ParticleSystem *psys;
234         struct Material *mat;
235
236         int flags;
237         int collision;
238
239         float r, g, b, alpha;
240         float wetness;
241
242         float particle_radius, particle_smooth;
243         float paint_distance;
244
245         /* color ramps */
246         struct ColorBand *paint_ramp;   /* Proximity paint falloff */
247         struct ColorBand *vel_ramp;             /* Velocity paint ramp */
248
249         short proximity_falloff;
250         short wave_type;
251         short ray_dir;
252         short pad;
253
254         float wave_factor, wave_clamp;
255         float max_velocity, smudge_strength;
256 } DynamicPaintBrushSettings;
257
258 #endif