Merge branch 'master' into blender2.8
[blender.git] / source / blender / render / intern / include / render_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  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * Contributor(s): (c) 2006 Blender Foundation, full refactor
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file blender/render/intern/include/render_types.h
27  *  \ingroup render
28  */
29
30
31 #ifndef __RENDER_TYPES_H__
32 #define __RENDER_TYPES_H__
33
34 /* ------------------------------------------------------------------------- */
35 /* exposed internal in render module only! */
36 /* ------------------------------------------------------------------------- */
37
38 #include "DNA_color_types.h"
39 #include "DNA_customdata_types.h"
40 #include "DNA_scene_types.h"
41 #include "DNA_world_types.h"
42 #include "DNA_object_types.h"
43 #include "DNA_vec_types.h"
44
45 #include "BLI_threads.h"
46
47 #include "BKE_main.h"
48
49 #include "RE_pipeline.h"
50 #include "RE_shader_ext.h"      /* TexResult, ShadeResult, ShadeInput */
51 #include "sunsky.h"
52
53 #include "BLI_sys_types.h" // for intptr_t support
54
55 struct EvaluationContext;
56 struct Object;
57 struct MemArena;
58 struct VertTableNode;
59 struct VlakTableNode;
60 struct GHash;
61 struct ObjectInstanceRen;
62 struct RayObject;
63 struct RayFace;
64 struct RenderEngine;
65 struct ReportList;
66 struct Main;
67 struct ImagePool;
68
69 #define TABLEINITSIZE 1024
70
71 typedef struct SampleTables {
72         float centLut[16];
73         float *fmask1[9], *fmask2[9];
74         char cmask[256], *centmask;
75         
76 } SampleTables;
77
78 typedef struct QMCSampler {
79         struct QMCSampler *next, *prev;
80         int type;
81         int tot;
82         int used;
83         double *samp2d;
84         double offs[BLENDER_MAX_THREADS][2];
85 } QMCSampler;
86
87 // #define SAMP_TYPE_JITTERED           0  // UNUSED
88 #define SAMP_TYPE_HALTON                1
89 #define SAMP_TYPE_HAMMERSLEY    2
90
91 /* this is handed over to threaded hiding/passes/shading engine */
92 typedef struct RenderPart {
93         struct RenderPart *next, *prev;
94         
95         RenderResult *result;                   /* result of part rendering */
96         ListBase fullresult;                    /* optional full sample buffers */
97         
98         int *recto;                                             /* object table for objects */
99         int *rectp;                                             /* polygon index table */
100         int *rectz;                                             /* zbuffer */
101         int *rectmask;                                  /* negative zmask */
102         intptr_t *rectdaps;                                     /* delta acum buffer for pixel structs */
103         int *rectbacko;                                 /* object table for backside sss */
104         int *rectbackp;                                 /* polygon index table for backside sss */
105         int *rectbackz;                                 /* zbuffer for backside sss */
106         intptr_t *rectall;                                      /* buffer for all faces for sss */
107
108         rcti disprect;                                  /* part coordinates within total picture */
109         int rectx, recty;                               /* the size */
110         int nr;                                                 /* nr is partnr */
111         short crop, status;                             /* crop is amount of pixels we crop, for filter */
112         short sample;                                   /* sample can be used by zbuffers */
113         short thread;                                   /* thread id */
114         
115         char *clipflag;                                 /* clipflags for part zbuffering */
116 } RenderPart;
117
118 enum {
119         PART_STATUS_NONE        = 0,
120         PART_STATUS_IN_PROGRESS = 1,
121         PART_STATUS_READY       = 2
122 };
123
124 /* controls state of render, everything that's read-only during render stage */
125 struct Render {
126         struct Render *next, *prev;
127         char name[RE_MAXNAME];
128         int slot;
129         
130         /* state settings */
131         short flag, osa, ok, result_ok;
132         
133         /* due to performance issues, getting initialized from color management settings once on Render initialization */
134         bool scene_color_manage;
135         
136         /* result of rendering */
137         RenderResult *result;
138         /* if render with single-layer option, other rendered layers are stored here */
139         RenderResult *pushedresult;
140         /* a list of RenderResults, for fullsample */
141         ListBase fullresult;
142         /* read/write mutex, all internal code that writes to re->result must use a
143          * write lock, all external code must use a read lock. internal code is assumed
144          * to not conflict with writes, so no lock used for that */
145         ThreadRWMutex resultmutex;
146         
147         /* window size, display rect, viewplane */
148         int winx, winy;                 /* buffer width and height with percentage applied
149                                                          * without border & crop. convert to long before multiplying together to avoid overflow. */
150         rcti disprect;                  /* part within winx winy */
151         rctf viewplane;                 /* mapped on winx winy */
152         float viewdx, viewdy;   /* size of 1 pixel */
153         float clipcrop;                 /* 2 pixel boundary to prevent clip when filter used */
154         
155         /* final picture width and height (within disprect) */
156         int rectx, recty;
157         
158         /* real maximum size of parts after correction for minimum 
159          * partx*xparts can be larger than rectx, in that case last part is smaller */
160         int partx, party;
161         
162         /* values for viewing */
163         float ycor; /* (scene->xasp / scene->yasp), multiplied with 'winy' */
164         
165         float panophi, panosi, panoco, panodxp, panodxv;
166         
167         /* Matrices */
168         float grvec[3];                 /* for world */
169         float imat[3][3];               /* copy of viewinv */
170         float viewmat[4][4], viewinv[4][4];
171         float viewmat_orig[4][4];       /* for incremental render */
172         float winmat[4][4];
173         
174         /* clippping */
175         float clipsta;
176         float clipend;
177         
178         /* samples */
179         SampleTables *samples;
180         float jit[32][2];
181         float mblur_jit[32][2];
182         ListBase *qmcsamplers;
183         int num_qmc_samplers;
184         
185         /* shadow counter, detect shadow-reuse for shaders */
186         int shadowsamplenr[BLENDER_MAX_THREADS];
187         
188         struct Depsgraph *depsgraph;
189
190         /* main, scene, and its full copy of renderdata and world */
191         struct Main *main;
192         Scene *scene;
193         RenderData r;
194         World wrld;
195         ViewRender view_render;
196         struct Object *camera_override;
197         unsigned int lay, layer_override;
198         
199         ThreadRWMutex partsmutex;
200         ListBase parts;
201         
202         /* render engine */
203         struct RenderEngine *engine;
204         
205         /* octree tables and variables for raytrace */
206         struct RayObject *raytree;
207         struct RayFace *rayfaces;
208         struct VlakPrimitive *rayprimitives;
209         float maxdist; /* needed for keeping an incorrect behavior of SUN and HEMI lights (avoid breaking old scenes) */
210
211         /* occlusion tree */
212         void *occlusiontree;
213         ListBase strandsurface;
214         
215         /* use this instead of R.r.cfra */
216         float mblur_offs, field_offs;
217         
218         /* render database */
219         int totvlak, totvert, tothalo, totstrand, totlamp;
220         struct HaloRen **sortedhalos;
221
222         ListBase lights;        /* GroupObject pointers */
223         ListBase lampren;       /* storage, for free */
224         
225         ListBase objecttable;
226
227         struct ObjectInstanceRen *objectinstance;
228         ListBase instancetable;
229         int totinstance;
230
231         struct Image *bakebuf;
232         
233         struct GHash *orco_hash;
234
235         struct GHash *sss_hash;
236         ListBase *sss_points;
237         struct Material *sss_mat;
238
239         ListBase customdata_names;
240
241         struct Object *excludeob;
242         ListBase render_volumes_inside;
243         ListBase volumes;
244
245 #ifdef WITH_FREESTYLE
246         struct Main *freestyle_bmain;
247         ListBase freestyle_renders;
248 #endif
249
250         /* arena for allocating data for use during render, for
251          * example dynamic TFaces to go in the VlakRen structure.
252          */
253         struct MemArena *memArena;
254         
255         /* callbacks */
256         void (*display_init)(void *handle, RenderResult *rr);
257         void *dih;
258         void (*display_clear)(void *handle, RenderResult *rr);
259         void *dch;
260         void (*display_update)(void *handle, RenderResult *rr, volatile rcti *rect);
261         void *duh;
262         void (*current_scene_update)(void *handle, struct Scene *scene);
263         void *suh;
264         
265         void (*stats_draw)(void *handle, RenderStats *ri);
266         void *sdh;
267         void (*progress)(void *handle, float i);
268         void *prh;
269         
270         void (*draw_lock)(void *handle, int i);
271         void *dlh;
272         int (*test_break)(void *handle);
273         void *tbh;
274         
275         RenderStats i;
276
277         struct ReportList *reports;
278
279         struct ImagePool *pool;
280         struct EvaluationContext *eval_ctx;
281
282         void **movie_ctx_arr;
283         char viewname[MAX_NAME];
284 };
285
286 /* ------------------------------------------------------------------------- */
287
288 struct ISBData;
289
290 typedef struct DeepSample {
291         int z;
292         float v;
293 } DeepSample;
294  
295 typedef struct ShadSampleBuf {
296         struct ShadSampleBuf *next, *prev;
297         intptr_t *zbuf;
298         char *cbuf;
299         DeepSample **deepbuf;
300         int *totbuf;
301 } ShadSampleBuf;
302
303 typedef struct ShadBuf {
304         /* regular shadowbuffer */
305         short samp, shadhalostep, totbuf;
306         float persmat[4][4];
307         float viewmat[4][4];
308         float winmat[4][4];
309         float *jit, *weight;
310         float d, clipend, pixsize, soft, compressthresh;
311         int co[3];
312         int size, bias;
313         ListBase buffers;
314         
315         /* irregular shadowbufer, result stored per thread */
316         struct ISBData *isb_result[BLENDER_MAX_THREADS];
317 } ShadBuf;
318
319 /* ------------------------------------------------------------------------- */
320
321 typedef struct ObjectRen {
322         struct ObjectRen *next, *prev;
323         struct Object *ob, *par;
324         struct Scene *sce;
325         int index, psysindex, flag, lay;
326
327         float boundbox[2][3];
328
329         int totvert, totvlak, totstrand, tothalo;
330         int vertnodeslen, vlaknodeslen, strandnodeslen, blohalen;
331         struct VertTableNode *vertnodes;
332         struct VlakTableNode *vlaknodes;
333         struct StrandTableNode *strandnodes;
334         struct HaloRen **bloha;
335         struct StrandBuffer *strandbuf;
336
337         char (*mtface)[MAX_CUSTOMDATA_LAYER_NAME];
338         char (*mcol)[MAX_CUSTOMDATA_LAYER_NAME];
339         int  actmtface, actmcol, bakemtface;
340
341         short tangent_mask; /* which tangent layer should be calculated */
342
343         float obmat[4][4];      /* only used in convertblender.c, for instancing */
344
345         /* used on makeraytree */
346         struct RayObject *raytree;
347         struct RayFace *rayfaces;
348         struct VlakPrimitive *rayprimitives;
349         struct ObjectInstanceRen *rayobi;
350         
351 } ObjectRen;
352
353 typedef struct ObjectInstanceRen {
354         struct ObjectInstanceRen *next, *prev;
355
356         ObjectRen *obr;
357         Object *ob, *par;
358         int index, psysindex, lay;
359
360         float mat[4][4], imat[4][4];
361         float nmat[3][3]; /* nmat is inverse mat tranposed */
362
363         float obmat[4][4], obinvmat[4][4];
364         float localtoviewmat[4][4], localtoviewinvmat[4][4];
365
366         short flag;
367
368         float dupliorco[3], dupliuv[2];
369         float (*duplitexmat)[4];
370         
371         struct VolumePrecache *volume_precache;
372         
373         float *vectors; /* (RE_WINSPEED_ELEMS * VertRen.index) */
374         int totvector;
375         
376         /* used on makeraytree */
377         struct RayObject *raytree;
378         int transform_primitives;
379
380         /* Particle info */
381         float part_index;
382         float part_age;
383         float part_lifetime;
384         float part_size;
385         float part_co[3];
386         float part_vel[3];
387         float part_avel[3];
388
389         unsigned int random_id;
390 } ObjectInstanceRen;
391
392 /* ------------------------------------------------------------------------- */
393
394 typedef struct VertRen {
395         float co[3];
396         float n[3];
397         float *orco;
398         unsigned int flag;      /* in use for clipping zbuffer parts, temp setting stuff in convertblender.c
399                                                  * only an 'int' because of alignment, could be a char too */
400         float accum;            /* accum for radio weighting, and for strand texco static particles */
401         int index;                      /* index allows extending vertren with any property */
402 } VertRen;
403
404 /* ------------------------------------------------------------------------- */
405
406 struct halosort {
407         struct HaloRen *har;
408         int z;
409 };
410
411 /* ------------------------------------------------------------------------- */
412 struct Material;
413 struct ImagePool;
414
415 typedef struct RadFace {
416         float unshot[3], totrad[3];
417         float norm[3], cent[3], area;
418         int flag;
419 } RadFace;
420
421 typedef struct VlakRen {
422         struct VertRen *v1, *v2, *v3, *v4;      /* keep in order for ** addressing */
423         float n[3];
424         struct Material *mat;
425         char puno;
426         char flag, ec;
427 #ifdef WITH_FREESTYLE
428         char freestyle_edge_mark;
429         char freestyle_face_mark;
430 #endif
431         int index;
432 } VlakRen;
433
434 typedef struct HaloRen {
435         short miny, maxy;
436         float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
437         float hard, b, g, r;
438         int zs, zd;
439         int zBufDist;   /* depth in the z-buffer coordinate system */
440         char starpoints, type, add, tex;
441         char linec, ringc, seed;
442         short flarec; /* used to be a char. why ?*/
443         float hasize;
444         int pixels;
445         unsigned int lay;
446         struct Material *mat;
447         struct ImagePool *pool;
448         bool skip_load_image, texnode_preview;
449 } HaloRen;
450
451 /* ------------------------------------------------------------------------- */
452
453 typedef struct StrandVert {
454         float co[3];
455         float strandco;
456 } StrandVert;
457
458 typedef struct StrandSurface {
459         struct StrandSurface *next, *prev;
460         ObjectRen obr;
461         int (*face)[4];
462         float (*co)[3];
463         /* for occlusion caching */
464         float (*ao)[3];
465         float (*env)[3];
466         float (*indirect)[3];
467         /* for speedvectors */
468         float (*prevco)[3], (*nextco)[3];
469         int totvert, totface;
470 } StrandSurface;
471
472 typedef struct StrandBound {
473         int start, end;
474         float boundbox[2][3];
475 } StrandBound;
476
477 typedef struct StrandBuffer {
478         struct StrandBuffer *next, *prev;
479         struct StrandVert *vert;
480         struct StrandBound *bound;
481         int totvert, totbound;
482
483         struct ObjectRen *obr;
484         struct Material *ma;
485         struct StrandSurface *surface;
486         unsigned int lay;
487         int overrideuv;
488         int flag, maxdepth;
489         float adaptcos, minwidth, widthfade;
490         
491         float maxwidth; /* for cliptest of strands in blender unit */
492         
493         float winmat[4][4];
494         int winx, winy;
495 } StrandBuffer;
496
497 typedef struct StrandRen {
498         StrandVert *vert;
499         StrandBuffer *buffer;
500         int totvert, flag;
501         int clip, index;
502         float orco[3];
503 } StrandRen;
504
505 /* ------------------------------------------------------------------------- */
506
507 typedef struct VolumeOb {
508         struct VolumeOb *next, *prev;
509         struct Material *ma;
510         struct ObjectRen *obr;
511 } VolumeOb;
512
513 typedef struct MatInside {
514         struct MatInside *next, *prev;
515         struct Material *ma;
516         struct ObjectInstanceRen *obi;
517 } MatInside;
518
519 typedef struct VolPrecachePart {
520         struct VolPrecachePart *next, *prev;
521         struct RayObject *tree;
522         struct ShadeInput *shi;
523         struct ObjectInstanceRen *obi;
524         float viewmat[4][4];
525         int num;
526         int minx, maxx;
527         int miny, maxy;
528         int minz, maxz;
529         int res[3];
530         float bbmin[3];
531         float voxel[3];
532         struct Render *re;
533 } VolPrecachePart;
534
535 typedef struct VolumePrecache {
536         int res[3];
537         float *bbmin, *bbmax;
538         float *data_r;
539         float *data_g;
540         float *data_b;
541 } VolumePrecache;
542
543 /* ------------------------------------------------------------------------- */
544
545 struct LampRen;
546 struct MTex;
547
548 /**
549  * For each lamp in a scene, a LampRen is created. It determines the
550  * properties of a lightsource.
551  */
552
553 typedef struct LampShadowSubSample {
554         int samplenr;
555         float shadfac[4];       /* rgba shadow */
556 } LampShadowSubSample;
557
558 typedef struct LampShadowSample {
559         LampShadowSubSample s[16];      /* MAX OSA */
560 } LampShadowSample;
561
562 typedef struct LampRen {
563         struct LampRen *next, *prev;
564         
565         float xs, ys, dist;
566         float co[3];
567         short type;
568         int mode;
569         float r, g, b, k;
570         float shdwr, shdwg, shdwb;
571         float energy, haint;
572         int lay;
573         float spotsi, spotbl;
574         float vec[3];
575         float xsp, ysp, distkw, inpr;
576         float halokw, halo;
577         
578         short falloff_type;
579         float ld1, ld2;
580         float coeff_const, coeff_lin, coeff_quad;
581         struct CurveMapping *curfalloff;
582
583         /* copied from Lamp, to decouple more rendering stuff */
584         /** Size of the shadowbuffer */
585         short bufsize;
586         /** Number of samples for the shadows */
587         short samp;
588         /** Softness factor for shadow */
589         float soft;
590         /** amount of subsample buffers and type of filter for sampling */
591         short buffers, filtertype;
592         /** shadow buffer type (regular, irregular) */
593         short buftype;
594         /** autoclip */
595         short bufflag;
596         /** shadow plus halo: detail level */
597         short shadhalostep;
598         /** Near clip of the lamp */
599         float clipsta;
600         /** Far clip of the lamp */
601         float clipend;
602         /** A small depth offset to prevent self-shadowing. */
603         float bias;
604         /* Compression threshold for deep shadow maps */
605         float compressthresh;
606         
607         short ray_samp, ray_sampy, ray_sampz, ray_samp_method, ray_samp_type, area_shape, ray_totsamp;
608         short xold[BLENDER_MAX_THREADS], yold[BLENDER_MAX_THREADS];     /* last jitter table for area lights */
609         float area_size, area_sizey, area_sizez;
610         float adapt_thresh;
611
612         /* sun/sky */
613         struct SunSky *sunsky;
614         
615         struct ShadBuf *shb;
616         float *jitter;
617         
618         float imat[3][3];
619         float spottexfac;
620         float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
621
622         float lampmat[4][4];    /* worls space lamp matrix, used for scene rotation */
623
624         float mat[3][3];        /* 3x3 part from lampmat x viewmat */
625         float area[8][3], areasize;
626         
627         /* passes & node shader support: all shadow info for a pixel */
628         LampShadowSample *shadsamp;
629         
630         /* ray optim */
631         struct RayObject *last_hit[BLENDER_MAX_THREADS];
632         
633         struct MTex *mtex[MAX_MTEX];
634
635         /* threading */
636         int thread_assigned;
637         int thread_ready;
638 } LampRen;
639
640 /* **************** defines ********************* */
641
642 /* R.r.mode flag is same as for renderdata */
643
644 /* R.flag */
645 #define R_ZTRA                  1
646 #define R_HALO                  2
647 #define R_SEC_FIELD             4
648 #define R_LAMPHALO              8
649 #define R_NEED_TANGENT  16
650 #define R_BAKE_TRACE    32
651 #define R_BAKING                64
652 #define R_ANIMATION             128
653 #define R_NEED_VCOL             256
654
655 /* vlakren->flag (vlak = face in dutch) char!!! */
656 #define R_SMOOTH                1
657 #define R_HIDDEN                2
658 /* strand flag, means special handling */
659 #define R_STRAND                4
660 #define R_FULL_OSA              8
661 #define R_FACE_SPLIT    16
662 /* Tells render to divide face other way. */
663 #define R_DIVIDE_24             32      
664 /* vertex normals are tangent or view-corrected vector, for hair strands */
665 #define R_TANGENT               64              
666 #define R_TRACEBLE              128
667
668 /* vlakren->freestyle_edge_mark */
669 #ifdef WITH_FREESTYLE
670 #  define R_EDGE_V1V2           1
671 #  define R_EDGE_V2V3           2
672 #  define R_EDGE_V3V4           4
673 #  define R_EDGE_V3V1           4
674 #  define R_EDGE_V4V1           8
675 #endif
676
677 /* strandbuffer->flag */
678 #define R_STRAND_BSPLINE        1
679 #define R_STRAND_B_UNITS        2
680
681 /* objectren->flag */
682 #define R_INSTANCEABLE          1
683
684 /* objectinstance->flag */
685 #define R_DUPLI_TRANSFORMED     1
686 #define R_ENV_TRANSFORMED       2
687 #define R_TRANSFORMED           (1|2)
688
689 #endif /* __RENDER_TYPES_H__ */
690