Merge branch 'blender2.7'
[blender.git] / source / blender / render / extern / include / RE_bake.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  * The Original Code is Copyright (C) 2010 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s):
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file RE_bake.h
29  *  \ingroup render
30  */
31
32 #ifndef __RE_BAKE_H__
33 #define __RE_BAKE_H__
34
35 struct Depsgraph;
36 struct ImBuf;
37 struct Mesh;
38 struct Render;
39
40 typedef struct BakeImage {
41         struct Image *image;
42         int width;
43         int height;
44         size_t offset;
45 } BakeImage;
46
47 typedef struct BakeImages {
48         BakeImage *data; /* all the images of an object */
49         int *lookup;     /* lookup table from Material to BakeImage */
50         int size;
51 } BakeImages;
52
53 typedef struct BakePixel {
54         int primitive_id, object_id;
55         float uv[2];
56         float du_dx, du_dy;
57         float dv_dx, dv_dy;
58 } BakePixel;
59
60 typedef struct BakeHighPolyData {
61         struct Object *ob;
62         struct Object *ob_eval;
63         struct Mesh *me;
64         bool is_flip_object;
65
66         float obmat[4][4];
67         float imat[4][4];
68 } BakeHighPolyData;
69
70 /* external_engine.c */
71 bool RE_bake_has_engine(struct Render *re);
72
73 bool RE_bake_engine(
74         struct Render *re, struct Depsgraph *depsgraph, struct Object *object, const int object_id, const BakePixel pixel_array[],
75         const size_t num_pixels, const int depth, const eScenePassType pass_type, const int pass_filter, float result[]);
76
77 /* bake.c */
78 int RE_pass_depth(const eScenePassType pass_type);
79
80 bool RE_bake_pixels_populate_from_objects(
81         struct Mesh *me_low, BakePixel pixel_array_from[], BakePixel pixel_array_to[],
82         BakeHighPolyData highpoly[], const int tot_highpoly, const size_t num_pixels, const bool is_custom_cage,
83         const float cage_extrusion, float mat_low[4][4], float mat_cage[4][4], struct Mesh *me_cage);
84
85 void RE_bake_pixels_populate(
86         struct Mesh *me, struct BakePixel *pixel_array,
87         const size_t num_pixels, const struct BakeImages *bake_images, const char *uv_layer);
88
89 void RE_bake_mask_fill(const BakePixel pixel_array[], const size_t num_pixels, char *mask);
90
91 void RE_bake_margin(struct ImBuf *ibuf, char *mask, const int margin);
92
93 void RE_bake_normal_world_to_object(
94         const BakePixel pixel_array[], const size_t num_pixels, const int depth, float result[],
95         struct Object *ob, const eBakeNormalSwizzle normal_swizzle[3]);
96 void RE_bake_normal_world_to_tangent(
97         const BakePixel pixel_array[], const size_t num_pixels, const int depth, float result[],
98         struct Mesh *me, const eBakeNormalSwizzle normal_swizzle[3], float mat[4][4]);
99 void RE_bake_normal_world_to_world(
100         const BakePixel pixel_array[], const size_t num_pixels, const int depth, float result[],
101         const eBakeNormalSwizzle normal_swizzle[3]);
102
103 void RE_bake_ibuf_clear(struct Image *image, const bool is_tangent);
104
105 #endif  /* __RE_BAKE_H__ */