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) 2006 Blender Foundation.
17  * All rights reserved.
18  */
19 
20 /** \file
21  * \ingroup render
22  */
23 
24 #pragma once
25 
26 #include "DEG_depsgraph.h"
27 #include "DNA_listBase.h"
28 #include "DNA_vec_types.h"
29 
30 struct Image;
31 struct ImageFormatData;
32 struct Main;
33 struct Object;
34 struct RenderData;
35 struct RenderResult;
36 struct ReportList;
37 struct Scene;
38 struct StampData;
39 struct ViewLayer;
40 struct bMovieHandle;
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
47 /* this include is what is exposed of render to outside world */
48 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
49 
50 /* length of the scene name + passname */
51 #define RE_MAXNAME ((MAX_ID_NAME - 2) + 10)
52 
53 /* only used as handle */
54 typedef struct Render Render;
55 
56 /* Render Result usage:
57  *
58  * - render engine allocates/frees and delivers raw floating point rects
59  * - right now it's full rects, but might become tiles or file
60  * - the display client has to allocate display rects, sort out what to display,
61  *   and how it's converted
62  */
63 
64 typedef struct RenderView {
65   struct RenderView *next, *prev;
66   char name[64]; /* EXR_VIEW_MAXNAME */
67 
68   /* if this exists, result of composited layers */
69   float *rectf;
70   /* if this exists, result of composited layers */
71   float *rectz;
72   /* optional, 32 bits version of picture, used for sequencer, ogl render and image curves */
73   int *rect32;
74 
75 } RenderView;
76 
77 typedef struct RenderPass {
78   struct RenderPass *next, *prev;
79   int channels;
80   char name[64];   /* amount defined in openexr_multi.h */
81   char chan_id[8]; /* amount defined in openexr_multi.h */
82   float *rect;
83   int rectx, recty;
84 
85   char fullname[64]; /* EXR_PASS_MAXNAME */
86   char view[64];     /* EXR_VIEW_MAXNAME */
87   int view_id;       /* quick lookup */
88 
89   int pad;
90 } RenderPass;
91 
92 /* a renderlayer is a full image, but with all passes and samples */
93 /* size of the rects is defined in RenderResult */
94 /* after render, the Combined pass is in combined,
95  * for renderlayers read from files it is a real pass */
96 typedef struct RenderLayer {
97   struct RenderLayer *next, *prev;
98 
99   /** copy of RenderData */
100   char name[RE_MAXNAME];
101   int layflag, passflag, pass_xor;
102 
103   int rectx, recty;
104 
105   /** Optional saved endresult on disk. */
106   void *exrhandle;
107 
108   ListBase passes;
109 
110 } RenderLayer;
111 
112 typedef struct RenderResult {
113   struct RenderResult *next, *prev;
114 
115   /* target image size */
116   int rectx, recty;
117   short crop, sample_nr;
118 
119   /* The following rect32, rectf and rectz buffers are for temporary storage only,
120    * for RenderResult structs created in #RE_AcquireResultImage - which do not have RenderView */
121 
122   /* optional, 32 bits version of picture, used for ogl render and image curves */
123   int *rect32;
124   /* if this exists, a copy of one of layers, or result of composited layers */
125   float *rectf;
126   /* if this exists, a copy of one of layers, or result of composited layers */
127   float *rectz;
128 
129   /* coordinates within final image (after cropping) */
130   rcti tilerect;
131   /* offset to apply to get a border render in full image */
132   int xof, yof;
133 
134   /* the main buffers */
135   ListBase layers;
136 
137   /* multiView maps to a StringVector in OpenEXR */
138   ListBase views; /* RenderView */
139 
140   /* allowing live updates: */
141   volatile rcti renrect;
142   volatile RenderLayer *renlay;
143 
144   /* optional saved endresult on disk */
145   int do_exr_tile;
146 
147   /* for render results in Image, verify validity for sequences */
148   int framenr;
149 
150   /* for acquire image, to indicate if it there is a combined layer */
151   int have_combined;
152 
153   /* render info text */
154   char *text;
155   char *error;
156 
157   struct StampData *stamp_data;
158 } RenderResult;
159 
160 typedef struct RenderStats {
161   int cfra;
162   int totface, totvert, totlamp, totpart;
163   bool localview;
164   double starttime, lastframetime;
165   const char *infostr, *statstr;
166   char scene_name[MAX_ID_NAME - 2];
167   float mem_used, mem_peak;
168 } RenderStats;
169 
170 /* *********************** API ******************** */
171 
172 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
173 /* calling a new render with same name, frees automatic existing render */
174 struct Render *RE_NewRender(const char *name);
175 struct Render *RE_GetRender(const char *name);
176 
177 struct Scene;
178 struct Render *RE_NewSceneRender(const struct Scene *scene);
179 struct Render *RE_GetSceneRender(const struct Scene *scene);
180 
181 /* assign default dummy callbacks */
182 void RE_InitRenderCB(struct Render *re);
183 
184 /* use free render as signal to do everything over (previews) */
185 void RE_FreeRender(struct Render *re);
186 /* only called on exit */
187 void RE_FreeAllRender(void);
188 /* Free memory used by persistent data.
189  * Invoked when loading new file.
190  */
191 void RE_FreeAllPersistentData(void);
192 /* only call on file load */
193 void RE_FreeAllRenderResults(void);
194 /* for external render engines that can keep persistent data */
195 void RE_FreePersistentData(void);
196 
197 /* get results and statistics */
198 void RE_FreeRenderResult(struct RenderResult *rr);
199 struct RenderResult *RE_AcquireResultRead(struct Render *re);
200 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
201 void RE_ReleaseResult(struct Render *re);
202 void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr);
203 void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr);
204 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, const int view_id);
205 void RE_ReleaseResultImage(struct Render *re);
206 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
207 void RE_ClearResult(struct Render *re);
208 struct RenderStats *RE_GetStats(struct Render *re);
209 
210 void RE_ResultGet32(struct Render *re, unsigned int *rect);
211 void RE_AcquiredResultGet32(struct Render *re,
212                             struct RenderResult *result,
213                             unsigned int *rect,
214                             const int view_id);
215 
216 void RE_render_result_rect_from_ibuf(struct RenderResult *rr,
217                                      struct RenderData *rd,
218                                      struct ImBuf *ibuf,
219                                      const int view_id);
220 
221 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
222 float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl,
223                              const char *name,
224                              const char *viewname);
225 
226 bool RE_HasSingleLayer(struct Render *re);
227 
228 /* add passes for grease pencil */
229 struct RenderPass *RE_create_gp_pass(struct RenderResult *rr,
230                                      const char *layername,
231                                      const char *viewname);
232 
233 void RE_create_render_pass(struct RenderResult *rr,
234                            const char *name,
235                            int channels,
236                            const char *chan_id,
237                            const char *layername,
238                            const char *viewname);
239 
240 /* obligatory initialize call, disprect is optional */
241 void RE_InitState(struct Render *re,
242                   struct Render *source,
243                   struct RenderData *rd,
244                   struct ListBase *render_layers,
245                   struct ViewLayer *single_layer,
246                   int winx,
247                   int winy,
248                   rcti *disprect);
249 void RE_ChangeResolution(struct Render *re, int winx, int winy, rcti *disprect);
250 void RE_ChangeModeFlag(struct Render *re, int flag, bool clear);
251 
252 /* set up the viewplane/perspective matrix, three choices */
253 struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
254 void RE_SetOverrideCamera(struct Render *re, struct Object *cam_ob);
255 void RE_SetCamera(struct Render *re, struct Object *cam_ob);
256 void RE_SetWindow(struct Render *re, const rctf *viewplane, float clip_start, float clip_end);
257 void RE_SetOrtho(struct Render *re, const rctf *viewplane, float clip_start, float clip_end);
258 
259 /* get current view and window transform */
260 void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect);
261 
262 /* set the render threads based on the command-line and autothreads setting */
263 void RE_init_threadcount(Render *re);
264 
265 bool RE_WriteRenderViewsImage(struct ReportList *reports,
266                               struct RenderResult *rr,
267                               struct Scene *scene,
268                               const bool stamp,
269                               char *name);
270 bool RE_WriteRenderViewsMovie(struct ReportList *reports,
271                               struct RenderResult *rr,
272                               struct Scene *scene,
273                               struct RenderData *rd,
274                               struct bMovieHandle *mh,
275                               void **movie_ctx_arr,
276                               const int totvideos,
277                               bool preview);
278 
279 /* only RE_NewRender() needed, main Blender render calls */
280 void RE_RenderFrame(struct Render *re,
281                     struct Main *bmain,
282                     struct Scene *scene,
283                     struct ViewLayer *single_layer,
284                     struct Object *camera_override,
285                     int frame,
286                     const bool write_still);
287 void RE_RenderAnim(struct Render *re,
288                    struct Main *bmain,
289                    struct Scene *scene,
290                    struct ViewLayer *single_layer,
291                    struct Object *camera_override,
292                    int sfra,
293                    int efra,
294                    int tfra);
295 #ifdef WITH_FREESTYLE
296 void RE_RenderFreestyleStrokes(struct Render *re,
297                                struct Main *bmain,
298                                struct Scene *scene,
299                                int render);
300 void RE_RenderFreestyleExternal(struct Render *re);
301 #endif
302 
303 /* Free memory and clear runtime data which is only needed during rendering. */
304 void RE_CleanAfterRender(struct Render *re);
305 
306 void RE_SetActiveRenderView(struct Render *re, const char *viewname);
307 const char *RE_GetActiveRenderView(struct Render *re);
308 
309 /* error reporting */
310 void RE_SetReports(struct Render *re, struct ReportList *reports);
311 
312 /* main preview render call */
313 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
314 
315 bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
316 bool RE_WriteRenderResult(struct ReportList *reports,
317                           RenderResult *rr,
318                           const char *filename,
319                           struct ImageFormatData *imf,
320                           const char *view,
321                           int layer);
322 struct RenderResult *RE_MultilayerConvert(
323     void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty);
324 
325 /* display and event callbacks */
326 void RE_display_init_cb(struct Render *re,
327                         void *handle,
328                         void (*f)(void *handle, RenderResult *rr));
329 void RE_display_clear_cb(struct Render *re,
330                          void *handle,
331                          void (*f)(void *handle, RenderResult *rr));
332 void RE_display_update_cb(struct Render *re,
333                           void *handle,
334                           void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
335 void RE_stats_draw_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
336 void RE_progress_cb(struct Render *re, void *handle, void (*f)(void *handle, float));
337 void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, int));
338 void RE_test_break_cb(struct Render *re, void *handle, int (*f)(void *handle));
339 void RE_current_scene_update_cb(struct Render *re,
340                                 void *handle,
341                                 void (*f)(void *handle, struct Scene *scene));
342 
343 void RE_gl_context_create(Render *re);
344 void RE_gl_context_destroy(Render *re);
345 void *RE_gl_context_get(Render *re);
346 void *RE_gpu_context_get(Render *re);
347 
348 /* should move to kernel once... still unsure on how/where */
349 float RE_filter_value(int type, float x);
350 
351 int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
352 
353 bool RE_layers_have_name(struct RenderResult *result);
354 bool RE_passes_have_name(struct RenderLayer *rl);
355 
356 struct RenderPass *RE_pass_find_by_name(volatile struct RenderLayer *rl,
357                                         const char *name,
358                                         const char *viewname);
359 struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl,
360                                         int passtype,
361                                         const char *viewname);
362 
363 /* shaded view or baking options */
364 #define RE_BAKE_NORMALS 0
365 #define RE_BAKE_DISPLACEMENT 1
366 #define RE_BAKE_AO 2
367 
368 void RE_GetCameraWindow(struct Render *re, struct Object *camera, float mat[4][4]);
369 void RE_GetCameraWindowWithOverscan(struct Render *re, float overscan, float r_winmat[4][4]);
370 void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_modelmat[4][4]);
371 struct Scene *RE_GetScene(struct Render *re);
372 void RE_SetScene(struct Render *re, struct Scene *sce);
373 
374 bool RE_is_rendering_allowed(struct Scene *scene,
375                              struct ViewLayer *single_layer,
376                              struct Object *camera_override,
377                              struct ReportList *reports);
378 
379 bool RE_allow_render_generic_object(struct Object *ob);
380 
381 /******* defined in render_result.c *********/
382 
383 bool RE_HasCombinedLayer(RenderResult *res);
384 bool RE_HasFloatPixels(RenderResult *res);
385 bool RE_RenderResult_is_stereo(RenderResult *res);
386 struct RenderView *RE_RenderViewGetById(struct RenderResult *rr, const int view_id);
387 struct RenderView *RE_RenderViewGetByName(struct RenderResult *rr, const char *viewname);
388 
389 RenderResult *RE_DuplicateRenderResult(RenderResult *rr);
390 
391 #ifdef __cplusplus
392 }
393 #endif
394