More work on render stuff!
[blender-staging.git] / source / blender / render / extern / include / RE_pipeline.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2006 Blender Foundation.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #ifndef RE_PIPELINE_H
31 #define RE_PIPELINE_H
32
33 #include "DNA_listBase.h"
34 #include "DNA_vec_types.h"
35 #include "BKE_utildefines.h"
36
37 struct Scene;
38 struct RenderData;
39
40 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
41 /* this include is what is exposed of render to outside world */
42 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
43
44
45 #define RE_MAXNAME      32
46
47 /* only used as handle */
48 typedef struct Render Render;
49
50 /* Render Result usage:
51
52 - render engine allocates/frees and delivers raw floating point rects
53 - right now it's full rects, but might become tiles or file 
54 - the display client has to allocate display rects, sort out what to display, 
55   and how it's converted
56 */
57
58 typedef struct RenderPass {
59         struct RenderPass *next, *prev;
60         int passtype;
61         float *rect;
62 } RenderPass;
63
64 /* a renderlayer is a full image, but with all passes and samples */
65 /* size of the rects is defined in RenderResult */
66 typedef struct RenderLayer {
67         struct RenderLayer *next, *prev;
68         
69         /* copy of RenderData */
70         char name[RE_MAXNAME];          
71         unsigned int lay;                       
72         int layflag, passflag;          
73         
74         float *rectf;   /* 4 float, standard rgba buffer */
75         
76         ListBase passes;
77         
78 } RenderLayer;
79
80 typedef struct RenderResult {
81         
82         /* target image size */
83         int rectx, recty;
84         short crop, pad;
85         
86         /* optional, 32 bits version of picture, used for ogl render and image curves */
87         int *rect32;
88         /* if this exists, a copy of one of layers, or result of composited layers */
89         float *rectf;
90         /* if this exists, a copy of one of layers, or result of composited layers */
91         float *rectz;
92         
93         /* coordinates within final image (after cropping) */
94         rcti tilerect;
95         
96         /* the main buffers */
97         ListBase layers;
98         
99         /* allowing live updates: */
100         rcti renrect;
101         RenderLayer *renlay;
102         
103         /* optional saved endresult on disk */
104         char exrfile[FILE_MAXDIR];
105         int filehandle;
106         
107 } RenderResult;
108
109 typedef struct RenderStats {
110         int totface, totvert, tothalo, totlamp, totpart;
111         short curfield, curblur, curpart, partsdone, convertdone;
112         double starttime, lastframetime;
113         char *infostr;
114         
115 } RenderStats;
116
117 /* *********************** API ******************** */
118
119 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
120 /* calling a new render with same name, frees automatic existing render */
121 struct Render *RE_NewRender (const char *name);
122 struct Render *RE_GetRender(const char *name);
123
124 /* use free render as signal to do everything over (previews) */
125 void RE_FreeRender (struct Render *re);
126 /* only called on exit */
127 void RE_FreeAllRender (void);
128
129 /* get results and statistics */
130 RenderResult *RE_GetResult(struct Render *re);
131 void RE_GetResultImage(struct Render *re, RenderResult *rr);
132 RenderStats *RE_GetStats(struct Render *re);
133 void RE_ResultGet32(struct Render *re, unsigned int *rect);
134 float *RE_RenderLayerGetPass(RenderLayer *rl, int passtype);
135
136 /* obligatory initialize call, disprect is optional */
137 void RE_InitState (struct Render *re, struct RenderData *rd, int winx, int winy, rcti *disprect);
138
139 /* use this to change disprect of active render */
140 void RE_SetDispRect (struct Render *re, rcti *disprect);
141
142 /* set up the viewplane/perspective matrix, three choices */
143 void RE_SetCamera(struct Render *re, struct Object *camera);
144 void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
145 void RE_SetOrtho (struct Render *re, rctf *viewplane, float clipsta, float clipend);
146
147 /* option to set viewmatrix before making dbase */
148 void RE_SetView (struct Render *re, float mat[][4]);
149
150 /* make or free the dbase */
151 void RE_Database_FromScene(struct Render *re, struct Scene *scene, int use_camera_view);
152 void RE_Database_Free (struct Render *re);
153
154 /* project dbase again, when viewplane/perspective changed */
155 void RE_DataBase_ApplyWindow(struct Render *re);
156
157 /* the main processor, assumes all was set OK! */
158 void RE_TileProcessor(struct Render *re);
159
160 /* only RE_NewRender() needed, main Blender render calls */
161 void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame);
162 void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra);
163
164
165 /* display and event callbacks */
166 void RE_display_init_cb (struct Render *re, void (*f)(RenderResult *rr));
167 void RE_display_clear_cb(struct Render *re, void (*f)(RenderResult *rr));
168 void RE_display_draw_cb (struct Render *re, void (*f)(RenderResult *rr, struct rcti *rect));
169 void RE_stats_draw_cb   (struct Render *re, void (*f)(RenderStats *rs));
170 void RE_timecursor_cb   (struct Render *re, void (*f)(int));
171 void RE_test_break_cb   (struct Render *re, int (*f)(void));
172 void RE_test_return_cb  (struct Render *re, int (*f)(void));
173 void RE_error_cb                (struct Render *re, void (*f)(const char *str));
174
175 /* should move to kernel once... still unsure on how/where */
176 float RE_filter_value(int type, float x);
177
178 #endif /* RE_PIPELINE_H */
179