Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-06-08 09:07:48 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-06-08 09:07:48 +0300
commita25c11fd8d602236f36c34c342453149bdc1d909 (patch)
treec1e537d7ef21767130c459914313517671d0170b /source/blender/render
parent009c38df5303f0a32eed2962650b89ebd6ae2e46 (diff)
Cleanup: trailing space
Remove from blender/nodes, collada, blenfont & render.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/CMakeLists.txt2
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h22
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h28
-rw-r--r--source/blender/render/intern/include/envmap.h2
-rw-r--r--source/blender/render/intern/include/initrender.h2
-rw-r--r--source/blender/render/intern/include/pixelblending.h2
-rw-r--r--source/blender/render/intern/include/pixelshading.h2
-rw-r--r--source/blender/render/intern/include/pointdensity.h2
-rw-r--r--source/blender/render/intern/include/raycounter.h2
-rw-r--r--source/blender/render/intern/include/rayintersection.h8
-rw-r--r--source/blender/render/intern/include/render_types.h94
-rw-r--r--source/blender/render/intern/include/rendercore.h2
-rw-r--r--source/blender/render/intern/include/shading.h4
-rw-r--r--source/blender/render/intern/include/strand.h2
-rw-r--r--source/blender/render/intern/include/sunsky.h2
-rw-r--r--source/blender/render/intern/include/texture_ocean.h2
-rw-r--r--source/blender/render/intern/include/voxeldata.h2
-rw-r--r--source/blender/render/intern/include/zbuf.h12
-rw-r--r--source/blender/render/intern/raytrace/bvh.h26
-rw-r--r--source/blender/render/intern/raytrace/rayobject.cpp16
-rw-r--r--source/blender/render/intern/raytrace/rayobject_hint.h2
-rw-r--r--source/blender/render/intern/raytrace/rayobject_instance.cpp4
-rw-r--r--source/blender/render/intern/raytrace/rayobject_octree.cpp136
-rw-r--r--source/blender/render/intern/raytrace/rayobject_qbvh.cpp14
-rw-r--r--source/blender/render/intern/raytrace/rayobject_raycounter.cpp2
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.cpp66
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.h10
-rw-r--r--source/blender/render/intern/raytrace/rayobject_svbvh.cpp14
-rw-r--r--source/blender/render/intern/raytrace/rayobject_vbvh.cpp16
-rw-r--r--source/blender/render/intern/raytrace/reorganize.h68
-rw-r--r--source/blender/render/intern/raytrace/svbvh.h26
-rw-r--r--source/blender/render/intern/raytrace/vbvh.h26
-rw-r--r--source/blender/render/intern/source/bake.c50
-rw-r--r--source/blender/render/intern/source/convertblender.c612
-rw-r--r--source/blender/render/intern/source/envmap.c166
-rw-r--r--source/blender/render/intern/source/external_engine.c8
-rw-r--r--source/blender/render/intern/source/imagetexture.c134
-rw-r--r--source/blender/render/intern/source/initrender.c94
-rw-r--r--source/blender/render/intern/source/multires_bake.c2
-rw-r--r--source/blender/render/intern/source/occlusion.c38
-rw-r--r--source/blender/render/intern/source/pipeline.c404
-rw-r--r--source/blender/render/intern/source/pixelblending.c68
-rw-r--r--source/blender/render/intern/source/pixelshading.c156
-rw-r--r--source/blender/render/intern/source/pointdensity.c48
-rw-r--r--source/blender/render/intern/source/rayshade.c508
-rw-r--r--source/blender/render/intern/source/render_result.c84
-rw-r--r--source/blender/render/intern/source/render_texture.c480
-rw-r--r--source/blender/render/intern/source/rendercore.c426
-rw-r--r--source/blender/render/intern/source/renderdatabase.c160
-rw-r--r--source/blender/render/intern/source/shadbuf.c500
-rw-r--r--source/blender/render/intern/source/shadeinput.c206
-rw-r--r--source/blender/render/intern/source/shadeoutput.c410
-rw-r--r--source/blender/render/intern/source/sss.c30
-rw-r--r--source/blender/render/intern/source/strand.c32
-rw-r--r--source/blender/render/intern/source/sunsky.c54
-rw-r--r--source/blender/render/intern/source/volume_precache.c172
-rw-r--r--source/blender/render/intern/source/volumetric.c208
-rw-r--r--source/blender/render/intern/source/voxeldata.c70
-rw-r--r--source/blender/render/intern/source/zbuf.c630
59 files changed, 3184 insertions, 3184 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index 27ec6bf8ba6..36e18da00c7 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -24,7 +24,7 @@
# ***** END GPL LICENSE BLOCK *****
-set(INC
+set(INC
extern/include
intern/include
../blenkernel
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 5c979be2cb6..71988394881 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -102,12 +102,12 @@ typedef struct RenderPass {
/* after render, the Combined pass is in combined, for renderlayers read from files it is a real pass */
typedef struct RenderLayer {
struct RenderLayer *next, *prev;
-
+
/* copy of RenderData */
char name[RE_MAXNAME];
unsigned int lay, lay_zmask, lay_exclude;
int layflag, passflag, pass_xor;
-
+
struct Material *mat_override;
struct Group *light_override;
@@ -122,18 +122,18 @@ typedef struct RenderLayer {
/* optional saved endresult on disk */
void *exrhandle;
-
+
ListBase passes;
-
+
} RenderLayer;
typedef struct RenderResult {
struct RenderResult *next, *prev;
-
+
/* target image size */
int rectx, recty;
short crop, sample_nr;
-
+
/* the following rect32, rectf and rectz buffers are for temporary storage only, for RenderResult structs
* created in #RE_AcquireResultImage - which do not have RenderView */
@@ -143,25 +143,25 @@ typedef struct RenderResult {
float *rectf;
/* if this exists, a copy of one of layers, or result of composited layers */
float *rectz;
-
+
/* coordinates within final image (after cropping) */
rcti tilerect;
/* offset to apply to get a border render in full image */
int xof, yof;
-
+
/* the main buffers */
ListBase layers;
-
+
/* multiView maps to a StringVector in OpenEXR */
ListBase views; /* RenderView */
/* allowing live updates: */
volatile rcti renrect;
volatile RenderLayer *renlay;
-
+
/* optional saved endresult on disk */
int do_exr_tile;
-
+
/* for render results in Image, verify validity for sequences */
int framenr;
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index 81a0449d5b7..838f7031d14 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -66,7 +66,7 @@ typedef struct ShadeResult {
/* only here for quick copy */
struct ShadeInputCopy {
-
+
struct Material *mat;
struct VlakRen *vlr;
struct StrandRen *strand;
@@ -98,7 +98,7 @@ typedef struct ShadeInputCol {
typedef struct ShadeInput {
/* copy from face, also to extract tria from quad */
/* note it mirrors a struct above for quick copy */
-
+
struct Material *mat;
struct VlakRen *vlr;
struct StrandRen *strand;
@@ -114,26 +114,26 @@ typedef struct ShadeInput {
float vn[3], vno[3]; /* actual render normal, and a copy to restore it */
float n1[3], n2[3], n3[3]; /* vertex normals, corrected */
int mode, mode2; /* base material mode (OR-ed result of entire node tree) */
-
+
/* internal face coordinates */
float u, v, dx_u, dx_v, dy_u, dy_v;
float co[3], view[3], camera_co[3];
-
+
/* copy from material, keep synced so we can do memcopy */
/* current size: 23*4 */
float r, g, b;
float specr, specg, specb;
float mirr, mirg, mirb;
float ambr, ambb, ambg;
-
+
float amb, emit, ang, spectra, ray_mirror;
float alpha, refl, spec, zoffs, add;
float translucency;
/* end direct copy from material */
-
+
/* individual copies: */
int har; /* hardness */
-
+
/* texture coordinates */
float lo[3], gl[3], ref[3], orn[3], winco[3], vcol[4];
float refcol[4], displace[3];
@@ -144,7 +144,7 @@ typedef struct ShadeInput {
ShadeInputUV uv[8]; /* 8 = MAX_MTFACE */
ShadeInputCol col[8]; /* 8 = MAX_MCOL */
int totuv, totcol, actuv, actcol;
-
+
/* dx/dy OSA coordinates */
float dxco[3], dyco[3];
float dxlo[3], dylo[3], dxgl[3], dygl[3];
@@ -154,18 +154,18 @@ typedef struct ShadeInput {
float dxwin[3], dywin[3];
float dxrefract[3], dyrefract[3];
float dxstrand, dystrand;
-
+
/* AO is a pre-process now */
float ao[3], indirect[3], env[3];
-
+
int xs, ys; /* pixel to be rendered */
int mask; /* subsample mask */
float scanco[3]; /* original scanline coordinate without jitter */
-
+
int samplenr; /* sample counter, to detect if we should do shadow again */
int depth; /* 1 or larger on raytrace shading */
int volume_depth; /* number of intersections through volumes */
-
+
/* for strand shading, normal at the surface */
float surfnor[3], surfdist;
@@ -175,7 +175,7 @@ typedef struct ShadeInput {
bool use_world_space_shading;
short thread, sample; /* sample: ShadeSample array index */
short nodes; /* indicate node shading, temp hack to prevent recursion */
-
+
unsigned int lay;
int layflag, passflag, combinedflag;
short object_pass_index;
@@ -185,7 +185,7 @@ typedef struct ShadeInput {
#ifdef RE_RAYCOUNTER
RayCounter raycounter;
#endif
-
+
} ShadeInput;
typedef struct BakeImBufuserData {
diff --git a/source/blender/render/intern/include/envmap.h b/source/blender/render/intern/include/envmap.h
index 58bde7d2322..c66427ae788 100644
--- a/source/blender/render/intern/include/envmap.h
+++ b/source/blender/render/intern/include/envmap.h
@@ -34,7 +34,7 @@
#ifndef __ENVMAP_H__
-#define __ENVMAP_H__
+#define __ENVMAP_H__
/**
* Make environment maps for all objects in the scene that have an
diff --git a/source/blender/render/intern/include/initrender.h b/source/blender/render/intern/include/initrender.h
index 87e2d2519d5..0f952baf257 100644
--- a/source/blender/render/intern/include/initrender.h
+++ b/source/blender/render/intern/include/initrender.h
@@ -31,7 +31,7 @@
#ifndef __INITRENDER_H__
-#define __INITRENDER_H__
+#define __INITRENDER_H__
/* Functions */
diff --git a/source/blender/render/intern/include/pixelblending.h b/source/blender/render/intern/include/pixelblending.h
index fd647f96afe..022510c7132 100644
--- a/source/blender/render/intern/include/pixelblending.h
+++ b/source/blender/render/intern/include/pixelblending.h
@@ -29,7 +29,7 @@
#ifndef __PIXELBLENDING_H__
-#define __PIXELBLENDING_H__
+#define __PIXELBLENDING_H__
/**
diff --git a/source/blender/render/intern/include/pixelshading.h b/source/blender/render/intern/include/pixelshading.h
index 98da7eb037b..0e630eda475 100644
--- a/source/blender/render/intern/include/pixelshading.h
+++ b/source/blender/render/intern/include/pixelshading.h
@@ -44,7 +44,7 @@
* mask is pixel coverage in bits
* \return pointer to the object
*/
-int shadeHaloFloat(HaloRen *har,
+int shadeHaloFloat(HaloRen *har,
float *col, int zz,
float dist, float xn,
float yn, short flarec);
diff --git a/source/blender/render/intern/include/pointdensity.h b/source/blender/render/intern/include/pointdensity.h
index 1d1e808e8d3..eadf714c1ba 100644
--- a/source/blender/render/intern/include/pointdensity.h
+++ b/source/blender/render/intern/include/pointdensity.h
@@ -31,7 +31,7 @@
#ifndef __POINTDENSITY_H__
-#define __POINTDENSITY_H__
+#define __POINTDENSITY_H__
/**
* Make point density kd-trees for all point density textures in the scene
diff --git a/source/blender/render/intern/include/raycounter.h b/source/blender/render/intern/include/raycounter.h
index d9ae210048d..e16c6e13c7e 100644
--- a/source/blender/render/intern/include/raycounter.h
+++ b/source/blender/render/intern/include/raycounter.h
@@ -64,7 +64,7 @@ extern RayCounter re_rc_counter[];
#define RE_RC_INFO(rc)
#define RE_RC_MERGE(dest,src)
#define RE_RC_COUNT(var)
-
+
#endif
#ifdef __cplusplus
diff --git a/source/blender/render/intern/include/rayintersection.h b/source/blender/render/intern/include/rayintersection.h
index ae1db30575a..a303301ad3b 100644
--- a/source/blender/render/intern/include/rayintersection.h
+++ b/source/blender/render/intern/include/rayintersection.h
@@ -69,7 +69,7 @@ typedef struct Isect {
/* for envmap and incremental view update renders */
float origstart[3];
float origdir[3];
-
+
/* precomputed values to accelerate bounding box intersection */
int bv_index[6];
float idot_axis[3];
@@ -84,12 +84,12 @@ typedef struct Isect {
/* hit information */
float u, v;
int isect; /* which half of quad */
-
+
struct {
void *ob;
void *face;
} hit, orig;
-
+
/* last hit optimization */
struct RayObject *last_hit;
@@ -98,7 +98,7 @@ typedef struct Isect {
RayTraceHint *hint, *hit_hint;
#endif
RayHint *hint;
-
+
/* ray counter */
#ifdef RE_RAYCOUNTER
RayCounter *raycounter;
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 45206f21ae4..4753d65597a 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -72,7 +72,7 @@ typedef struct SampleTables {
float centLut[16];
float *fmask1[9], *fmask2[9];
char cmask[256], *centmask;
-
+
} SampleTables;
typedef struct QMCSampler {
@@ -91,10 +91,10 @@ typedef struct QMCSampler {
/* this is handed over to threaded hiding/passes/shading engine */
typedef struct RenderPart {
struct RenderPart *next, *prev;
-
+
RenderResult *result; /* result of part rendering */
ListBase fullresult; /* optional full sample buffers */
-
+
int *recto; /* object table for objects */
int *rectp; /* polygon index table */
int *rectz; /* zbuffer */
@@ -111,7 +111,7 @@ typedef struct RenderPart {
short crop, status; /* crop is amount of pixels we crop, for filter */
short sample; /* sample can be used by zbuffers */
short thread; /* thread id */
-
+
char *clipflag; /* clipflags for part zbuffering */
} RenderPart;
@@ -127,13 +127,13 @@ struct Render {
struct Render *next, *prev;
char name[RE_MAXNAME];
int slot;
-
+
/* state settings */
short flag, osa, ok, result_ok;
-
+
/* due to performance issues, getting initialized from color management settings once on Render initialization */
bool scene_color_manage;
-
+
/* result of rendering */
RenderResult *result;
/* if render with single-layer option, other rendered layers are stored here */
@@ -144,7 +144,7 @@ struct Render {
* write lock, all external code must use a read lock. internal code is assumed
* to not conflict with writes, so no lock used for that */
ThreadRWMutex resultmutex;
-
+
/* window size, display rect, viewplane */
int winx, winy; /* buffer width and height with percentage applied
* without border & crop. convert to long before multiplying together to avoid overflow. */
@@ -152,40 +152,40 @@ struct Render {
rctf viewplane; /* mapped on winx winy */
float viewdx, viewdy; /* size of 1 pixel */
float clipcrop; /* 2 pixel boundary to prevent clip when filter used */
-
+
/* final picture width and height (within disprect) */
int rectx, recty;
-
- /* real maximum size of parts after correction for minimum
+
+ /* real maximum size of parts after correction for minimum
* partx*xparts can be larger than rectx, in that case last part is smaller */
int partx, party;
-
+
/* values for viewing */
float ycor; /* (scene->xasp / scene->yasp), multiplied with 'winy' */
-
+
float panophi, panosi, panoco, panodxp, panodxv;
-
+
/* Matrices */
float grvec[3]; /* for world */
float imat[3][3]; /* copy of viewinv */
float viewmat[4][4], viewinv[4][4];
float viewmat_orig[4][4]; /* for incremental render */
float winmat[4][4];
-
+
/* clippping */
float clipsta;
float clipend;
-
+
/* samples */
SampleTables *samples;
float jit[32][2];
float mblur_jit[32][2];
ListBase *qmcsamplers;
int num_qmc_samplers;
-
+
/* shadow counter, detect shadow-reuse for shaders */
int shadowsamplenr[BLENDER_MAX_THREADS];
-
+
/* main, scene, and its full copy of renderdata and world */
struct Main *main;
Scene *scene;
@@ -193,13 +193,13 @@ struct Render {
World wrld;
struct Object *camera_override;
unsigned int lay, layer_override;
-
+
ThreadRWMutex partsmutex;
ListBase parts;
-
+
/* render engine */
struct RenderEngine *engine;
-
+
/* octree tables and variables for raytrace */
struct RayObject *raytree;
struct RayFace *rayfaces;
@@ -209,17 +209,17 @@ struct Render {
/* occlusion tree */
void *occlusiontree;
ListBase strandsurface;
-
+
/* use this instead of R.r.cfra */
float mblur_offs, field_offs;
-
+
/* render database */
int totvlak, totvert, tothalo, totstrand, totlamp;
struct HaloRen **sortedhalos;
ListBase lights; /* GroupObject pointers */
ListBase lampren; /* storage, for free */
-
+
ListBase objecttable;
struct ObjectInstanceRen *objectinstance;
@@ -227,7 +227,7 @@ struct Render {
int totinstance;
struct Image *bakebuf;
-
+
struct GHash *orco_hash;
struct GHash *sss_hash;
@@ -249,7 +249,7 @@ struct Render {
* example dynamic TFaces to go in the VlakRen structure.
*/
struct MemArena *memArena;
-
+
/* callbacks */
void (*display_init)(void *handle, RenderResult *rr);
void *dih;
@@ -259,17 +259,17 @@ struct Render {
void *duh;
void (*current_scene_update)(void *handle, struct Scene *scene);
void *suh;
-
+
void (*stats_draw)(void *handle, RenderStats *ri);
void *sdh;
void (*progress)(void *handle, float i);
void *prh;
-
+
void (*draw_lock)(void *handle, int i);
void *dlh;
int (*test_break)(void *handle);
void *tbh;
-
+
RenderStats i;
struct ReportList *reports;
@@ -289,7 +289,7 @@ typedef struct DeepSample {
int z;
float v;
} DeepSample;
-
+
typedef struct ShadSampleBuf {
struct ShadSampleBuf *next, *prev;
intptr_t *zbuf;
@@ -309,7 +309,7 @@ typedef struct ShadBuf {
int co[3];
int size, bias;
ListBase buffers;
-
+
/* irregular shadowbufer, result stored per thread */
struct ISBData *isb_result[BLENDER_MAX_THREADS];
} ShadBuf;
@@ -345,7 +345,7 @@ typedef struct ObjectRen {
struct RayFace *rayfaces;
struct VlakPrimitive *rayprimitives;
struct ObjectInstanceRen *rayobi;
-
+
} ObjectRen;
typedef struct ObjectInstanceRen {
@@ -365,12 +365,12 @@ typedef struct ObjectInstanceRen {
float dupliorco[3], dupliuv[2];
float (*duplitexmat)[4];
-
+
struct VolumePrecache *volume_precache;
-
+
float *vectors; /* (RE_WINSPEED_ELEMS * VertRen.index) */
int totvector;
-
+
/* used on makeraytree */
struct RayObject *raytree;
int transform_primitives;
@@ -485,9 +485,9 @@ typedef struct StrandBuffer {
int overrideuv;
int flag, maxdepth;
float adaptcos, minwidth, widthfade;
-
+
float maxwidth; /* for cliptest of strands in blender unit */
-
+
float winmat[4][4];
int winx, winy;
} StrandBuffer;
@@ -559,7 +559,7 @@ typedef struct LampShadowSample {
typedef struct LampRen {
struct LampRen *next, *prev;
-
+
float xs, ys, dist;
float co[3];
short type;
@@ -572,7 +572,7 @@ typedef struct LampRen {
float vec[3];
float xsp, ysp, distkw, inpr;
float halokw, halo;
-
+
short falloff_type;
float ld1, ld2;
float coeff_const, coeff_lin, coeff_quad;
@@ -601,7 +601,7 @@ typedef struct LampRen {
float bias;
/* Compression threshold for deep shadow maps */
float compressthresh;
-
+
short ray_samp, ray_sampy, ray_sampz, ray_samp_method, ray_samp_type, area_shape, ray_totsamp;
short xold[BLENDER_MAX_THREADS], yold[BLENDER_MAX_THREADS]; /* last jitter table for area lights */
float area_size, area_sizey, area_sizez;
@@ -609,10 +609,10 @@ typedef struct LampRen {
/* sun/sky */
struct SunSky *sunsky;
-
+
struct ShadBuf *shb;
float *jitter;
-
+
float imat[3][3];
float spottexfac;
float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
@@ -621,13 +621,13 @@ typedef struct LampRen {
float mat[3][3]; /* 3x3 part from lampmat x viewmat */
float area[8][3], areasize;
-
+
/* passes & node shader support: all shadow info for a pixel */
LampShadowSample *shadsamp;
-
+
/* ray optim */
struct RayObject *last_hit[BLENDER_MAX_THREADS];
-
+
struct MTex *mtex[MAX_MTEX];
/* threading */
@@ -658,9 +658,9 @@ typedef struct LampRen {
#define R_FULL_OSA 8
#define R_FACE_SPLIT 16
/* Tells render to divide face other way. */
-#define R_DIVIDE_24 32
+#define R_DIVIDE_24 32
/* vertex normals are tangent or view-corrected vector, for hair strands */
-#define R_TANGENT 64
+#define R_TANGENT 64
#define R_TRACEBLE 128
/* vlakren->freestyle_edge_mark */
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
index f4c4a50ac27..aa3efca9e5b 100644
--- a/source/blender/render/intern/include/rendercore.h
+++ b/source/blender/render/intern/include/rendercore.h
@@ -26,7 +26,7 @@
*/
#ifndef __RENDERCORE_H__
-#define __RENDERCORE_H__
+#define __RENDERCORE_H__
/** \file blender/render/intern/include/rendercore.h
* \ingroup render
diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h
index 3ef6e9d7476..e306c3c075c 100644
--- a/source/blender/render/intern/include/shading.h
+++ b/source/blender/render/intern/include/shading.h
@@ -44,9 +44,9 @@ struct Isect;
/* needed to calculate shadow and AO for an entire pixel */
typedef struct ShadeSample {
int tot; /* amount of shi in use, can be 1 for not FULL_OSA */
-
+
RenderLayer *rlpp[RE_MAX_OSA]; /* fast lookup from sample to renderlayer (fullsample buf) */
-
+
/* could be malloced once */
ShadeInput shi[RE_MAX_OSA];
ShadeResult shr[RE_MAX_OSA];
diff --git a/source/blender/render/intern/include/strand.h b/source/blender/render/intern/include/strand.h
index 5687ef3c837..f4e22c78b42 100644
--- a/source/blender/render/intern/include/strand.h
+++ b/source/blender/render/intern/include/strand.h
@@ -26,7 +26,7 @@
#ifndef __STRAND_H__
-#define __STRAND_H__
+#define __STRAND_H__
struct StrandVert;
struct StrandRen;
diff --git a/source/blender/render/intern/include/sunsky.h b/source/blender/render/intern/include/sunsky.h
index 53151ca17ac..c608f9fc48c 100644
--- a/source/blender/render/intern/include/sunsky.h
+++ b/source/blender/render/intern/include/sunsky.h
@@ -51,7 +51,7 @@ typedef struct SunSky {
float backscattered_light;
float skyblendfac;
float sky_exposure;
-
+
float atm_HGg;
float atm_SunIntensity;
diff --git a/source/blender/render/intern/include/texture_ocean.h b/source/blender/render/intern/include/texture_ocean.h
index 4a71aff930a..6d7bc6fe7b0 100644
--- a/source/blender/render/intern/include/texture_ocean.h
+++ b/source/blender/render/intern/include/texture_ocean.h
@@ -1,4 +1,4 @@
-/*
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/render/intern/include/voxeldata.h b/source/blender/render/intern/include/voxeldata.h
index dd2262e0357..041ca78a799 100644
--- a/source/blender/render/intern/include/voxeldata.h
+++ b/source/blender/render/intern/include/voxeldata.h
@@ -30,7 +30,7 @@
*/
#ifndef __VOXELDATA_H__
-#define __VOXELDATA_H__
+#define __VOXELDATA_H__
struct Render;
struct TexResult;
diff --git a/source/blender/render/intern/include/zbuf.h b/source/blender/render/intern/include/zbuf.h
index eb1af7ad89c..95c78e6d614 100644
--- a/source/blender/render/intern/include/zbuf.h
+++ b/source/blender/render/intern/include/zbuf.h
@@ -87,13 +87,13 @@ typedef struct APixstrMain {
/* span fill in method, is also used to localize data for zbuffering */
typedef struct ZSpan {
int rectx, recty; /* range for clipping */
-
+
int miny1, maxy1, miny2, maxy2; /* actual filled in range */
const float *minp1, *maxp1, *minp2, *maxp2; /* vertex pointers detect min/max range in */
float *span1, *span2;
-
+
float zmulx, zmuly, zofsx, zofsy; /* transform from hoco to zbuf co */
-
+
int *rectz, *arectz; /* zbuffers, arectz is for transparent */
int *rectz1; /* secondary z buffer for shadowbuffer (2nd closest z) */
int *rectp; /* polygon index buffer */
@@ -102,7 +102,7 @@ typedef struct ZSpan {
APixstr *apixbuf, *curpstr; /* apixbuf for transparent */
APixstrand *curpstrand; /* same for strands */
struct ListBase *apsmbase;
-
+
int polygon_offset; /* offset in Z */
float shad_alpha; /* copy from material, used by irregular shadbuf */
int mask, apsmcounter; /* in use by apixbuf */
@@ -112,10 +112,10 @@ typedef struct ZSpan {
void *sss_handle; /* used by sss */
void (*sss_func)(void *, int, int, int, int, int);
-
+
void (*zbuffunc)(struct ZSpan *, int, int, const float *, const float *, const float *, const float *);
void (*zbuflinefunc)(struct ZSpan *, int, int, const float *, const float *);
-
+
} ZSpan;
/* exported to shadbuf.c */
diff --git a/source/blender/render/intern/raytrace/bvh.h b/source/blender/render/intern/raytrace/bvh.h
index e6e88714692..0f9a506762b 100644
--- a/source/blender/render/intern/raytrace/bvh.h
+++ b/source/blender/render/intern/raytrace/bvh.h
@@ -65,7 +65,7 @@ inline int test_bb_group4(__m128 *bb_group, const Isect *isec)
const __m128 tmax2 = _mm_min_ps(tmax1, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[3]], _mm_set_ps1(start[1]) ), _mm_set_ps1(idot_axis[1])) );
const __m128 tmin3 = _mm_max_ps(tmin2, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[4]], _mm_set_ps1(start[2]) ), _mm_set_ps1(idot_axis[2])) );
const __m128 tmax3 = _mm_min_ps(tmax2, _mm_mul_ps(_mm_sub_ps(bb_group[isec->bv_index[5]], _mm_set_ps1(start[2]) ), _mm_set_ps1(idot_axis[2])) );
-
+
return _mm_movemask_ps(_mm_cmpge_ps(tmax3, tmin3));
}
#endif
@@ -78,7 +78,7 @@ inline int test_bb_group4(__m128 *bb_group, const Isect *isec)
static inline int rayobject_bb_intersect_test(const Isect *isec, const float *_bb)
{
const float *bb = _bb;
-
+
float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
@@ -87,7 +87,7 @@ static inline int rayobject_bb_intersect_test(const Isect *isec, const float *_b
float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
RE_RC_COUNT(isec->raycounter->bb.test);
-
+
if (t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
if (t2x < 0.0f || t2y < 0.0f || t2z < 0.0f) return 0;
if (t1x > isec->dist || t1y > isec->dist || t1z > isec->dist) return 0;
@@ -170,7 +170,7 @@ static int bvh_node_stack_raycast(Node *root, Isect *isec)
{
Node *stack[MAX_STACK_SIZE];
int hit = 0, stack_pos = 0;
-
+
if (!TEST_ROOT && !is_leaf(root))
bvh_node_push_childs(root, isec, stack, stack_pos);
else
@@ -205,7 +205,7 @@ static int bvh_node_stack_raycast_simd(Node *root, Isect *isec)
Node *stack[MAX_STACK_SIZE];
int hit = 0, stack_pos = 0;
-
+
if (!TEST_ROOT) {
if (!is_leaf(root)) {
if (!is_leaf(root->child))
@@ -228,7 +228,7 @@ static int bvh_node_stack_raycast_simd(Node *root, Isect *isec)
if (stack_pos >= 4) {
__m128 t_bb[6];
Node *t_node[4];
-
+
stack_pos -= 4;
/* prepare the 4BB for SIMD */
@@ -261,7 +261,7 @@ static int bvh_node_stack_raycast_simd(Node *root, Isect *isec)
{
Node *t = stack[stack_pos + i];
assert(!is_leaf(t));
-
+
float *bb = ((float *)t_bb) + i;
bb[4 * 0] = t->bb[0];
bb[4 * 1] = t->bb[1];
@@ -293,7 +293,7 @@ static int bvh_node_stack_raycast_simd(Node *root, Isect *isec)
else if (stack_pos > 0) {
Node *node = stack[--stack_pos];
assert(!is_leaf(node));
-
+
if (bvh_node_hit_test(node, isec)) {
if (!is_leaf(node->child)) {
bvh_node_push_childs(node, isec, stack, stack_pos);
@@ -328,7 +328,7 @@ static int bvh_node_raycast(Node *node, Isect *isec)
if (!is_leaf(node->child[i]))
{
if (node->child[i] == 0) break;
-
+
hit |= bvh_node_raycast(node->child[i], isec);
if (hit && isec->mode == RE_RAY_SHADOW) return hit;
}
@@ -362,7 +362,7 @@ template<class Node, class HintObject>
static void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, HintObject *hintObject)
{
assert(hint->size + reserve_space + 1 <= RE_RAY_LCTS_MAX_SIZE);
-
+
if (is_leaf(node)) {
hint->stack[hint->size++] = (RayObject *)node;
}
@@ -394,13 +394,13 @@ static inline RayObject *bvh_create_tree(int size)
{
Tree *obj = (Tree *)MEM_callocN(sizeof(Tree), "BVHTree");
assert(RE_rayobject_isAligned(obj)); /* RayObject API assumes real data to be 4-byte aligned */
-
+
obj->rayobj.api = bvh_get_api<Tree>(DFS_STACK_SIZE);
obj->root = NULL;
-
+
obj->node_arena = NULL;
obj->builder = rtbuild_create(size);
-
+
return RE_rayobject_unalignRayAPI((RayObject *) obj);
}
diff --git a/source/blender/render/intern/raytrace/rayobject.cpp b/source/blender/render/intern/raytrace/rayobject.cpp
index 04dc8505e70..fee877b311d 100644
--- a/source/blender/render/intern/raytrace/rayobject.cpp
+++ b/source/blender/render/intern/raytrace/rayobject.cpp
@@ -268,11 +268,11 @@ MALWAYS_INLINE int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *i
{
float dist, uv[2];
int ok = 0;
-
+
/* avoid self-intersection */
if (is->orig.ob == face->ob && is->orig.face == face->face)
return 0;
-
+
/* check if we should intersect this face */
if (is->check == RE_CHECK_VLR_RENDER) {
if (vlr_check_intersect(is, (ObjectInstanceRen *)face->ob, (VlakRen *)face->face) == 0)
@@ -296,7 +296,7 @@ MALWAYS_INLINE int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *i
ok = isec_tri_quad(is->start, &is->isect_precalc, face, uv, &dist);
if (ok) {
-
+
/* when a shadow ray leaves a face, it can be little outside the edges
* of it, causing intersection to be detected in its neighbor face */
if (is->skip & RE_SKIP_VLR_NEIGHBOUR) {
@@ -373,19 +373,19 @@ int RE_rayobject_raycast(RayObject *r, Isect *isec)
/* setup vars used on raycast */
for (i = 0; i < 3; i++) {
isec->idot_axis[i] = 1.0f / isec->dir[i];
-
+
isec->bv_index[2 * i] = isec->idot_axis[i] < 0.0f ? 1 : 0;
isec->bv_index[2 * i + 1] = 1 - isec->bv_index[2 * i];
-
+
isec->bv_index[2 * i] = i + 3 * isec->bv_index[2 * i];
isec->bv_index[2 * i + 1] = i + 3 * isec->bv_index[2 * i + 1];
}
-#ifdef RT_USE_LAST_HIT
+#ifdef RT_USE_LAST_HIT
/* last hit heuristic */
if (isec->mode == RE_RAY_SHADOW && isec->last_hit) {
RE_RC_COUNT(isec->raycounter->rayshadow_last_hit.test);
-
+
if (RE_rayobject_intersect(isec->last_hit, isec)) {
RE_RC_COUNT(isec->raycounter->raycast.hit);
RE_RC_COUNT(isec->raycounter->rayshadow_last_hit.hit);
@@ -474,7 +474,7 @@ void RE_rayobject_merge_bb(RayObject *r, float min[3], float max[3])
{
if (RE_rayobject_isRayFace(r)) {
RayFace *face = (RayFace *) RE_rayobject_align(r);
-
+
DO_MINMAX(face->v1, min, max);
DO_MINMAX(face->v2, min, max);
DO_MINMAX(face->v3, min, max);
diff --git a/source/blender/render/intern/raytrace/rayobject_hint.h b/source/blender/render/intern/raytrace/rayobject_hint.h
index b8cd186612b..88a32819bd2 100644
--- a/source/blender/render/intern/raytrace/rayobject_hint.h
+++ b/source/blender/render/intern/raytrace/rayobject_hint.h
@@ -64,7 +64,7 @@ inline int hint_test_bb(HintFrustum &obj, float *Nmin, float *Nmax)
{
return HINT_DISCARD;
}
-
+
return HINT_ACCEPT;
}
#endif
diff --git a/source/blender/render/intern/raytrace/rayobject_instance.cpp b/source/blender/render/intern/raytrace/rayobject_instance.cpp
index 9a8c1957894..361e7963d96 100644
--- a/source/blender/render/intern/raytrace/rayobject_instance.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_instance.cpp
@@ -68,10 +68,10 @@ typedef struct InstanceRayObject {
void *ob; //Object represented by this instance
void *target_ob; //Object represented by the inner RayObject, needed to handle self-intersection
-
+
float global2target[4][4];
float target2global[4][4];
-
+
} InstanceRayObject;
diff --git a/source/blender/render/intern/raytrace/rayobject_octree.cpp b/source/blender/render/intern/raytrace/rayobject_octree.cpp
index a45b3989e7b..4b73e64ca45 100644
--- a/source/blender/render/intern/raytrace/rayobject_octree.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_octree.cpp
@@ -77,11 +77,11 @@ typedef struct Octree {
int branchcount, nodecount;
/* during building only */
- char *ocface;
-
+ char *ocface;
+
RayFace **ro_nodes;
int ro_nodes_size, ro_nodes_used;
-
+
} Octree;
static int RE_rayobject_octree_intersect(RayObject *o, Isect *isec);
@@ -126,7 +126,7 @@ static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x,
{
float min[3], max[3];
int ocmin, ocmax;
-
+
copy_v3_v3(min, v1);
copy_v3_v3(max, v1);
DO_MINMAX(v2, min, max);
@@ -134,7 +134,7 @@ static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x,
if (v4) {
DO_MINMAX(v4, min, max);
}
-
+
ocmin = OCVALRES * (min[0] - x);
ocmax = OCVALRES * (max[0] - x);
ov->ocx = BROW16(ocmin, ocmax);
@@ -152,7 +152,7 @@ static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x,
static void calc_ocval_ray(OcVal *ov, float xo, float yo, float zo, float *vec1, float *vec2)
{
int ocmin, ocmax;
-
+
if (vec1[0] < vec2[0]) {
ocmin = OCVALRES * (vec1[0] - xo);
ocmax = OCVALRES * (vec2[0] - xo);
@@ -189,12 +189,12 @@ static void calc_ocval_ray(OcVal *ov, float xo, float yo, float zo, float *vec1,
static Branch *addbranch(Octree *oc, Branch *br, short ocb)
{
int index;
-
+
if (br->b[ocb]) return br->b[ocb];
-
+
oc->branchcount++;
index = oc->branchcount >> 12;
-
+
if (oc->adrbranch[index] == NULL)
oc->adrbranch[index] = (Branch *)MEM_callocN(4096 * sizeof(Branch), "new oc branch");
@@ -202,17 +202,17 @@ static Branch *addbranch(Octree *oc, Branch *br, short ocb)
printf("error; octree branches full\n");
oc->branchcount = 0;
}
-
+
return br->b[ocb] = oc->adrbranch[index] + (oc->branchcount & 4095);
}
static Node *addnode(Octree *oc)
{
int index;
-
+
oc->nodecount++;
index = oc->nodecount >> 12;
-
+
if (oc->adrnode[index] == NULL)
oc->adrnode[index] = (Node *)MEM_callocN(4096 * sizeof(Node), "addnode");
@@ -220,7 +220,7 @@ static Node *addnode(Octree *oc)
printf("error; octree nodes full\n");
oc->nodecount = 0;
}
-
+
return oc->adrnode[index] + (oc->nodecount & 4095);
}
@@ -228,14 +228,14 @@ static bool face_in_node(RayFace *face, short x, short y, short z, float rtf[4][
{
static float nor[3], d;
float fx, fy, fz;
-
- // init static vars
+
+ // init static vars
if (face) {
normal_tri_v3(nor, rtf[0], rtf[1], rtf[2]);
d = -nor[0] * rtf[0][0] - nor[1] * rtf[0][1] - nor[2] * rtf[0][2];
return 0;
}
-
+
fx = x;
fy = y;
fz = z;
@@ -260,7 +260,7 @@ static bool face_in_node(RayFace *face, short x, short y, short z, float rtf[4][
if ((fx ) * nor[0] + (fy + 1) * nor[1] + (fz + 1) * nor[2] + d > 0.0f) return 1;
if ((fx + 1) * nor[0] + (fy + 1) * nor[1] + (fz + 1) * nor[2] + d > 0.0f) return 1;
}
-
+
return 0;
}
@@ -313,9 +313,9 @@ static void ocwrite(Octree *oc, RayFace *face, int quad, short x, short y, short
else {
while (no->v[a] != NULL) a++;
}
-
+
no->v[a] = (RayFace *) RE_rayobject_align(face);
-
+
if (quad)
calc_ocval_face(rtf[0], rtf[1], rtf[2], rtf[3], x >> 2, y >> 1, z, &no->ov[a]);
else
@@ -377,19 +377,19 @@ static void d2dda(Octree *oc, short b1, short b2, short c1, short c2, char *ocfa
lambda_y = 1.0f;
ldy = 0;
}
-
+
x = ocx1; y = ocy1;
lambda = MIN2(lambda_x, lambda_y);
-
+
while (true) {
-
+
if (x < 0 || y < 0 || x >= oc->ocres || y >= oc->ocres) {
/* pass*/
}
else {
ocface[oc->ocres * x + y] = 1;
}
-
+
lambda_o = lambda;
if (lambda_x == lambda_y) {
lambda_x += ldx;
@@ -460,7 +460,7 @@ static void RE_rayobject_octree_free(RayObject *tree)
oc->adrbranch = NULL;
}
oc->branchcount = 0;
-
+
if (oc->adrnode) {
int a = 0;
while (oc->adrnode[a]) {
@@ -481,16 +481,16 @@ RayObject *RE_rayobject_octree_create(int ocres, int size)
{
Octree *oc = (Octree *)MEM_callocN(sizeof(Octree), "Octree");
assert(RE_rayobject_isAligned(oc) ); /* RayObject API assumes real data to be 4-byte aligned */
-
+
oc->rayobj.api = &octree_api;
-
+
oc->ocres = ocres;
-
+
oc->ro_nodes = (RayFace **)MEM_callocN(sizeof(RayFace *) * size, "octree rayobject nodes");
oc->ro_nodes_size = size;
oc->ro_nodes_used = 0;
-
+
return RE_rayobject_unalignRayAPI((RayObject *) oc);
}
@@ -537,7 +537,7 @@ static void octree_fill_rayface(Octree *oc, RayFace *face)
rts[3][c] = (short)rtf[3][c];
}
}
-
+
for (c = 0; c < 3; c++) {
oc1 = rts[0][c];
oc2 = rts[1][c];
@@ -554,12 +554,12 @@ static void octree_fill_rayface(Octree *oc, RayFace *face)
if (ocmax[c] > oc->ocres - 1) ocmax[c] = oc->ocres - 1;
if (ocmin[c] < 0) ocmin[c] = 0;
}
-
+
if (ocmin[0] == ocmax[0] && ocmin[1] == ocmax[1] && ocmin[2] == ocmax[2]) {
ocwrite(oc, face, RE_rayface_isQuad(face), ocmin[0], ocmin[1], ocmin[2], rtf);
}
else {
-
+
d2dda(oc, 0, 1, 0, 1, ocface + ocres2, rts, rtf);
d2dda(oc, 0, 1, 0, 2, ocface, rts, rtf);
d2dda(oc, 0, 1, 1, 2, ocface + 2 * ocres2, rts, rtf);
@@ -583,10 +583,10 @@ static void octree_fill_rayface(Octree *oc, RayFace *face)
filltriangle(oc, 0, 1, ocface + ocres2, ocmin, ocmax);
filltriangle(oc, 0, 2, ocface, ocmin, ocmax);
filltriangle(oc, 1, 2, ocface + 2 * ocres2, ocmin, ocmax);
-
+
/* init static vars here */
face_in_node(face, 0, 0, 0, rtf);
-
+
for (x = ocmin[0]; x <= ocmax[0]; x++) {
a = oc->ocres * x;
for (y = ocmin[1]; y <= ocmax[1]; y++) {
@@ -601,7 +601,7 @@ static void octree_fill_rayface(Octree *oc, RayFace *face)
}
}
}
-
+
/* same loops to clear octree, doubt it can be done smarter */
for (x = ocmin[0]; x <= ocmax[0]; x++) {
a = oc->ocres * x;
@@ -627,19 +627,19 @@ static void RE_rayobject_octree_done(RayObject *tree)
int c;
float t00, t01, t02;
int ocres2 = oc->ocres * oc->ocres;
-
+
INIT_MINMAX(oc->min, oc->max);
-
+
/* Calculate Bounding Box */
for (c = 0; c < oc->ro_nodes_used; c++)
RE_rayobject_merge_bb(RE_rayobject_unalignRayFace(oc->ro_nodes[c]), oc->min, oc->max);
-
+
/* Alloc memory */
oc->adrbranch = (Branch **)MEM_callocN(sizeof(void *) * BRANCH_ARRAY, "octree branches");
oc->adrnode = (Node **)MEM_callocN(sizeof(void *) * NODE_ARRAY, "octree nodes");
-
+
oc->adrbranch[0] = (Branch *)MEM_callocN(4096 * sizeof(Branch), "makeoctree");
-
+
/* the lookup table, per face, for which nodes to fill in */
oc->ocface = (char *)MEM_callocN(3 * ocres2 + 8, "ocface");
memset(oc->ocface, 0, 3 * ocres2);
@@ -652,12 +652,12 @@ static void RE_rayobject_octree_done(RayObject *tree)
t00 = oc->max[0] - oc->min[0];
t01 = oc->max[1] - oc->min[1];
t02 = oc->max[2] - oc->min[2];
-
+
/* this minus 0.1 is old safety... seems to be needed? */
oc->ocfacx = (oc->ocres - 0.1f) / t00;
oc->ocfacy = (oc->ocres - 0.1f) / t01;
oc->ocfacz = (oc->ocres - 0.1f) / t02;
-
+
oc->ocsize = sqrtf(t00 * t00 + t01 * t01 + t02 * t02); /* global, max size octree */
for (c = 0; c < oc->ro_nodes_used; c++) {
@@ -690,7 +690,7 @@ static int testnode(Octree *UNUSED(oc), Isect *is, Node *no, OcVal ocval)
/* return on any first hit */
if (is->mode == RE_RAY_SHADOW) {
-
+
for (; no; no = no->next) {
for (nr = 0; nr < 8; nr++) {
RayFace *face = no->v[nr];
@@ -708,7 +708,7 @@ static int testnode(Octree *UNUSED(oc), Isect *is, Node *no, OcVal ocval)
else {
/* else mirror or glass or shadowtra, return closest face */
int found = 0;
-
+
for (; no; no = no->next) {
for (nr = 0; nr < 8; nr++) {
RayFace *face = no->v[nr];
@@ -723,7 +723,7 @@ static int testnode(Octree *UNUSED(oc), Isect *is, Node *no, OcVal ocval)
}
}
}
-
+
return found;
}
@@ -735,12 +735,12 @@ static Node *ocread(Octree *oc, int x, int y, int z)
{
Branch *br;
int oc1;
-
+
x <<= 2;
y <<= 1;
-
+
br = oc->adrbranch[0];
-
+
if (oc->ocres == 512) {
oc1 = ((x & 1024) + (y & 512) + (z & 256)) >> 8;
br = br->b[oc1];
@@ -762,7 +762,7 @@ static Node *ocread(Octree *oc, int x, int y, int z)
return NULL;
}
}
-
+
oc1 = ((x & 128) + (y & 64) + (z & 32)) >> 5;
br = br->b[oc1];
if (br) {
@@ -785,7 +785,7 @@ static Node *ocread(Octree *oc, int x, int y, int z)
}
}
}
-
+
return NULL;
}
@@ -817,26 +817,26 @@ static int cliptest(float p, float q, float *u1, float *u2)
/* extensive coherence checks/storage cancels out the benefit of it, and gives errors... we
* need better methods, sample code commented out below (ton) */
-
+
#if 0
in top : static int coh_nodes[16 * 16 * 16][6];
in makeoctree : memset(coh_nodes, 0, sizeof(coh_nodes));
-
+
static void add_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
{
short *sp;
-
+
sp = coh_nodes[(ocx2 & 15) + 16 * (ocy2 & 15) + 256 * (ocz2 & 15)];
sp[0] = ocx1; sp[1] = ocy1; sp[2] = ocz1;
sp[3] = ocx2; sp[4] = ocy2; sp[5] = ocz2;
-
+
}
static int do_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
{
short *sp;
-
+
sp = coh_nodes[(ocx2 & 15) + 16 * (ocy2 & 15) + 256 * (ocz2 & 15)];
if (sp[0] == ocx1 && sp[1] == ocy1 && sp[2] == ocz1 &&
sp[3] == ocx2 && sp[4] == ocy2 && sp[5] == ocz2) return 1;
@@ -859,10 +859,10 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
int dx, dy, dz;
int xo, yo, zo, c1 = 0;
int ocx1, ocx2, ocy1, ocy2, ocz1, ocz2;
-
+
/* clip with octree */
if (oc->branchcount == 0) return 0;
-
+
/* do this before intersect calls */
#if 0
is->facecontr = NULL; /* to check shared edge */
@@ -877,7 +877,7 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
o_lambda = is->dist;
u1 = 0.0f;
u2 = 1.0f;
-
+
/* clip with octree cube */
if (cliptest(-ldx, start[0] - oc->min[0], &u1, &u2)) {
if (cliptest(ldx, oc->max[0] - start[0], &u1, &u2)) {
@@ -925,7 +925,7 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
ocx2 = (int)ox2;
ocy2 = (int)oy2;
ocz2 = (int)oz2;
-
+
if (ocx1 == ocx2 && ocy1 == ocy2 && ocz1 == ocz2) {
no = ocread(oc, ocx1, ocy1, ocz1);
if (no) {
@@ -941,7 +941,7 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
//static int coh_ocx1, coh_ocx2, coh_ocy1, coh_ocy2, coh_ocz1, coh_ocz2;
float dox, doy, doz;
int eqval;
-
+
/* calc lambda en ld */
dox = ox1 - ox2;
doy = oy1 - oy2;
@@ -994,14 +994,14 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
ldz = 0;
dz = 0;
}
-
+
xo = ocx1; yo = ocy1; zo = ocz1;
dda_lambda = min_fff(lambda_x, lambda_y, lambda_z);
-
+
vec2[0] = ox1;
vec2[1] = oy1;
vec2[2] = oz1;
-
+
/* this loop has been constructed to make sure the first and last node of ray
* are always included, even when dda_lambda==1.0f or larger */
@@ -1009,7 +1009,7 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
no = ocread(oc, xo, yo, zo);
if (no) {
-
+
/* calculate ray intersection with octree node */
copy_v3_v3(vec1, vec2);
// dox, y, z is negative
@@ -1028,7 +1028,7 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
lambda_o = dda_lambda;
-
+
/* traversing octree nodes need careful detection of smallest values, with proper
* exceptions for equal lambdas */
eqval = (lambda_x == lambda_y);
@@ -1073,7 +1073,7 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
eqval = (lambda_x < lambda_y);
if (lambda_y < lambda_z) eqval += 2;
if (lambda_x < lambda_z) eqval += 4;
-
+
if (eqval == 7 || eqval == 5) { // x smallest
xo += dx; lambda_x += ldx;
}
@@ -1083,7 +1083,7 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
else { // z smallest
zo += dz; lambda_z += ldz;
}
-
+
}
dda_lambda = min_fff(lambda_x, lambda_y, lambda_z);
@@ -1092,10 +1092,10 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
if (lambda_o >= 1.0f) break;
}
}
-
+
/* reached end, no intersections found */
return 0;
-}
+}
diff --git a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
index 712613506e5..8e3dd87efd1 100644
--- a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
@@ -57,7 +57,7 @@ template<>
void bvh_done<QBVHTree>(QBVHTree *obj)
{
rtbuild_done(obj->builder, &obj->rayobj.control);
-
+
//TODO find a away to exactly calculate the needed memory
MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "qbvh arena");
BLI_memarena_use_malloc(arena1);
@@ -75,17 +75,17 @@ void bvh_done<QBVHTree>(QBVHTree *obj)
BLI_memarena_free(arena2);
return;
}
-
+
if (root) {
pushup_simd<VBVHNode, 4>(root);
obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
}
else
obj->root = NULL;
-
+
//Free data
BLI_memarena_free(arena1);
-
+
obj->node_arena = arena2;
obj->cost = 1.0;
@@ -120,7 +120,7 @@ static void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *UNUSED(min), float *U
template<class Tree, int STACK_SIZE>
static RayObjectAPI make_api()
{
- static RayObjectAPI api =
+ static RayObjectAPI api =
{
(RE_rayobject_raycast_callback) ((int (*)(Tree *, Isect *)) & intersect<STACK_SIZE>),
(RE_rayobject_add_callback) ((void (*)(Tree *, RayObject *)) & bvh_add<Tree>),
@@ -130,7 +130,7 @@ static RayObjectAPI make_api()
(RE_rayobject_cost_callback) ((float (*)(Tree *)) & bvh_cost<Tree>),
(RE_rayobject_hint_bb_callback) ((void (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb<Tree>)
};
-
+
return api;
}
@@ -138,7 +138,7 @@ template<class Tree>
RayObjectAPI *bvh_get_api(int maxstacksize)
{
static RayObjectAPI bvh_api256 = make_api<Tree, 1024>();
-
+
if (maxstacksize <= 1024) return &bvh_api256;
assert(maxstacksize <= 256);
return NULL;
diff --git a/source/blender/render/intern/raytrace/rayobject_raycounter.cpp b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
index 21161e63512..429c47f1c0f 100644
--- a/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
@@ -80,7 +80,7 @@ void RE_RC_MERGE(RayCounter *dest, RayCounter *tmp)
dest->raycast.test += tmp->raycast.test;
dest->raycast.hit += tmp->raycast.hit;
-
+
dest->rayshadow_last_hit.test += tmp->rayshadow_last_hit.test;
dest->rayshadow_last_hit.hit += tmp->rayshadow_last_hit.hit;
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
index a7402605301..51f89784674 100644
--- a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
@@ -60,13 +60,13 @@ static void rtbuild_init(RTBuilder *b)
b->primitives.end = NULL;
b->primitives.maxsize = 0;
b->depth = 0;
-
+
for (int i = 0; i < RTBUILD_MAX_CHILDS; i++)
b->child_offset[i] = 0;
for (int i = 0; i < 3; i++)
b->sorted_begin[i] = b->sorted_end[i] = NULL;
-
+
INIT_MINMAX(b->bb, b->bb + 3);
}
@@ -77,15 +77,15 @@ RTBuilder *rtbuild_create(int size)
rtbuild_init(builder);
-
+
builder->primitives.begin = builder->primitives.end = memblock;
builder->primitives.maxsize = size;
-
+
for (int i = 0; i < 3; i++) {
builder->sorted_begin[i] = (RTBuilder::Object **)MEM_mallocN(sizeof(RTBuilder::Object *) * size, "RTBuilder.sorted_objects");
builder->sorted_end[i] = builder->sorted_begin[i];
}
-
+
return builder;
}
@@ -124,12 +124,12 @@ void rtbuild_add(RTBuilder *b, RayObject *o)
* will give problems in rtbuild_heuristic_object_split later */
if (bb[0] == bb[3] && bb[1] == bb[4] && bb[2] == bb[5])
return;
-
+
copy_v3_v3(b->primitives.end->bb, bb);
copy_v3_v3(b->primitives.end->bb + 3, bb + 3);
b->primitives.end->obj = o;
b->primitives.end->cost = RE_rayobject_cost(o);
-
+
for (int i = 0; i < 3; i++) {
*(b->sorted_end[i]) = b->primitives.end;
b->sorted_end[i]++;
@@ -190,7 +190,7 @@ RTBuilder *rtbuild_get_child(RTBuilder *b, int child, RTBuilder *tmp)
tmp->sorted_begin[i] = NULL;
tmp->sorted_end[i] = NULL;
}
-
+
return tmp;
}
@@ -227,17 +227,17 @@ int rtbuild_mean_split(RTBuilder *b, int nchilds, int axis)
long long s;
assert(nchilds <= RTBUILD_MAX_CHILDS);
-
+
//TODO optimize calc of leafs_per_child
for (s = nchilds; s < tot_leafs; s *= nchilds) ;
Mleafs_per_child = s / nchilds;
mleafs_per_child = Mleafs_per_child / nchilds;
-
+
//split min leafs per child
b->child_offset[0] = 0;
for (i = 1; i <= nchilds; i++)
b->child_offset[i] = mleafs_per_child;
-
+
//split remaining leafs
missing_leafs = tot_leafs - mleafs_per_child * nchilds;
for (i = 1; i <= nchilds; i++)
@@ -253,7 +253,7 @@ int rtbuild_mean_split(RTBuilder *b, int nchilds, int axis)
break;
}
}
-
+
//adjust for accumulative offsets
for (i = 1; i <= nchilds; i++)
b->child_offset[i] += b->child_offset[i - 1];
@@ -261,12 +261,12 @@ int rtbuild_mean_split(RTBuilder *b, int nchilds, int axis)
//Count created childs
for (i = nchilds; b->child_offset[i] == b->child_offset[i - 1]; i--) ;
split_leafs(b, b->child_offset, i, axis);
-
+
assert(b->child_offset[0] == 0 && b->child_offset[i] == tot_leafs);
return i;
}
-
-
+
+
int rtbuild_mean_split_largest_axis(RTBuilder *b, int nchilds)
{
int axis = rtbuild_get_largest_axis(b);
@@ -282,7 +282,7 @@ int rtbuild_mean_split_largest_axis(RTBuilder *b, int nchilds)
int rtbuild_median_split(RTBuilder *b, float *separators, int nchilds, int axis)
{
int size = rtbuild_size(b);
-
+
assert(nchilds <= RTBUILD_MAX_CHILDS);
if (size <= nchilds)
{
@@ -292,17 +292,17 @@ int rtbuild_median_split(RTBuilder *b, float *separators, int nchilds, int axis)
int i;
b->split_axis = axis;
-
+
//Calculate child offsets
b->child_offset[0] = 0;
for (i = 0; i < nchilds - 1; i++)
b->child_offset[i + 1] = split_leafs_by_plane(b, b->child_offset[i], size, separators[i]);
b->child_offset[nchilds] = size;
-
+
for (i = 0; i < nchilds; i++)
if (b->child_offset[i + 1] - b->child_offset[i] == size)
return rtbuild_mean_split(b, nchilds, axis);
-
+
return nchilds;
}
}
@@ -311,13 +311,13 @@ int rtbuild_median_split_largest_axis(RTBuilder *b, int nchilds)
{
int la, i;
float separators[RTBUILD_MAX_CHILDS];
-
+
rtbuild_calc_bb(b);
la = bb_largest_axis(b->bb, b->bb + 3);
for (i = 1; i < nchilds; i++)
separators[i - 1] = (b->bb[la + 3] - b->bb[la]) * i / nchilds;
-
+
return rtbuild_median_split(b, separators, nchilds, la);
}
#endif
@@ -353,12 +353,12 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
boffset = size / 2;
SweepCost *sweep = (SweepCost *)MEM_mallocN(sizeof(SweepCost) * size, "RTBuilder.HeuristicSweep");
-
+
for (int axis = 0; axis < 3; axis++) {
SweepCost sweep_left;
RTBuilder::Object **obj = b->sorted_begin[axis];
-
+
// float right_cost = 0;
for (int i = size - 1; i >= 0; i--) {
if (i == size - 1) {
@@ -377,7 +377,7 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
}
// right_cost += obj[i]->cost;
}
-
+
sweep_left.bb[0] = obj[0]->bb[0];
sweep_left.bb[1] = obj[0]->bb[1];
sweep_left.bb[2] = obj[0]->bb[2];
@@ -385,13 +385,13 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
sweep_left.bb[4] = obj[0]->bb[4];
sweep_left.bb[5] = obj[0]->bb[5];
sweep_left.cost = obj[0]->cost;
-
+
// right_cost -= obj[0]->cost; if (right_cost < 0) right_cost = 0;
for (int i = 1; i < size; i++) {
//Worst case heuristic (cost of each child is linear)
float hcost, left_side, right_side;
-
+
// not using log seems to have no impact on raytracing perf, but
// makes tree construction quicker, left out for now to test (brecht)
// left_side = bb_area(sweep_left.bb, sweep_left.bb + 3) * (sweep_left.cost + logf((float)i));
@@ -402,7 +402,7 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
assert(left_side >= 0);
assert(right_side >= 0);
-
+
if (left_side > bcost) break; //No way we can find a better heuristic in this axis
assert(hcost >= 0);
@@ -418,13 +418,13 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
sweep_left.cost += obj[i]->cost;
// right_cost -= obj[i]->cost; if (right_cost < 0) right_cost = 0;
}
-
+
//assert(baxis >= 0 && baxis < 3);
if (!(baxis >= 0 && baxis < 3))
baxis = 0;
}
-
-
+
+
MEM_freeN(sweep);
}
else if (size == 2) {
@@ -436,11 +436,11 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
b->child_offset[1] = 1;
return 1;
}
-
+
b->child_offset[0] = 0;
b->child_offset[1] = boffset;
b->child_offset[2] = size;
-
+
/* Adjust sorted arrays for childs */
for (int i = 0; i < boffset; i++) b->sorted_begin[baxis][i]->selected = true;
@@ -498,7 +498,7 @@ float bb_area(const float min[3], const float max[3])
int bb_largest_axis(const float min[3], const float max[3])
{
float sub[3];
-
+
sub[0] = max[0] - min[0];
sub[1] = max[1] - min[1];
sub[2] = max[2] - min[2];
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.h b/source/blender/render/intern/raytrace/rayobject_rtbuild.h
index d62f853bc63..fc42bc36d92 100644
--- a/source/blender/render/intern/raytrace/rayobject_rtbuild.h
+++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.h
@@ -60,24 +60,24 @@ typedef struct RTBuilder {
float bb[6];
int selected;
};
-
+
/* list to all primitives added in this tree */
struct {
Object *begin, *end;
int maxsize;
} primitives;
-
+
/* sorted list of rayobjects */
struct Object **sorted_begin[3], **sorted_end[3];
/* axis used (if any) on the split method */
int split_axis;
-
+
/* child partitions calculated during splitting */
int child_offset[RTBUILD_MAX_CHILDS + 1];
-
+
// int child_sorted_axis; /* -1 if not sorted */
-
+
float bb[6];
/* current depth */
diff --git a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
index 2caaabe7359..fcd692fac02 100644
--- a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
@@ -67,7 +67,7 @@ template<>
void bvh_done<SVBVHTree>(SVBVHTree *obj)
{
rtbuild_done(obj->builder, &obj->rayobj.control);
-
+
//TODO find a away to exactly calculate the needed memory
MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "svbvh arena");
BLI_memarena_use_malloc(arena1);
@@ -85,7 +85,7 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
BLI_memarena_free(arena2);
return;
}
-
+
reorganize(root);
remove_useless(root, &root);
bvh_refit(root);
@@ -114,10 +114,10 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
else
obj->root = NULL;
}
-
+
//Free data
BLI_memarena_free(arena1);
-
+
obj->node_arena = arena2;
obj->cost = 1.0;
@@ -152,7 +152,7 @@ static void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *UNUSED(min), float *U
template<class Tree, int STACK_SIZE>
static RayObjectAPI make_api()
{
- static RayObjectAPI api =
+ static RayObjectAPI api =
{
(RE_rayobject_raycast_callback) ((int (*)(Tree *, Isect *)) & intersect<STACK_SIZE>),
(RE_rayobject_add_callback) ((void (*)(Tree *, RayObject *)) & bvh_add<Tree>),
@@ -162,7 +162,7 @@ static RayObjectAPI make_api()
(RE_rayobject_cost_callback) ((float (*)(Tree *)) & bvh_cost<Tree>),
(RE_rayobject_hint_bb_callback) ((void (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb<Tree>)
};
-
+
return api;
}
@@ -170,7 +170,7 @@ template<class Tree>
static RayObjectAPI *bvh_get_api(int maxstacksize)
{
static RayObjectAPI bvh_api256 = make_api<Tree, 1024>();
-
+
if (maxstacksize <= 1024) return &bvh_api256;
assert(maxstacksize <= 256);
return NULL;
diff --git a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
index 55918f1d6f6..b63a11047dd 100644
--- a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
@@ -79,11 +79,11 @@ template<>
void bvh_done<VBVHTree>(VBVHTree *obj)
{
rtbuild_done(obj->builder, &obj->rayobj.control);
-
+
//TODO find a away to exactly calculate the needed memory
MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vbvh arena");
BLI_memarena_use_malloc(arena1);
-
+
//Build and optimize the tree
if (1) {
VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
@@ -96,7 +96,7 @@ void bvh_done<VBVHTree>(VBVHTree *obj)
reorganize(root);
remove_useless(root, &root);
bvh_refit(root);
-
+
pushup(root);
pushdown(root);
obj->root = root;
@@ -109,13 +109,13 @@ void bvh_done<VBVHTree>(VBVHTree *obj)
#if 0
MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vbvh arena2");
BLI_memarena_use_malloc(arena2);
-
+
//Finds the optimal packing of this tree using a given cost model
//TODO this uses quite a lot of memory, find ways to reduce memory usage during building
OVBVHNode *root = BuildBinaryVBVH<OVBVHNode>(arena2).transform(obj->builder);
VBVH_optimalPackSIMD<OVBVHNode, PackCost>(PackCost()).transform(root);
obj->root = Reorganize_VBVH<OVBVHNode>(arena1).transform(root);
-
+
BLI_memarena_free(arena2);
#endif
}
@@ -176,7 +176,7 @@ static void bfree(VBVHTree *tree)
template<class Tree, int STACK_SIZE>
static RayObjectAPI make_api()
{
- static RayObjectAPI api =
+ static RayObjectAPI api =
{
(RE_rayobject_raycast_callback) ((int (*)(Tree *, Isect *)) & intersect<STACK_SIZE>),
(RE_rayobject_add_callback) ((void (*)(Tree *, RayObject *)) & bvh_add<Tree>),
@@ -186,7 +186,7 @@ static RayObjectAPI make_api()
(RE_rayobject_cost_callback) ((float (*)(Tree *)) & bvh_cost<Tree>),
(RE_rayobject_hint_bb_callback) ((void (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb<Tree>)
};
-
+
return api;
}
@@ -194,7 +194,7 @@ template<class Tree>
RayObjectAPI *bvh_get_api(int maxstacksize)
{
static RayObjectAPI bvh_api256 = make_api<Tree, 1024>();
-
+
if (maxstacksize <= 1024) return &bvh_api256;
assert(maxstacksize <= 256);
return 0;
diff --git a/source/blender/render/intern/raytrace/reorganize.h b/source/blender/render/intern/raytrace/reorganize.h
index 3f2b4f72f69..3fdd3363edb 100644
--- a/source/blender/render/intern/raytrace/reorganize.h
+++ b/source/blender/render/intern/raytrace/reorganize.h
@@ -65,11 +65,11 @@ static void reorganize_find_fittest_parent(Node *tree, Node *node, std::pair<flo
{
std::queue<Node *> q;
q.push(tree);
-
+
while (!q.empty()) {
Node *parent = q.front();
q.pop();
-
+
if (parent == node) continue;
if (node_fits_inside(node, parent) && RE_rayobject_isAligned(parent->child) ) {
float pcost = bb_area(parent->bb, parent->bb + 3);
@@ -89,7 +89,7 @@ static void reorganize(Node *root)
while (!q.empty()) {
Node *node = q.front();
q.pop();
-
+
if (RE_rayobject_isAligned(node->child)) {
for (Node **prev = &node->child; *prev; ) {
assert(RE_rayobject_isAligned(*prev));
@@ -105,12 +105,12 @@ static void reorganize(Node *root)
else {
Node *tmp = *prev;
*prev = (*prev)->sibling;
-
+
tmp->sibling = best.second->child;
best.second->child = tmp;
}
-
-
+
+
}
}
if (node != root) {
@@ -156,7 +156,7 @@ template<class Node>
static void pushup(Node *parent)
{
if (is_leaf(parent)) return;
-
+
float p_area = bb_area(parent->bb, parent->bb + 3);
Node **prev = &parent->child;
for (Node *child = parent->child; RE_rayobject_isAligned(child) && child; ) {
@@ -180,7 +180,7 @@ static void pushup(Node *parent)
child = *prev;
}
}
-
+
for (Node *child = parent->child; RE_rayobject_isAligned(child) && child; child = child->sibling)
pushup(child);
}
@@ -192,9 +192,9 @@ template<class Node, int SSize>
static void pushup_simd(Node *parent)
{
if (is_leaf(parent)) return;
-
+
int n = count_childs(parent);
-
+
Node **prev = &parent->child;
for (Node *child = parent->child; RE_rayobject_isAligned(child) && child; ) {
int cn = count_childs(child);
@@ -210,7 +210,7 @@ static void pushup_simd(Node *parent)
child = *prev;
}
}
-
+
for (Node *child = parent->child; RE_rayobject_isAligned(child) && child; child = child->sibling)
pushup_simd<Node, SSize>(child);
}
@@ -225,13 +225,13 @@ static void pushdown(Node *parent)
{
Node **s_child = &parent->child;
Node *child = parent->child;
-
+
while (child && RE_rayobject_isAligned(child)) {
Node *next = child->sibling;
Node **next_s_child = &child->sibling;
-
+
//assert(bb_fits_inside(parent->bb, parent->bb+3, child->bb, child->bb+3));
-
+
for (Node *i = parent->child; RE_rayobject_isAligned(i) && i; i = i->sibling)
if (child != i && bb_fits_inside(i->bb, i->bb + 3, child->bb, child->bb + 3) && RE_rayobject_isAligned(i->child)) {
// todo optimize (should the one with the smallest area?)
@@ -241,14 +241,14 @@ static void pushdown(Node *parent)
child->sibling = i->child;
i->child = child;
next_s_child = s_child;
-
+
tot_pushdown++;
break;
}
child = next;
s_child = next_s_child;
}
-
+
for (Node *i = parent->child; RE_rayobject_isAligned(i) && i; i = i->sibling) {
pushdown(i);
}
@@ -264,12 +264,12 @@ static float bvh_refit(Node *node)
{
if (is_leaf(node)) return 0;
if (is_leaf(node->child)) return 0;
-
+
float total = 0;
-
+
for (Node *child = node->child; child; child = child->sibling)
total += bvh_refit(child);
-
+
float old_area = bb_area(node->bb, node->bb + 3);
INIT_MINMAX(node->bb, node->bb + 3);
for (Node *child = node->child; child; child = child->sibling) {
@@ -298,7 +298,7 @@ struct OVBVHNode {
OVBVHNode *child;
OVBVHNode *sibling;
-
+
/*
* Returns min cost to represent the subtree starting at the given node,
* allowing it to have a given cutsize
@@ -309,7 +309,7 @@ struct OVBVHNode {
assert(CUT_SIZE_IS_VALID(cutsize - 1));
return cut_cost[cutsize - 1];
}
-
+
/*
* This saves the cut size of this child, when parent is reaching
* its minimum cut with the given cut size
@@ -320,7 +320,7 @@ struct OVBVHNode {
assert(CUT_SIZE_IS_VALID(parent_cut_size - 1));
return cut_size[parent_cut_size - 1];
}
-
+
/*
* Reorganize the node based on calculated cut costs
*/
@@ -371,19 +371,19 @@ struct OVBVHNode {
template<class Node, class TestCost>
struct VBVH_optimalPackSIMD {
TestCost testcost;
-
+
VBVH_optimalPackSIMD(TestCost testcost)
{
this->testcost = testcost;
}
-
+
/*
* calc best cut on a node
*/
struct calc_best {
Node *child[MAX_OPTIMIZE_CHILDS];
float child_hit_prob[MAX_OPTIMIZE_CHILDS];
-
+
calc_best(Node *node)
{
int nchilds = 0;
@@ -398,12 +398,12 @@ struct VBVH_optimalPackSIMD {
assert(nchilds >= 2 && nchilds <= MAX_OPTIMIZE_CHILDS);
}
-
-
+
+
//Build DP table to find minimum cost to represent this node with a given cutsize
int bt[MAX_OPTIMIZE_CHILDS + 1][MAX_CUT_SIZE + 1]; //backtrace table
float cost[MAX_OPTIMIZE_CHILDS + 1][MAX_CUT_SIZE + 1]; //cost table (can be reduced to float[2][MAX_CUT_COST])
-
+
for (int i = 0; i <= nchilds; i++) {
for (int j = 0; j <= MAX_CUT_SIZE; j++) {
cost[i][j] = INFINITY;
@@ -411,7 +411,7 @@ struct VBVH_optimalPackSIMD {
}
cost[0][0] = 0;
-
+
for (int i = 1; i <= nchilds; i++) {
for (int size = i - 1; size /*+(nchilds-i)*/ <= MAX_CUT_SIZE; size++) {
for (int cut = 1; cut + size /*+(nchilds-i)*/ <= MAX_CUT_SIZE; cut++) {
@@ -423,7 +423,7 @@ struct VBVH_optimalPackSIMD {
}
}
}
-
+
/* Save the ways to archive the minimum cost with a given cutsize */
for (int i = nchilds; i <= MAX_CUT_SIZE; i++) {
node->cut_cost[i - 1] = cost[nchilds][i];
@@ -437,10 +437,10 @@ struct VBVH_optimalPackSIMD {
}
}
};
-
+
void calc_costs(Node *node)
{
-
+
if (RE_rayobject_isAligned(node->child) ) {
int nchilds = 0;
for (Node *child = node->child; child && RE_rayobject_isAligned(child); child = child->sibling) {
@@ -459,14 +459,14 @@ struct VBVH_optimalPackSIMD {
for (Node *child = node->child; child && RE_rayobject_isAligned(child); child = child->sibling) {
cost += ((parent_area != 0.0f) ? (bb_area(child->bb, child->bb + 3) / parent_area) : 1.0f) * child->get_cost(1);
}
-
+
cost += testcost(nchilds);
node->cut_cost[0] = cost;
node->best_cutsize = nchilds;
}
else {
calc_best calc(node);
-
+
//calc expected cost if we optimaly pack this node
for (int cutsize = nchilds; cutsize <= MAX_CUT_SIZE; cutsize++) {
float m = node->get_cost(cutsize) + testcost(cutsize);
diff --git a/source/blender/render/intern/raytrace/svbvh.h b/source/blender/render/intern/raytrace/svbvh.h
index 565bba6876c..0a5690deb46 100644
--- a/source/blender/render/intern/raytrace/svbvh.h
+++ b/source/blender/render/intern/raytrace/svbvh.h
@@ -73,21 +73,21 @@ static int svbvh_bb_intersect_test_simd4(const Isect *isec, const __m128 *bb_gro
const __m128 tmax2 = _mm_min_ps(tmax1, mul3);
const __m128 tmin3 = _mm_max_ps(tmin2, mul4);
const __m128 tmax3 = _mm_min_ps(tmax2, mul5);
-
+
return _mm_movemask_ps(_mm_cmpge_ps(tmax3, tmin3));
}
static int svbvh_bb_intersect_test(const Isect *isec, const float *_bb)
{
const float *bb = _bb;
-
+
float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
-
+
RE_RC_COUNT(isec->raycounter->bb.test);
if (t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
@@ -205,12 +205,12 @@ struct Reorganize_SVBVH {
nodes = 0;
childs_per_node = 0;
useless_bb = 0;
-
+
for (int i = 0; i < 16; i++) {
nodes_with_childs[i] = 0;
}
}
-
+
~Reorganize_SVBVH()
{
#if 0
@@ -223,7 +223,7 @@ struct Reorganize_SVBVH {
}
#endif
}
-
+
SVBVHNode *create_node(int nchilds)
{
SVBVHNode *node = (SVBVHNode *)BLI_memarena_alloc(arena, sizeof(SVBVHNode));
@@ -231,12 +231,12 @@ struct Reorganize_SVBVH {
return node;
}
-
+
void copy_bb(float bb[6], const float old_bb[6])
{
std::copy(old_bb, old_bb + 6, bb);
}
-
+
void prepare_for_simd(SVBVHNode *node)
{
int i = 0;
@@ -261,7 +261,7 @@ struct Reorganize_SVBVH {
{
return ((num + (amt - 1)) & ~(amt - 1));
}
-
+
SVBVHNode *transform(OldNode *old)
{
if (is_leaf(old))
@@ -273,14 +273,14 @@ struct Reorganize_SVBVH {
int alloc_childs = nchilds;
if (nchilds % 4 > 2)
alloc_childs = padup(nchilds, 4);
-
+
SVBVHNode *node = create_node(alloc_childs);
childs_per_node += nchilds;
nodes++;
if (nchilds < 16)
nodes_with_childs[nchilds]++;
-
+
useless_bb += alloc_childs - nchilds;
while (alloc_childs > nchilds) {
const static float def_bb[6] = {FLT_MAX, FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX};
@@ -288,7 +288,7 @@ struct Reorganize_SVBVH {
node->child[alloc_childs] = NULL;
copy_bb(node->child_bb + alloc_childs * 6, def_bb);
}
-
+
int i = nchilds;
for (OldNode *o_child = old->child; o_child; o_child = o_child->sibling) {
i--;
@@ -307,7 +307,7 @@ struct Reorganize_SVBVH {
assert(i == 0);
prepare_for_simd(node);
-
+
return node;
}
};
diff --git a/source/blender/render/intern/raytrace/vbvh.h b/source/blender/render/intern/raytrace/vbvh.h
index 8ae9f8b5762..0b0bbd19116 100644
--- a/source/blender/render/intern/raytrace/vbvh.h
+++ b/source/blender/render/intern/raytrace/vbvh.h
@@ -87,7 +87,7 @@ static int count_childs(Node *parent)
if (is_leaf(i))
break;
}
-
+
return n;
}
@@ -97,7 +97,7 @@ static void append_sibling(Node *node, Node *sibling)
{
while (node->sibling)
node = node->sibling;
-
+
node->sibling = sibling;
}
@@ -132,24 +132,24 @@ struct BuildBinaryVBVH {
return node;
}
-
+
int rtbuild_split(RTBuilder *builder)
{
return ::rtbuild_heuristic_object_split(builder, 2);
}
-
+
Node *transform(RTBuilder *builder)
{
try
{
return _transform(builder);
-
+
} catch (...)
{
}
return NULL;
}
-
+
Node *_transform(RTBuilder *builder)
{
int size = rtbuild_size(builder);
@@ -166,7 +166,7 @@ struct BuildBinaryVBVH {
}
else {
test_break();
-
+
Node *node = create_node();
Node **child = &node->child;
@@ -178,7 +178,7 @@ struct BuildBinaryVBVH {
for (int i = 0; i < nc; i++) {
RTBuilder tmp;
rtbuild_get_child(builder, i, &tmp);
-
+
*child = _transform(&tmp);
DO_MIN((*child)->bb, node->bb);
DO_MAX((*child)->bb + 3, node->bb + 3);
@@ -195,23 +195,23 @@ struct BuildBinaryVBVH {
template<class Tree, class OldNode>
struct Reorganize_VBVH {
Tree *tree;
-
+
Reorganize_VBVH(Tree *t)
{
tree = t;
}
-
+
VBVHNode *create_node()
{
VBVHNode *node = (VBVHNode *)BLI_memarena_alloc(tree->node_arena, sizeof(VBVHNode));
return node;
}
-
+
void copy_bb(VBVHNode *node, OldNode *old)
{
std::copy(old->bb, old->bb + 6, node->bb);
}
-
+
VBVHNode *transform(OldNode *old)
{
if (is_leaf(old))
@@ -231,7 +231,7 @@ struct Reorganize_VBVH {
child_ptr = &n_child->sibling;
}
*child_ptr = 0;
-
+
return node;
}
};
diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c
index 12be60d5171..4a7962b1776 100644
--- a/source/blender/render/intern/source/bake.c
+++ b/source/blender/render/intern/source/bake.c
@@ -81,11 +81,11 @@ typedef struct BakeShade {
ShadeSample ssamp;
ObjectInstanceRen *obi;
VlakRen *vlr;
-
+
ZSpan *zspan;
Image *ima;
ImBuf *ibuf;
-
+
int rectx, recty, quad, type, vdone;
bool ready;
@@ -97,7 +97,7 @@ typedef struct BakeShade {
MPoly *mpoly;
MLoop *mloop;
MLoopCol *vcol;
-
+
unsigned int *rect;
float *rect_float;
@@ -105,7 +105,7 @@ typedef struct BakeShade {
bool use_displacement_buffer;
float *displacement_buffer;
float displacement_min, displacement_max;
-
+
bool use_mask;
char *rect_mask; /* bake pixel mask */
@@ -122,7 +122,7 @@ static void bake_set_shade_input(ObjectInstanceRen *obi, VlakRen *vlr, ShadeInpu
shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
else
shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
-
+
/* cache for shadow */
shi->samplenr = R.shadowsamplenr[shi->thread]++;
@@ -172,12 +172,12 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(qua
shi->r = shi->g = shi->b = 1.0f;
shade_input_set_shade_texco(shi);
-
+
/* only do AO for a full bake (and obviously AO bakes)
* AO for light bakes is a leftover and might not be needed */
if (ELEM(bs->type, RE_BAKE_ALL, RE_BAKE_AO, RE_BAKE_LIGHT))
shade_samples_do_AO(ssamp);
-
+
if (shi->mat->nodetree && shi->mat->use_nodes) {
ntreeShaderExecTree(shi->mat->nodetree, shi, &shr);
shi->mat = vlr->mat; /* shi->mat is being set in nodetree */
@@ -271,7 +271,7 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(qua
shr.alpha = shi->vcol[3];
}
}
-
+
if (bs->rect_float && !bs->vcol) {
float *col = bs->rect_float + 4 * (bs->rectx * y + x);
copy_v3_v3(col, shr.combined);
@@ -303,7 +303,7 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(qua
else {
rgb_float_to_uchar(col, shr.combined);
}
-
+
if (ELEM(bs->type, RE_BAKE_ALL, RE_BAKE_TEXTURE, RE_BAKE_VERTEX_COLORS)) {
col[3] = unit_float_to_uchar_clamp(shr.alpha);
}
@@ -324,7 +324,7 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(qua
}
}
-
+
if (bs->rect_mask) {
bs->rect_mask[bs->rectx * y + x] = FILTER_MASK_USED;
}
@@ -608,7 +608,7 @@ static int get_next_bake_face(BakeShade *bs)
obi = R.instancetable.first;
return 0;
}
-
+
BLI_thread_lock(LOCK_CUSTOM1);
for (; obi; obi = obi->next, v = 0) {
@@ -688,17 +688,17 @@ static int get_next_bake_face(BakeShade *bs)
BKE_image_release_ibuf(ima, ibuf, NULL);
continue;
}
-
+
if (ima->flag & IMA_USED_FOR_RENDER) {
ima->id.tag &= ~LIB_TAG_DOIT;
BKE_image_release_ibuf(ima, ibuf, NULL);
continue;
}
-
+
/* find the image for the first time? */
if (ima->id.tag & LIB_TAG_DOIT) {
ima->id.tag &= ~LIB_TAG_DOIT;
-
+
/* we either fill in float or char, this ensures things go fine */
if (ibuf->rect_float)
imb_freerectImBuf(ibuf);
@@ -729,7 +729,7 @@ static int get_next_bake_face(BakeShade *bs)
}
}
}
-
+
BLI_thread_unlock(LOCK_CUSTOM1);
return 0;
}
@@ -820,7 +820,7 @@ static void shade_tface(BakeShade *bs)
/* per face fixed seed */
BLI_thread_srandom(bs->thread, vlr->index);
-
+
/* check valid zspan */
if (ima != bs->ima) {
BKE_image_release_ibuf(bs->ima, bs->ibuf, NULL);
@@ -870,7 +870,7 @@ static void shade_tface(BakeShade *bs)
bs->rect_mask = userdata->mask_buffer;
bs->displacement_buffer = userdata->displacement_buffer;
}
-
+
/* get pixel level vertex coordinates */
for (a = 0; a < 4; a++) {
/* Note, workaround for pixel aligned UVs which are common and can screw up our intersection tests
@@ -886,7 +886,7 @@ static void shade_tface(BakeShade *bs)
vlr_set_uv_indices(vlr, &i1, &i2, &i3);
bake_set_vlr_dxyco(bs, vec[i1], vec[i2], vec[i3]);
zspan_scanconvert(bs->zspan, bs, vec[i1], vec[i2], vec[i3], do_bake_shade);
-
+
if (vlr->v4) {
bs->quad = 1;
bake_set_vlr_dxyco(bs, vec[0], vec[2], vec[3]);
@@ -905,7 +905,7 @@ static void *do_bake_thread(void *bs_v)
else {
shade_tface(bs);
}
-
+
/* fast threadsafe break test */
if (R.test_break(R.tbh))
break;
@@ -1000,14 +1000,14 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up
}
re->scene_color_manage = BKE_scene_check_color_management_enabled(re->scene);
-
+
/* initialize render global */
R = *re;
R.bakebuf = NULL;
/* initialize static vars */
get_next_bake_face(NULL);
-
+
/* do we need a mask? */
if (re->r.bake_filter)
use_mask = true;
@@ -1068,18 +1068,18 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up
handles[a].zspan = NULL;
else
handles[a].zspan = MEM_callocN(sizeof(ZSpan), "zspan for bake");
-
+
handles[a].use_mask = use_mask;
handles[a].use_displacement_buffer = use_displacement_buffer;
handles[a].do_update = do_update; /* use to tell the view to update */
-
+
handles[a].displacement_min = FLT_MAX;
handles[a].displacement_max = -FLT_MAX;
BLI_threadpool_insert(&threads, &handles[a]);
}
-
+
/* wait for everything to be done */
a = 0;
while (a != re->r.threads) {
@@ -1150,7 +1150,7 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up
}
MEM_freeN(handles);
-
+
BLI_threadpool_end(&threads);
if (vdone == 0) {
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 0b68802decc..8675ffec313 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -111,7 +111,7 @@
#endif
/* ------------------------------------------------------------------------- */
-/* tool functions/defines for ad hoc simplification and possible future
+/* tool functions/defines for ad hoc simplification and possible future
* cleanup */
/* ------------------------------------------------------------------------- */
@@ -178,11 +178,11 @@ static void calc_edge_stress_add(float *accum, VertRen *v1, VertRen *v2)
{
float len= len_v3v3(v1->co, v2->co)/len_v3v3(v1->orco, v2->orco);
float *acc;
-
+
acc= accum + 2*v1->index;
acc[0]+= len;
acc[1]+= 1.0f;
-
+
acc= accum + 2*v2->index;
acc[0]+= len;
acc[1]+= 1.0f;
@@ -192,13 +192,13 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me)
{
float loc[3], size[3], *accum, *acc, *accumoffs, *stress;
int a;
-
+
if (obr->totvert==0) return;
-
+
BKE_mesh_texspace_get(me, loc, NULL, size);
-
+
accum= MEM_callocN(2*sizeof(float)*obr->totvert, "temp accum for stress");
-
+
/* de-normalize orco */
for (a=0; a<obr->totvert; a++) {
VertRen *ver= RE_findOrAddVert(obr, a);
@@ -208,7 +208,7 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me)
ver->orco[2]= ver->orco[2]*size[2] +loc[2];
}
}
-
+
/* add stress values */
accumoffs= accum; /* so we can use vertex index */
for (a=0; a<obr->totvlak; a++) {
@@ -225,7 +225,7 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me)
}
}
}
-
+
for (a=0; a<obr->totvert; a++) {
VertRen *ver= RE_findOrAddVert(obr, a);
if (ver->orco) {
@@ -235,14 +235,14 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me)
acc[0]/= acc[1];
stress= RE_vertren_get_stress(obr, ver, 1);
*stress= *acc;
-
+
/* restore orcos */
ver->orco[0] = (ver->orco[0]-loc[0])/size[0];
ver->orco[1] = (ver->orco[1]-loc[1])/size[1];
ver->orco[2] = (ver->orco[2]-loc[2])/size[2];
}
}
-
+
MEM_freeN(accum);
}
@@ -254,7 +254,7 @@ static void calc_tangent_vector(ObjectRen *obr, VlakRen *vlr, int do_tangent)
float tang[3], *tav;
float *uv1, *uv2, *uv3, *uv4;
float uv[4][2];
-
+
if (tface) {
uv1= tface->uv[0];
uv2= tface->uv[1];
@@ -272,7 +272,7 @@ static void calc_tangent_vector(ObjectRen *obr, VlakRen *vlr, int do_tangent)
else return;
tangent_from_uv_v3(uv1, uv2, uv3, v1->co, v2->co, v3->co, vlr->n, tang);
-
+
if (do_tangent) {
tav= RE_vertren_get_tangent(obr, v1, 1);
add_v3_v3(tav, tang);
@@ -281,10 +281,10 @@ static void calc_tangent_vector(ObjectRen *obr, VlakRen *vlr, int do_tangent)
tav= RE_vertren_get_tangent(obr, v3, 1);
add_v3_v3(tav, tang);
}
-
+
if (v4) {
tangent_from_uv_v3(uv1, uv3, uv4, v1->co, v3->co, v4->co, vlr->n, tang);
-
+
if (do_tangent) {
tav= RE_vertren_get_tangent(obr, v1, 1);
add_v3_v3(tav, tang);
@@ -339,7 +339,7 @@ static void GetTextureCoordinate(const SMikkTSpaceContext *pContext, float r_uv[
VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
MTFace *tface= RE_vlakren_get_tface(pMesh->obr, vlr, pMesh->mtface_index, NULL, 0);
const float *coord;
-
+
if (tface != NULL) {
coord= tface->uv[vert_index];
copy_v2_v2(r_uv, coord);
@@ -419,7 +419,7 @@ static void calc_vertexnormals(Render *UNUSED(re), ObjectRen *obr, bool do_verte
if (vlr->v4 && is_zero_v3(vlr->v4->n)) copy_v3_v3(vlr->v4->n, vlr->n);
}
}
-
+
/* normalize vertex normals */
for (a=0; a<obr->totvert; a++) {
VertRen *ver= RE_findOrAddVert(obr, a);
@@ -642,7 +642,7 @@ static void autosmooth(Render *UNUSED(re), ObjectRen *obr, float mat[4][4], shor
if (vlr->v2 != vlr->v3) {
if (vlr->v4)
normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
- else
+ else
normal_tri_v3(vlr->n, vlr->v3->co, vlr->v2->co, vlr->v1->co);
}
}
@@ -665,11 +665,11 @@ static void set_object_orco(Render *re, void *ob, float *orco)
{
if (!re->orco_hash)
re->orco_hash = BLI_ghash_ptr_new("set_object_orco gh");
-
+
BLI_ghash_insert(re->orco_hash, ob, orco);
}
-static void free_mesh_orco_hash(Render *re)
+static void free_mesh_orco_hash(Render *re)
{
if (re->orco_hash) {
BLI_ghash_free(re->orco_hash, NULL, MEM_freeN);
@@ -681,11 +681,11 @@ static void check_material_mapto(Material *ma)
{
int a;
ma->mapto_textured = 0;
-
+
/* cache which inputs are actually textured.
* this can avoid a bit of time spent iterating through all the texture slots, map inputs and map tos
* every time a property which may or may not be textured is accessed */
-
+
for (a=0; a<MAX_MTEX; a++) {
if (ma->mtex[a] && ma->mtex[a]->tex) {
/* currently used only in volume render, so we'll check for those flags */
@@ -723,28 +723,28 @@ static Material *give_render_material(Render *re, Object *ob, short nr)
{
extern Material defmaterial; /* material.c */
Material *ma;
-
+
ma= give_current_material(ob, nr);
if (ma==NULL)
ma= &defmaterial;
-
+
if (re->r.mode & R_SPEED) ma->texco |= NEED_UV;
-
+
if (ma->material_type == MA_TYPE_VOLUME) {
ma->mode |= MA_TRANSP;
ma->mode &= ~MA_SHADBUF;
}
if ((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP))
re->flag |= R_ZTRA;
-
+
/* for light groups and SSS */
ma->flag |= MA_IS_USED;
if (ma->nodetree && ma->use_nodes)
flag_render_node_material(re, ma->nodetree);
-
+
check_material_mapto(ma);
-
+
return ma;
}
@@ -768,7 +768,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
static float anor[3], avec[3];
int flag, i;
static int second=0;
-
+
sub_v3_v3v3(nor, vec, vec1);
normalize_v3(nor); /* nor needed as tangent */
cross_v3_v3v3(cross, vec, nor);
@@ -778,7 +778,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
dx= re->winx*cross[0]*re->winmat[0][0];
dy= re->winy*cross[1]*re->winmat[1][1];
w = sqrtf(dx * dx + dy * dy) / w;
-
+
if (w!=0.0f) {
float fac;
if (ma->strand_ease!=0.0f) {
@@ -807,16 +807,16 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
mul_v3_fl(cross, width);
}
-
+
if (ma->mode & MA_TANGENT_STR)
flag= R_SMOOTH|R_TANGENT;
else
flag= R_SMOOTH;
-
+
/* only 1 pixel wide strands filled in as quads now, otherwise zbuf errors */
if (ma->strand_sta==1.0f)
flag |= R_STRAND;
-
+
/* single face line */
if (sd->line) {
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
@@ -825,13 +825,13 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
vlr->v2= RE_findOrAddVert(obr, obr->totvert++);
vlr->v3= RE_findOrAddVert(obr, obr->totvert++);
vlr->v4= RE_findOrAddVert(obr, obr->totvert++);
-
+
copy_v3_v3(vlr->v1->co, vec);
add_v3_v3(vlr->v1->co, cross);
copy_v3_v3(vlr->v1->n, nor);
vlr->v1->orco= sd->orco;
vlr->v1->accum = -1.0f; /* accum abuse for strand texco */
-
+
copy_v3_v3(vlr->v2->co, vec);
sub_v3_v3v3(vlr->v2->co, vlr->v2->co, cross);
copy_v3_v3(vlr->v2->n, nor);
@@ -851,7 +851,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
vlr->v3->accum= vlr->v4->accum;
normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
-
+
vlr->mat= ma;
vlr->ec= ME_V2V3;
@@ -872,7 +872,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
if (sd->override_uv>=0) {
MTFace *mtf;
mtf=RE_vlakren_get_tface(obr, vlr, sd->override_uv, NULL, 0);
-
+
mtf->uv[0][0]=mtf->uv[3][0]=0.0f;
mtf->uv[1][0]=mtf->uv[2][0]=1.0f;
@@ -899,13 +899,13 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
v1= RE_findOrAddVert(obr, obr->totvert++);
v2= RE_findOrAddVert(obr, obr->totvert++);
-
+
copy_v3_v3(v1->co, vec);
add_v3_v3(v1->co, cross);
copy_v3_v3(v1->n, nor);
v1->orco= sd->orco;
v1->accum = -1.0f; /* accum abuse for strand texco */
-
+
copy_v3_v3(v2->co, vec);
sub_v3_v3v3(v2->co, v2->co, cross);
copy_v3_v3(v2->n, nor);
@@ -961,7 +961,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
vlr= RE_findOrAddVlak(obr, obr->totvlak-1);
}
}
-
+
copy_v3_v3(vlr->v4->co, vec);
add_v3_v3(vlr->v4->co, cross);
copy_v3_v3(vlr->v4->n, nor);
@@ -973,9 +973,9 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
copy_v3_v3(vlr->v3->n, nor);
vlr->v3->orco= sd->orco;
vlr->v3->accum= vlr->v4->accum;
-
+
normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
-
+
vlr->mat= ma;
vlr->ec= ME_V2V3;
@@ -996,7 +996,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
if (sd->override_uv>=0) {
MTFace *mtf;
mtf=RE_vlakren_get_tface(obr, vlr, sd->override_uv, NULL, 0);
-
+
mtf->uv[0][0]=mtf->uv[3][0]=0.0f;
mtf->uv[1][0]=mtf->uv[2][0]=1.0f;
@@ -1026,15 +1026,15 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, const float vec[3
vlr->v2= RE_findOrAddVert(obr, obr->totvert++);
vlr->v3= vlr->v2;
vlr->v4= NULL;
-
+
copy_v3_v3(vlr->v1->co, vec);
copy_v3_v3(vlr->v2->co, vec1);
-
+
sub_v3_v3v3(vlr->n, vec, vec1);
normalize_v3(vlr->n);
copy_v3_v3(vlr->v1->n, vlr->n);
copy_v3_v3(vlr->v2->n, vlr->n);
-
+
vlr->mat= ma;
vlr->ec= ME_V1V2;
@@ -1049,14 +1049,14 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, const float vec[3
vlr->v2= RE_findOrAddVert(obr, obr->totvert++);
vlr->v3= vlr->v2;
vlr->v4= NULL;
-
+
v1= vlr->v2; /* cycle */
copy_v3_v3(v1->co, vec);
-
+
sub_v3_v3v3(vlr->n, vec, vec1);
normalize_v3(vlr->n);
copy_v3_v3(v1->n, vlr->n);
-
+
vlr->mat= ma;
vlr->ec= ME_V1V2;
}
@@ -1117,7 +1117,7 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
copy_v3_v3(vlr->v2->n, vlr->n);
copy_v3_v3(vlr->v3->n, vlr->n);
copy_v3_v3(vlr->v4->n, vlr->n);
-
+
vlr->mat= ma;
vlr->ec= ME_V2V3;
@@ -1145,9 +1145,9 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
zvec[bb->align] = 0.0f;
normalize_v3(zvec);
}
-
+
time = saacos(dot_v3v3(zvec, axis1)) / (float)M_PI;
-
+
if (dot_v3v3(zvec, axis2) < 0.0f)
time = 1.0f - time / 2.0f;
else
@@ -1206,7 +1206,7 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, ParticleBillboardData *bb, ParticleKey *state, int seed, float hasize, float *pa_co)
{
float loc[3], loc0[3], loc1[3], vel[3];
-
+
copy_v3_v3(loc, state->co);
if (ren_as != PART_DRAW_BB)
@@ -1245,7 +1245,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re
HaloRen *har = NULL;
har = RE_inithalo_particle(re, obr, dm, ma, loc, NULL, sd->orco, sd->uvco, hasize, 0.0, seed, pa_co);
-
+
if (har) har->lay= obr->ob->lay;
break;
@@ -1263,7 +1263,7 @@ static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int
MFace *mface = dm->getTessFaceData(dm, num, CD_MFACE);
MTFace *mtface = (MTFace*)CustomData_get_layer_n(&dm->faceData, CD_MTFACE, i);
mtface += num;
-
+
psys_interpolate_uvs(mtface, mface->v4, fuv, sd->uvco + 2 * i);
}
else {
@@ -1332,7 +1332,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if (part==NULL || pars==NULL || !psys_check_enabled(ob, psys, G.is_rendering))
return 0;
-
+
if (part->ren_as==PART_DRAW_OB || part->ren_as==PART_DRAW_GR || part->ren_as==PART_DRAW_NOT)
return 1;
@@ -1384,7 +1384,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
/* 2.1 setup material stff */
ma= give_render_material(re, ob, part->omat);
-
+
#if 0 /* XXX old animation system */
if (ma->ipo) {
calc_ipo(ma->ipo, cfra);
@@ -1441,7 +1441,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
bb.totnum = totpart+totchild;
bb.uv_split = part->bb_uv_split;
}
-
+
/* 2.5 setup matrices */
mul_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat); /* need to be that way, for imat texture */
@@ -1590,7 +1590,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
max_k = (int)cache->segments;
}
-
+
pa_time = psys_get_child_time(psys, cpa, cfra, &pa_birthtime, &pa_dietime);
pa_size = psys_get_child_size(psys, cpa, cfra, &pa_time);
@@ -1868,13 +1868,13 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if (sd.uvco)
MEM_freeN(sd.uvco);
-
+
if (sd.mcol)
MEM_freeN(sd.mcol);
if (states)
MEM_freeN(states);
-
+
BLI_rng_free(rng);
psys->flag &= ~PSYS_DRAWING;
@@ -1948,7 +1948,7 @@ static int verghalo(const void *a1, const void *a2)
{
const HaloRen *har1= *(const HaloRen**)a1;
const HaloRen *har2= *(const HaloRen**)a2;
-
+
if (har1->zs < har2->zs) return 1;
else if (har1->zs > har2->zs) return -1;
return 0;
@@ -1986,7 +1986,7 @@ static short test_for_displace(Render *re, Object *ob)
/* return 1 when this object uses displacement textures. */
Material *ma;
int i;
-
+
for (i=1; i<=ob->totcol; i++) {
ma=give_render_material(re, ob, i);
/* ma->mapto is ORed total of all mapto channels */
@@ -2051,10 +2051,10 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve
}
shi->displace[0]= shi->displace[1]= shi->displace[2]= 0.0;
-
+
do_material_tex(shi, re);
-
- //printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2],
+
+ //printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2],
//vr->co[0], vr->co[1], vr->co[2]);
displace[0]= shi->displace[0] * scale[0];
@@ -2062,22 +2062,22 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve
displace[2]= shi->displace[2] * scale[2];
/* 0.5 could become button once? */
- vr->co[0] += displace[0];
+ vr->co[0] += displace[0];
vr->co[1] += displace[1];
vr->co[2] += displace[2];
-
- //printf("after co=%f, %f, %f\n", vr->co[0], vr->co[1], vr->co[2]);
-
+
+ //printf("after co=%f, %f, %f\n", vr->co[0], vr->co[1], vr->co[2]);
+
/* we just don't do this vertex again, bad luck for other face using same vertex with
* different material... */
vr->flag |= 1;
-
+
/* Pass sample back so displace_face can decide which way to split the quad */
sample = shi->displace[0]*shi->displace[0];
sample += shi->displace[1]*shi->displace[1];
sample += shi->displace[2]*shi->displace[2];
-
- vr->accum=sample;
+
+ vr->accum=sample;
/* Should be sqrt(sample), but I'm only looking for "bigger". Save the cycles. */
return;
}
@@ -2088,11 +2088,11 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float
/* Warning, This is not that nice, and possibly a bit slow,
* however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
- memset(&shi, 0, sizeof(ShadeInput));
+ memset(&shi, 0, sizeof(ShadeInput));
/* end warning! - Campbell */
-
+
/* set up shadeinput struct for multitex() */
-
+
/* memset above means we don't need this */
/*shi.osatex= 0;*/ /* signal not to use dx[] and dy[] texture AA vectors */
@@ -2100,7 +2100,7 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float
shi.vlr= vlr; /* current render face */
shi.mat= vlr->mat; /* current input material */
shi.thread= 0;
-
+
/* TODO, assign these, displacement with new bumpmap is skipped without - campbell */
#if 0
/* order is not known ? */
@@ -2112,7 +2112,7 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float
/* Displace the verts, flag is set when done */
if (!vlr->v1->flag)
displace_render_vert(re, obr, &shi, vlr->v1, 0, scale);
-
+
if (!vlr->v2->flag)
displace_render_vert(re, obr, &shi, vlr->v2, 1, scale);
@@ -2123,11 +2123,11 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float
if (!vlr->v4->flag)
displace_render_vert(re, obr, &shi, vlr->v4, 3, scale);
- /* closest in displace value. This will help smooth edges. */
+ /* closest in displace value. This will help smooth edges. */
if (fabsf(vlr->v1->accum - vlr->v3->accum) > fabsf(vlr->v2->accum - vlr->v4->accum)) vlr->flag |= R_DIVIDE_24;
else vlr->flag &= ~R_DIVIDE_24;
}
-
+
/* Recalculate the face normal - if flipped before, flip now */
if (vlr->v4) {
normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
@@ -2145,7 +2145,7 @@ static void displace(Render *re, ObjectRen *obr)
float scale[3]={1.0f, 1.0f, 1.0f}, temp[3];//, xn
int i; //, texflag=0;
Object *obt;
-
+
/* Object Size with parenting */
obt=obr->ob;
while (obt) {
@@ -2153,7 +2153,7 @@ static void displace(Render *re, ObjectRen *obr)
scale[0]*=temp[0]; scale[1]*=temp[1]; scale[2]*=temp[2];
obt=obt->parent;
}
-
+
/* Clear all flags */
for (i=0; i<obr->totvert; i++) {
vr= RE_findOrAddVert(obr, i);
@@ -2164,7 +2164,7 @@ static void displace(Render *re, ObjectRen *obr)
vlr=RE_findOrAddVlak(obr, i);
displace_render_face(re, obr, vlr, scale);
}
-
+
/* Recalc vertex normals */
calc_vertexnormals(re, obr, 1, 0, 0);
}
@@ -2232,7 +2232,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
ver->n[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
normalize_v3(ver->n);
//if (ob->transflag & OB_NEG_SCALE) negate_v3(ver->n);
-
+
if (need_orco) {
ver->orco= orco;
orco+=3;
@@ -2290,10 +2290,10 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
int p1, p2, p3, p4, a;
int sizeu, nsizeu, sizev, nsizev;
int startvert, startvlak;
-
+
startvert= obr->totvert;
- nsizeu = sizeu = dl->parts; nsizev = sizev = dl->nr;
-
+ nsizeu = sizeu = dl->parts; nsizev = sizev = dl->nr;
+
data= dl->verts;
for (u = 0; u < sizeu; u++) {
v1 = RE_findOrAddVert(obr, obr->totvert++); /* save this for possible V wrapping */
@@ -2302,7 +2302,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
v1->orco= orco; orco+= 3; orcoret++;
}
mul_m4_v3(mat, v1->co);
-
+
for (v = 1; v < sizev; v++) {
ver= RE_findOrAddVert(obr, obr->totvert++);
copy_v3_v3(ver->co, data); data += 3;
@@ -2320,11 +2320,11 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
}
}
}
-
+
/* Done before next loop to get corner vert */
if (dl->flag & DL_CYCL_U) nsizev++;
if (dl->flag & DL_CYCL_V) nsizeu++;
-
+
/* if U cyclic, add extra row at end of column */
if (dl->flag & DL_CYCL_V) {
for (v = 0; v < nsizev; v++) {
@@ -2336,47 +2336,47 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
}
}
}
-
+
sizeu = nsizeu;
sizev = nsizev;
-
+
startvlak= obr->totvlak;
-
+
for (u = 0; u < sizeu - 1; u++) {
p1 = startvert + u * sizev; /* walk through face list */
p2 = p1 + 1;
p3 = p2 + sizev;
p4 = p3 - 1;
-
+
for (v = 0; v < sizev - 1; v++) {
v1= RE_findOrAddVert(obr, p1);
v2= RE_findOrAddVert(obr, p2);
v3= RE_findOrAddVert(obr, p3);
v4= RE_findOrAddVert(obr, p4);
-
+
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
vlr->v1= v1; vlr->v2= v2; vlr->v3= v3; vlr->v4= v4;
-
+
normal_quad_v3(n1, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
-
+
copy_v3_v3(vlr->n, n1);
-
+
vlr->mat= matar[ dl->col];
vlr->ec= ME_V1V2+ME_V2V3;
vlr->flag= dl->rt;
-
+
add_v3_v3(v1->n, n1);
add_v3_v3(v2->n, n1);
add_v3_v3(v3->n, n1);
add_v3_v3(v4->n, n1);
-
+
p1++; p2++; p3++; p4++;
}
}
/* fix normals for U resp. V cyclic faces */
sizeu--; sizev--; /* dec size for face array */
if (dl->flag & DL_CYCL_V) {
-
+
for (v = 0; v < sizev; v++) {
/* optimize! :*/
vlr= RE_findOrAddVlak(obr, UVTOINDEX(sizeu - 1, v));
@@ -2388,7 +2388,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
}
}
if (dl->flag & DL_CYCL_U) {
-
+
for (u = 0; u < sizeu; u++) {
/* optimize! :*/
vlr= RE_findOrAddVlak(obr, UVTOINDEX(u, 0));
@@ -2400,7 +2400,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
}
}
- /* last vertex is an extra case:
+ /* last vertex is an extra case:
*
* ^ ()----()----()----()
* | | | || |
@@ -2412,7 +2412,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
* | | || |
* ()----()----()----()
* v ->
- *
+ *
* vertex [] is no longer shared, therefore distribute
* normals of the surrounding faces to all of the duplicates of []
*/
@@ -2434,8 +2434,8 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
ver= RE_findOrAddVert(obr, a);
normalize_v3(ver->n);
}
-
-
+
+
return orcoret;
}
@@ -2660,7 +2660,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
BKE_displist_make_curveTypes_forRender(re->scene, ob, &disp, &dm, false, true);
dl= disp.first;
if (dl==NULL) return;
-
+
mul_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat);
negative_scale = is_negative_m4(mat);
@@ -3225,7 +3225,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
/* attempt to autsmooth on original mesh, only without subsurf */
if (do_autosmooth && me->totvert==totvert && me->totface==dm->getNumTessFaces(dm))
use_original_normals= true;
-
+
ma= give_render_material(re, ob, 1);
@@ -3273,7 +3273,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
*origindex = a;
}
}
-
+
if (!timeoffset) {
short (*lnp)[4][3] = NULL;
#ifdef WITH_FREESTYLE
@@ -3294,7 +3294,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
obr->tangent_mask = dm->tangent_mask;
DM_generate_tangent_tessface_data(dm, need_nmap_tangent_concrete || need_tangent);
}
-
+
/* still to do for keys: the correct local texture coordinate */
/* faces in order of color blocks */
@@ -3320,7 +3320,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
}
}
}
-
+
/* if wire material, and we got edges, don't do the faces */
if (ma->material_type == MA_TYPE_WIRE) {
end= dm->getNumEdges(dm);
@@ -3340,10 +3340,10 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
index_mp_to_orig= dm->getPolyDataArray(dm, CD_ORIGINDEX);
ffa= CustomData_get_layer(&me->pdata, CD_FREESTYLE_FACE);
#endif
-
+
for (a=0; a<end; a++, mface++) {
int v1, v2, v3, v4, flag;
-
+
if ( mface->mat_nr==a1 ) {
float len;
bool reverse_verts = (negative_scale != 0 && do_autosmooth == false);
@@ -3390,16 +3390,16 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
if (use_original_normals) {
MFace *mf= me->mface+a;
MVert *mv= me->mvert;
-
+
if (vlr->v4)
len= normal_quad_v3(vlr->n, mv[mf->v4].co, mv[mf->v3].co, mv[mf->v2].co, mv[mf->v1].co);
- else
+ else
len= normal_tri_v3(vlr->n, mv[mf->v3].co, mv[mf->v2].co, mv[mf->v1].co);
}
else {
if (vlr->v4)
len= normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
- else
+ else
len= normal_tri_v3(vlr->n, vlr->v3->co, vlr->v2->co, vlr->v1->co);
}
@@ -3419,7 +3419,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
for (index=0; index<dm->faceData.totlayer; index++) {
layer= &dm->faceData.layers[index];
name= layer->name;
-
+
if (layer->type == CD_MTFACE && mtfn < MAX_MTFACE) {
int t;
mtf= RE_vlakren_get_tface(obr, vlr, mtfn++, &name, 1);
@@ -3494,7 +3494,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
if (edge_hash)
BLI_edgehash_free(edge_hash, NULL);
#endif
-
+
/* exception... we do edges for wire mode. potential conflict when faces exist... */
end= dm->getNumEdges(dm);
mvert= dm->getVertArray(dm);
@@ -3504,12 +3504,12 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
struct edgesort *edgetable;
int totedge= 0;
recalc_normals= 1;
-
+
medge= dm->getEdgeArray(dm);
-
+
/* we want edges to have UV and vcol too... */
edgetable= make_mesh_edge_lookup(dm, &totedge);
-
+
for (a1=0; a1<end; a1++, medge++) {
if (medge->flag&ME_EDGERENDER) {
MVert *v0 = &mvert[medge->v1];
@@ -3520,10 +3520,10 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
vlr->v2= RE_findOrAddVert(obr, vertofs+medge->v2);
vlr->v3= vlr->v2;
vlr->v4= NULL;
-
+
if (edgetable)
use_mesh_edge_lookup(obr, dm, medge, vlr, edgetable, totedge);
-
+
xn= -(v0->no[0]+v1->no[0]);
yn= -(v0->no[1]+v1->no[1]);
zn= -(v0->no[2]+v1->no[2]);
@@ -3532,7 +3532,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
vlr->n[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
vlr->n[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
normalize_v3(vlr->n);
-
+
vlr->mat= ma;
vlr->flag= 0;
vlr->ec= ME_V1V2;
@@ -3543,7 +3543,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
}
}
}
-
+
if (!timeoffset) {
if (need_stress)
calc_edge_stress(re, obr, me);
@@ -3575,49 +3575,49 @@ static void initshadowbuf(Render *re, LampRen *lar, float mat[4][4])
{
struct ShadBuf *shb;
float viewinv[4][4];
-
+
/* if (la->spsi<16) return; */
-
+
/* memory alloc */
shb= (struct ShadBuf *)MEM_callocN(sizeof(struct ShadBuf), "initshadbuf");
lar->shb= shb;
-
+
if (shb==NULL) return;
-
+
VECCOPY(shb->co, lar->co); /* int copy */
-
+
/* percentage render: keep track of min and max */
shb->size= (lar->bufsize*re->r.size)/100;
-
+
if (shb->size<512) shb->size= 512;
else if (shb->size > lar->bufsize) shb->size= lar->bufsize;
-
+
shb->size &= ~15; /* make sure its multiples of 16 */
-
+
shb->samp= lar->samp;
shb->soft= lar->soft;
shb->shadhalostep= lar->shadhalostep;
-
+
normalize_m4(mat);
invert_m4_m4(shb->winmat, mat); /* winmat is temp */
-
+
/* matrix: combination of inverse view and lampmat */
/* calculate again: the ortho-render has no correct viewinv */
invert_m4_m4(viewinv, re->viewmat);
mul_m4_m4m4(shb->viewmat, shb->winmat, viewinv);
-
+
/* projection */
shb->d= lar->clipsta;
shb->clipend= lar->clipend;
-
+
/* bias is percentage, made 2x larger because of correction for angle of incidence */
/* when a ray is closer to parallel of a face, bias value is increased during render */
shb->bias= (0.02f*lar->bias)*0x7FFFFFFF;
-
+
/* halfway method (average of first and 2nd z) reduces bias issues */
if (ELEM(lar->buftype, LA_SHADBUF_HALFWAY, LA_SHADBUF_DEEP))
shb->bias= 0.1f*shb->bias;
-
+
shb->compressthresh= lar->compressthresh;
}
@@ -3629,7 +3629,7 @@ void area_lamp_vectors(LampRen *lar)
multifac= 1.0f/sqrtf((float)lar->ray_totsamp);
xsize *= multifac;
ysize *= multifac;
-
+
/* corner vectors */
lar->area[0][0]= lar->co[0] - xsize*lar->mat[0][0] - ysize*lar->mat[1][0];
lar->area[0][1]= lar->co[1] - xsize*lar->mat[0][1] - ysize*lar->mat[1][1];
@@ -3665,14 +3665,14 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
/* previewrender sets this to zero... prevent accidents */
if (la==NULL) return NULL;
-
+
/* prevent only shadow from rendering light */
if (la->mode & LA_ONLYSHADOW)
if ((re->r.mode & R_SHADOW)==0)
return NULL;
-
+
re->totlamp++;
-
+
/* groups is used to unify support for lightgroups, this is the global lightgroup */
go= MEM_callocN(sizeof(GroupObject), "groupobject");
BLI_addtail(&re->lights, go);
@@ -3699,7 +3699,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
lar->shadhalostep = la->shadhalostep;
lar->clipsta = la->clipsta;
lar->clipend = la->clipend;
-
+
lar->bias = la->bias;
lar->compressthresh = la->compressthresh;
@@ -3731,25 +3731,25 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
lar->ray_samp= la->ray_samp;
lar->ray_sampy= la->ray_sampy;
lar->ray_sampz= la->ray_sampz;
-
+
lar->area_size= la->area_size;
lar->area_sizey= la->area_sizey;
lar->area_sizez= la->area_sizez;
lar->area_shape= la->area_shape;
-
+
/* Annoying, lamp UI does this, but the UI might not have been used? - add here too.
* make sure this matches buttons_shading.c's logic */
if (ELEM(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL) && (la->mode & LA_SHAD_RAY))
if (ELEM(la->type, LA_SPOT, LA_SUN, LA_LOCAL))
if (la->ray_samp_method == LA_SAMP_CONSTANT) la->ray_samp_method = LA_SAMP_HALTON;
-
+
lar->ray_samp_method= la->ray_samp_method;
lar->ray_samp_type= la->ray_samp_type;
-
+
lar->adapt_thresh= la->adapt_thresh;
lar->sunsky = NULL;
-
+
if ( ELEM(lar->type, LA_SPOT, LA_LOCAL)) {
lar->ray_totsamp= lar->ray_samp*lar->ray_samp;
lar->area_shape = LA_AREA_SQUARE;
@@ -3790,7 +3790,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
{
lar->sunsky = (struct SunSky*)MEM_callocN(sizeof(struct SunSky), "sunskyren");
lar->sunsky->effect_type = la->sun_effect_type;
-
+
copy_v3_v3(vec, ob->obmat[2]);
normalize_v3(vec);
@@ -3804,7 +3804,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
}
}
else lar->ray_totsamp= 0;
-
+
lar->spotsi= la->spotsize;
if (lar->mode & LA_HALO) {
if (lar->spotsi > DEG2RADF(170.0f)) lar->spotsi = DEG2RADF(170.0f);
@@ -3878,7 +3878,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
for (c=0; c<MAX_MTEX; c++) {
if (la->mtex[c] && la->mtex[c]->tex) {
- if (la->mtex[c]->mapto & LAMAP_COL)
+ if (la->mtex[c]->mapto & LAMAP_COL)
lar->mode |= LA_TEXTURE;
if (la->mtex[c]->mapto & LAMAP_SHAD)
lar->mode |= LA_SHAD_TEX;
@@ -3898,10 +3898,10 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
if ( (re->r.mode & R_RAYTRACE)==0)
lar->mode &= ~LA_SHAD_RAY;
}
-
+
if (re->r.mode & R_SHADOW) {
-
+
if (la->type==LA_AREA && (lar->mode & LA_SHAD_RAY) && (lar->ray_samp_method == LA_SAMP_CONSTANT)) {
init_jitter_plane(lar);
}
@@ -3911,8 +3911,8 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
copy_m4_m4(mat, ob->obmat);
initshadowbuf(re, lar, mat); /* mat is altered */
}
-
-
+
+
/* this is the way used all over to check for shadow */
if (lar->shb || (lar->mode & LA_SHAD_RAY)) {
LampShadowSample *ls;
@@ -3920,7 +3920,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
int a, b;
memset(re->shadowsamplenr, 0, sizeof(re->shadowsamplenr));
-
+
lar->shadsamp= MEM_mallocN(re->r.threads*sizeof(LampShadowSample), "lamp shadow sample");
ls= lar->shadsamp;
@@ -3938,7 +3938,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
}
}
}
-
+
return go;
}
@@ -3954,7 +3954,7 @@ static bool is_object_hidden(Render *re, Object *ob)
{
if (is_object_restricted(re, ob))
return true;
-
+
if (re->r.scemode & R_VIEWPORT_PREVIEW) {
/* Mesh deform cages and so on mess up the preview. To avoid the problem,
* viewport doesn't show mesh object if its draw type is bounding box or wireframe.
@@ -3978,7 +3978,7 @@ static bool is_object_hidden(Render *re, Object *ob)
static void add_lightgroup(Render *re, Group *group, int exclusive)
{
GroupObject *go, *gol;
-
+
group->id.tag &= ~LIB_TAG_DOIT;
/* it's a bit too many loops in loops... but will survive */
@@ -3988,7 +3988,7 @@ static void add_lightgroup(Render *re, Group *group, int exclusive)
if (is_object_hidden(re, go->ob))
continue;
-
+
if (go->ob->lay & re->lay) {
if (go->ob && go->ob->type==OB_LAMP) {
for (gol= re->lights.first; gol; gol= gol->next) {
@@ -4012,14 +4012,14 @@ static void set_material_lightgroups(Render *re)
{
Group *group;
Material *ma;
-
+
/* not for preview render */
if (re->scene->r.scemode & (R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))
return;
-
+
for (group= re->main->group.first; group; group=group->id.next)
group->id.tag |= LIB_TAG_DOIT;
-
+
/* it's a bit too many loops in loops... but will survive */
/* hola! materials not in use...? */
for (ma= re->main->mat.first; ma; ma=ma->id.next) {
@@ -4031,7 +4031,7 @@ static void set_material_lightgroups(Render *re)
static void set_renderlayer_lightgroups(Render *re, Scene *sce)
{
SceneRenderLayer *srl;
-
+
for (srl= sce->r.layers.first; srl; srl= srl->next) {
if (srl->light_override)
add_lightgroup(re, srl->light_override, 0);
@@ -4050,17 +4050,17 @@ void init_render_world(Render *re)
};
int a;
-
+
if (re->scene && re->scene->world) {
re->wrld = *(re->scene->world);
copy_v3_v3(re->grvec, re->viewmat[2]);
normalize_v3(re->grvec);
copy_m3_m4(re->imat, re->viewinv);
-
+
for (a=0; a<MAX_MTEX; a++)
if (re->wrld.mtex[a] && re->wrld.mtex[a]->tex) re->wrld.skytype |= WO_SKYTEX;
-
+
/* AO samples should be OSA minimum */
if (re->osa)
while (re->wrld.aosamp*re->wrld.aosamp < re->osa)
@@ -4072,13 +4072,13 @@ void init_render_world(Render *re)
memset(&re->wrld, 0, sizeof(World));
re->wrld.exp= 0.0f;
re->wrld.range= 1.0f;
-
+
/* for mist pass */
re->wrld.miststa= re->clipsta;
re->wrld.mistdist= re->clipend-re->clipsta;
re->wrld.misi= 1.0f;
}
-
+
re->wrld.linfac= 1.0f + powf((2.0f*re->wrld.exp + 0.5f), -10);
re->wrld.logfac= logf((re->wrld.linfac-1.0f)/re->wrld.linfac) / re->wrld.range;
@@ -4100,11 +4100,11 @@ static void set_phong_threshold(ObjectRen *obr)
VlakRen *vlr;
float thresh= 0.0, dot;
int tot=0, i;
-
- /* Added check for 'pointy' situations, only dotproducts of 0.9 and larger
+
+ /* Added check for 'pointy' situations, only dotproducts of 0.9 and larger
* are taken into account. This threshold is meant to work on smooth geometry, not
* for extreme cases (ton) */
-
+
for (i=0; i<obr->totvlak; i++) {
vlr= RE_findOrAddVlak(obr, i);
if ((vlr->flag & R_SMOOTH) && (vlr->flag & R_STRAND)==0) {
@@ -4134,7 +4134,7 @@ static void set_phong_threshold(ObjectRen *obr)
}
}
}
-
+
if (tot) {
thresh/= (float)tot;
obr->ob->smoothresh= cosf(0.5f*(float)M_PI-saacos(thresh));
@@ -4150,14 +4150,14 @@ static void set_fullsample_trace_flag(Render *re, ObjectRen *obr)
osa= re->osa;
trace= re->r.mode & R_RAYTRACE;
-
+
for (a=obr->totvlak-1; a>=0; a--) {
vlr= RE_findOrAddVlak(obr, a);
mode= vlr->mat->mode;
if (trace && (mode & MA_TRACEBLE))
vlr->flag |= R_TRACEBLE;
-
+
if (osa) {
if (mode & MA_FULL_OSA) {
vlr->flag |= R_FULL_OSA;
@@ -4170,7 +4170,7 @@ static void set_fullsample_trace_flag(Render *re, ObjectRen *obr)
/* pass */
}
else if ((mode & MA_RAYMIRROR) || ((mode & MA_TRANSP) && (mode & MA_RAYTRANSP))) {
- /* for blurry reflect/refract, better to take more samples
+ /* for blurry reflect/refract, better to take more samples
* inside the raytrace than as OSA samples */
if ((vlr->mat->gloss_mir == 1.0f) && (vlr->mat->gloss_tra == 1.0f))
vlr->flag |= R_FULL_OSA;
@@ -4183,22 +4183,22 @@ static void set_fullsample_trace_flag(Render *re, ObjectRen *obr)
/* split quads for predictable baking
* dir 1 == (0, 1, 2) (0, 2, 3), 2 == (1, 3, 0) (1, 2, 3)
*/
-static void split_quads(ObjectRen *obr, int dir)
+static void split_quads(ObjectRen *obr, int dir)
{
VlakRen *vlr, *vlr1;
int a;
for (a=obr->totvlak-1; a>=0; a--) {
vlr= RE_findOrAddVlak(obr, a);
-
+
/* test if rendering as a quad or triangle, skip wire */
if ((vlr->flag & R_STRAND)==0 && (vlr->mat->material_type != MA_TYPE_WIRE)) {
-
+
if (vlr->v4) {
vlr1= RE_vlakren_copy(obr, vlr);
vlr1->flag |= R_FACE_SPLIT;
-
+
if ( dir==2 ) vlr->flag |= R_DIVIDE_24;
else vlr->flag &= ~R_DIVIDE_24;
@@ -4209,18 +4209,18 @@ static void split_quads(ObjectRen *obr, int dir)
vlr1->v3= vlr->v4;
vlr->v3 = vlr->v4;
-
+
vlr1->flag |= R_DIVIDE_24;
}
else {
vlr1->v1= vlr->v1;
vlr1->v2= vlr->v3;
vlr1->v3= vlr->v4;
-
+
vlr1->flag &= ~R_DIVIDE_24;
}
vlr->v4 = vlr1->v4 = NULL;
-
+
#ifdef WITH_FREESTYLE
/* Freestyle edge marks */
if (vlr->flag & R_DIVIDE_24) {
@@ -4260,10 +4260,10 @@ static void check_non_flat_quads(ObjectRen *obr)
for (a=obr->totvlak-1; a>=0; a--) {
vlr= RE_findOrAddVlak(obr, a);
-
+
/* test if rendering as a quad or triangle, skip wire */
if (vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->material_type != MA_TYPE_WIRE)) {
-
+
/* check if quad is actually triangle */
v1= vlr->v1;
v2= vlr->v2;
@@ -4298,20 +4298,20 @@ static void check_non_flat_quads(ObjectRen *obr)
}
}
}
-
+
if (vlr->v4) {
-
+
/* Face is divided along edge with the least gradient */
/* Flagged with R_DIVIDE_24 if divide is from vert 2 to 4 */
/* 4---3 4---3 */
/* |\ 1| or |1 /| */
/* |0\ | |/ 0| */
/* 1---2 1---2 0 = orig face, 1 = new face */
-
+
/* render normals are inverted in render! we calculate normal of single tria here */
flen= normal_tri_v3(nor, vlr->v4->co, vlr->v3->co, vlr->v1->co);
if (flen==0.0f) normal_tri_v3(nor, vlr->v4->co, vlr->v2->co, vlr->v1->co);
-
+
xn = dot_v3v3(nor, vlr->n);
if (ABS(xn) < 0.999995f ) { /* checked on noisy fractal grid */
@@ -4320,7 +4320,7 @@ static void check_non_flat_quads(ObjectRen *obr)
vlr1= RE_vlakren_copy(obr, vlr);
vlr1->flag |= R_FACE_SPLIT;
-
+
/* split direction based on vnorms */
normal_tri_v3(nor, vlr->v1->co, vlr->v2->co, vlr->v3->co);
d1 = dot_v3v3(nor, vlr->v1->n);
@@ -4338,18 +4338,18 @@ static void check_non_flat_quads(ObjectRen *obr)
vlr1->v3= vlr->v4;
vlr->v3 = vlr->v4;
-
+
vlr1->flag |= R_DIVIDE_24;
}
else {
vlr1->v1= vlr->v1;
vlr1->v2= vlr->v3;
vlr1->v3= vlr->v4;
-
+
vlr1->flag &= ~R_DIVIDE_24;
}
vlr->v4 = vlr1->v4 = NULL;
-
+
/* new normals */
normal_tri_v3(vlr->n, vlr->v3->co, vlr->v2->co, vlr->v1->co);
normal_tri_v3(vlr1->n, vlr1->v3->co, vlr1->v2->co, vlr1->v1->co);
@@ -4391,19 +4391,19 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
int a, b;
if (obr->totvert || obr->totvlak || obr->tothalo || obr->totstrand) {
- /* the exception below is because displace code now is in init_render_mesh call,
+ /* the exception below is because displace code now is in init_render_mesh call,
* I will look at means to have autosmooth enabled for all object types
* and have it as general postprocess, like displace */
if (ob->type!=OB_MESH && test_for_displace(re, ob))
displace(re, obr);
-
+
if (!timeoffset) {
/* phong normal interpolation can cause error in tracing
* (terminator problem) */
ob->smoothresh= 0.0;
if ((re->r.mode & R_RAYTRACE) && (re->r.mode & R_SHADOW))
set_phong_threshold(obr);
-
+
if (re->flag & R_BAKING && re->r.bake_quad_split != 0) {
/* Baking lets us define a quad split order */
split_quads(obr, re->r.bake_quad_split);
@@ -4414,7 +4414,7 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
if ((re->r.mode & R_SIMPLIFY && re->r.simplify_flag & R_SIMPLE_NO_TRIANGULATE) == 0)
check_non_flat_quads(obr);
}
-
+
set_fullsample_trace_flag(re, obr);
/* compute bounding boxes for clipping */
@@ -4428,17 +4428,17 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
if (obr->strandbuf) {
float width;
-
+
/* compute average bounding box of strandpoint itself (width) */
if (obr->strandbuf->flag & R_STRAND_B_UNITS)
obr->strandbuf->maxwidth = max_ff(obr->strandbuf->ma->strand_sta, obr->strandbuf->ma->strand_end);
else
obr->strandbuf->maxwidth= 0.0f;
-
+
width= obr->strandbuf->maxwidth;
sbound= obr->strandbuf->bound;
for (b=0; b<obr->strandbuf->totbound; b++, sbound++) {
-
+
INIT_MINMAX(smin, smax);
for (a=sbound->start; a<sbound->end; a++) {
@@ -4556,7 +4556,7 @@ static ObjectRen *find_dupligroup_dupli(Render *re, Object *ob, int psysindex)
for (obr=re->objecttable.first; obr; obr=obr->next)
if (obr->ob == ob && obr->psysindex == psysindex && (obr->flag & R_INSTANCEABLE))
return obr;
-
+
return NULL;
}
@@ -4697,7 +4697,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
}
else
find_dupli_instances(re, obr, dob);
-
+
for (i=1; i<=ob->totcol; i++) {
Material* ma = give_render_material(re, ob, i);
if (ma && ma->material_type == MA_TYPE_VOLUME)
@@ -4711,7 +4711,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
for (psys=ob->particlesystem.first; psys; psys=psys->next, psysindex++) {
if (!psys_check_enabled(ob, psys, G.is_rendering))
continue;
-
+
obr= RE_addRenderObject(re, ob, par, index, psysindex, ob->lay);
if ((dob && !dob->animated) || (ob->transflag & OB_RENDER_DUPLI)) {
obr->flag |= R_INSTANCEABLE;
@@ -4752,7 +4752,7 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject
mul_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat);
}
-
+
time= PIL_check_seconds_timer();
if (time - lasttime > 1.0) {
lasttime= time;
@@ -4785,7 +4785,7 @@ void RE_Database_Free(Render *re)
}
/* FREE */
-
+
for (lar= re->lampren.first; lar; lar= lar->next) {
freeshadowbuf(lar);
if (lar->jitter) MEM_freeN(lar->jitter);
@@ -4793,9 +4793,9 @@ void RE_Database_Free(Render *re)
if (lar->sunsky) MEM_freeN(lar->sunsky);
curvemapping_free(lar->curfalloff);
}
-
+
free_volume_precache(re);
-
+
BLI_freelistN(&re->lampren);
BLI_freelistN(&re->lights);
@@ -4809,9 +4809,9 @@ void RE_Database_Free(Render *re)
end_render_textures(re);
free_pointdensities(re);
}
-
+
free_camera_inside_volumes(re);
-
+
if (re->wrld.aosphere) {
MEM_freeN(re->wrld.aosphere);
re->wrld.aosphere= NULL;
@@ -4826,13 +4826,13 @@ void RE_Database_Free(Render *re)
}
if (re->r.mode & R_RAYTRACE)
free_render_qmcsampler(re);
-
+
if (re->r.mode & R_RAYTRACE) freeraytree(re);
free_sss(re);
free_occ(re);
free_strand_surface(re);
-
+
re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->i.convertdone = false;
@@ -4860,17 +4860,17 @@ static int allow_render_object(Render *re, Object *ob, int nolamps, int onlysele
return 0;
}
}
-
+
/* don't add non-basic meta objects, ends up having renderobjects with no geometry */
if (ob->type == OB_MBALL && ob!=BKE_mball_basis_find(re->eval_ctx, re->scene, ob))
return 0;
-
+
if (nolamps && (ob->type==OB_LAMP))
return 0;
-
+
if (onlyselected && (ob!=actob && !(ob->flag & SELECT)))
return 0;
-
+
return 1;
}
@@ -4915,7 +4915,7 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in
if (level >= MAX_DUPLI_RECUR)
return;
-
+
if (ob->transflag & OB_DUPLIPARTS) {
for (psys=ob->particlesystem.first; psys; psys=psys->next) {
if (ELEM(psys->part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
@@ -5006,7 +5006,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
* See bug: [#28744] - campbell */
for (ob= re->main->object.first; ob; ob= ob->id.next) {
float mat[4][4];
-
+
/* imat objects has to be done here, since displace can have texture using Object map-input */
mul_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat_ren, mat);
@@ -5134,7 +5134,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
if (obi==NULL)
/* can't instance, just create the object */
init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset);
-
+
if (dob->type != OB_DUPLIGROUP) {
obd->flag |= OB_DONE;
obd->transflag |= OB_RENDER_DUPLI;
@@ -5142,7 +5142,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
}
else
init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset);
-
+
if (re->test_break(re->tbh)) break;
}
@@ -5188,34 +5188,34 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
if (re->r.scemode & R_VIEWPORT_PREVIEW)
re->scene_color_manage = BKE_scene_check_color_management_enabled(scene);
-
+
/* scene needs to be set to get camera */
camera= RE_GetCamera(re);
-
+
/* per second, per object, stats print this */
re->i.infostr= "Preparing Scene data";
re->i.cfra= scene->r.cfra;
BLI_strncpy(re->i.scene_name, scene->id.name + 2, sizeof(re->i.scene_name));
-
+
/* XXX add test if dbase was filled already? */
-
+
re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "render db arena");
re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->lights.first= re->lights.last= NULL;
re->lampren.first= re->lampren.last= NULL;
re->i.partsdone = false; /* signal now in use for previewrender */
-
+
/* in localview, lamps are using normal layers, objects only local bits */
if (re->lay & 0xFF000000)
lay &= 0xFF000000;
-
+
/* applies changes fully */
if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0) {
BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, lay);
render_update_anim_renderdata(re, &re->scene->r);
}
-
+
/* if no camera, viewmat should have been set! */
if (use_camera_view && camera) {
/* called before but need to call again in case of lens animation from the
@@ -5229,10 +5229,10 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
/* force correct matrix for scaled cameras */
DAG_id_tag_update_ex(re->main, &camera->id, OB_RECALC_OB);
}
-
+
/* store for incremental render, viewmat rotates dbase */
copy_m4_m4(re->viewmat_orig, re->viewmat);
-
+
init_render_world(re); /* do first, because of ambient. also requires re->osa set correct */
if (re->r.mode & R_RAYTRACE) {
init_render_qmcsampler(re);
@@ -5241,7 +5241,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
if (re->wrld.ao_samp_method == WO_AOSAMP_CONSTANT)
init_ao_sphere(re, &re->wrld);
}
-
+
/* still bad... doing all */
init_render_textures(re);
copy_v3_v3(amb, &re->wrld.ambr);
@@ -5250,12 +5250,12 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
/* MAKE RENDER DATA */
database_init_objects(re, lay, 0, 0, NULL, 0);
-
+
if (!re->test_break(re->tbh)) {
set_material_lightgroups(re);
for (sce= re->scene; sce; sce= sce->set)
set_renderlayer_lightgroups(re, sce);
-
+
/* for now some clumsy copying still */
re->i.totvert= re->totvert;
re->i.totface= re->totvlak;
@@ -5273,9 +5273,9 @@ void RE_Database_Preprocess(Render *re)
tothalo= re->tothalo;
sort_halos(re, tothalo);
-
+
init_camera_inside_volumes(re);
-
+
re->i.infostr = IFACE_("Creating Shadowbuffers");
re->stats_draw(re->sdh, &re->i);
@@ -5293,7 +5293,7 @@ void RE_Database_Preprocess(Render *re)
/* ENVIRONMENT MAPS */
if (!re->test_break(re->tbh))
make_envmaps(re);
-
+
/* point density texture */
if (!re->test_break(re->tbh))
make_pointdensities(re);
@@ -5301,10 +5301,10 @@ void RE_Database_Preprocess(Render *re)
if (!re->test_break(re->tbh))
make_voxeldata(re);
}
-
+
if (!re->test_break(re->tbh))
project_renderdata(re, projectverto, (re->r.mode & R_PANORAMA) != 0, 0, 1);
-
+
/* Occlusion */
if ((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && !re->test_break(re->tbh))
if (re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
@@ -5314,17 +5314,17 @@ void RE_Database_Preprocess(Render *re)
/* SSS */
if ((re->r.mode & R_SSS) && !re->test_break(re->tbh))
make_sss_tree(re);
-
+
if (!re->test_break(re->tbh))
if (re->r.mode & R_RAYTRACE)
volume_precache(re);
}
-
+
re->i.convertdone = true;
if (re->test_break(re->tbh))
RE_Database_Free(re);
-
+
re->i.infostr = NULL;
re->stats_draw(re->sdh, &re->i);
}
@@ -5339,15 +5339,15 @@ void RE_DataBase_ApplyWindow(Render *re)
void RE_DataBase_IncrementalView(Render *re, float viewmat[4][4], int restore)
{
float oldviewinv[4][4], tmat[4][4];
-
+
invert_m4_m4(oldviewinv, re->viewmat_orig);
-
+
/* we have to correct for the already rotated vertexcoords */
mul_m4_m4m4(tmat, viewmat, oldviewinv);
-
+
copy_m4_m4(re->viewmat, viewmat);
invert_m4_m4(re->viewinv, re->viewmat);
-
+
init_camera_inside_volumes(re);
env_rotate_scene(re, tmat, !restore);
@@ -5371,25 +5371,25 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la
{
Object *camera= RE_GetCamera(re);
float mat[4][4];
-
+
re->scene= scene;
re->lay= lay;
-
+
/* XXX add test if dbase was filled already? */
-
+
re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vector render db arena");
re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->i.totface=re->i.totvert=re->i.totstrand=re->i.totlamp=re->i.tothalo= 0;
re->lights.first= re->lights.last= NULL;
-
+
/* in localview, lamps are using normal layers, objects only local bits */
if (re->lay & 0xFF000000)
lay &= 0xFF000000;
-
+
/* applies changes fully */
scene->r.cfra += timeoffset;
BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, lay);
-
+
/* if no camera, viewmat should have been set! */
if (camera) {
RE_GetCameraModelMatrix(re, camera, mat);
@@ -5397,10 +5397,10 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la
invert_m4(mat);
RE_SetView(re, mat);
}
-
+
/* MAKE RENDER DATA */
database_init_objects(re, lay, 0, 0, NULL, timeoffset);
-
+
if (!re->test_break(re->tbh))
project_renderdata(re, projectverto, (re->r.mode & R_PANORAMA) != 0, 0, 1);
@@ -5414,11 +5414,11 @@ static void speedvector_project(Render *re, float zco[2], const float co[3], con
static float pixelphix=0.0f, pixelphiy=0.0f, zmulx=0.0f, zmuly=0.0f;
static int pano= 0;
float div;
-
+
/* initialize */
if (re) {
pano= re->r.mode & R_PANORAMA;
-
+
/* precalculate amount of radians 1 pixel rotates */
if (pano) {
/* size of 1 pixel mapped to viewplane coords */
@@ -5427,21 +5427,21 @@ static void speedvector_project(Render *re, float zco[2], const float co[3], con
psize = BLI_rctf_size_x(&re->viewplane) / (float)re->winx;
/* x angle of a pixel */
pixelphix = atan(psize / re->clipsta);
-
+
psize = BLI_rctf_size_y(&re->viewplane) / (float)re->winy;
/* y angle of a pixel */
pixelphiy = atan(psize / re->clipsta);
}
zmulx= re->winx/2;
zmuly= re->winy/2;
-
+
return;
}
-
+
/* now map hocos to screenspace, uses very primitive clip still */
if (ho[3]<0.1f) div= 10.0f;
else div= 1.0f/ho[3];
-
+
/* use cylinder projection */
if (pano) {
float vec[3], ang;
@@ -5451,10 +5451,10 @@ static void speedvector_project(Render *re, float zco[2], const float co[3], con
ang= saacos(-vec[2]/sqrtf(vec[0]*vec[0] + vec[2]*vec[2]));
if (vec[0]<0.0f) ang= -ang;
zco[0]= ang/pixelphix + zmulx;
-
+
ang= 0.5f*(float)M_PI - saacos(vec[1] / len_v3(vec));
zco[1]= ang/pixelphiy + zmuly;
-
+
}
else {
zco[0]= zmulx*(1.0f+ho[0]*div);
@@ -5467,16 +5467,16 @@ static void calculate_speedvector(const float vectors[2], int step, float winsq,
float zco[2], len;
speedvector_project(NULL, zco, co, ho);
-
+
zco[0]= vectors[0] - zco[0];
zco[1]= vectors[1] - zco[1];
-
+
/* enable nice masks for hardly moving stuff or float inaccuracy */
if (zco[0]<0.1f && zco[0]>-0.1f && zco[1]<0.1f && zco[1]>-0.1f ) {
zco[0]= 0.0f;
zco[1]= 0.0f;
}
-
+
/* maximize speed for image width, otherwise it never looks good */
len= zco[0]*zco[0] + zco[1]*zco[1];
if (len > winsq) {
@@ -5484,7 +5484,7 @@ static void calculate_speedvector(const float vectors[2], int step, float winsq,
zco[0]*= len;
zco[1]*= len;
}
-
+
/* note; in main vecblur loop speedvec is negated again */
if (step) {
speed[2]= -zco[0];
@@ -5619,44 +5619,44 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(fsob, eModifierType_Fluidsim);
FluidsimSettings *fss;
FluidVertexVelocity *velarray = NULL;
-
+
/* only one step needed */
if (step) return 1;
-
+
if (fluidmd)
fss = fluidmd->fss;
else
return 0;
-
+
copy_m4_m4(mat, re->viewmat);
invert_m4_m4(imat, mat);
/* set first vertex OK */
if (!fss->meshVelocities) return 0;
-
+
if ( obr->totvert != fss->totvert) {
//fprintf(stderr, "load_fluidsimspeedvectors - modified fluidsim mesh, not using speed vectors (%d,%d)...\n", obr->totvert, fsob->fluidsimSettings->meshSurface->totvert); // DEBUG
return 0;
}
-
+
velarray = fss->meshVelocities;
if (obi->flag & R_TRANSFORMED)
mul_m4_m4m4(winmat, re->winmat, obi->mat);
else
copy_m4_m4(winmat, re->winmat);
-
+
/* (bad) HACK calculate average velocity */
/* better solution would be fixing getVelocityAt() in intern/elbeem/intern/solver_util.cpp
* so that also small drops/little water volumes return a velocity != 0.
* But I had no luck in fixing that function - DG */
for (a=0; a<obr->totvert; a++) {
for (j=0;j<3;j++) avgvel[j] += velarray[a].vel[j];
-
+
}
for (j=0;j<3;j++) avgvel[j] /= (float)(obr->totvert);
-
-
+
+
for (a=0; a<obr->totvert; a++, vectors+=2) {
if ((a & 255)==0)
ver= obr->vertnodes[a>>8].vert;
@@ -5667,14 +5667,14 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
fsvec[3] = 0.0f;
//fsvec[0] = fsvec[1] = fsvec[2] = fsvec[3] = 0.0; fsvec[2] = 2.0f; // NT fixed test
for (j=0;j<3;j++) fsvec[j] = velarray[a].vel[j];
-
+
/* (bad) HACK insert average velocity if none is there (see previous comment) */
if ((fsvec[0] == 0.0f) && (fsvec[1] == 0.0f) && (fsvec[2] == 0.0f)) {
fsvec[0] = avgvel[0];
fsvec[1] = avgvel[1];
fsvec[2] = avgvel[2];
}
-
+
/* transform (=rotate) to cam space */
camco[0] = dot_v3v3(imat[0], fsvec);
camco[1] = dot_v3v3(imat[1], fsvec);
@@ -5683,14 +5683,14 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
/* get homogeneous coordinates */
projectvert(camco, winmat, hoco);
projectvert(ver->co, winmat, ho);
-
+
/* now map hocos to screenspace, uses very primitive clip still */
/* use ho[3] of original vertex, xy component of vel. direction */
if (ho[3]<0.1f) div= 10.0f;
else div= 1.0f/ho[3];
zco[0]= zmulx*hoco[0]*div;
zco[1]= zmuly*hoco[1]*div;
-
+
/* maximize speed as usual */
len= zco[0]*zco[0] + zco[1]*zco[1];
if (len > winsq) {
@@ -5738,7 +5738,7 @@ static void copy_dbase_object_vectors(Render *re, ListBase *lb)
for (a=0; a<obr->totvert; a++, vec+=2) {
if ((a & 255)==0) ver= obr->vertnodes[a>>8].vert;
else ver++;
-
+
projectvert(ver->co, winmat, ho);
speedvector_project(NULL, vec, ver->co, ho);
}
@@ -5749,7 +5749,7 @@ static void copy_dbase_object_vectors(Render *re, ListBase *lb)
static void free_dbase_object_vectors(ListBase *lb)
{
ObjectInstanceRen *obi;
-
+
for (obi= lb->first; obi; obi= obi->next)
if (obi->vectors)
MEM_freeN(obi->vectors);
@@ -5764,56 +5764,56 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned
ListBase oldtable= {NULL, NULL}, newtable= {NULL, NULL};
ListBase strandsurface;
int step;
-
+
re->i.infostr = IFACE_("Calculating previous frame vectors");
re->r.mode |= R_SPEED;
-
+
speedvector_project(re, NULL, NULL, NULL); /* initializes projection code */
-
+
/* creates entire dbase */
database_fromscene_vectors(re, sce, lay, -1);
-
+
/* copy away vertex info */
copy_dbase_object_vectors(re, &oldtable);
-
+
/* free dbase and make the future one */
strandsurface= re->strandsurface;
memset(&re->strandsurface, 0, sizeof(ListBase));
re->i.convertdone = true;
RE_Database_Free(re);
re->strandsurface= strandsurface;
-
+
if (!re->test_break(re->tbh)) {
/* creates entire dbase */
re->i.infostr = IFACE_("Calculating next frame vectors");
-
+
database_fromscene_vectors(re, sce, lay, +1);
}
/* copy away vertex info */
copy_dbase_object_vectors(re, &newtable);
-
+
/* free dbase and make the real one */
strandsurface= re->strandsurface;
memset(&re->strandsurface, 0, sizeof(ListBase));
re->i.convertdone = true;
RE_Database_Free(re);
re->strandsurface= strandsurface;
-
+
if (!re->test_break(re->tbh)) {
RE_Database_FromScene(re, bmain, sce, lay, 1);
RE_Database_Preprocess(re);
}
-
+
if (!re->test_break(re->tbh)) {
int vectorlay= get_vector_renderlayers(re->scene);
for (step= 0; step<2; step++) {
-
+
if (step)
table= &newtable;
else
table= &oldtable;
-
+
oldobi= table->first;
for (obi= re->instancetable.first; obi && oldobi; obi= obi->next) {
int ok= 1;
@@ -5859,7 +5859,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned
}
}
}
-
+
free_dbase_object_vectors(&oldtable);
free_dbase_object_vectors(&newtable);
@@ -5873,7 +5873,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned
mesh->nextco= NULL;
}
}
-
+
re->i.infostr = NULL;
re->stats_draw(re->sdh, &re->i);
}
@@ -5911,7 +5911,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
render_copy_renderdata(&re->r, &scene->r);
RE_init_threadcount(re);
-
+
re->flag |= R_BAKING;
re->excludeob= actob;
if (actob)
@@ -5927,14 +5927,14 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
re->r.mode &= ~R_SHADOW;
re->r.mode &= ~R_RAYTRACE;
}
-
+
if (!actob && (type==RE_BAKE_SHADOW)) {
re->r.mode |= R_SHADOW;
}
-
+
/* setup render stuff */
re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "bake db arena");
-
+
re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->lights.first= re->lights.last= NULL;
re->lampren.first= re->lampren.last= NULL;
@@ -5942,9 +5942,9 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
/* in localview, lamps are using normal layers, objects only local bits */
if (re->lay & 0xFF000000)
lay &= 0xFF000000;
-
+
camera= RE_GetCamera(re);
-
+
/* if no camera, set unit */
if (camera) {
normalize_m4_m4(mat, camera->obmat);
@@ -5967,25 +5967,25 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
init_render_world(re); /* do first, because of ambient. also requires re->osa set correct */
if (re->r.mode & R_RAYTRACE) {
init_render_qmcsampler(re);
-
+
if (re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT))
if (re->wrld.ao_samp_method == WO_AOSAMP_CONSTANT)
init_ao_sphere(re, &re->wrld);
}
-
+
/* still bad... doing all */
init_render_textures(re);
-
+
copy_v3_v3(amb, &re->wrld.ambr);
init_render_materials(re->main, re->r.mode, amb, true);
-
+
set_node_shader_lamp_loop(shade_material_loop);
-
+
/* MAKE RENDER DATA */
database_init_objects(re, lay, nolamps, onlyselected, actob, 0);
set_material_lightgroups(re);
-
+
/* SHADOW BUFFER */
if (type!=RE_BAKE_LIGHT)
if (re->r.mode & R_SHADOW)
@@ -5995,7 +5995,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
if (!re->test_break(re->tbh))
if (re->r.mode & R_RAYTRACE)
makeraytree(re);
-
+
/* point density texture */
if (!re->test_break(re->tbh))
make_pointdensities(re);
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 40b249192f9..85a6af92a28 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -68,13 +68,13 @@
static void envmap_split_ima(EnvMap *env, ImBuf *ibuf)
{
int dx, part;
-
+
/* after lock we test cube[1], if set the other thread has done it fine */
BLI_thread_lock(LOCK_IMAGE);
if (env->cube[1] == NULL) {
BKE_texture_envmap_free_data(env);
-
+
dx = ibuf->y;
dx /= 2;
if (3 * dx == ibuf->x) {
@@ -90,27 +90,27 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf)
env->ok = 0;
env->ima->ok = 0;
}
-
+
if (env->ok) {
if (env->type == ENV_CUBE) {
for (part = 0; part < 6; part++) {
env->cube[part] = IMB_allocImBuf(dx, dx, 24, IB_rect | IB_rectfloat);
}
IMB_float_from_rect(ibuf);
-
- IMB_rectcpy(env->cube[0], ibuf,
+
+ IMB_rectcpy(env->cube[0], ibuf,
0, 0, 0, 0, dx, dx);
- IMB_rectcpy(env->cube[1], ibuf,
+ IMB_rectcpy(env->cube[1], ibuf,
0, 0, dx, 0, dx, dx);
- IMB_rectcpy(env->cube[2], ibuf,
+ IMB_rectcpy(env->cube[2], ibuf,
0, 0, 2 * dx, 0, dx, dx);
- IMB_rectcpy(env->cube[3], ibuf,
+ IMB_rectcpy(env->cube[3], ibuf,
0, 0, 0, dx, dx, dx);
- IMB_rectcpy(env->cube[4], ibuf,
+ IMB_rectcpy(env->cube[4], ibuf,
0, 0, dx, dx, dx, dx);
- IMB_rectcpy(env->cube[5], ibuf,
+ IMB_rectcpy(env->cube[5], ibuf,
0, 0, 2 * dx, dx, dx, dx);
-
+
}
else { /* ENV_PLANE */
env->cube[1] = IMB_dupImBuf(ibuf);
@@ -130,16 +130,16 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
Render *envre;
float viewscale;
int cuberes;
-
+
envre = RE_NewRender("Envmap");
-
+
env->lastsize = re->r.size;
cuberes = (env->cuberes * re->r.size) / 100;
cuberes &= 0xFFFC;
-
+
/* this flag has R_ZTRA in it for example */
envre->flag = re->flag;
-
+
/* set up renderdata */
render_copy_renderdata(&envre->r, &re->r);
envre->r.mode &= ~(R_BORDER | R_PANORAMA | R_ORTHO | R_MBLUR);
@@ -150,7 +150,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
envre->r.tiley = envre->r.ysch / 2;
envre->r.size = 100;
envre->r.yasp = envre->r.xasp = 1;
-
+
RE_InitState(envre, NULL, &envre->r, NULL, cuberes, cuberes, NULL);
envre->main = re->main;
envre->scene = re->scene; /* unsure about this... */
@@ -161,7 +161,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
viewscale = (env->type == ENV_PLANE) ? env->viewscale : 1.0f;
RE_SetEnvmapCamera(envre, env->object, viewscale, env->clipsta, env->clipend);
copy_m4_m4(envre->viewmat_orig, re->viewmat_orig);
-
+
/* callbacks */
envre->display_update = re->display_update;
envre->duh = re->duh;
@@ -169,7 +169,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
envre->tbh = re->tbh;
envre->current_scene_update = re->current_scene_update;
envre->suh = re->suh;
-
+
/* and for the evil stuff; copy the database... */
envre->totvlak = re->totvlak;
envre->totvert = re->totvert;
@@ -185,7 +185,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
envre->instancetable = re->instancetable;
envre->objectinstance = re->objectinstance;
envre->qmcsamplers = re->qmcsamplers;
-
+
return envre;
}
@@ -206,7 +206,7 @@ static void envmap_free_render_copy(Render *envre)
BLI_listbase_clear(&envre->instancetable);
envre->objectinstance = NULL;
envre->qmcsamplers = NULL;
-
+
RE_FreeRender(envre);
}
@@ -215,9 +215,9 @@ static void envmap_free_render_copy(Render *envre)
static void envmap_transmatrix(float mat[4][4], int part)
{
float tmat[4][4], eul[3], rotmat[4][4];
-
+
eul[0] = eul[1] = eul[2] = 0.0;
-
+
if (part == 0) { /* neg z */
/* pass */
}
@@ -239,7 +239,7 @@ static void envmap_transmatrix(float mat[4][4], int part)
eul[0] = M_PI / 2.0;
eul[2] = -M_PI / 2.0;
}
-
+
copy_m4_m4(tmat, mat);
eul_to_mat4(rotmat, eul);
mul_m4_m4m4(mat, tmat, rotmat);
@@ -250,15 +250,15 @@ static void env_set_imats(Render *re)
{
Base *base;
float mat[4][4];
-
+
base = re->scene->base.first;
while (base) {
mul_m4_m4m4(mat, re->viewmat, base->object->obmat);
invert_m4_m4(base->object->imat, mat);
-
+
base = base->next;
}
-
+
}
/* ------------------------------------------------------------------------- */
@@ -271,17 +271,17 @@ void env_rotate_scene(Render *re, float mat[4][4], int do_rotate)
HaloRen *har = NULL;
float imat[3][3], mat_inverse[4][4], smat[4][4], tmat[4][4], cmat[3][3], tmpmat[4][4];
int a;
-
+
if (do_rotate == 0) {
invert_m4_m4(tmat, mat);
copy_m3_m4(imat, tmat);
-
+
copy_m4_m4(mat_inverse, mat);
}
else {
copy_m4_m4(tmat, mat);
copy_m3_m4(imat, mat);
-
+
invert_m4_m4(mat_inverse, tmat);
}
@@ -308,13 +308,13 @@ void env_rotate_scene(Render *re, float mat[4][4], int do_rotate)
copy_m4_m4(obi->imat, mat_inverse);
}
}
-
+
for (obr = re->objecttable.first; obr; obr = obr->next) {
for (a = 0; a < obr->tothalo; a++) {
if ((a & 255) == 0) har = obr->bloha[a >> 8];
else har++;
-
+
mul_m4_v3(tmat, har->co);
}
@@ -322,7 +322,7 @@ void env_rotate_scene(Render *re, float mat[4][4], int do_rotate)
mul_m4_m4m4(obr->ob->imat_ren, re->viewmat, obr->ob->obmat);
invert_m4(obr->ob->imat_ren);
}
-
+
for (lar = re->lampren.first; lar; lar = lar->next) {
float lamp_imat[4][4];
@@ -351,13 +351,13 @@ void env_rotate_scene(Render *re, float mat[4][4], int do_rotate)
normalize_v3(lar->imat[0]);
normalize_v3(lar->imat[1]);
normalize_v3(lar->imat[2]);
-
+
lar->sh_invcampos[0] = -lar->co[0];
lar->sh_invcampos[1] = -lar->co[1];
lar->sh_invcampos[2] = -lar->co[2];
mul_m3_v3(lar->imat, lar->sh_invcampos);
lar->sh_invcampos[2] *= lar->sh_zfac;
-
+
if (lar->shb) {
if (do_rotate == 1) {
mul_m4_m4m4(smat, lar->shb->viewmat, mat_inverse);
@@ -367,7 +367,7 @@ void env_rotate_scene(Render *re, float mat[4][4], int do_rotate)
}
}
}
-
+
if (do_rotate) {
init_render_world(re);
env_set_imats(re);
@@ -381,7 +381,7 @@ static void env_layerflags(Render *re, unsigned int notlay)
ObjectRen *obr;
VlakRen *vlr = NULL;
int a;
-
+
/* invert notlay, so if face is in multiple layers it will still be visible,
* unless all 'notlay' bits match the face bits.
* face: 0110
@@ -389,9 +389,9 @@ static void env_layerflags(Render *re, unsigned int notlay)
* ~not: 1011
* now (face & ~not) is true
*/
-
+
notlay = ~notlay;
-
+
for (obr = re->objecttable.first; obr; obr = obr->next) {
if ((obr->lay & notlay) == 0) {
for (a = 0; a < obr->totvlak; a++) {
@@ -409,7 +409,7 @@ static void env_hideobject(Render *re, Object *ob)
ObjectRen *obr;
VlakRen *vlr = NULL;
int a;
-
+
for (obr = re->objecttable.first; obr; obr = obr->next) {
for (a = 0; a < obr->totvlak; a++) {
if ((a & 255) == 0) vlr = obr->vlaknodes[a >> 8].vlak;
@@ -426,7 +426,7 @@ static void env_showobjects(Render *re)
ObjectRen *obr;
VlakRen *vlr = NULL;
int a;
-
+
for (obr = re->objecttable.first; obr; obr = obr->next) {
for (a = 0; a < obr->totvlak; a++) {
if ((a & 255) == 0) vlr = obr->vlaknodes[a >> 8].vlak;
@@ -447,16 +447,16 @@ static void render_envmap(Render *re, EnvMap *env)
float orthmat[4][4];
float oldviewinv[4][4], mat[4][4], tmat[4][4];
short part;
-
+
/* need a recalc: ortho-render has no correct viewinv */
invert_m4_m4(oldviewinv, re->viewmat);
envre = envmap_render_copy(re, env);
-
+
/* precalc orthmat for object */
copy_m4_m4(orthmat, env->object->obmat);
normalize_m4(orthmat);
-
+
/* need imat later for texture imat */
mul_m4_m4m4(mat, re->viewmat, orthmat);
invert_m4_m4(tmat, mat);
@@ -465,9 +465,9 @@ static void render_envmap(Render *re, EnvMap *env)
for (part = 0; part < 6; part++) {
if (env->type == ENV_PLANE && part != 1)
continue;
-
+
re->display_clear(re->dch, envre->result);
-
+
copy_m4_m4(tmat, orthmat);
envmap_transmatrix(tmat, part);
invert_m4_m4(mat, tmat);
@@ -475,20 +475,20 @@ static void render_envmap(Render *re, EnvMap *env)
copy_m4_m4(envre->viewmat, mat);
copy_m4_m4(envre->viewinv, tmat);
-
+
/* we have to correct for the already rotated vertexcoords */
mul_m4_m4m4(tmat, envre->viewmat, oldviewinv);
invert_m4_m4(env->imat, tmat);
-
+
env_rotate_scene(envre, tmat, 1);
project_renderdata(envre, projectverto, 0, 0, 1);
env_layerflags(envre, env->notlay);
env_hideobject(envre, env->object);
-
+
if (re->test_break(re->tbh) == 0) {
RE_TileProcessor(envre);
}
-
+
/* rotate back */
env_showobjects(envre);
env_rotate_scene(envre, tmat, 0);
@@ -510,26 +510,26 @@ static void render_envmap(Render *re, EnvMap *env)
rect = RE_RenderLayerGetPass(rl, RE_PASSNAME_COMBINED, "");
ibuf = IMB_allocImBuf(envre->rectx, envre->recty, 24, IB_rect | IB_rectfloat);
memcpy(ibuf->rect_float, rect, ibuf->channels * ibuf->x * ibuf->y * sizeof(float));
-
+
/* envmap renders without alpha */
alpha = ibuf->rect_float + 3;
for (y = ibuf->x * ibuf->y - 1; y >= 0; y--, alpha += 4)
*alpha = 1.0;
-
+
env->cube[part] = ibuf;
}
-
+
if (re->test_break(re->tbh)) break;
}
-
+
if (re->test_break(re->tbh)) BKE_texture_envmap_free_data(env);
else {
if (envre->r.mode & R_OSA) env->ok = ENV_OSA;
else env->ok = ENV_NORMAL;
env->lastframe = re->scene->r.cfra;
}
-
+
/* restore */
envmap_free_render_copy(envre);
env_set_imats(re);
@@ -543,16 +543,16 @@ void make_envmaps(Render *re)
Tex *tex;
bool do_init = false;
int depth = 0, trace;
-
+
if (!(re->r.mode & R_ENVMAP)) return;
-
+
/* we don't raytrace, disabling the flag will cause ray_transp render solid */
trace = (re->r.mode & R_RAYTRACE);
re->r.mode &= ~R_RAYTRACE;
re->i.infostr = IFACE_("Creating Environment maps");
re->stats_draw(re->sdh, &re->i);
-
+
/* 5 = hardcoded max recursion level */
while (depth < 5) {
tex = re->main->tex.first;
@@ -560,27 +560,27 @@ void make_envmaps(Render *re)
if (tex->id.us && tex->type == TEX_ENVMAP) {
if (tex->env && tex->env->object) {
EnvMap *env = tex->env;
-
+
if (env->object->lay & re->lay) {
if (env->stype == ENV_LOAD) {
float orthmat[4][4], mat[4][4], tmat[4][4];
-
+
/* precalc orthmat for object */
copy_m4_m4(orthmat, env->object->obmat);
normalize_m4(orthmat);
-
+
/* need imat later for texture imat */
mul_m4_m4m4(mat, re->viewmat, orthmat);
invert_m4_m4(tmat, mat);
copy_m3_m4(env->obimat, tmat);
}
else {
-
+
/* decide if to render an envmap (again) */
if (env->depth >= depth) {
-
+
/* set 'recalc' to make sure it does an entire loop of recalcs */
-
+
if (env->ok) {
/* free when OSA, and old one isn't OSA */
if ((re->r.mode & R_OSA) && env->ok == ENV_NORMAL)
@@ -592,13 +592,13 @@ void make_envmaps(Render *re)
else if (env->recalc)
BKE_texture_envmap_free_data(env);
}
-
+
if (env->ok == 0 && depth == 0) env->recalc = 1;
-
+
if (env->ok == 0) {
do_init = true;
render_envmap(re, env);
-
+
if (depth == env->depth) env->recalc = 0;
}
}
@@ -627,10 +627,10 @@ static int envcube_isect(EnvMap *env, const float vec[3], float answ[2])
{
float lambda;
int face;
-
+
if (env->type == ENV_PLANE) {
face = 1;
-
+
lambda = 1.0f / vec[2];
answ[0] = env->viewscale * lambda * vec[0];
answ[1] = -env->viewscale * lambda * vec[1];
@@ -674,7 +674,7 @@ static int envcube_isect(EnvMap *env, const float vec[3], float answ[2])
answ[1] = lambda * vec[2];
}
}
-
+
answ[0] = 0.5f + 0.5f * answ[0];
answ[1] = 0.5f + 0.5f * answ[1];
return face;
@@ -714,13 +714,13 @@ int envmaptex(Tex *tex, const float texvec[3], float dxt[3], float dyt[3], int o
ImBuf *ibuf;
float fac, vec[3], sco[3], dxts[3], dyts[3];
int face, face1;
-
+
env = tex->env;
if (env == NULL || (env->stype != ENV_LOAD && env->object == NULL)) {
texres->tin = 0.0;
return 0;
}
-
+
if (env->stype == ENV_LOAD) {
env->ima = tex->ima;
if (env->ima && env->ima->ok) {
@@ -743,7 +743,7 @@ int envmaptex(Tex *tex, const float texvec[3], float dxt[3], float dyt[3], int o
texres->tin = 0.0;
return 0;
}
-
+
/* rotate to envmap space, if object is set */
copy_v3_v3(vec, texvec);
if (env->object) {
@@ -763,46 +763,46 @@ int envmaptex(Tex *tex, const float texvec[3], float dxt[3], float dyt[3], int o
}
}
}
-
+
face = envcube_isect(env, vec, sco);
ibuf = env->cube[face];
-
+
if (osatex) {
set_dxtdyt(dxts, dyts, dxt, dyt, face);
imagewraposa(tex, NULL, ibuf, sco, dxts, dyts, texres, pool, skip_load_image);
-
+
/* edges? */
-
+
if (texres->ta < 1.0f) {
TexResult texr1, texr2;
-
+
texr1.nor = texr2.nor = NULL;
texr1.talpha = texr2.talpha = texres->talpha; /* boxclip expects this initialized */
add_v3_v3(vec, dxt);
face1 = envcube_isect(env, vec, sco);
sub_v3_v3(vec, dxt);
-
+
if (face != face1) {
ibuf = env->cube[face1];
set_dxtdyt(dxts, dyts, dxt, dyt, face1);
imagewraposa(tex, NULL, ibuf, sco, dxts, dyts, &texr1, pool, skip_load_image);
}
else texr1.tr = texr1.tg = texr1.tb = texr1.ta = 0.0;
-
+
/* here was the nasty bug! results were not zero-ed. FPE! */
-
+
add_v3_v3(vec, dyt);
face1 = envcube_isect(env, vec, sco);
sub_v3_v3(vec, dyt);
-
+
if (face != face1) {
ibuf = env->cube[face1];
set_dxtdyt(dxts, dyts, dxt, dyt, face1);
imagewraposa(tex, NULL, ibuf, sco, dxts, dyts, &texr2, pool, skip_load_image);
}
else texr2.tr = texr2.tg = texr2.tb = texr2.ta = 0.0;
-
+
fac = (texres->ta + texr1.ta + texr2.ta);
if (fac != 0.0f) {
fac = 1.0f / fac;
@@ -817,6 +817,6 @@ int envmaptex(Tex *tex, const float texvec[3], float dxt[3], float dyt[3], int o
else {
imagewrap(tex, NULL, ibuf, sco, texres, pool, skip_load_image);
}
-
+
return 1;
}
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index fdf914102b0..b99ab611458 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -114,11 +114,11 @@ void RE_engines_exit(void)
RenderEngineType *RE_engines_find(const char *idname)
{
RenderEngineType *type;
-
+
type = BLI_findstring(&R_engines, idname, offsetof(RenderEngineType, idname));
if (!type)
type = &internal_render_type;
-
+
return type;
}
@@ -315,7 +315,7 @@ int RE_engine_test_break(RenderEngine *engine)
if (re)
return re->test_break(re->tbh);
-
+
return 0;
}
@@ -769,7 +769,7 @@ int RE_engine_render(Render *re, int do_all)
if (BKE_reports_contain(re->reports, RPT_ERROR))
G.is_break = true;
-
+
#ifdef WITH_FREESTYLE
if (re->r.mode & R_EDGE_FRS)
RE_RenderFreestyleExternal(re);
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index 1a7d9aeddf2..1f1e900ba04 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -32,7 +32,7 @@
#include <fcntl.h>
#include <math.h>
#include <float.h>
-#ifndef WIN32
+#ifndef WIN32
#include <unistd.h>
#else
#include <io.h>
@@ -72,7 +72,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
static void ibuf_get_color(float col[4], struct ImBuf *ibuf, int x, int y)
{
int ofs = y * ibuf->x + x;
-
+
if (ibuf->rect_float) {
if (ibuf->channels==4) {
const float *fp= ibuf->rect_float + 4*ofs;
@@ -110,15 +110,15 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
int xi, yi; /* original values */
texres->tin= texres->ta= texres->tr= texres->tg= texres->tb= 0.0f;
-
+
/* we need to set retval OK, otherwise texture code generates normals itself... */
retval= texres->nor ? 3 : 1;
-
+
/* quick tests */
if (ibuf==NULL && ima==NULL)
return retval;
if (ima) {
-
+
/* hack for icon render */
if (skip_load_image && !BKE_image_has_loaded_ibuf(ima))
return retval;
@@ -132,7 +132,7 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
BKE_image_pool_release_ibuf(ima, ibuf, pool);
return retval;
}
-
+
/* setup mapping */
if (tex->imaflag & TEX_IMAROT) {
fy= texvec[0];
@@ -142,10 +142,10 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
fx= texvec[0];
fy= texvec[1];
}
-
+
if (tex->extend == TEX_CHECKER) {
int xs, ys;
-
+
xs= (int)floor(fx);
ys= (int)floor(fy);
fx-= xs;
@@ -210,7 +210,7 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
if (y<0) y+= ibuf->y;
}
}
-
+
/* warning, no return before setting back! */
if ( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
ibuf->rect+= (ibuf->x*ibuf->y);
@@ -242,7 +242,7 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
else { /* no filtering */
ibuf_get_color(&texres->tr, ibuf, x, y);
}
-
+
if ( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
ibuf->rect-= (ibuf->x*ibuf->y);
}
@@ -297,7 +297,7 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
else {
texres->ta = texres->tin = 1.0;
}
-
+
if (tex->flag & TEX_NEGALPHA) {
texres->ta = 1.0f - texres->ta;
}
@@ -315,7 +315,7 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
BKE_image_pool_release_ibuf(ima, ibuf, pool);
BRICONTRGB;
-
+
return retval;
}
@@ -341,9 +341,9 @@ static void clipx_rctf_swap(rctf *stack, short *count, float x1, float x2)
newrct->xmin = rf->xmin+(x2-x1);
newrct->ymin = rf->ymin;
newrct->ymax = rf->ymax;
-
+
if (newrct->xmin ==newrct->xmax) (*count)--;
-
+
rf->xmin = x1;
}
}
@@ -503,7 +503,7 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
else {
div= texres->tr= texres->tg= texres->tb= texres->ta= 0.0;
for (y=starty; y<=endy; y++) {
-
+
muly= 1.0;
if (starty==endy) {
@@ -513,10 +513,10 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
if (y==starty) muly= 1.0f-(rf->ymin - y);
if (y==endy) muly= (rf->ymax - y);
}
-
+
if (startx==endx) {
mulx= muly;
-
+
ibuf_get_color(col, ibuf, startx, y);
texres->ta+= mulx*col[3];
@@ -532,7 +532,7 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
if (x==endx) mulx*= (rf->xmax - x);
ibuf_get_color(col, ibuf, x, y);
-
+
if (mulx==1.0f) {
texres->ta+= col[3];
texres->tr+= col[0];
@@ -587,7 +587,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
rf->ymax = maxy*(ibuf->y);
texr.talpha= texres->talpha; /* is read by boxsample_clip */
-
+
if (imapextend) {
CLAMP(rf->xmin, 0.0f, ibuf->x-1);
CLAMP(rf->xmax, 0.0f, ibuf->x-1);
@@ -622,7 +622,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
tot= texres->tr= texres->tb= texres->tg= texres->ta= 0.0;
while (count--) {
boxsampleclip(ibuf, rf, &texr);
-
+
opp= square_rctf(rf);
tot+= opp;
@@ -643,7 +643,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
boxsampleclip(ibuf, rf, texres);
if (texres->talpha==0) texres->ta= 1.0;
-
+
if (alphaclip!=1.0f) {
/* premul it all */
texres->tr*= alphaclip;
@@ -651,7 +651,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
texres->tb*= alphaclip;
texres->ta*= alphaclip;
}
-}
+}
/*-----------------------------------------------------------------------------------------------------------------
* from here, some functions only used for the new filtering */
@@ -888,7 +888,7 @@ static void image_mipmap_test(Tex *tex, ImBuf *ibuf)
{
if (tex->imaflag & TEX_MIPMAP) {
if ((ibuf->flags & IB_fields) == 0) {
-
+
if (ibuf->mipmap[0] && (ibuf->userflags & IB_MIPMAP_INVALID)) {
BLI_thread_lock(LOCK_IMAGE);
if (ibuf->userflags & IB_MIPMAP_INVALID) {
@@ -899,7 +899,7 @@ static void image_mipmap_test(Tex *tex, ImBuf *ibuf)
}
if (ibuf->mipmap[0] == NULL) {
BLI_thread_lock(LOCK_IMAGE);
- if (ibuf->mipmap[0] == NULL)
+ if (ibuf->mipmap[0] == NULL)
IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
BLI_thread_unlock(LOCK_IMAGE);
}
@@ -909,7 +909,7 @@ static void image_mipmap_test(Tex *tex, ImBuf *ibuf)
}
}
}
-
+
}
static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], float dxt[2], float dyt[2], TexResult *texres, struct ImagePool *pool, const bool skip_load_image)
@@ -960,7 +960,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float tex
/* mipmap test */
image_mipmap_test(tex, ibuf);
-
+
if (ima) {
if ((tex->imaflag & TEX_USEALPHA) && (ima->flag & IMA_IGNORE_ALPHA) == 0) {
if ((tex->imaflag & TEX_CALCALPHA) == 0) {
@@ -1310,7 +1310,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float tex
else
texres->tin = texres->ta;
if (tex->flag & TEX_NEGALPHA) texres->ta = 1.f - texres->ta;
-
+
if ((R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields))
ibuf->rect -= ibuf->x*ibuf->y;
@@ -1344,7 +1344,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float tex
BKE_image_pool_release_ibuf(ima, ibuf, pool);
BRICONTRGB;
-
+
return retval;
}
@@ -1366,10 +1366,10 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
return imagewraposa_aniso(tex, ima, ibuf, texvec, dxt, dyt, texres, pool, skip_load_image);
texres->tin= texres->ta= texres->tr= texres->tg= texres->tb= 0.0f;
-
+
/* we need to set retval OK, otherwise texture code generates normals itself... */
retval = texres->nor ? 3 : 1;
-
+
/* quick tests */
if (ibuf==NULL && ima==NULL)
return retval;
@@ -1378,7 +1378,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
/* hack for icon render */
if (skip_load_image && !BKE_image_has_loaded_ibuf(ima))
return retval;
-
+
ibuf = BKE_image_pool_acquire_ibuf(ima, &tex->iuser, pool);
ima->flag|= IMA_USED_FOR_RENDER;
@@ -1388,7 +1388,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
BKE_image_pool_release_ibuf(ima, ibuf, pool);
return retval;
}
-
+
/* mipmap test */
image_mipmap_test(tex, ibuf);
@@ -1399,9 +1399,9 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
}
}
}
-
+
texr.talpha= texres->talpha;
-
+
if (tex->imaflag & TEX_IMAROT) {
fy= texvec[0];
fx= texvec[1];
@@ -1410,7 +1410,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
fx= texvec[0];
fy= texvec[1];
}
-
+
if (ibuf->flags & IB_fields) {
if (R.r.mode & R_FIELDS) { /* field render */
if (R.flag & R_SEC_FIELD) { /* correction for 2nd field */
@@ -1422,7 +1422,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
}
}
}
-
+
/* pixel coordinates */
minx = min_fff(dxt[0], dyt[0], dxt[0] + dyt[0]);
@@ -1433,7 +1433,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
/* tex_sharper has been removed */
minx= (maxx-minx)/2.0f;
miny= (maxy-miny)/2.0f;
-
+
if (tex->imaflag & TEX_FILTER_MIN) {
/* make sure the filtersize is minimal in pixels (normal, ref map can have miniature pixel dx/dy) */
float addval= (0.5f * tex->filtersize) / (float) MIN2(ibuf->x, ibuf->y);
@@ -1446,7 +1446,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
else if (tex->filtersize!=1.0f) {
minx*= tex->filtersize;
miny*= tex->filtersize;
-
+
dxt[0]*= tex->filtersize;
dxt[1]*= tex->filtersize;
dyt[0]*= tex->filtersize;
@@ -1454,13 +1454,13 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
}
if (tex->imaflag & TEX_IMAROT) SWAP(float, minx, miny);
-
+
if (minx>0.25f) minx= 0.25f;
else if (minx<0.00001f) minx= 0.00001f; /* side faces of unit-cube */
if (miny>0.25f) miny= 0.25f;
else if (miny<0.00001f) miny= 0.00001f;
-
+
/* repeat and clip */
imaprepeat= (tex->extend==TEX_REPEAT);
imapextend= (tex->extend==TEX_EXTEND);
@@ -1474,10 +1474,10 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
if (tex->extend == TEX_CHECKER) {
int xs, ys, xs1, ys1, xs2, ys2, boundary;
-
+
xs= (int)floor(fx);
ys= (int)floor(fy);
-
+
/* both checkers available, no boundary exceptions, checkerdist will eat aliasing */
if ( (tex->flag & TEX_CHECKER_ODD) && (tex->flag & TEX_CHECKER_EVEN) ) {
fx-= xs;
@@ -1491,7 +1491,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
return retval;
}
else {
-
+
xs1= (int)floor(fx-minx);
ys1= (int)floor(fy-miny);
xs2= (int)floor(fx+minx);
@@ -1523,14 +1523,14 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
if (tex->flag & TEX_CHECKER_ODD) {
if ((xs1+ys) & 1) fx-= xs2;
else fx-= xs1;
-
+
if ((ys1+xs) & 1) fy-= ys2;
else fy-= ys1;
}
if (tex->flag & TEX_CHECKER_EVEN) {
if ((xs1+ys) & 1) fx-= xs1;
else fx-= xs2;
-
+
if ((ys1+xs) & 1) fy-= ys1;
else fy-= ys2;
}
@@ -1569,7 +1569,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
if (fx>1.0f) fx -= (int)(fx);
else if (fx<0.0f) fx+= 1-(int)(fx);
}
-
+
if (imapextend) {
if (fy>1.0f) fy = 1.0f;
else if (fy<0.0f) fy= 0.0f;
@@ -1589,18 +1589,18 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
if (tex->imaflag & TEX_MIPMAP) {
ImBuf *previbuf, *curibuf;
float bumpscale;
-
+
dx = minx;
dy = miny;
maxd = max_ff(dx, dy);
if (maxd > 0.5f) maxd = 0.5f;
pixsize = 1.0f / (float) MIN2(ibuf->x, ibuf->y);
-
+
bumpscale= pixsize/maxd;
if (bumpscale>1.0f) bumpscale= 1.0f;
else bumpscale*=bumpscale;
-
+
curmap= 0;
previbuf= curibuf= ibuf;
while (curmap < IMB_MIPMAP_LEVELS && ibuf->mipmap[curmap]) {
@@ -1616,12 +1616,12 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
if (minx < 0.5f / ibuf->x) minx = 0.5f / ibuf->x;
if (miny < 0.5f / ibuf->y) miny = 0.5f / ibuf->y;
}
-
+
if (texres->nor && (tex->imaflag & TEX_NORMALMAP)==0) {
/* a bit extra filter */
//minx*= 1.35f;
//miny*= 1.35f;
-
+
boxsample(curibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
val1= texres->tr+texres->tg+texres->tb;
boxsample(curibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend);
@@ -1632,11 +1632,11 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
/* don't switch x or y! */
texres->nor[0]= (val1-val2);
texres->nor[1]= (val1-val3);
-
+
if (previbuf!=curibuf) { /* interpolate */
-
+
boxsample(previbuf, fx-minx, fy-miny, fx+minx, fy+miny, &texr, imaprepeat, imapextend);
-
+
/* calc rgb */
dx= 2.0f*(pixsize-maxd)/pixsize;
if (dx>=1.0f) {
@@ -1650,16 +1650,16 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
texres->tr= dy*texres->tr+ dx*texr.tr;
texres->ta= dy*texres->ta+ dx*texr.ta;
}
-
+
val1= dy*val1+ dx*(texr.tr + texr.tg + texr.tb);
boxsample(previbuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend);
val2= dy*val2+ dx*(texr.tr + texr.tg + texr.tb);
boxsample(previbuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend);
val3= dy*val3+ dx*(texr.tr + texr.tg + texr.tb);
-
+
texres->nor[0]= (val1-val2); /* vals have been interpolated above! */
texres->nor[1]= (val1-val3);
-
+
if (dx<1.0f) {
dy= 1.0f-dx;
texres->tb= dy*texres->tb+ dx*texr.tb;
@@ -1681,9 +1681,9 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
if (previbuf!=curibuf) { /* interpolate */
boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend);
-
+
fx= 2.0f*(pixsize-maxd)/pixsize;
-
+
if (fx>=1.0f) {
texres->ta= texr.ta; texres->tb= texr.tb;
texres->tg= texr.tg; texres->tr= texr.tr;
@@ -1721,7 +1721,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
else
boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
}
-
+
if (tex->imaflag & TEX_CALCALPHA) {
texres->ta = texres->tin = texres->ta * max_fff(texres->tr, texres->tg, texres->tb);
}
@@ -1730,7 +1730,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
}
if (tex->flag & TEX_NEGALPHA) texres->ta= 1.0f-texres->ta;
-
+
if ( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
ibuf->rect-= (ibuf->x*ibuf->y);
}
@@ -1758,7 +1758,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const
BKE_image_pool_release_ibuf(ima, ibuf, pool);
BRICONTRGB;
-
+
return retval;
}
@@ -1766,19 +1766,19 @@ void image_sample(Image *ima, float fx, float fy, float dx, float dy, float resu
{
TexResult texres;
ImBuf *ibuf = BKE_image_pool_acquire_ibuf(ima, NULL, pool);
-
+
if (UNLIKELY(ibuf == NULL)) {
zero_v4(result);
return;
}
-
+
if ( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) )
ibuf->rect+= (ibuf->x*ibuf->y);
texres.talpha = true; /* boxsample expects to be initialized */
boxsample(ibuf, fx, fy, fx + dx, fy + dy, &texres, 0, 1);
copy_v4_v4(result, &texres.tr);
-
+
if ( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) )
ibuf->rect-= (ibuf->x*ibuf->y);
@@ -1796,11 +1796,11 @@ void ibuf_sample(ImBuf *ibuf, float fx, float fy, float dx, float dy, float resu
AFD.dyt[0] = dy; AFD.dyt[1] = dy;
//copy_v2_v2(AFD.dxt, dx);
//copy_v2_v2(AFD.dyt, dy);
-
+
AFD.intpol = 1;
AFD.extflag = TXC_EXTD;
ewa_eval(&texres, ibuf, fx, fy, &AFD);
-
+
copy_v4_v4(result, &texres.tr);
}
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index ce3331e9a92..34e47a00c7a 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -64,18 +64,18 @@ static void init_render_jit(Render *re)
static float mblur_jit[32][2]; /* simple caching */
static int lastjit = 0;
static int last_mblur_jit = 0;
-
+
if (lastjit != re->r.osa || last_mblur_jit != re->r.mblur_samples) {
memset(jit, 0, sizeof(jit));
BLI_jitter_init(jit, re->r.osa);
-
+
memset(mblur_jit, 0, sizeof(mblur_jit));
BLI_jitter_init(mblur_jit, re->r.mblur_samples);
}
-
+
lastjit = re->r.osa;
memcpy(re->jit, jit, sizeof(jit));
-
+
last_mblur_jit = re->r.mblur_samples;
memcpy(re->mblur_jit, mblur_jit, sizeof(mblur_jit));
}
@@ -95,9 +95,9 @@ static float filt_quadratic(float x)
static float filt_cubic(float x)
{
float x2 = x * x;
-
+
if (x < 0.0f) x = -x;
-
+
if (x < 1.0f) return 0.5f * x * x2 - x2 + 2.0f / 3.0f;
if (x < 2.0f) return (2.0f - x) * (2.0f - x) * (2.0f - x) / 6.0f;
return 0.0f;
@@ -107,7 +107,7 @@ static float filt_cubic(float x)
static float filt_catrom(float x)
{
float x2 = x * x;
-
+
if (x < 0.0f) x = -x;
if (x < 1.0f) return 1.5f * x2 * x - 2.5f * x2 + 1.0f;
if (x < 2.0f) return -0.5f * x2 * x + 2.5f * x2 - 4.0f * x + 2.0f;
@@ -137,34 +137,34 @@ static float filt_mitchell(float x) /* Mitchell & Netravali's two-param cubic */
float RE_filter_value(int type, float x)
{
float gaussfac = 1.6f;
-
+
x = ABS(x);
-
+
switch (type) {
case R_FILTER_BOX:
if (x > 1.0f) return 0.0f;
return 1.0f;
-
+
case R_FILTER_TENT:
if (x > 1.0f) return 0.0f;
return 1.0f - x;
-
+
case R_FILTER_GAUSS:
{
const float two_gaussfac2 = 2.0f * gaussfac * gaussfac;
x *= 3.0f * gaussfac;
return 1.0f / sqrtf((float)M_PI * two_gaussfac2) * expf(-x*x / two_gaussfac2);
}
-
+
case R_FILTER_MITCH:
return filt_mitchell(x * gaussfac);
-
+
case R_FILTER_QUAD:
return filt_quadratic(x * gaussfac);
-
+
case R_FILTER_CUBIC:
return filt_cubic(x * gaussfac);
-
+
case R_FILTER_CATROM:
return filt_catrom(x * gaussfac);
}
@@ -188,35 +188,35 @@ static float calc_weight(Render *re, float *weight, int i, int j)
case R_FILTER_BOX:
if (i == 0 && j == 0) weight[a] = 1.0;
break;
-
+
case R_FILTER_TENT:
if (dist < re->r.gauss)
weight[a] = re->r.gauss - dist;
break;
-
+
case R_FILTER_GAUSS:
x = dist * re->r.gauss;
weight[a] = (1.0f / expf(x * x) - 1.0f / expf(re->r.gauss * re->r.gauss * 2.25f));
break;
-
+
case R_FILTER_MITCH:
weight[a] = filt_mitchell(dist * re->r.gauss);
break;
-
+
case R_FILTER_QUAD:
weight[a] = filt_quadratic(dist * re->r.gauss);
break;
-
+
case R_FILTER_CUBIC:
weight[a] = filt_cubic(dist * re->r.gauss);
break;
-
+
case R_FILTER_CATROM:
weight[a] = filt_catrom(dist * re->r.gauss);
break;
-
+
}
-
+
totw += weight[a];
}
@@ -226,13 +226,13 @@ static float calc_weight(Render *re, float *weight, int i, int j)
void free_sample_tables(Render *re)
{
int a;
-
+
if (re->samples) {
for (a = 0; a < 9; a++) {
MEM_freeN(re->samples->fmask1[a]);
MEM_freeN(re->samples->fmask2[a]);
}
-
+
MEM_freeN(re->samples->centmask);
MEM_freeN(re->samples);
re->samples = NULL;
@@ -252,19 +252,19 @@ void make_sample_tables(Render *re)
if (firsttime) {
firsttime = 0;
}
-
+
free_sample_tables(re);
-
+
init_render_jit(re); /* needed for mblur too */
-
+
if (re->osa == 0) {
/* just prevents cpu cycles for larger render and copying */
re->r.filtertype = 0;
return;
}
-
+
st = re->samples = MEM_callocN(sizeof(SampleTables), "sample tables");
-
+
for (a = 0; a < 9; a++) {
st->fmask1[a] = MEM_callocN(256 * sizeof(float), "initfilt");
st->fmask2[a] = MEM_callocN(256 * sizeof(float), "initfilt");
@@ -280,10 +280,10 @@ void make_sample_tables(Render *re)
if (a & 64) st->cmask[a]++;
if (a & 128) st->cmask[a]++;
}
-
+
centmasksize = (1 << re->osa);
st->centmask = MEM_mallocN(centmasksize, "Initfilt3");
-
+
for (a = 0; a < 16; a++) {
st->centLut[a] = -0.45f + ((float)a) / 16.0f;
}
@@ -457,7 +457,7 @@ void RE_SetEnvmapCamera(Render *re, Object *cam_ob, float viewscale, float clips
params.sensor_fit = CAMERA_SENSOR_FIT_AUTO;
params.clipsta = clipsta;
params.clipend = clipend;
-
+
/* compute matrix, viewplane, .. */
BKE_camera_params_compute_viewplane(&params, re->winx, re->winy, 1.0f, 1.0f);
BKE_camera_params_compute_matrix(&params);
@@ -523,7 +523,7 @@ void RE_GetCameraModelMatrix(Render *re, struct Object *camera, float r_mat[4][4
void RE_parts_free(Render *re)
{
RenderPart *part = re->parts.first;
-
+
while (part) {
if (part->rectp) MEM_freeN(part->rectp);
if (part->rectz) MEM_freeN(part->rectz);
@@ -543,20 +543,20 @@ void RE_parts_init(Render *re, bool do_crop)
{
int nr, xd, yd, partx, party, xparts, yparts;
int xminb, xmaxb, yminb, ymaxb;
-
+
RE_parts_free(re);
-
+
/* this is render info for caller, is not reset when parts are freed! */
re->i.totpart = 0;
re->i.curpart = 0;
re->i.partsdone = 0;
-
+
/* just for readable code.. */
xminb = re->disprect.xmin;
yminb = re->disprect.ymin;
xmaxb = re->disprect.xmax;
ymaxb = re->disprect.ymax;
-
+
RE_parts_clamp(re);
partx = re->partx;
@@ -564,21 +564,21 @@ void RE_parts_init(Render *re, bool do_crop)
/* part count */
xparts = (re->rectx + partx - 1) / partx;
yparts = (re->recty + party - 1) / party;
-
+
/* calculate rotation factor of 1 pixel */
if (re->r.mode & R_PANORAMA)
re->panophi = panorama_pixel_rot(re);
-
+
for (nr = 0; nr < xparts * yparts; nr++) {
rcti disprect;
int rectx, recty;
-
+
xd = (nr % xparts);
yd = (nr - xd) / xparts;
-
+
disprect.xmin = xminb + xd * partx;
disprect.ymin = yminb + yd * party;
-
+
/* ensure we cover the entire picture, so last parts go to end */
if (xd < xparts - 1) {
disprect.xmax = disprect.xmin + partx;
@@ -586,21 +586,21 @@ void RE_parts_init(Render *re, bool do_crop)
disprect.xmax = xmaxb;
}
else disprect.xmax = xmaxb;
-
+
if (yd < yparts - 1) {
disprect.ymax = disprect.ymin + party;
if (disprect.ymax > ymaxb)
disprect.ymax = ymaxb;
}
else disprect.ymax = ymaxb;
-
+
rectx = BLI_rcti_size_x(&disprect);
recty = BLI_rcti_size_y(&disprect);
-
+
/* so, now can we add this part? */
if (rectx > 0 && recty > 0) {
RenderPart *pa = MEM_callocN(sizeof(RenderPart), "new part");
-
+
/* Non-box filters need 2 pixels extra to work */
if (do_crop && (re->r.filtertype || (re->r.mode & R_EDGE))) {
pa->crop = 2;
diff --git a/source/blender/render/intern/source/multires_bake.c b/source/blender/render/intern/source/multires_bake.c
index d85cc87dfe3..6f66f6d3520 100644
--- a/source/blender/render/intern/source/multires_bake.c
+++ b/source/blender/render/intern/source/multires_bake.c
@@ -1283,7 +1283,7 @@ static void finish_images(MultiresBakeRender *bkr, MultiresBakeResult *result)
}
BKE_image_release_ibuf(ima, ibuf, NULL);
- DAG_id_tag_update(&ima->id, 0);
+ DAG_id_tag_update(&ima->id, 0);
}
}
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index 42200a8278c..8aa90a390b3 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -99,7 +99,7 @@ typedef struct OcclusionTree {
OccFace *face; /* instance and face indices */
float *occlusion; /* occlusion for faces */
float (*rad)[3]; /* radiance for faces */
-
+
OccNode *root;
OccNode **stack[BLENDER_MAX_THREADS];
@@ -144,7 +144,7 @@ static void occ_shade(ShadeSample *ssamp, ObjectInstanceRen *obi, VlakRen *vlr,
ShadeInput *shi = ssamp->shi;
ShadeResult *shr = ssamp->shr;
float l, u, v, *v1, *v2, *v3;
-
+
/* init */
if (vlr->v4) {
shi->u = u = 0.5f;
@@ -159,10 +159,10 @@ static void occ_shade(ShadeSample *ssamp, ObjectInstanceRen *obi, VlakRen *vlr,
v1 = vlr->v1->co;
v2 = vlr->v2->co;
v3 = vlr->v3->co;
-
+
/* renderco */
l = 1.0f - u - v;
-
+
shi->co[0] = l * v3[0] + u * v1[0] + v * v2[0];
shi->co[1] = l * v3[1] + u * v1[1] + v * v2[1];
shi->co[2] = l * v3[2] + u * v1[2] + v * v2[2];
@@ -172,13 +172,13 @@ static void occ_shade(ShadeSample *ssamp, ObjectInstanceRen *obi, VlakRen *vlr,
/* set up view vector */
copy_v3_v3(shi->view, shi->co);
normalize_v3(shi->view);
-
+
/* cache for shadow */
shi->samplenr++;
shi->xs = 0; /* TODO */
shi->ys = 0;
-
+
shade_input_set_normals(shi);
/* no normal flip */
@@ -324,7 +324,7 @@ static void occ_face(const OccFace *face, float co[3], float normal[3], float *a
obi = &R.objectinstance[face->obi];
vlr = RE_findOrAddVlak(obi->obr, face->facenr);
-
+
if (co) {
if (vlr->v4)
mid_v3_v3v3(co, vlr->v1->co, vlr->v3->co);
@@ -334,7 +334,7 @@ static void occ_face(const OccFace *face, float co[3], float normal[3], float *a
if (obi->flag & R_TRANSFORMED)
mul_m4_v3(obi->mat, co);
}
-
+
if (normal) {
normal[0] = -vlr->n[0];
normal[1] = -vlr->n[1];
@@ -397,7 +397,7 @@ static void occ_sum_occlusion(OcclusionTree *tree, OccNode *node)
occ /= totarea;
if (indirect) mul_v3_fl(rad, 1.0f / totarea);
}
-
+
node->occlusion = occ;
if (indirect) copy_v3_v3(node->rad, rad);
}
@@ -668,7 +668,7 @@ static OcclusionTree *occ_tree_build(Render *re)
if (totface == 0)
return NULL;
-
+
tree = MEM_callocN(sizeof(OcclusionTree), "OcclusionTree");
tree->totface = totface;
@@ -704,7 +704,7 @@ static OcclusionTree *occ_tree_build(Render *re)
tree->face[b].obi = c;
tree->face[b].facenr = a;
tree->occlusion[b] = 1.0f;
- occ_face(&tree->face[b], tree->co[b], NULL, NULL);
+ occ_face(&tree->face[b], tree->co[b], NULL, NULL);
b++;
}
}
@@ -726,7 +726,7 @@ static OcclusionTree *occ_tree_build(Render *re)
if (!(re->test_break(re->tbh)))
occ_sum_occlusion(tree, tree->root);
}
-
+
MEM_freeN(tree->co);
tree->co = NULL;
@@ -773,7 +773,7 @@ static float occ_solid_angle(OccNode *node, const float v[3], float d2, float in
CLAMP(dotemit, 0.0f, 1.0f);
CLAMP(dotreceive, 0.0f, 1.0f);
-
+
return ((node->area * dotemit * dotreceive) / (d2 + node->area * INVPI)) * INVPI;
}
@@ -827,7 +827,7 @@ static void occ_lookup(OcclusionTree *tree, int thread, OccFace *exclude,
if (bentn)
copy_v3_v3(bentn, n);
-
+
error = tree->error;
distfac = tree->distfac;
@@ -883,7 +883,7 @@ static void occ_lookup(OcclusionTree *tree, int thread, OccFace *exclude,
/* accumulate occlusion with face form factor */
if (!exclude || !(face->obi == exclude->obi && face->facenr == exclude->facenr)) {
if (bentn || distfac != 0.0f) {
- occ_face(face, co, NULL, NULL);
+ occ_face(face, co, NULL, NULL);
sub_v3_v3v3(v, co, p);
d2 = dot_v3v3(v, v) + 1e-16f;
@@ -977,7 +977,7 @@ static void occ_compute_passes(Render *re, OcclusionTree *tree, int totpass)
{
float *occ, co[3], n[3];
int pass, i;
-
+
occ = MEM_callocN(sizeof(float) * tree->totface, "OcclusionPassOcc");
for (pass = 0; pass < totpass; pass++) {
@@ -1095,7 +1095,7 @@ static int sample_occ_cache(OcclusionTree *tree, float *co, float *n, int x, int
if (!tree->cache)
return 0;
-
+
/* first try to find a sample in the same pixel */
cache = &tree->cache[thread];
@@ -1278,9 +1278,9 @@ void make_occ_tree(Render *re)
re->i.infostr = IFACE_("Occlusion preprocessing");
re->stats_draw(re->sdh, &re->i);
-
+
re->occlusiontree = tree = occ_tree_build(re);
-
+
if (tree && !re->test_break(re->tbh)) {
if (re->wrld.ao_approx_passes > 0)
occ_compute_passes(re, tree, re->wrld.ao_approx_passes);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 9e93a30d212..707f126b202 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -136,7 +136,7 @@
/* here we store all renders */
static struct {
ListBase renderlist;
-} RenderGlobal = {{NULL, NULL}};
+} RenderGlobal = {{NULL, NULL}};
/* hardcopy of current render, used while rendering for speed */
Render R;
@@ -288,7 +288,7 @@ RenderLayer *render_get_active_layer(Render *re, RenderResult *rr)
static int render_scene_needs_vector(Render *re)
{
SceneRenderLayer *srl;
-
+
for (srl = re->r.layers.first; srl; srl = srl->next)
if (!(srl->layflag & SCE_LAY_DISABLE))
if (srl->passflag & SCE_PASS_VECTOR)
@@ -440,10 +440,10 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id)
if (re->result) {
RenderLayer *rl;
RenderView *rv;
-
+
rr->rectx = re->result->rectx;
rr->recty = re->result->recty;
-
+
/* actview view */
rv = RE_RenderViewGetById(re->result, view_id);
rr->have_combined = (rv->rectf != NULL);
@@ -510,7 +510,7 @@ Render *RE_NewRender(const char *name)
/* only one render per name exists */
re = RE_GetRender(name);
if (re == NULL) {
-
+
/* new render data struct */
re = MEM_callocN(sizeof(Render), "new render");
BLI_addtail(&RenderGlobal.renderlist, re);
@@ -519,12 +519,12 @@ Render *RE_NewRender(const char *name)
BLI_rw_mutex_init(&re->partsmutex);
re->eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER);
}
-
+
RE_InitRenderCB(re);
/* init some variables */
re->ycor = 1.0f;
-
+
return re;
}
@@ -594,13 +594,13 @@ void RE_FreeRender(Render *re)
/* main dbase can already be invalid now, some database-free code checks it */
re->main = NULL;
re->scene = NULL;
-
+
RE_Database_Free(re); /* view render can still have full database */
free_sample_tables(re);
-
+
render_result_free(re->result);
render_result_free(re->pushedresult);
-
+
BLI_remlink(&RenderGlobal.renderlist, re);
MEM_freeN(re->eval_ctx);
MEM_freeN(re);
@@ -750,7 +750,7 @@ void RE_InitState(Render *re, Render *source, RenderData *rd,
bool had_freestyle = (re->r.mode & R_EDGE_FRS) != 0;
re->ok = true; /* maybe flag */
-
+
re->i.starttime = PIL_check_seconds_timer();
/* copy render data and render layers for thread safety */
@@ -785,7 +785,7 @@ void RE_InitState(Render *re, Render *source, RenderData *rd,
}
re->r.scemode = check_mode_full_sample(&re->r);
-
+
/* fullsample wants uniform osa levels */
if (source && (re->r.scemode & R_FULL_SAMPLE)) {
/* but, if source has no full sample we disable it */
@@ -802,7 +802,7 @@ void RE_InitState(Render *re, Render *source, RenderData *rd,
}
else re->osa = 0;
}
-
+
if (srl) {
int index = BLI_findindex(&rd->layers, srl);
if (index != -1) {
@@ -810,10 +810,10 @@ void RE_InitState(Render *re, Render *source, RenderData *rd,
re->r.scemode |= R_SINGLE_LAYER;
}
}
-
+
/* always call, checks for gamma, gamma tables and jitter too */
make_sample_tables(re);
-
+
/* if preview render, we try to keep old result */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
@@ -846,7 +846,7 @@ void RE_InitState(Render *re, Render *source, RenderData *rd,
}
}
else {
-
+
/* make empty render result, so display callbacks can initialize */
render_result_free(re->result);
re->result = MEM_callocN(sizeof(RenderResult), "new render result");
@@ -854,19 +854,19 @@ void RE_InitState(Render *re, Render *source, RenderData *rd,
re->result->recty = re->recty;
render_result_view_new(re->result, "");
}
-
+
if (re->r.scemode & R_VIEWPORT_PREVIEW)
re->eval_ctx->mode = DAG_EVAL_PREVIEW;
else
re->eval_ctx->mode = DAG_EVAL_RENDER;
-
+
/* ensure renderdatabase can use part settings correct */
RE_parts_clamp(re);
BLI_rw_mutex_unlock(&re->resultmutex);
-
+
re->mblur_offs = re->field_offs = 0.f;
-
+
RE_init_threadcount(re);
}
@@ -979,7 +979,7 @@ void render_update_anim_renderdata(Render *re, RenderData *rd)
void RE_SetWindow(Render *re, const rctf *viewplane, float clipsta, float clipend)
{
/* re->ok flag? */
-
+
re->viewplane = *viewplane;
re->clipsta = clipsta;
re->clipend = clipend;
@@ -988,13 +988,13 @@ void RE_SetWindow(Render *re, const rctf *viewplane, float clipsta, float clipen
perspective_m4(re->winmat,
re->viewplane.xmin, re->viewplane.xmax,
re->viewplane.ymin, re->viewplane.ymax, re->clipsta, re->clipend);
-
+
}
void RE_SetOrtho(Render *re, const rctf *viewplane, float clipsta, float clipend)
{
/* re->ok flag? */
-
+
re->viewplane = *viewplane;
re->clipsta = clipsta;
re->clipend = clipend;
@@ -1015,7 +1015,7 @@ void RE_SetView(Render *re, float mat[4][4])
void RE_GetViewPlane(Render *re, rctf *r_viewplane, rcti *r_disprect)
{
*r_viewplane = re->viewplane;
-
+
/* make disprect zero when no border render, is needed to detect changes in 3d view render */
if (re->r.mode & R_BORDER) {
*r_disprect = re->disprect;
@@ -1082,7 +1082,7 @@ void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
#if 0
void RE_AddObject(Render *UNUSED(re), Object *UNUSED(ob))
{
-
+
}
#endif
@@ -1106,7 +1106,7 @@ static void *do_part_thread(void *pa_v)
/* need to return nicely all parts on esc */
if (R.test_break(R.tbh) == 0) {
-
+
if (!R.sss_points && (R.r.scemode & R_FULL_SAMPLE))
pa->result = render_result_new_full_sample(&R, &pa->fullresult, &pa->disprect, pa->crop, RR_USE_MEM, R.viewname);
else
@@ -1126,11 +1126,11 @@ static void *do_part_thread(void *pa_v)
zbufshadeDA_tile(pa);
else
zbufshade_tile(pa);
-
+
/* we do actually write pixels, but don't allocate/deallocate anything,
* so it is safe with other threads reading at the same time */
BLI_rw_mutex_lock(&R.resultmutex, THREAD_LOCK_READ);
-
+
/* merge too on break! */
if (R.result->do_exr_tile) {
render_result_exr_file_merge(R.result, pa->result, R.viewname);
@@ -1144,12 +1144,12 @@ static void *do_part_thread(void *pa_v)
render_result_merge(R.result, pa->result);
}
}
-
+
BLI_rw_mutex_unlock(&R.resultmutex);
}
-
+
pa->status = PART_STATUS_MERGED;
-
+
return NULL;
}
@@ -1161,21 +1161,21 @@ float panorama_pixel_rot(Render *re)
float psize, phi, xfac;
float borderfac = (float)BLI_rcti_size_x(&re->disprect) / (float)re->winx;
int xparts = (re->rectx + re->partx - 1) / re->partx;
-
+
/* size of 1 pixel mapped to viewplane coords */
psize = BLI_rctf_size_x(&re->viewplane) / (float)re->winx;
/* angle of a pixel */
phi = atan(psize / re->clipsta);
-
+
/* correction factor for viewplane shifting, first calculate how much the viewplane angle is */
xfac = borderfac * BLI_rctf_size_x(&re->viewplane) / (float)xparts;
xfac = atan(0.5f * xfac / re->clipsta);
/* and how much the same viewplane angle is wrapped */
psize = 0.5f * phi * ((float)re->partx);
-
+
/* the ratio applied to final per-pixel angle */
phi *= xfac / psize;
-
+
return phi;
}
@@ -1185,9 +1185,9 @@ static bool find_next_pano_slice(Render *re, int *slice, int *minx, rctf *viewpl
{
RenderPart *pa, *best = NULL;
bool found = false;
-
+
*minx = re->winx;
-
+
if (!(re->r.mode & R_PANORAMA)) {
/* for regular render, just one 'slice' */
found = (*slice == 0);
@@ -1205,7 +1205,7 @@ static bool find_next_pano_slice(Render *re, int *slice, int *minx, rctf *viewpl
}
}
}
-
+
if (best) {
float phi = panorama_pixel_rot(re);
@@ -1217,15 +1217,15 @@ static bool find_next_pano_slice(Render *re, int *slice, int *minx, rctf *viewpl
R.viewplane.xmax = viewplane->xmax + R.panodxv;
RE_SetWindow(re, &R.viewplane, R.clipsta, R.clipend);
copy_m4_m4(R.winmat, re->winmat);
-
+
/* rotate database according to part coordinates */
project_renderdata(re, projectverto, 1, -R.panodxp * phi, 1);
R.panosi = sinf(R.panodxp * phi);
R.panoco = cosf(R.panodxp * phi);
}
-
+
(*slice)++;
-
+
return found;
}
@@ -1251,7 +1251,7 @@ static int sort_and_queue_parts(Render *re, int minx, ThreadQueue *workqueue)
/* long long int's needed because of overflow [#24414] */
long long int centx = re->winx / 2, centy = re->winy / 2, tot = 1;
int totsort = 0;
-
+
/* find center of rendered parts, image center counts for 1 too */
for (pa = re->parts.first; pa; pa = pa->next) {
if (pa->status >= PART_STATUS_RENDERED) {
@@ -1267,7 +1267,7 @@ static int sort_and_queue_parts(Render *re, int minx, ThreadQueue *workqueue)
}
centx /= tot;
centy /= tot;
-
+
if (totsort > 0) {
SortRenderPart *sortlist = MEM_mallocN(sizeof(*sortlist) * totsort, "renderpartsort");
long int i = 0;
@@ -1306,7 +1306,7 @@ static int sort_and_queue_parts(Render *re, int minx, ThreadQueue *workqueue)
static void print_part_stats(Render *re, RenderPart *pa)
{
char str[64];
-
+
BLI_snprintf(str, sizeof(str), IFACE_("%s, Part %d-%d"), re->scene->id.name + 2, pa->nr, re->i.totpart);
re->i.infostr = str;
re->stats_draw(re->sdh, &re->i);
@@ -1316,7 +1316,7 @@ static void print_part_stats(Render *re, RenderPart *pa)
typedef struct RenderThread {
ThreadQueue *workqueue;
ThreadQueue *donequeue;
-
+
int number;
void (*display_update)(void *handle, RenderResult *rr, volatile rcti *rect);
@@ -1327,7 +1327,7 @@ static void *do_render_thread(void *thread_v)
{
RenderThread *thread = thread_v;
RenderPart *pa;
-
+
while ((pa = BLI_thread_queue_pop(thread->workqueue))) {
pa->thread = thread->number;
do_part_thread(pa);
@@ -1337,11 +1337,11 @@ static void *do_render_thread(void *thread_v)
}
BLI_thread_queue_push(thread->donequeue, pa);
-
+
if (R.test_break(R.tbh))
break;
}
-
+
return NULL;
}
@@ -1395,33 +1395,33 @@ static void threaded_tile_processor(Render *re)
rctf viewplane = re->viewplane;
double lastdraw, elapsed, redrawtime = 1.0f;
int totpart = 0, minx = 0, slice = 0, a, wait;
-
+
if (re->result == NULL)
return;
/* warning; no return here without closing exr file */
RE_parts_init(re, true);
-
+
/* assuming no new data gets added to dbase... */
R = *re;
-
+
/* set threadsafe break */
R.test_break = thread_break;
-
+
/* create and fill work queue */
workqueue = BLI_thread_queue_init();
donequeue = BLI_thread_queue_init();
-
+
/* for panorama we loop over slices */
while (find_next_pano_slice(re, &slice, &minx, &viewplane)) {
/* gather parts into queue */
totpart = sort_and_queue_parts(re, minx, workqueue);
-
+
BLI_thread_queue_nowait(workqueue);
-
+
/* start all threads */
BLI_threadpool_init(&threads, do_render_thread, re->r.threads);
-
+
for (a = 0; a < re->r.threads; a++) {
thread[a].workqueue = workqueue;
thread[a].donequeue = donequeue;
@@ -1438,36 +1438,36 @@ static void threaded_tile_processor(Render *re)
BLI_threadpool_insert(&threads, &thread[a]);
}
-
+
/* wait for results to come back */
lastdraw = PIL_check_seconds_timer();
-
+
while (1) {
elapsed = PIL_check_seconds_timer() - lastdraw;
wait = (redrawtime - elapsed)*1000;
-
+
/* handle finished part */
if ((pa=BLI_thread_queue_pop_timeout(donequeue, wait))) {
if (pa->result) {
print_part_stats(re, pa);
-
+
render_result_free_list(&pa->fullresult, pa->result);
pa->result = NULL;
re->i.partsdone++;
re->progress(re->prh, re->i.partsdone / (float)re->i.totpart);
}
-
+
totpart--;
}
-
+
/* check for render cancel */
if ((g_break=re->test_break(re->tbh)))
break;
-
+
/* or done with parts */
if (totpart == 0)
break;
-
+
/* redraw in progress parts */
elapsed = PIL_check_seconds_timer() - lastdraw;
if (elapsed > redrawtime) {
@@ -1475,13 +1475,13 @@ static void threaded_tile_processor(Render *re)
for (pa = re->parts.first; pa; pa = pa->next)
if ((pa->status == PART_STATUS_IN_PROGRESS) && pa->nr && pa->result)
re->display_update(re->duh, pa->result, &pa->result->renrect);
-
+
lastdraw = PIL_check_seconds_timer();
}
}
-
+
BLI_threadpool_end(&threads);
-
+
if ((g_break=re->test_break(re->tbh)))
break;
}
@@ -1527,7 +1527,7 @@ void RE_TileProcessor(Render *re)
{
main_render_result_new(re);
threaded_tile_processor(re);
-
+
re->i.lastframetime = PIL_check_seconds_timer() - re->i.starttime;
re->stats_draw(re->sdh, &re->i);
@@ -1538,7 +1538,7 @@ void RE_TileProcessor(Render *re)
init_freestyle(re);
add_freestyle(re, 1);
free_all_freestyle_renders();
-
+
re->i.lastframetime = PIL_check_seconds_timer() - re->i.starttime;
re->stats_draw(re->sdh, &re->i);
}
@@ -1561,7 +1561,7 @@ static void do_render_3d(Render *re)
/* internal */
RE_parts_clamp(re);
-
+
/* add motion blur and fields offset to frames */
const int cfra_backup = re->scene->r.cfra;
const float subframe_backup = re->scene->r.subframe;
@@ -1599,20 +1599,20 @@ static void do_render_3d(Render *re)
RE_Database_FromScene(re, re->main, re->scene, re->lay, 1);
RE_Database_Preprocess(re);
}
-
+
/* clear UI drawing locks */
if (re->draw_lock)
re->draw_lock(re->dlh, 0);
-
+
threaded_tile_processor(re);
-
+
#ifdef WITH_FREESTYLE
/* Freestyle */
if (re->r.mode & R_EDGE_FRS)
if (!re->test_break(re->tbh))
add_freestyle(re, 1);
#endif
-
+
/* do left-over 3d post effects (flares) */
if (re->flag & R_HALO)
if (!re->test_break(re->tbh))
@@ -1634,14 +1634,14 @@ static void addblur_rect_key(RenderResult *rr, float *rectf, float *rectf1, floa
float mfac = 1.0f - blurfac;
int a, b, stride = 4 * rr->rectx;
int len = stride * sizeof(float);
-
+
for (a = 0; a < rr->recty; a++) {
if (blurfac == 1.0f) {
memcpy(rectf, rectf1, len);
}
else {
float *rf = rectf, *rf1 = rectf1;
-
+
for (b = rr->rectx; b > 0; b--, rf += 4, rf1 += 4) {
if (rf1[3] < 0.01f)
rf[3] = mfac * rf[3];
@@ -1670,14 +1670,14 @@ static void addblur_rect(RenderResult *rr, float *rectf, float *rectf1, float bl
float mfac = 1.0f - blurfac;
int a, b, stride = channels * rr->rectx;
int len = stride * sizeof(float);
-
+
for (a = 0; a < rr->recty; a++) {
if (blurfac == 1.0f) {
memcpy(rectf, rectf1, len);
}
else {
float *rf = rectf, *rf1 = rectf1;
-
+
for (b = rr->rectx * channels; b > 0; b--, rf++, rf1++) {
rf[0] = mfac * rf[0] + blurfac * rf1[0];
}
@@ -1693,7 +1693,7 @@ static void merge_renderresult_blur(RenderResult *rr, RenderResult *brr, float b
{
RenderLayer *rl, *rl1;
RenderPass *rpass, *rpass1;
-
+
rl1 = brr->layers.first;
for (rl = rr->layers.first; rl && rl1; rl = rl->next, rl1 = rl1->next) {
/* passes are allocated in sync */
@@ -1713,38 +1713,38 @@ static void do_render_blur_3d(Render *re)
RenderResult *rres;
float blurfac;
int blur = re->r.mblur_samples;
-
+
/* create accumulation render result */
rres = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS);
-
+
/* do the blur steps */
while (blur--) {
re->mblur_offs = re->r.blurfac * ((float)(re->r.mblur_samples - blur)) / (float)re->r.mblur_samples;
-
+
re->i.curblur = re->r.mblur_samples - blur; /* stats */
-
+
do_render_3d(re);
-
+
blurfac = 1.0f / (float)(re->r.mblur_samples - blur);
-
+
merge_renderresult_blur(rres, re->result, blurfac, false);
if (re->test_break(re->tbh)) break;
}
-
+
/* swap results */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
render_result_free(re->result);
re->result = rres;
BLI_rw_mutex_unlock(&re->resultmutex);
-
+
re->mblur_offs = 0.0f;
re->i.curblur = 0; /* stats */
-
+
/* make sure motion blur changes get reset to current frame */
if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0) {
BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, re->lay);
}
-
+
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay = render_get_active_layer(re, re->result);
re->display_update(re->duh, re->result, NULL);
@@ -1756,7 +1756,7 @@ static void interleave_rect(RenderResult *rr, float *rectf, float *rectf1, float
{
int a, stride = channels * rr->rectx;
int len = stride * sizeof(float);
-
+
for (a = 0; a < rr->recty; a += 2) {
memcpy(rectf, rectf1, len);
rectf += stride;
@@ -1772,11 +1772,11 @@ static void merge_renderresult_fields(RenderResult *rr, RenderResult *rr1, Rende
{
RenderLayer *rl, *rl1, *rl2;
RenderPass *rpass, *rpass1, *rpass2;
-
+
rl1 = rr1->layers.first;
rl2 = rr2->layers.first;
for (rl = rr->layers.first; rl && rl1 && rl2; rl = rl->next, rl1 = rl1->next, rl2 = rl2->next) {
-
+
/* passes are allocated in sync */
rpass1 = rl1->passes.first;
rpass2 = rl2->passes.first;
@@ -1795,15 +1795,15 @@ static void do_render_fields_3d(Render *re)
{
Object *camera = RE_GetCamera(re);
RenderResult *rr1, *rr2 = NULL;
-
+
/* no render result was created, we can safely halve render y */
re->winy /= 2;
re->recty /= 2;
re->disprect.ymin /= 2;
re->disprect.ymax /= 2;
-
+
re->i.curfield = 1; /* stats */
-
+
/* first field, we have to call camera routine for correct aspect and subpixel offset */
RE_SetCamera(re, camera);
if (re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE) == 0)
@@ -1815,12 +1815,12 @@ static void do_render_fields_3d(Render *re)
rr1 = re->result;
re->result = NULL;
BLI_rw_mutex_unlock(&re->resultmutex);
-
+
/* second field */
if (!re->test_break(re->tbh)) {
-
+
re->i.curfield = 2; /* stats */
-
+
re->flag |= R_SEC_FIELD;
if ((re->r.mode & R_FIELDSTILL) == 0) {
re->field_offs = 0.5f;
@@ -1831,12 +1831,12 @@ static void do_render_fields_3d(Render *re)
else
do_render_3d(re);
re->flag &= ~R_SEC_FIELD;
-
+
re->field_offs = 0.0f;
-
+
rr2 = re->result;
}
-
+
/* allocate original height new buffers */
re->winy *= 2;
re->recty *= 2;
@@ -1851,14 +1851,14 @@ static void do_render_fields_3d(Render *re)
merge_renderresult_fields(re->result, rr2, rr1);
else
merge_renderresult_fields(re->result, rr1, rr2);
-
+
render_result_free(rr2);
}
render_result_free(rr1);
-
+
re->i.curfield = 0; /* stats */
-
+
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay = render_get_active_layer(re, re->result);
@@ -1939,14 +1939,14 @@ static void do_render_fields_blur_3d(Render *re)
/* now use renderdata and camera to set viewplane */
RE_SetCamera(re, camera);
-
+
if (re->r.mode & R_FIELDS)
do_render_fields_3d(re);
else if (re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE) == 0)
do_render_blur_3d(re);
else
do_render_3d(re);
-
+
/* when border render, check if we have to insert it in black */
render_result_uncrop(re);
}
@@ -1959,7 +1959,7 @@ static void render_scene(Render *re, Scene *sce, int cfra)
{
Render *resc = RE_NewSceneRender(sce);
int winx = re->winx, winy = re->winy;
-
+
sce->r.cfra = cfra;
BKE_scene_camera_switch_update(sce);
@@ -1969,7 +1969,7 @@ static void render_scene(Render *re, Scene *sce, int cfra)
winx = (sce->r.size * sce->r.xsch) / 100;
winy = (sce->r.size * sce->r.ysch) / 100;
}
-
+
/* initial setup */
RE_InitState(resc, re, &sce->r, NULL, winx, winy, &re->disprect);
@@ -1981,7 +1981,7 @@ static void render_scene(Render *re, Scene *sce, int cfra)
resc->scene = sce;
resc->lay = sce->lay;
resc->scene_color_manage = BKE_scene_check_color_management_enabled(sce);
-
+
/* ensure scene has depsgraph, base flags etc OK */
BKE_scene_set_background(re->main, sce);
@@ -1994,7 +1994,7 @@ static void render_scene(Render *re, Scene *sce, int cfra)
resc->sdh = re->sdh;
resc->current_scene_update = re->current_scene_update;
resc->suh = re->suh;
-
+
do_render_fields_blur_3d(resc);
}
@@ -2003,11 +2003,11 @@ static int composite_needs_render(Scene *sce, int this_scene)
{
bNodeTree *ntree = sce->nodetree;
bNode *node;
-
+
if (ntree == NULL) return 1;
if (sce->use_nodes == false) return 1;
if ((sce->r.scemode & R_DOCOMP) == 0) return 1;
-
+
for (node = ntree->nodes.first; node; node = node->next) {
if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0)
if (this_scene == 0 || node->id == NULL || node->id == &sce->id)
@@ -2165,14 +2165,14 @@ static void tag_scenes_for_render(Render *re)
#ifdef DEPSGRAPH_WORKAROUND_HACK
int renderlay = re->lay;
#endif
-
+
for (sce = re->main->scene.first; sce; sce = sce->id.next) {
sce->id.tag &= ~LIB_TAG_DOIT;
#ifdef DEPSGRAPH_WORKAROUND_HACK
tag_dependend_objects_for_render(re->main, sce, renderlay);
#endif
}
-
+
#ifdef WITH_FREESTYLE
if (re->freestyle_bmain) {
for (sce = re->freestyle_bmain->scene.first; sce; sce = sce->id.next) {
@@ -2190,9 +2190,9 @@ static void tag_scenes_for_render(Render *re)
tag_dependend_objects_for_render(re->main, re->scene, renderlay);
#endif
}
-
+
if (re->scene->nodetree == NULL) return;
-
+
/* check for render-layers nodes using other scenes, we tag them LIB_TAG_DOIT */
for (node = re->scene->nodetree->nodes.first; node; node = node->next) {
node->flag &= ~NODE_TEST;
@@ -2228,7 +2228,7 @@ static void tag_scenes_for_render(Render *re)
}
}
}
-
+
}
static void ntree_render_scenes(Render *re)
@@ -2237,11 +2237,11 @@ static void ntree_render_scenes(Render *re)
int cfra = re->scene->r.cfra;
Scene *restore_scene = re->scene;
bool scene_changed = false;
-
+
if (re->scene->nodetree == NULL) return;
-
+
tag_scenes_for_render(re);
-
+
/* now foreach render-result node tagged we do a full render */
/* results are stored in a way compisitor will find it */
for (node = re->scene->nodetree->nodes.first; node; node = node->next) {
@@ -2253,7 +2253,7 @@ static void ntree_render_scenes(Render *re)
scene_changed |= scene != restore_scene;
render_scene(re, scene, cfra);
node->flag &= ~NODE_TEST;
-
+
nodeUpdate(restore_scene->nodetree, node);
}
}
@@ -2399,7 +2399,7 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
float *rectf, filt[3][3];
int x, y, sample;
int nr, numviews;
-
+
/* interaction callbacks */
if (ntree) {
ntree->stats_draw = render_composit_stats;
@@ -2409,10 +2409,10 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
ntree->tbh = re->tbh;
ntree->prh = re->prh;
}
-
+
/* filtmask needs it */
R = *re;
-
+
/* temporary storage of the acccumulation buffers */
rectfs = MEM_callocN(sizeof(ListBase), "fullsample accumulation buffers");
@@ -2430,13 +2430,13 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
Render *re1;
RenderResult rres;
int mask;
-
+
/* enable full sample print */
R.i.curfsa = sample + 1;
-
+
/* set all involved renders on the samplebuffers (first was done by render itself, but needs tagged) */
/* also function below assumes this */
-
+
tag_scenes_for_render(re);
for (sce = re->main->scene.first; sce; sce = sce->id.next) {
if (sce->id.tag & LIB_TAG_DOIT) {
@@ -2457,7 +2457,7 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
}
}
}
-
+
/* composite */
if (ntree) {
ntreeCompositTagRender(re->scene);
@@ -2481,17 +2481,17 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
for (y = 0; y < re->result->recty; y++) {
float *rf = rectf + 4 * y * re->result->rectx;
float *col = rres.rectf + 4 * y * re->result->rectx;
-
+
for (x = 0; x < re->result->rectx; x++, rf += 4, col += 4) {
/* clamping to 1.0 is needed for correct AA */
CLAMP(col[0], 0.0f, 1.0f);
CLAMP(col[1], 0.0f, 1.0f);
CLAMP(col[2], 0.0f, 1.0f);
-
+
add_filt_fmask_coord(filt, col, rf, re->result->rectx, x, y, &filter_mask);
}
}
-
+
RE_ReleaseResultImage(re);
/* show stuff */
@@ -2510,7 +2510,7 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
/* clamp alpha and RGB to 0..1 and 0..inf, can go outside due to filter */
for (y = 0; y < re->result->recty; y++) {
float *rf = rectf + 4 * y * re->result->rectx;
-
+
for (x = 0; x < re->result->rectx; x++, rf += 4) {
rf[0] = MAX2(rf[0], 0.0f);
rf[1] = MAX2(rf[1], 0.0f);
@@ -2527,7 +2527,7 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
rv->rectf = rectf;
BLI_rw_mutex_unlock(&re->resultmutex);
}
-
+
/* clear interaction callbacks */
if (ntree) {
ntree->stats_draw = NULL;
@@ -2535,7 +2535,7 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
ntree->progress = NULL;
ntree->tbh = ntree->sdh = ntree->prh = NULL;
}
-
+
/* disable full sample print */
R.i.curfsa = 0;
@@ -2556,17 +2556,17 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree)
/* default start situation */
G.is_break = false;
-
+
re->main = bmain;
re->scene = sce;
re->scene_color_manage = BKE_scene_check_color_management_enabled(sce);
-
+
/* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
-
+
/* tag scenes unread */
for (scene = re->main->scene.first; scene; scene = scene->id.next)
scene->id.tag |= LIB_TAG_DOIT;
-
+
#ifdef WITH_FREESTYLE
if (re->freestyle_bmain) {
for (scene = re->freestyle_bmain->scene.first; scene; scene = scene->id.next)
@@ -2577,7 +2577,7 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree)
for (node = ntree->nodes.first; node; node = node->next) {
if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) {
Scene *nodescene = (Scene *)node->id;
-
+
if (nodescene == NULL) nodescene = sce;
if (nodescene->id.tag & LIB_TAG_DOIT) {
nodescene->r.mode |= R_OSA; /* render struct needs tables */
@@ -2586,17 +2586,17 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree)
}
}
}
-
+
/* own render result should be read/allocated */
if (re->scene->id.tag & LIB_TAG_DOIT) {
RE_ReadRenderResult(re->scene, re->scene);
re->scene->id.tag &= ~LIB_TAG_DOIT;
}
-
+
/* and now we can draw (result is there) */
re->display_init(re->dih, re->result);
re->display_clear(re->dch, re->result);
-
+
#ifdef WITH_FREESTYLE
if (re->r.mode & R_EDGE_FRS) {
init_freestyle(re);
@@ -2616,10 +2616,10 @@ static void do_render_composite_fields_blur_3d(Render *re)
{
bNodeTree *ntree = re->scene->nodetree;
int update_newframe = 0;
-
+
/* INIT seeding, compositor can use random texture */
BLI_srandom(re->r.cfra);
-
+
if (composite_needs_render(re->scene, 1)) {
/* save memory... free all cached images */
ntreeFreeCache(ntree);
@@ -2635,7 +2635,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
/* ensure new result gets added, like for regular renders */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
-
+
render_result_free(re->result);
if ((re->r.mode & R_CROP) == 0) {
render_result_disprect_to_full_resolution(re);
@@ -2643,30 +2643,30 @@ static void do_render_composite_fields_blur_3d(Render *re)
re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS);
BLI_rw_mutex_unlock(&re->resultmutex);
-
+
/* scene render process already updates animsys */
update_newframe = 1;
}
-
+
/* swap render result */
if (re->r.scemode & R_SINGLE_LAYER) {
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
render_result_single_layer_end(re);
BLI_rw_mutex_unlock(&re->resultmutex);
}
-
+
if (!re->test_break(re->tbh)) {
-
+
if (ntree) {
ntreeCompositTagRender(re->scene);
ntreeCompositTagAnimated(ntree);
}
-
+
if (ntree && re->scene->use_nodes && re->r.scemode & R_DOCOMP) {
/* checks if there are render-result nodes that need scene */
if ((re->r.scemode & R_SINGLE_LAYER) == 0)
ntree_render_scenes(re);
-
+
if (!re->test_break(re->tbh)) {
ntree->stats_draw = render_composit_stats;
ntree->test_break = re->test_break;
@@ -2674,16 +2674,16 @@ static void do_render_composite_fields_blur_3d(Render *re)
ntree->sdh = re->sdh;
ntree->tbh = re->tbh;
ntree->prh = re->prh;
-
+
/* in case it was never initialized */
R.sdh = re->sdh;
R.stats_draw = re->stats_draw;
R.i.starttime = re->i.starttime;
R.i.cfra = re->i.cfra;
-
+
if (update_newframe)
BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, re->lay);
-
+
if (re->r.scemode & R_FULL_SAMPLE)
do_merge_fullsample(re, ntree);
else {
@@ -2692,7 +2692,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
ntreeCompositExecTree(re->scene, ntree, &re->r, true, G.background == 0, &re->scene->view_settings, &re->scene->display_settings, rv->name);
}
}
-
+
ntree->stats_draw = NULL;
ntree->test_break = NULL;
ntree->progress = NULL;
@@ -2742,15 +2742,15 @@ int RE_seq_render_active(Scene *scene, RenderData *rd)
Sequence *seq;
ed = scene->ed;
-
+
if (!(rd->scemode & R_DOSEQ) || !ed || !ed->seqbase.first)
return 0;
-
+
for (seq = ed->seqbase.first; seq; seq = seq->next) {
if (seq->type != SEQ_TYPE_SOUND_RAM)
return 1;
}
-
+
return 0;
}
@@ -2891,7 +2891,7 @@ static void do_render_all_options(Render *re)
do_render_seq(re);
render_seq = true;
}
-
+
re->stats_draw(re->sdh, &re->i);
re->display_update(re->duh, re->result, NULL);
}
@@ -2903,11 +2903,11 @@ static void do_render_all_options(Render *re)
BKE_image_pool_free(re->pool);
re->pool = NULL;
}
-
+
re->i.lastframetime = PIL_check_seconds_timer() - re->i.starttime;
-
+
re->stats_draw(re->sdh, &re->i);
-
+
/* save render result stamp if needed */
if (re->result != NULL) {
camera = RE_GetCamera(re);
@@ -3073,7 +3073,7 @@ static int check_composite_output(Scene *scene)
bool RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *reports)
{
int scemode = check_mode_full_sample(&scene->r);
-
+
if (scene->r.mode & R_BORDER) {
if (scene->r.border.xmax <= scene->r.border.xmin ||
scene->r.border.ymax <= scene->r.border.ymin)
@@ -3082,37 +3082,37 @@ bool RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *
return 0;
}
}
-
+
if (scemode & (R_EXR_TILE_FILE | R_FULL_SAMPLE)) {
char str[FILE_MAX];
-
+
render_result_exr_file_path(scene, "", 0, str);
-
+
if (!BLI_file_is_writable(str)) {
BKE_report(reports, RPT_ERROR, "Cannot save render buffers, check the temp default path");
return 0;
}
-
+
/* no fullsample and edge */
if ((scemode & R_FULL_SAMPLE) && (scene->r.mode & R_EDGE)) {
BKE_report(reports, RPT_ERROR, "Full sample does not support edge enhance");
return 0;
}
-
+
}
-
+
if (scemode & R_DOCOMP) {
if (scene->use_nodes) {
if (!scene->nodetree) {
BKE_report(reports, RPT_ERROR, "No node tree in scene");
return 0;
}
-
+
if (!check_composite_output(scene)) {
BKE_report(reports, RPT_ERROR, "No render output node in scene");
return 0;
}
-
+
if (scemode & R_FULL_SAMPLE) {
if (composite_needs_render(scene, 0) == 0) {
BKE_report(reports, RPT_ERROR, "Full sample AA not supported without 3D rendering");
@@ -3121,12 +3121,12 @@ bool RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *
}
}
}
-
+
/* check valid camera, without camera render is OK (compo, seq) */
if (!check_valid_camera(scene, camera_override, reports)) {
return 0;
}
-
+
/* get panorama & ortho, only after camera is set */
BKE_camera_object_mode(&scene->r, camera_override ? camera_override : scene->camera);
@@ -3216,19 +3216,19 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain,
{
int winx, winy;
rcti disprect;
-
+
/* r.xsch and r.ysch has the actual view window size
* r.border is the clipping rect */
-
+
/* calculate actual render result and display size */
winx = (rd->size * rd->xsch) / 100;
winy = (rd->size * rd->ysch) / 100;
-
+
/* we always render smaller part, inserting it in larger image is compositor bizz, it uses disprect for it */
if (scene->r.mode & R_BORDER) {
disprect.xmin = rd->border.xmin * winx;
disprect.xmax = rd->border.xmax * winx;
-
+
disprect.ymin = rd->border.ymin * winy;
disprect.ymax = rd->border.ymax * winy;
}
@@ -3237,7 +3237,7 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain,
disprect.xmax = winx;
disprect.ymax = winy;
}
-
+
re->main = bmain;
re->scene = scene;
re->scene_color_manage = BKE_scene_check_color_management_enabled(scene);
@@ -3253,7 +3253,7 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain,
re->disprect = disprect;
return 1;
}
-
+
/* check all scenes involved */
tag_scenes_for_render(re);
@@ -3266,17 +3266,17 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain,
/* make sure dynamics are up to date */
update_physics_cache(re, scene, anim_init);
}
-
+
if (srl || scene->r.scemode & R_SINGLE_LAYER) {
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
render_result_single_layer_begin(re);
BLI_rw_mutex_unlock(&re->resultmutex);
}
-
+
RE_InitState(re, NULL, &scene->r, srl, winx, winy, &disprect);
if (!re->ok) /* if an error was printed, abort */
return 0;
-
+
/* initstate makes new result, have to send changed tags around */
ntreeCompositTagRender(re->scene);
@@ -3284,7 +3284,7 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain,
re->display_init(re->dih, re->result);
re->display_clear(re->dch, re->result);
-
+
return 1;
}
@@ -3301,9 +3301,9 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr
/* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */
G.is_rendering = true;
-
+
scene->r.cfra = frame;
-
+
if (render_initialize_from_main(re, &scene->r, bmain, scene, srl, camera_override, lay_override, 0, 0)) {
MEM_reset_peak_memory();
@@ -3565,12 +3565,12 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
/* write images as individual images or stereo */
ok = RE_WriteRenderViewsImage(re->reports, &rres, scene, true, name);
}
-
+
RE_ReleaseResultImageViews(re, &rres);
render_time = re->i.lastframetime;
re->i.lastframetime = PIL_check_seconds_timer() - re->i.starttime;
-
+
BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime);
printf(" Time: %s", name);
@@ -3581,7 +3581,7 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime - render_time);
printf(" (Saving: %s)\n", name);
-
+
fputc('\n', stdout);
fflush(stdout); /* needed for renderd !! (not anymore... (ton)) */
@@ -3820,10 +3820,10 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
/* run callbacs before rendering, before the scene is updated */
BLI_callback_exec(re->main, (ID *)scene, BLI_CB_EVT_RENDER_PRE);
-
+
do_render_all_options(re);
totrendered++;
-
+
if (re->test_break(re->tbh) == 0) {
if (!G.is_break)
if (!do_write_image_or_movie(re, bmain, scene, mh, totvideos, NULL))
@@ -3831,7 +3831,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
}
else
G.is_break = true;
-
+
if (G.is_break == true) {
/* remove touched file */
if (is_movie == false) {
@@ -3860,7 +3860,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
}
}
}
-
+
break;
}
@@ -3870,12 +3870,12 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
}
}
}
-
+
/* end movie */
if (is_movie) {
re_movie_free_all(re, mh, totvideos);
}
-
+
if (totskipped && totrendered == 0)
BKE_report(re->reports, RPT_INFO, "No frames rendered, skipped to not overwrite");
@@ -3925,16 +3925,16 @@ bool RE_ReadRenderResult(Scene *scene, Scene *scenode)
int winx, winy;
bool success;
rcti disprect;
-
+
/* calculate actual render result and display size */
winx = (scene->r.size * scene->r.xsch) / 100;
winy = (scene->r.size * scene->r.ysch) / 100;
-
+
/* only in movie case we render smaller part */
if (scene->r.mode & R_BORDER) {
disprect.xmin = scene->r.border.xmin * winx;
disprect.xmax = scene->r.border.xmax * winx;
-
+
disprect.ymin = scene->r.border.ymin * winy;
disprect.ymax = scene->r.border.ymax * winy;
}
@@ -3943,10 +3943,10 @@ bool RE_ReadRenderResult(Scene *scene, Scene *scenode)
disprect.xmax = winx;
disprect.ymax = winy;
}
-
+
if (scenode)
scene = scenode;
-
+
/* get render: it can be called from UI with draw callbacks */
re = RE_GetSceneRender(scene);
if (re == NULL)
@@ -3954,7 +3954,7 @@ bool RE_ReadRenderResult(Scene *scene, Scene *scenode)
RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect);
re->scene = scene;
re->scene_color_manage = BKE_scene_check_color_management_enabled(scene);
-
+
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
success = render_result_exr_file_cache_read(re);
BLI_rw_mutex_unlock(&re->resultmutex);
@@ -3964,7 +3964,7 @@ bool RE_ReadRenderResult(Scene *scene, Scene *scenode)
return success;
}
-void RE_init_threadcount(Render *re)
+void RE_init_threadcount(Render *re)
{
re->r.threads = BKE_render_num_threads(&re->r);
}
@@ -4190,7 +4190,7 @@ RenderPass *RE_create_gp_pass(RenderResult *rr, const char *layername, const cha
rl->rectx = rr->rectx;
rl->recty = rr->recty;
}
-
+
/* clear previous pass if exist or the new image will be over previous one*/
RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_COMBINED, viewname);
if (rp) {
diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c
index fc79786e5c7..c7cfe765f5b 100644
--- a/source/blender/render/intern/source/pixelblending.c
+++ b/source/blender/render/intern/source/pixelblending.c
@@ -96,7 +96,7 @@ void addAlphaUnderFloat(float dest[4], const float source[4])
dest[1] += (mul * source[1]);
dest[2] += (mul * source[2]);
dest[3] += (mul * source[3]);
-}
+}
/* ------------------------------------------------------------------------- */
@@ -112,29 +112,29 @@ void addalphaAddfacFloat(float dest[4], const float source[4], char addfac)
/* blend colors*/
c = (m * dest[0]) + source[0];
#ifdef RE_FLOAT_COLOR_CLIPPING
- if (c >= RE_FULL_COLOR_FLOAT) dest[0] = RE_FULL_COLOR_FLOAT;
- else
+ if (c >= RE_FULL_COLOR_FLOAT) dest[0] = RE_FULL_COLOR_FLOAT;
+ else
#endif
dest[0] = c;
c = (m * dest[1]) + source[1];
#ifdef RE_FLOAT_COLOR_CLIPPING
- if (c >= RE_FULL_COLOR_FLOAT) dest[1] = RE_FULL_COLOR_FLOAT;
- else
+ if (c >= RE_FULL_COLOR_FLOAT) dest[1] = RE_FULL_COLOR_FLOAT;
+ else
#endif
dest[1] = c;
c = (m * dest[2]) + source[2];
#ifdef RE_FLOAT_COLOR_CLIPPING
- if (c >= RE_FULL_COLOR_FLOAT) dest[2] = RE_FULL_COLOR_FLOAT;
- else
+ if (c >= RE_FULL_COLOR_FLOAT) dest[2] = RE_FULL_COLOR_FLOAT;
+ else
#endif
dest[2] = c;
c = (m * dest[3]) + source[3];
#ifdef RE_ALPHA_CLIPPING
- if (c >= RE_FULL_COLOR_FLOAT) dest[3] = RE_FULL_COLOR_FLOAT;
- else
+ if (c >= RE_FULL_COLOR_FLOAT) dest[3] = RE_FULL_COLOR_FLOAT;
+ else
#endif
dest[3] = c;
@@ -152,7 +152,7 @@ void add_filt_fmask(unsigned int mask, const float col[4], float *rowbuf, int ro
float val, r, g, b, al;
unsigned int a, maskand, maskshift;
int j;
-
+
r = col[0];
g = col[1];
b = col[2];
@@ -177,7 +177,7 @@ void add_filt_fmask(unsigned int mask, const float col[4], float *rowbuf, int ro
rb1[3] += val * al;
}
a += 3;
-
+
val = *(fmask1[a] + maskand) + *(fmask2[a] + maskshift);
if (val != 0.0f) {
rb2[0] += val * r;
@@ -186,7 +186,7 @@ void add_filt_fmask(unsigned int mask, const float col[4], float *rowbuf, int ro
rb2[3] += val * al;
}
a += 3;
-
+
val = *(fmask1[a] + maskand) + *(fmask2[a] + maskshift);
if (val != 0.0f) {
rb3[0] += val * r;
@@ -194,7 +194,7 @@ void add_filt_fmask(unsigned int mask, const float col[4], float *rowbuf, int ro
rb3[2] += val * b;
rb3[3] += val * al;
}
-
+
rb1 += 4;
rb2 += 4;
rb3 += 4;
@@ -208,19 +208,19 @@ void mask_array(unsigned int mask, float filt[3][3])
unsigned int maskand = (mask & 255);
unsigned int maskshift = (mask >> 8);
int a, j;
-
+
for (j = 2; j >= 0; j--) {
-
+
a = j;
-
+
filt[2][2 - j] = *(fmask1[a] + maskand) + *(fmask2[a] + maskshift);
a += 3;
-
+
filt[1][2 - j] = *(fmask1[a] + maskand) + *(fmask2[a] + maskshift);
-
+
a += 3;
-
+
filt[0][2 - j] = *(fmask1[a] + maskand) + *(fmask2[a] + maskshift);
}
}
@@ -244,14 +244,14 @@ void add_filt_fmask_coord(float filt[3][3], const float col[4], float *rowbuf, i
{
float *fpoin[3][3];
float val, r, g, b, al, lfilt[3][3];
-
+
r = col[0];
g = col[1];
b = col[2];
al = col[3];
-
+
memcpy(lfilt, filt, sizeof(lfilt));
-
+
fpoin[0][1] = rowbuf - 4 * row_stride;
fpoin[1][1] = rowbuf;
fpoin[2][1] = rowbuf + 4 * row_stride;
@@ -284,7 +284,7 @@ void add_filt_fmask_coord(float filt[3][3], const float col[4], float *rowbuf, i
lfilt[2][1] = filt[0][1];
lfilt[2][2] = filt[0][2];
}
-
+
if (x <= mask->xmin) {
fpoin[2][0] = fpoin[2][1];
fpoin[1][0] = fpoin[1][1];
@@ -303,8 +303,8 @@ void add_filt_fmask_coord(float filt[3][3], const float col[4], float *rowbuf, i
lfilt[1][2] = filt[1][0];
lfilt[0][2] = filt[0][0];
}
-
-
+
+
/* loop unroll */
#define MASKFILT(i, j) \
val = lfilt[i][j]; \
@@ -315,7 +315,7 @@ void add_filt_fmask_coord(float filt[3][3], const float col[4], float *rowbuf, i
fp[2] += val * b; \
fp[3] += val * al; \
} (void)0
-
+
MASKFILT(0, 0);
MASKFILT(0, 1);
MASKFILT(0, 2);
@@ -337,38 +337,38 @@ void add_filt_fmask_pixsize(unsigned int mask, float *in, float *rowbuf, int row
float val;
unsigned int a, maskand, maskshift;
int i, j;
-
+
rb2 = rowbuf - pixsize;
rb3 = rb2 - pixsize * row_w;
rb1 = rb2 + pixsize * row_w;
-
+
maskand = (mask & 255);
maskshift = (mask >> 8);
-
+
for (j = 2; j >= 0; j--) {
-
+
a = j;
-
+
val = *(fmask1[a] + maskand) + *(fmask2[a] + maskshift);
if (val != 0.0f) {
for (i = 0; i < pixsize; i++)
rb1[i] += val * in[i];
}
a += 3;
-
+
val = *(fmask1[a] + maskand) + *(fmask2[a] + maskshift);
if (val != 0.0f) {
for (i = 0; i < pixsize; i++)
rb2[i] += val * in[i];
}
a += 3;
-
+
val = *(fmask1[a] + maskand) + *(fmask2[a] + maskshift);
if (val != 0.0f) {
for (i = 0; i < pixsize; i++)
rb3[i] += val * in[i];
}
-
+
rb1 += pixsize;
rb2 += pixsize;
rb3 += pixsize;
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index f1323af2826..7f202629ce4 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -71,20 +71,20 @@ static void render_lighting_halo(HaloRen *har, float col_r[3])
LampRen *lar;
float i, inp, inpr, rco[3], dco[3], lv[3], lampdist, ld, t, *vn;
float ir, ig, ib, shadfac, soft, lacol[3];
-
+
ir= ig= ib= 0.0;
-
+
copy_v3_v3(rco, har->co);
dco[0]=dco[1]=dco[2]= 1.0f/har->rad;
-
+
vn= har->no;
-
+
for (go=R.lights.first; go; go= go->next) {
lar= go->lampren;
-
+
/* test for lamplayer */
if (lar->mode & LA_LAYER) if ((lar->lay & har->lay)==0) continue;
-
+
/* lampdist cacluation */
if (lar->type==LA_SUN || lar->type==LA_HEMI) {
copy_v3_v3(lv, lar->vec);
@@ -98,63 +98,63 @@ static void render_lighting_halo(HaloRen *har, float col_r[3])
lv[0]/= ld;
lv[1]/= ld;
lv[2]/= ld;
-
+
/* ld is re-used further on (texco's) */
-
+
if (lar->mode & LA_QUAD) {
t= 1.0;
if (lar->ld1>0.0f)
t= lar->dist/(lar->dist+lar->ld1*ld);
if (lar->ld2>0.0f)
t*= lar->distkw/(lar->distkw+lar->ld2*ld*ld);
-
+
lampdist= t;
}
else {
lampdist= (lar->dist/(lar->dist+ld));
}
-
+
if (lar->mode & LA_SPHERE) {
t= lar->dist - ld;
if (t<0.0f) continue;
-
+
t/= lar->dist;
lampdist*= (t);
}
-
+
}
-
+
lacol[0]= lar->r;
lacol[1]= lar->g;
lacol[2]= lar->b;
-
+
if (lar->mode & LA_TEXTURE) {
ShadeInput shi;
-
+
/* Warning, This is not that nice, and possibly a bit slow,
* however some variables were not initialized properly in, unless using shade_input_initialize(...),
* we need to do a memset */
- memset(&shi, 0, sizeof(ShadeInput));
+ memset(&shi, 0, sizeof(ShadeInput));
/* end warning! - Campbell */
-
+
copy_v3_v3(shi.co, rco);
shi.osatex= 0;
do_lamp_tex(lar, lv, &shi, lacol, LA_TEXTURE);
}
-
+
if (lar->type==LA_SPOT) {
-
+
if (lar->mode & LA_SQUARE) {
if (lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2]>0.0f) {
float x, lvrot[3];
-
+
/* rotate view to lampspace */
copy_v3_v3(lvrot, lv);
mul_m3_v3(lar->imat, lvrot);
-
+
x = max_ff(fabsf(lvrot[0]/lvrot[2]), fabsf(lvrot[1]/lvrot[2]));
/* 1.0/(sqrt(1+x*x)) is equivalent to cos(atan(x)) */
-
+
inpr = 1.0f / (sqrtf(1.0f + x * x));
}
else inpr= 0.0;
@@ -162,7 +162,7 @@ static void render_lighting_halo(HaloRen *har, float col_r[3])
else {
inpr= lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2];
}
-
+
t= lar->spotsi;
if (inpr<t) continue;
else {
@@ -187,7 +187,7 @@ static void render_lighting_halo(HaloRen *har, float col_r[3])
ir -= shadfac;
ig -= shadfac;
ib -= shadfac;
-
+
continue;
}
}
@@ -196,24 +196,24 @@ static void render_lighting_halo(HaloRen *har, float col_r[3])
lampdist*=inpr;
}
if (lar->mode & LA_ONLYSHADOW) continue;
-
+
}
-
+
/* dot product and reflectivity*/
-
+
inp = 1.0f - fabsf(dot_v3v3(vn, lv));
-
+
/* inp= cos(0.5*M_PI-acos(inp)); */
-
+
i= inp;
-
+
if (lar->type==LA_HEMI) {
i= 0.5f*i+0.5f;
}
if (i>0.0f) {
i*= lampdist;
}
-
+
/* shadow */
if (i> -0.41f) { /* heuristic valua! */
if (lar->shb) {
@@ -222,14 +222,14 @@ static void render_lighting_halo(HaloRen *har, float col_r[3])
i*= shadfac;
}
}
-
+
if (i>0.0f) {
ir+= i*lacol[0];
ig+= i*lacol[1];
ib+= i*lacol[2];
}
}
-
+
if (ir<0.0f) ir= 0.0f;
if (ig<0.0f) ig= 0.0f;
if (ib<0.0f) ib= 0.0f;
@@ -237,7 +237,7 @@ static void render_lighting_halo(HaloRen *har, float col_r[3])
col_r[0]*= ir;
col_r[1]*= ig;
col_r[2]*= ib;
-
+
}
@@ -287,14 +287,14 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz,
}
}
else alpha= har->alfa;
-
+
if (alpha==0.0f)
return 0;
/* soften the halo if it intersects geometry */
if (har->mat && har->mat->mode & MA_HALO_SOFT) {
float segment_length, halo_depth, distance_from_z /* , visible_depth */ /* UNUSED */, soften;
-
+
/* calculate halo depth */
segment_length= har->hasize*sasqrt(1.0f - dist/(har->rad*har->rad));
halo_depth= 2.0f*segment_length;
@@ -333,16 +333,16 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz,
const float *rc;
float fac;
int ofs;
-
+
/* per ring an antialised circle */
ofs= har->seed;
-
+
for (a= har->ringc; a>0; a--, ofs+=2) {
-
+
rc= hashvectf + (ofs % 768);
-
+
fac = fabsf(rc[1] * (har->rad * fabsf(rc[0]) - radist));
-
+
if (fac< 1.0f) {
ringf+= (1.0f-fac);
}
@@ -379,25 +379,25 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz,
dist= (1.0f-dist);
else
dist= 0.0f;
-
+
if (har->linec) {
const float *rc;
float fac;
int ofs;
-
+
/* per starpoint an antialiased line */
ofs= har->seed;
-
+
for (a= har->linec; a>0; a--, ofs+=3) {
-
+
rc= hashvectf + (ofs % 768);
-
+
fac = fabsf((xn) * rc[0] + (yn) * rc[1]);
-
+
if (fac< 1.0f )
linef+= (1.0f-fac);
}
-
+
linef*= dist;
}
@@ -406,16 +406,16 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz,
/* rotation */
angle = atan2f(yn, xn);
angle *= (1.0f+0.25f*har->starpoints);
-
+
co= cosf(angle);
si= sinf(angle);
-
+
angle= (co*xn+si*yn)*(co*yn-si*xn);
-
+
ster = fabsf(angle);
if (ster>1.0f) {
ster= (har->rad)/(ster);
-
+
if (ster<1.0f) dist*= sqrtf(ster);
}
}
@@ -423,25 +423,25 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz,
/* disputable optimize... (ton) */
if (dist<=0.00001f)
return 0;
-
+
dist*= alpha;
ringf*= dist;
linef*= alpha;
-
+
/* The color is either the rgb spec-ed by the user, or extracted from */
/* the texture */
if (har->tex) {
- col[0]= har->r;
- col[1]= har->g;
+ col[0]= har->r;
+ col[1]= har->g;
col[2]= har->b;
col[3]= dist;
-
+
do_halo_tex(har, xn, yn, col);
-
+
col[0]*= col[3];
col[1]*= col[3];
col[2]*= col[3];
-
+
}
else {
col[0]= dist*har->r;
@@ -460,11 +460,11 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz,
/* Next, we do the line and ring factor modifications. */
if (linef!=0.0f) {
Material *ma= har->mat;
-
+
col[0]+= linef * ma->specr;
col[1]+= linef * ma->specg;
col[2]+= linef * ma->specb;
-
+
if (har->type & HA_XALPHA) col[3]+= linef*linef;
else col[3]+= linef;
}
@@ -474,12 +474,12 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz,
col[0]+= ringf * ma->mirr;
col[1]+= ringf * ma->mirg;
col[2]+= ringf * ma->mirb;
-
+
if (har->type & HA_XALPHA) col[3]+= ringf*ringf;
else col[3]+= ringf;
}
}
-
+
/* alpha requires clip, gives black dots */
if (col[3] > 1.0f)
col[3]= 1.0f;
@@ -494,17 +494,17 @@ void shadeSkyView(float col_r[3], const float rco[3], const float view[3], const
{
float zen[3], hor[3], blend, blendm;
int skyflag;
-
+
/* flag indicating if we render the top hemisphere */
skyflag = WO_ZENUP;
-
+
/* Some view vector stuff. */
if (R.wrld.skytype & WO_SKYREAL) {
-
+
blend = dot_v3v3(view, R.grvec);
-
+
if (blend<0.0f) skyflag= 0;
-
+
blend = fabsf(blend);
}
else if (R.wrld.skytype & WO_SKYPAPER) {
@@ -532,10 +532,10 @@ void shadeSkyView(float col_r[3], const float rco[3], const float view[3], const
}
do_sky_tex(rco, view, lo, dxyview, hor, zen, &blend, skyflag, thread);
}
-
+
if (blend>1.0f) blend= 1.0f;
blendm= 1.0f-blend;
-
+
/* No clipping, no conversion! */
if (R.wrld.skytype & WO_SKYBLEND) {
col_r[0] = (blendm*hor[0] + blend*zen[0]);
@@ -557,13 +557,13 @@ void shadeSunView(float col_r[3], const float view[3])
LampRen *lar;
float sview[3];
bool do_init = true;
-
+
for (go=R.lights.first; go; go= go->next) {
lar= go->lampren;
if (lar->type==LA_SUN && lar->sunsky && (lar->sunsky->effect_type & LA_SUN_EFFECT_SKY)) {
float sun_collector[3];
float colorxyz[3];
-
+
if (do_init) {
normalize_v3_v3(sview, view);
@@ -573,11 +573,11 @@ void shadeSunView(float col_r[3], const float view[3])
normalize_v3(sview);
do_init = false;
}
-
+
GetSkyXYZRadiancef(lar->sunsky, sview, colorxyz);
xyz_to_rgb(colorxyz[0], colorxyz[1], colorxyz[2], &sun_collector[0], &sun_collector[1], &sun_collector[2],
lar->sunsky->sky_colorspace);
-
+
ramp_blend(lar->sunsky->skyblendtype, col_r, lar->sunsky->skyblendfac, sun_collector);
}
}
@@ -613,25 +613,25 @@ void shadeSkyPixel(float collector[4], float fx, float fy, short thread)
view[0]= -1.0f + 2.0f*(fx/(float)R.winx);
view[1]= -1.0f + 2.0f*(fy/(float)R.winy);
view[2]= 0.0;
-
+
dxyview[0]= 1.0f/(float)R.winx;
dxyview[1]= 1.0f/(float)R.winy;
}
else {
calc_view_vector(view, fx, fy);
fac= normalize_v3(view);
-
+
if (R.wrld.skytype & WO_SKYTEX) {
dxyview[0]= -R.viewdx/fac;
dxyview[1]= -R.viewdy/fac;
}
}
-
+
/* get sky color in the collector */
shadeSkyView(collector, NULL, view, dxyview, thread);
collector[3] = 0.0f;
}
-
+
calc_view_vector(view, fx, fy);
shadeSunView(collector, view);
}
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
index b75d996ff27..635bfc58425 100644
--- a/source/blender/render/intern/source/pointdensity.c
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -107,7 +107,7 @@ static void point_data_pointers(PointDensity *pd,
const int totpoint = pd->totpoints;
float *data = pd->point_data;
int offset = 0;
-
+
if (data_used & POINT_DATA_VEL) {
if (r_data_velocity)
*r_data_velocity = data + offset;
@@ -117,7 +117,7 @@ static void point_data_pointers(PointDensity *pd,
if (r_data_velocity)
*r_data_velocity = NULL;
}
-
+
if (data_used & POINT_DATA_LIFE) {
if (r_data_life)
*r_data_life = data + offset;
@@ -127,7 +127,7 @@ static void point_data_pointers(PointDensity *pd,
if (r_data_life)
*r_data_life = NULL;
}
-
+
if (data_used & POINT_DATA_COLOR) {
if (r_data_color)
*r_data_color = data + offset;
@@ -318,19 +318,19 @@ static void pointdensity_cache_vertex_color(PointDensity *pd, Object *UNUSED(ob)
const MLoopCol *mcol;
char layername[MAX_CUSTOMDATA_LAYER_NAME];
int i;
-
+
BLI_assert(data_color);
-
+
if (!CustomData_has_layer(&dm->loopData, CD_MLOOPCOL))
return;
CustomData_validate_layer_name(&dm->loopData, CD_MLOOPCOL, pd->vertex_attribute_name, layername);
mcol = CustomData_get_layer_named(&dm->loopData, CD_MLOOPCOL, layername);
if (!mcol)
return;
-
+
/* Stores the number of MLoops using the same vertex, so we can normalize colors. */
int *mcorners = MEM_callocN(sizeof(int) * pd->totpoints, "point density corner count");
-
+
for (i = 0; i < totloop; i++) {
int v = mloop[i].v;
@@ -345,7 +345,7 @@ static void pointdensity_cache_vertex_color(PointDensity *pd, Object *UNUSED(ob)
++mcorners[v];
}
-
+
/* Normalize colors by averaging over mcorners.
* All the corners share the same vertex, ie. occupy the same point in space.
*/
@@ -353,7 +353,7 @@ static void pointdensity_cache_vertex_color(PointDensity *pd, Object *UNUSED(ob)
if (mcorners[i] > 0)
mul_v3_fl(&data_color[i*3], 1.0f / mcorners[i]);
}
-
+
MEM_freeN(mcorners);
}
@@ -363,9 +363,9 @@ static void pointdensity_cache_vertex_weight(PointDensity *pd, Object *ob, Deriv
const MDeformVert *mdef, *dv;
int mdef_index;
int i;
-
+
BLI_assert(data_color);
-
+
mdef = CustomData_get_layer(&dm->vertData, CD_MDEFORMVERT);
if (!mdef)
return;
@@ -374,11 +374,11 @@ static void pointdensity_cache_vertex_weight(PointDensity *pd, Object *ob, Deriv
mdef_index = ob->actdef - 1;
if (mdef_index < 0)
return;
-
+
for (i = 0, dv = mdef; i < totvert; ++i, ++dv, data_color += 3) {
MDeformWeight *dw;
int j;
-
+
for (j = 0, dw = dv->dw; j < dv->totweight; ++j, ++dw) {
if (dw->def_nr == mdef_index) {
copy_v3_fl(data_color, dw->weight);
@@ -392,9 +392,9 @@ static void pointdensity_cache_vertex_normal(PointDensity *pd, Object *UNUSED(ob
{
MVert *mvert = dm->getVertArray(dm), *mv;
int i;
-
+
BLI_assert(data_color);
-
+
for (i = 0, mv = mvert; i < pd->totpoints; i++, mv++, data_color += 3) {
normal_short_to_float_v3(data_color, mv->no);
}
@@ -457,7 +457,7 @@ static void pointdensity_cache_object(Scene *scene,
BLI_bvhtree_insert(pd->point_tree, i, co, 1);
}
-
+
switch (pd->ob_color_source) {
case TEX_PD_COLOR_VERTCOL:
pointdensity_cache_vertex_color(pd, ob, dm, data_color);
@@ -601,7 +601,7 @@ static float density_falloff(PointDensityRangeData *pdr, int index, float square
{
const float dist = (pdr->squared_radius - squared_dist) / pdr->squared_radius * 0.5f;
float density = 0.0f;
-
+
switch (pdr->falloff_type) {
case TEX_PD_FALLOFF_STD:
density = dist;
@@ -631,12 +631,12 @@ static float density_falloff(PointDensityRangeData *pdr, int index, float square
density = dist;
break;
}
-
+
if (pdr->density_curve && dist != 0.0f) {
curvemapping_initialize(pdr->density_curve);
density = curvemapping_evaluateF(pdr->density_curve, 0, density / dist) * dist;
}
-
+
return density;
}
@@ -777,7 +777,7 @@ static int pointdensity_color(PointDensity *pd, TexResult *texres, float age, co
if (pd->source == TEX_PD_PSYS) {
float rgba[4];
-
+
switch (pd->color_source) {
case TEX_PD_COLOR_PARTAGE:
if (pd->coba) {
@@ -792,7 +792,7 @@ static int pointdensity_color(PointDensity *pd, TexResult *texres, float age, co
case TEX_PD_COLOR_PARTSPEED:
{
float speed = len_v3(vec) * pd->speed_scale;
-
+
if (pd->coba) {
if (BKE_colorband_evaluate(pd->coba, speed, rgba)) {
texres->talpha = true;
@@ -817,7 +817,7 @@ static int pointdensity_color(PointDensity *pd, TexResult *texres, float age, co
}
else {
float rgba[4];
-
+
switch (pd->ob_color_source) {
case TEX_PD_COLOR_VERTCOL:
texres->talpha = true;
@@ -847,7 +847,7 @@ static int pointdensity_color(PointDensity *pd, TexResult *texres, float age, co
break;
}
}
-
+
return retval;
}
@@ -861,7 +861,7 @@ int pointdensitytex(Tex *tex, const float texvec[3], TexResult *texres)
retval |= pointdensity_color(pd, texres, age, vec, col);
BRICONTRGB;
-
+
return retval;
#if 0
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 2ee0ce22c23..df1cb868230 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -99,15 +99,15 @@ RayObject *RE_rayobject_create(int type, int size, int octree_resolution)
type = R_RAYSTRUCTURE_VBVH;
#endif
}
-
+
#ifndef __SSE__
if (type == R_RAYSTRUCTURE_SIMD_SVBVH || type == R_RAYSTRUCTURE_SIMD_QBVH) {
puts("Warning: Using VBVH (SSE was disabled at compile time)");
type = R_RAYSTRUCTURE_VBVH;
}
#endif
-
-
+
+
if (type == R_RAYSTRUCTURE_OCTREE) //TODO dynamic ocres
res = RE_rayobject_octree_create(octree_resolution, size);
else if (type == R_RAYSTRUCTURE_VBVH)
@@ -118,7 +118,7 @@ RayObject *RE_rayobject_create(int type, int size, int octree_resolution)
res = RE_rayobject_qbvh_create(size);
else
res = RE_rayobject_vbvh_create(size); //Fallback
-
+
return res;
}
@@ -127,7 +127,7 @@ static RayObject* rayobject_create(Render *re, int type, int size)
RayObject * res = NULL;
res = RE_rayobject_create(type, size, re->r.ocres);
-
+
if (res)
RE_rayobject_config_control(res, re);
@@ -142,7 +142,7 @@ RayCounter re_rc_counter[BLENDER_MAX_THREADS];
void freeraytree(Render *re)
{
ObjectInstanceRen *obi;
-
+
if (re->raytree) {
RE_rayobject_free(re->raytree);
re->raytree = NULL;
@@ -171,7 +171,7 @@ void freeraytree(Render *re)
obi->raytree = NULL;
}
}
-
+
#ifdef RE_RAYCOUNTER
{
const int num_threads = re->r.threads;
@@ -226,7 +226,7 @@ RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi)
RayFace *face = NULL;
VlakPrimitive *vlakprimitive = NULL;
int v;
-
+
//Count faces
int faces = 0;
for (v=0;v<obr->totvlak;v++) {
@@ -234,7 +234,7 @@ RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi)
if (is_raytraceable_vlr(re, vlr))
faces++;
}
-
+
if (faces == 0)
return NULL;
@@ -246,7 +246,7 @@ RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi)
face = obr->rayfaces = (RayFace *)MEM_callocN(faces * sizeof(RayFace), "ObjectRen faces");
obr->rayobi = obi;
-
+
for (v=0;v<obr->totvlak;v++) {
VlakRen *vlr = obr->vlaknodes[v>>8].vlak + (v&255);
if (is_raytraceable_vlr(re, vlr)) {
@@ -276,7 +276,7 @@ RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi)
obi->raytree = RE_rayobject_instance_create( obr->raytree, obi->mat, obi, obi->obr->rayobi );
}
}
-
+
if (obi->raytree) return obi->raytree;
return obi->obr->raytree;
}
@@ -286,7 +286,7 @@ static bool has_special_rayobject(Render *re, ObjectInstanceRen *obi)
if ( (obi->flag & R_TRANSFORMED) && (re->r.raytrace_options & R_RAYTRACE_USE_INSTANCES) ) {
ObjectRen *obr = obi->obr;
int v, faces = 0;
-
+
for (v=0;v<obr->totvlak;v++) {
VlakRen *vlr = obr->vlaknodes[v>>8].vlak + (v&255);
if (is_raytraceable_vlr(re, vlr)) {
@@ -327,12 +327,12 @@ static void makeraytree_single(Render *re)
}
}
}
-
+
if (faces + special == 0) {
re->raytree = RE_rayobject_empty_create();
return;
}
-
+
//Create raytree
raytree = re->raytree = rayobject_create( re, re->r.raytrace_structure, faces+special );
@@ -342,7 +342,7 @@ static void makeraytree_single(Render *re)
else {
face = re->rayfaces = (RayFace *)MEM_callocN(faces * sizeof(RayFace), "Render ray faces");
}
-
+
for (obi=re->instancetable.first; obi; obi=obi->next)
if (is_raytraceable(re, obi)) {
if (test_break(re))
@@ -360,7 +360,7 @@ static void makeraytree_single(Render *re)
else {
int v;
ObjectRen *obr = obi->obr;
-
+
if (obi->flag & R_TRANSFORMED) {
obi->transform_primitives = 1;
}
@@ -390,7 +390,7 @@ static void makeraytree_single(Render *re)
}
}
}
-
+
if (!test_break(re)) {
re->i.infostr = IFACE_("Raytree.. building");
re->stats_draw(re->sdh, &re->i);
@@ -403,7 +403,7 @@ void makeraytree(Render *re)
{
float min[3], max[3], sub[3];
int i;
-
+
re->i.infostr = IFACE_("Raytree.. preparing");
re->stats_draw(re->sdh, &re->i);
@@ -479,14 +479,14 @@ static void shade_ray_set_derivative(ShadeInput *shi)
}
detsh= 1.0f/(t00*t11-t10*t01);
- t00*= detsh; t01*=detsh;
+ t00*= detsh; t01*=detsh;
t10*=detsh; t11*=detsh;
-
+
shi->dx_u= shi->dxco[axis1]*t11- shi->dxco[axis2]*t10;
shi->dx_v= shi->dxco[axis2]*t00- shi->dxco[axis1]*t01;
shi->dy_u= shi->dyco[axis1]*t11- shi->dyco[axis2]*t10;
shi->dy_v= shi->dyco[axis2]*t00- shi->dyco[axis1]*t01;
-
+
}
/* main ray shader */
@@ -494,7 +494,7 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
{
ObjectInstanceRen *obi = (ObjectInstanceRen *)is->hit.ob;
VlakRen *vlr = (VlakRen *)is->hit.face;
-
+
/* set up view vector */
copy_v3_v3(shi->view, is->dir);
@@ -502,7 +502,7 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shi->co[0]= is->start[0]+is->dist*(shi->view[0]);
shi->co[1]= is->start[1]+is->dist*(shi->view[1]);
shi->co[2]= is->start[2]+is->dist*(shi->view[2]);
-
+
normalize_v3(shi->view);
shi->obi= obi;
@@ -510,8 +510,8 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shi->vlr= vlr;
shi->mat= vlr->mat;
shade_input_init_material(shi);
-
- if (is->isect==2)
+
+ if (is->isect==2)
shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
else
shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
@@ -550,7 +550,7 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
else {
shade_material_loop(shi, shr);
}
-
+
/* raytrace likes to separate the spec color */
sub_v3_v3v3(shr->diff, shr->combined, shr->spec);
copy_v3_v3(shr->diffshad, shr->diff);
@@ -563,7 +563,7 @@ static int refraction(float refract[3], const float n[3], const float view[3], f
float dot, fac;
copy_v3_v3(refract, view);
-
+
dot = dot_v3v3(view, n);
if (dot>0.0f) {
@@ -612,7 +612,7 @@ static void reflection(float ref[3], float n[3], const float view[3], const floa
static void color_combine(float *result, float fac1, float fac2, float col1[3], float col2[3])
{
float col1t[3], col2t[3];
-
+
col1t[0]= sqrt(col1[0]);
col1t[1]= sqrt(col1[1]);
col1t[2]= sqrt(col1[2]);
@@ -634,7 +634,7 @@ static float shade_by_transmission(Isect *is, ShadeInput *shi, ShadeResult *shr)
float d;
if (0 == (shi->mat->mode & MA_TRANSP))
return -1;
-
+
if (shi->mat->tx_limit <= 0.0f) {
d= 1.0f;
}
@@ -670,7 +670,7 @@ static void ray_fadeout_endcolor(float col[3], ShadeInput *origshi, ShadeInput *
else if (origshi->mat->fadeto_mir == MA_RAYMIR_FADETOSKY) {
copy_v3_v3(shi->view, vec);
normalize_v3(shi->view);
-
+
shadeSkyView(col, isec->start, shi->view, NULL, shi->thread);
shadeSunView(col, shi->view);
}
@@ -682,7 +682,7 @@ static void ray_fadeout(Isect *is, ShadeInput *shi, float col[3], const float bl
float blendfac;
blendfac = 1.0f - len_v3v3(shi->co, is->start)/dist_mir;
-
+
col[0] = col[0]*blendfac + (1.0f - blendfac)*blendcol[0];
col[1] = col[1]*blendfac + (1.0f - blendfac)*blendcol[1];
col[2] = col[2]*blendfac + (1.0f - blendfac)*blendcol[2];
@@ -704,7 +704,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
zero_v4(col);
return;
}
-
+
copy_v3_v3(isec.start, start);
copy_v3_v3(isec.dir, dir);
isec.dist = dist_mir > 0 ? dist_mir : RE_RAYTRACE_MAXDIST;
@@ -716,7 +716,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
isec.orig.ob = obi;
isec.orig.face = vlr;
RE_RC_INIT(isec, shi);
-
+
/* database is in original view, obi->imat transforms current position back to original */
RE_instance_rotate_ray(origshi->obi, &isec);
@@ -725,11 +725,11 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
float d= 1.0f;
RE_instance_rotate_ray_restore(origshi->obi, &isec);
-
+
/* for as long we don't have proper dx/dy transform for rays we copy over original */
copy_v3_v3(shi.dxco, origshi->dxco);
copy_v3_v3(shi.dyco, origshi->dyco);
-
+
shi.mask= origshi->mask;
shi.osatex= origshi->osatex;
shi.depth= origshi->depth + 1; /* only used to indicate tracing */
@@ -744,18 +744,18 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
//shi.do_preview = false; // memset above, so don't need this
shi.light_override= origshi->light_override;
shi.mat_override= origshi->mat_override;
-
+
shade_ray(&isec, &shi, &shr);
/* ray has traveled inside the material, so shade by transmission */
if (traflag & RAY_INSIDE)
d= shade_by_transmission(&isec, &shi, &shr);
-
+
if (depth>0) {
float fr, fg, fb, f1;
if ((shi.mat->mode_l & MA_TRANSP) && shr.alpha < 1.0f && (shi.mat->mode_l & (MA_ZTRANSP | MA_RAYTRANSP))) {
float nf, f, refract[3], tracol[4];
-
+
tracol[0]= shi.r;
tracol[1]= shi.g;
tracol[2]= shi.b;
@@ -764,7 +764,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
if ((shi.mat->mode & MA_TRANSP) && (shi.mat->mode & MA_RAYTRANSP)) {
/* don't overwrite traflag, it's value is used in mirror reflection */
int new_traflag = traflag;
-
+
if (new_traflag & RAY_INSIDE) {
/* inside the material, so use inverse normal */
float norm[3];
@@ -795,7 +795,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
}
else
traceray(origshi, origshr, depth-1, shi.co, shi.view, tracol, shi.obi, shi.vlr, 0);
-
+
f= shr.alpha; f1= 1.0f-f;
nf= (shi.mat->mode & MA_RAYTRANSP) ? d * shi.mat->filter : 0.0f;
fr= 1.0f+ nf*(shi.r-1.0f);
@@ -804,7 +804,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
shr.diff[0]= f*shr.diff[0] + f1*fr*tracol[0];
shr.diff[1]= f*shr.diff[1] + f1*fg*tracol[1];
shr.diff[2]= f*shr.diff[2] + f1*fb*tracol[2];
-
+
shr.spec[0] *=f;
shr.spec[1] *=f;
shr.spec[2] *=f;
@@ -821,14 +821,14 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
if (f!=0.0f) f*= fresnel_fac(shi.view, shi.vn, shi.mat->fresnel_mir_i, shi.mat->fresnel_mir);
}
else f= 0.0f;
-
+
if (f!=0.0f) {
float mircol[4];
float ref[3];
-
+
reflection_simple(ref, shi.vn, shi.view);
traceray(origshi, origshr, depth-1, shi.co, ref, mircol, shi.obi, shi.vlr, traflag);
-
+
f1= 1.0f-f;
/* combine */
@@ -836,11 +836,11 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
//col[0]+= shr.spec[0];
//col[1]+= shr.spec[1];
//col[2]+= shr.spec[2];
-
+
fr= shi.mirr;
fg= shi.mirg;
fb= shi.mirb;
-
+
col[0]= f*fr*(1.0f-shr.spec[0])*mircol[0] + f1*shr.diff[0] + shr.spec[0];
col[1]= f*fg*(1.0f-shr.spec[1])*mircol[1] + f1*shr.diff[1] + shr.spec[1];
col[2]= f*fb*(1.0f-shr.spec[2])*mircol[2] + f1*shr.diff[2] + shr.spec[2];
@@ -850,10 +850,10 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
col[1]= shr.diff[1] + shr.spec[1];
col[2]= shr.diff[2] + shr.spec[2];
}
-
+
if (dist_mir > 0.0f) {
float blendcol[3];
-
+
/* max ray distance set, but found an intersection, so fade this color
* out towards the sky/material color for a smooth transition */
ray_fadeout_endcolor(blendcol, origshi, &shi, origshr, &isec, dir);
@@ -865,7 +865,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
col[1]= shr.diff[1] + shr.spec[1];
col[2]= shr.diff[2] + shr.spec[2];
}
-
+
}
else {
ray_fadeout_endcolor(col, origshi, &shi, origshr, &isec, dir);
@@ -882,11 +882,11 @@ static void DP_energy(float *table, float vec[2], int tot, float xsize, float ys
int x, y, a;
float *fp, force[3], result[3];
float dx, dy, dist, min;
-
+
min= MIN2(xsize, ysize);
min*= min;
result[0]= result[1]= 0.0f;
-
+
for (y= -1; y<2; y++) {
dy= ysize*y;
for (x= -1; x<2; x++) {
@@ -917,7 +917,7 @@ static void jitter_plane_offset(float *jitter1, float *jitter2, int tot, float s
float dsizey= sizey*ofsy;
float hsizex= 0.5f*sizex, hsizey= 0.5f*sizey;
int x;
-
+
for (x=tot; x>0; x--, jitter1+=2, jitter2+=2) {
jitter2[0]= jitter1[0] + dsizex;
jitter2[1]= jitter1[1] + dsizey;
@@ -932,15 +932,15 @@ void init_jitter_plane(LampRen *lar)
{
float *fp;
int x, tot= lar->ray_totsamp;
-
+
/* test if already initialized */
if (lar->jitter) return;
-
+
/* at least 4, or max threads+1 tables */
if (BLENDER_MAX_THREADS < 4) x= 4;
else x= BLENDER_MAX_THREADS+1;
fp= lar->jitter= MEM_callocN(x*tot*2*sizeof(float), "lamp jitter tab");
-
+
/* if 1 sample, we leave table to be zero's */
if (tot>1) {
/* set per-lamp fixed seed */
@@ -952,7 +952,7 @@ void init_jitter_plane(LampRen *lar)
fp[0]= (BLI_rng_get_float(rng)-0.5f)*lar->area_size;
fp[1]= (BLI_rng_get_float(rng)-0.5f)*lar->area_sizey;
}
-
+
while (iter--) {
fp= lar->jitter;
for (x=tot; x>0; x--, fp+=2) {
@@ -972,15 +972,15 @@ void init_jitter_plane(LampRen *lar)
static float *give_jitter_plane(LampRen *lar, int thread, int xs, int ys)
{
int tot;
-
+
tot= lar->ray_totsamp;
-
+
if (lar->ray_samp_type & LA_SAMP_JITTER) {
/* made it threadsafe */
-
+
if (lar->xold[thread]!=xs || lar->yold[thread]!=ys) {
jitter_plane_offset(lar->jitter, lar->jitter+2*(thread+1)*tot, tot, lar->area_size, lar->area_sizey, BLI_thread_frand(thread), BLI_thread_frand(thread));
- lar->xold[thread]= xs;
+ lar->xold[thread]= xs;
lar->yold[thread]= ys;
}
return lar->jitter+2*(thread+1)*tot;
@@ -988,7 +988,7 @@ static float *give_jitter_plane(LampRen *lar, int thread, int xs, int ys)
if (lar->ray_samp_type & LA_SAMP_DITHER) {
return lar->jitter + 2*tot*((xs & 1)+2*(ys & 1));
}
-
+
return lar->jitter;
}
@@ -1003,21 +1003,21 @@ static void halton_sample(double *ht_invprimes, double *ht_nums, double *v)
for (i = 0; i < 2; i++) {
double r = fabs((1.0 - ht_nums[i]) - 1e-10);
-
+
if (ht_invprimes[i] >= r) {
double lasth;
double h = ht_invprimes[i];
-
+
do {
lasth = h;
h *= ht_invprimes[i];
} while (h >= r);
-
+
ht_nums[i] += ((lasth + h) - 1.0);
}
else
ht_nums[i] += ht_invprimes[i];
-
+
v[i] = (float)ht_nums[i];
}
}
@@ -1036,23 +1036,23 @@ static void hammersley_create(double *out, int n)
t += p;
}
}
-
+
out[2 * k + 0] = (double)k / (double)n;
out[2 * k + 1] = t;
}
}
static struct QMCSampler *QMC_initSampler(int type, int tot)
-{
+{
QMCSampler *qsa = MEM_callocN(sizeof(QMCSampler), "qmc sampler");
qsa->samp2d = MEM_callocN(2*sizeof(double)*tot, "qmc sample table");
qsa->tot = tot;
qsa->type = type;
-
- if (qsa->type==SAMP_TYPE_HAMMERSLEY)
+
+ if (qsa->type==SAMP_TYPE_HAMMERSLEY)
hammersley_create(qsa->samp2d, qsa->tot);
-
+
return qsa;
}
@@ -1065,19 +1065,19 @@ static void QMC_initPixel(QMCSampler *qsa, int thread)
qsa->offs[thread][1] = 0.5f * BLI_thread_frand(thread);
}
else { /* SAMP_TYPE_HALTON */
-
+
/* generate a new randomized halton sequence per pixel
- * to alleviate qmc artifacts and make it reproducible
+ * to alleviate qmc artifacts and make it reproducible
* between threads/frames */
double ht_invprimes[2], ht_nums[2];
double r[2];
int i;
-
+
ht_nums[0] = BLI_thread_frand(thread);
ht_nums[1] = BLI_thread_frand(thread);
ht_invprimes[0] = 0.5;
ht_invprimes[1] = 1.0/3.0;
-
+
for (i=0; i< qsa->tot; i++) {
halton_sample(ht_invprimes, ht_nums, r);
qsa->samp2d[2*i+0] = r[0];
@@ -1109,7 +1109,7 @@ static void QMC_samplePhong(float vec[3], QMCSampler *qsa, int thread, int num,
{
double s[2];
float phi, pz, sqr;
-
+
QMC_getSample(s, qsa, thread, num);
phi = s[0]*2*M_PI;
@@ -1127,7 +1127,7 @@ static void QMC_sampleRect(float vec[3], QMCSampler *qsa, int thread, int num, f
double s[2];
QMC_getSample(s, qsa, thread, num);
-
+
vec[0] = (float)(s[0] - 0.5) * sizex;
vec[1] = (float)(s[1] - 0.5) * sizey;
vec[2] = 0.0f;
@@ -1138,9 +1138,9 @@ static void QMC_sampleDisc(float vec[3], QMCSampler *qsa, int thread, int num, f
{
double s[2];
float phi, sqr;
-
+
QMC_getSample(s, qsa, thread, num);
-
+
phi = s[0]*2*M_PI;
sqr = sqrt(s[1]);
@@ -1154,9 +1154,9 @@ static void QMC_sampleHemi(float vec[3], QMCSampler *qsa, int thread, int num)
{
double s[2];
float phi, sqr;
-
+
QMC_getSample(s, qsa, thread, num);
-
+
phi = s[0]*2.0*M_PI;
sqr = sqrt(s[1]);
@@ -1171,9 +1171,9 @@ static void QMC_sampleHemiCosine(float vec[3], QMCSampler *qsa, int thread, int
{
double s[2];
float phi, sqr;
-
+
QMC_getSample(s, qsa, thread, num);
-
+
phi = s[0]*2.f*M_PI;
sqr = s[1]*sqrt(2-s[1]*s[1]);
@@ -1241,10 +1241,10 @@ static int adaptive_sample_variance(int samples, const float col[3], const float
{
float var[3], mean[3];
- /* scale threshold just to give a bit more precision in input rather than dealing with
+ /* scale threshold just to give a bit more precision in input rather than dealing with
* tiny tiny numbers in the UI */
thresh /= 2;
-
+
mean[0] = col[0] / (float)samples;
mean[1] = col[1] / (float)samples;
mean[2] = col[2] / (float)samples;
@@ -1252,7 +1252,7 @@ static int adaptive_sample_variance(int samples, const float col[3], const float
var[0] = (colsq[0] / (float)samples) - (mean[0]*mean[0]);
var[1] = (colsq[1] / (float)samples) - (mean[1]*mean[1]);
var[2] = (colsq[2] / (float)samples) - (mean[2]*mean[2]);
-
+
if ((var[0] * 0.4f < thresh) && (var[1] * 0.3f < thresh) && (var[2] * 0.6f < thresh))
return 1;
else
@@ -1262,7 +1262,7 @@ static int adaptive_sample_variance(int samples, const float col[3], const float
static int adaptive_sample_contrast_val(int samples, float prev, float val, float thresh)
{
/* if the last sample's contribution to the total value was below a small threshold
- * (i.e. the samples taken are very similar), then taking more samples that are probably
+ * (i.e. the samples taken are very similar), then taking more samples that are probably
* going to be the same is wasting effort */
if (fabsf(prev / (float)(samples - 1) - val / (float)samples ) < thresh) {
return 1;
@@ -1274,14 +1274,14 @@ static int adaptive_sample_contrast_val(int samples, float prev, float val, floa
static float get_avg_speed(ShadeInput *shi)
{
float pre_x, pre_y, post_x, post_y, speedavg;
-
+
pre_x = (shi->winspeed[0] == PASS_VECTOR_MAX)?0.0f:shi->winspeed[0];
pre_y = (shi->winspeed[1] == PASS_VECTOR_MAX)?0.0f:shi->winspeed[1];
post_x = (shi->winspeed[2] == PASS_VECTOR_MAX)?0.0f:shi->winspeed[2];
post_y = (shi->winspeed[3] == PASS_VECTOR_MAX)?0.0f:shi->winspeed[3];
-
+
speedavg = (sqrtf(pre_x * pre_x + pre_y * pre_y) + sqrtf(post_x * post_x + post_y * post_y)) / 2.0f;
-
+
return speedavg;
}
@@ -1293,17 +1293,17 @@ static void trace_refract(float col[4], ShadeInput *shi, ShadeResult *shr)
QMCSampler *qsa=NULL;
int samp_type;
int traflag=0;
-
+
float samp3d[3], orthx[3], orthy[3];
float v_refract[3], v_refract_new[3];
float sampcol[4], colsq[4];
-
+
float blur = pow3f(1.0f - shi->mat->gloss_tra);
short max_samples = shi->mat->samp_gloss_tra;
float adapt_thresh = shi->mat->adapt_thresh_tra;
-
+
int samples=0;
-
+
colsq[0] = colsq[1] = colsq[2] = 0.0;
col[0] = col[1] = col[2] = 0.0;
col[3]= shr->alpha;
@@ -1311,14 +1311,14 @@ static void trace_refract(float col[4], ShadeInput *shi, ShadeResult *shr)
if (blur > 0.0f) {
if (adapt_thresh != 0.0f) samp_type = SAMP_TYPE_HALTON;
else samp_type = SAMP_TYPE_HAMMERSLEY;
-
+
/* all samples are generated per pixel */
qsa = get_thread_qmcsampler(&R, shi->thread, samp_type, max_samples);
QMC_initPixel(qsa, shi->thread);
}
else
max_samples = 1;
-
+
while (samples < max_samples) {
if (refraction(v_refract, shi->vn, shi->view, shi->ang)) {
@@ -1326,7 +1326,7 @@ static void trace_refract(float col[4], ShadeInput *shi, ShadeResult *shr)
}
else {
/* total external reflection can happen for materials with IOR < 1.0 */
- if ((shi->vlr->flag & R_SMOOTH))
+ if ((shi->vlr->flag & R_SMOOTH))
reflection(v_refract, shi->vn, shi->view, shi->facenor);
else
reflection_simple(v_refract, shi->vn, shi->view);
@@ -1334,58 +1334,58 @@ static void trace_refract(float col[4], ShadeInput *shi, ShadeResult *shr)
/* can't blur total external reflection */
max_samples = 1;
}
-
+
if (max_samples > 1) {
/* get a quasi-random vector from a phong-weighted disc */
QMC_samplePhong(samp3d, qsa, shi->thread, samples, blur);
-
+
ortho_basis_v3v3_v3(orthx, orthy, v_refract);
mul_v3_fl(orthx, samp3d[0]);
mul_v3_fl(orthy, samp3d[1]);
-
+
/* and perturb the refraction vector in it */
add_v3_v3v3(v_refract_new, v_refract, orthx);
add_v3_v3(v_refract_new, orthy);
-
+
normalize_v3(v_refract_new);
}
else {
/* no blurriness, use the original normal */
copy_v3_v3(v_refract_new, v_refract);
}
-
+
sampcol[0]= sampcol[1]= sampcol[2]= sampcol[3]= 0.0f;
traceray(shi, shr, shi->mat->ray_depth_tra, shi->co, v_refract_new, sampcol, shi->obi, shi->vlr, traflag);
-
+
col[0] += sampcol[0];
col[1] += sampcol[1];
col[2] += sampcol[2];
col[3] += sampcol[3];
-
+
/* for variance calc */
colsq[0] += sampcol[0]*sampcol[0];
colsq[1] += sampcol[1]*sampcol[1];
colsq[2] += sampcol[2]*sampcol[2];
-
+
samples++;
-
+
/* adaptive sampling */
if (adapt_thresh < 1.0f && samples > max_samples/2) {
if (adaptive_sample_variance(samples, col, colsq, adapt_thresh))
break;
-
+
/* if the pixel so far is very dark, we can get away with less samples */
if ( (col[0] + col[1] + col[2])/3.0f/(float)samples < 0.01f )
max_samples--;
}
}
-
+
col[0] /= (float)samples;
col[1] /= (float)samples;
col[2] /= (float)samples;
col[3] /= (float)samples;
-
+
if (qsa)
release_thread_qmcsampler(&R, shi->thread, qsa);
}
@@ -1394,34 +1394,34 @@ static void trace_reflect(float col[3], ShadeInput *shi, ShadeResult *shr, float
{
QMCSampler *qsa=NULL;
int samp_type;
-
+
float samp3d[3], orthx[3], orthy[3];
float v_nor_new[3], v_reflect[3];
float sampcol[4], colsq[4];
-
+
float blur = pow3f(1.0f - shi->mat->gloss_mir);
short max_samples = shi->mat->samp_gloss_mir;
float adapt_thresh = shi->mat->adapt_thresh_mir;
float aniso = 1.0f - shi->mat->aniso_gloss_mir;
-
+
int samples=0;
-
+
col[0] = col[1] = col[2] = 0.0;
colsq[0] = colsq[1] = colsq[2] = 0.0;
-
+
if (blur > 0.0f) {
if (adapt_thresh != 0.0f) samp_type = SAMP_TYPE_HALTON;
else samp_type = SAMP_TYPE_HAMMERSLEY;
-
+
/* all samples are generated per pixel */
qsa = get_thread_qmcsampler(&R, shi->thread, samp_type, max_samples);
QMC_initPixel(qsa, shi->thread);
}
else
max_samples = 1;
-
+
while (samples < max_samples) {
-
+
if (max_samples > 1) {
/* get a quasi-random vector from a phong-weighted disc */
QMC_samplePhong(samp3d, qsa, shi->thread, samples, blur);
@@ -1449,53 +1449,53 @@ static void trace_reflect(float col[3], ShadeInput *shi, ShadeResult *shr, float
/* no blurriness, use the original normal */
copy_v3_v3(v_nor_new, shi->vn);
}
-
- if ((shi->vlr->flag & R_SMOOTH))
+
+ if ((shi->vlr->flag & R_SMOOTH))
reflection(v_reflect, v_nor_new, shi->view, shi->facenor);
else
reflection_simple(v_reflect, v_nor_new, shi->view);
-
+
sampcol[0]= sampcol[1]= sampcol[2]= sampcol[3]= 0.0f;
traceray(shi, shr, shi->mat->ray_depth, shi->co, v_reflect, sampcol, shi->obi, shi->vlr, 0);
-
+
col[0] += sampcol[0];
col[1] += sampcol[1];
col[2] += sampcol[2];
-
+
/* for variance calc */
colsq[0] += sampcol[0]*sampcol[0];
colsq[1] += sampcol[1]*sampcol[1];
colsq[2] += sampcol[2]*sampcol[2];
-
+
samples++;
/* adaptive sampling */
if (adapt_thresh > 0.0f && samples > max_samples/3) {
if (adaptive_sample_variance(samples, col, colsq, adapt_thresh))
break;
-
+
/* if the pixel so far is very dark, we can get away with less samples */
if ( (col[0] + col[1] + col[2])/3.0f/(float)samples < 0.01f )
max_samples--;
-
+
/* reduce samples when reflection is dim due to low ray mirror blend value or fresnel factor
* and when reflection is blurry */
if (fresnelfac < 0.1f * (blur+1)) {
max_samples--;
-
+
/* even more for very dim */
if (fresnelfac < 0.05f * (blur+1))
max_samples--;
}
}
}
-
+
col[0] /= (float)samples;
col[1] /= (float)samples;
col[2] /= (float)samples;
-
+
if (qsa)
release_thread_qmcsampler(&R, shi->thread, qsa);
}
@@ -1507,48 +1507,48 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
float mircol[4], tracol[4];
float diff[3];
int do_tra, do_mir;
-
+
do_tra = ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha != 1.0f && (shi->depth <= shi->mat->ray_depth_tra));
do_mir = ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror != 0.0f && (shi->depth <= shi->mat->ray_depth));
-
+
/* raytrace mirror and refract like to separate the spec color */
if (shi->combinedflag & SCE_PASS_SPEC)
sub_v3_v3v3(diff, shr->combined, shr->spec);
else
copy_v3_v3(diff, shr->combined);
-
+
if (do_tra) {
float olddiff[3], f;
-
+
trace_refract(tracol, shi, shr);
-
+
f= shr->alpha; f1= 1.0f-f;
fr= 1.0f+ shi->mat->filter*(shi->r-1.0f);
fg= 1.0f+ shi->mat->filter*(shi->g-1.0f);
fb= 1.0f+ shi->mat->filter*(shi->b-1.0f);
-
+
/* for refract pass */
copy_v3_v3(olddiff, diff);
-
+
diff[0]= f*diff[0] + f1*fr*tracol[0];
diff[1]= f*diff[1] + f1*fg*tracol[1];
diff[2]= f*diff[2] + f1*fb*tracol[2];
-
+
if (shi->passflag & SCE_PASS_REFRACT)
sub_v3_v3v3(shr->refr, diff, olddiff);
-
+
if (!(shi->combinedflag & SCE_PASS_REFRACT))
sub_v3_v3v3(diff, diff, shr->refr);
-
+
shr->alpha = min_ff(1.0f, tracol[3]);
}
-
+
if (do_mir) {
const float i= shi->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->mat->fresnel_mir_i, shi->mat->fresnel_mir);
if (i!=0.0f) {
-
+
trace_reflect(mircol, shi, shr, i);
-
+
fr= i*shi->mirr;
fg= i*shi->mirg;
fb= i*shi->mirb;
@@ -1559,19 +1559,19 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
shr->refl[1]= fg*mircol[1] - fg*diff[1];
shr->refl[2]= fb*mircol[2] - fb*diff[2];
}
-
+
if (shi->combinedflag & SCE_PASS_REFLECT) {
/* values in shr->spec can be greater than 1.0.
* In this case the mircol uses a zero blending factor, so ignoring it is ok.
* Fixes bug #18837 - when the spec is higher then 1.0,
* diff can become a negative color - Campbell */
-
+
f1= 1.0f-i;
-
+
diff[0] *= f1;
diff[1] *= f1;
diff[2] *= f1;
-
+
if (shr->spec[0]<1.0f) diff[0] += mircol[0] * (fr*(1.0f-shr->spec[0]));
if (shr->spec[1]<1.0f) diff[1] += mircol[1] * (fg*(1.0f-shr->spec[1]));
if (shr->spec[2]<1.0f) diff[2] += mircol[2] * (fb*(1.0f-shr->spec[2]));
@@ -1590,15 +1590,15 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
static void addAlphaLight(float shadfac[4], const float col[3], float alpha, float filter)
{
float fr, fg, fb;
-
+
fr= 1.0f+ filter*(col[0]-1.0f);
fg= 1.0f+ filter*(col[1]-1.0f);
fb= 1.0f+ filter*(col[2]-1.0f);
-
+
shadfac[0]= alpha*col[0] + fr*(1.0f-alpha)*shadfac[0];
shadfac[1]= alpha*col[1] + fg*(1.0f-alpha)*shadfac[1];
shadfac[2]= alpha*col[2] + fb*(1.0f-alpha)*shadfac[2];
-
+
shadfac[3]= (1.0f-alpha)*shadfac[3];
}
@@ -1625,13 +1625,13 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
shi.thread= origshi->thread;
shi.passflag= SCE_PASS_COMBINED;
shi.combinedflag= 0xFFFFFF; /* ray trace does all options */
-
+
shi.xs= origshi->xs;
shi.ys= origshi->ys;
shi.do_manage= origshi->do_manage;
shi.lay= origshi->lay;
shi.nodes= origshi->nodes;
-
+
RE_instance_rotate_ray_restore(origshi->obi, is);
shade_ray(is, &shi, &shr);
@@ -1644,16 +1644,16 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
}
else if (shi.mat->material_type == MA_TYPE_VOLUME) {
const float a = col[3];
-
+
col[0] = a*col[0] + shr.alpha*shr.combined[0];
col[1] = a*col[1] + shr.alpha*shr.combined[1];
col[2] = a*col[2] + shr.alpha*shr.combined[2];
-
+
col[3] = (1.0f - shr.alpha)*a;
}
-
+
if (depth>0 && col[3]>0.0f) {
-
+
/* adapt isect struct */
copy_v3_v3(is->start, shi.co);
is->dist = initial_dist-is->dist;
@@ -1662,7 +1662,7 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
ray_trace_shadow_tra(is, origshi, depth-1, traflag | RAY_TRA, col);
}
-
+
RE_RC_MERGE(&origshi->raycounter, &shi.raycounter);
}
}
@@ -1675,9 +1675,9 @@ static void DS_energy(float *sphere, int tot, float vec[3])
{
float *fp, fac, force[3], res[3];
int a;
-
+
res[0]= res[1]= res[2]= 0.0f;
-
+
for (a=0, fp=sphere; a<tot; a++, fp+=3) {
sub_v3_v3v3(force, vec, fp);
fac = dot_v3v3(force, force);
@@ -1692,7 +1692,7 @@ static void DS_energy(float *sphere, int tot, float vec[3])
mul_v3_fl(res, 0.5);
add_v3_v3(vec, res);
normalize_v3(vec);
-
+
}
/* called from convertBlenderScene.c */
@@ -1708,22 +1708,22 @@ void init_ao_sphere(Render *re, World *wrld)
/* we make twice the amount of samples, because only a hemisphere is used */
tot= 2*wrld->aosamp*wrld->aosamp;
-
+
wrld->aosphere= MEM_mallocN(3*tot*sizeof(float), "AO sphere");
rng = BLI_rng_new_srandom(tot);
-
+
/* init */
fp= wrld->aosphere;
for (a=0; a<tot; a++, fp+= 3) {
BLI_rng_get_float_unit_v3(rng, fp);
}
-
+
while (iter--) {
for (a=0, fp= wrld->aosphere; a<tot; a++, fp+= 3) {
DS_energy(wrld->aosphere, tot, fp);
}
}
-
+
/* tables */
wrld->aotables= MEM_mallocN(num_threads*3*tot*sizeof(float), "AO tables");
@@ -1735,13 +1735,13 @@ static float *threadsafe_table_sphere(int test, int thread, int xs, int ys, int
{
static int xso[BLENDER_MAX_THREADS], yso[BLENDER_MAX_THREADS];
static int firsttime= 1;
-
+
if (firsttime) {
memset(xso, 255, sizeof(xso));
memset(yso, 255, sizeof(yso));
firsttime= 0;
}
-
+
if (xs==xso[thread] && ys==yso[thread]) return R.wrld.aotables+ thread*tot*3;
if (test) return NULL;
xso[thread]= xs; yso[thread]= ys;
@@ -1752,7 +1752,7 @@ static float *sphere_sampler(int type, int resol, int thread, int xs, int ys, in
{
int tot;
float *vec;
-
+
tot= 2*resol*resol;
if (type & WO_AORNDSMP) {
@@ -1760,7 +1760,7 @@ static float *sphere_sampler(int type, int resol, int thread, int xs, int ys, in
RNG *rng = BLI_rng_new(BLI_thread_rand(thread));
float *sphere;
int a;
-
+
/* always returns table */
sphere= threadsafe_table_sphere(0, thread, xs, ys, tot);
@@ -1770,13 +1770,13 @@ static float *sphere_sampler(int type, int resol, int thread, int xs, int ys, in
}
BLI_rng_free(rng);
-
+
return sphere;
}
else {
float *sphere;
float *vec1;
-
+
/* returns table if xs and ys were equal to last call, and not resetting */
sphere= (reset)? NULL: threadsafe_table_sphere(1, thread, xs, ys, tot);
if (sphere==NULL) {
@@ -1785,13 +1785,13 @@ static float *sphere_sampler(int type, int resol, int thread, int xs, int ys, in
int a;
sphere= threadsafe_table_sphere(0, thread, xs, ys, tot);
-
+
/* random rotation */
ang = BLI_thread_frand(thread);
sinfi = sinf(ang); cosfi = cosf(ang);
ang = BLI_thread_frand(thread);
sint = sinf(ang); cost = cosf(ang);
-
+
vec= R.wrld.aosphere;
vec1= sphere;
for (a=0; a<tot; a++, vec+=3, vec1+=3) {
@@ -1811,18 +1811,18 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
QMCSampler *qsa=NULL;
float samp3d[3];
float up[3], side[3], dir[3], nrm[3];
-
+
float maxdist = R.wrld.aodist;
float fac=0.0f, prev=0.0f;
float adapt_thresh = R.wrld.ao_adapt_thresh;
float adapt_speed_fac = R.wrld.ao_adapt_speed_fac;
-
+
int samples=0;
int max_samples = R.wrld.aosamp*R.wrld.aosamp;
-
+
float dxyview[3], skyadded=0;
int envcolor;
-
+
RE_RC_INIT(isec, *shi);
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
@@ -1834,31 +1834,31 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
isec.hit.face = NULL;
isec.last_hit = NULL;
-
+
isec.mode= (R.wrld.aomode & WO_AODIST)?RE_RAY_SHADOW_TRA:RE_RAY_SHADOW;
isec.lay= -1;
-
+
copy_v3_v3(isec.start, shi->co);
-
+
RE_instance_rotate_ray_start(shi->obi, &isec);
-
+
RE_rayobject_hint_bb(R.raytree, &point_hint, isec.start, isec.start);
isec.hint = &point_hint;
zero_v3(ao);
zero_v3(env);
-
+
/* prevent sky colors to be added for only shadow (shadow becomes alpha) */
envcolor= R.wrld.aocolor;
if (shi->mat->mode & MA_ONLYSHADOW)
envcolor= WO_AOPLAIN;
-
+
if (envcolor == WO_AOSKYTEX) {
dxyview[0]= 1.0f/(float)R.wrld.aosamp;
dxyview[1]= 1.0f/(float)R.wrld.aosamp;
dxyview[2]= 0.0f;
}
-
+
if (shi->vlr->flag & R_SMOOTH) {
copy_v3_v3(nrm, shi->vn);
}
@@ -1867,23 +1867,23 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
}
ortho_basis_v3v3_v3(up, side, nrm);
-
+
/* sampling init */
if (R.wrld.ao_samp_method==WO_AOSAMP_HALTON) {
float speedfac;
-
+
speedfac = get_avg_speed(shi) * adapt_speed_fac;
CLAMP(speedfac, 1.0f, 1000.0f);
max_samples /= speedfac;
if (max_samples < 5) max_samples = 5;
-
+
qsa = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HALTON, max_samples);
}
else if (R.wrld.ao_samp_method==WO_AOSAMP_HAMMERSLEY)
qsa = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HAMMERSLEY, max_samples);
QMC_initPixel(qsa, shi->thread);
-
+
while (samples < max_samples) {
/* sampling, returns quasi-random vector in unit hemisphere */
@@ -1892,18 +1892,18 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
dir[0] = (samp3d[0]*up[0] + samp3d[1]*side[0] + samp3d[2]*nrm[0]);
dir[1] = (samp3d[0]*up[1] + samp3d[1]*side[1] + samp3d[2]*nrm[1]);
dir[2] = (samp3d[0]*up[2] + samp3d[1]*side[2] + samp3d[2]*nrm[2]);
-
+
normalize_v3(dir);
-
+
isec.dir[0] = -dir[0];
isec.dir[1] = -dir[1];
isec.dir[2] = -dir[2];
isec.dist = maxdist;
-
+
RE_instance_rotate_ray_dir(shi->obi, &isec);
-
+
prev = fac;
-
+
if (RE_rayobject_raycast(R.raytree, &isec)) {
if (R.wrld.aomode & WO_AODIST) fac+= expf(-isec.dist*R.wrld.aodistfac);
else fac+= 1.0f;
@@ -1911,12 +1911,12 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
else if (envcolor!=WO_AOPLAIN) {
float skycol[4];
float view[3];
-
+
view[0]= -dir[0];
view[1]= -dir[1];
view[2]= -dir[2];
normalize_v3(view);
-
+
if (envcolor==WO_AOSKYCOL) {
const float skyfac= 0.5f * (1.0f + dot_v3v3(view, R.grvec));
env[0]+= (1.0f-skyfac)*R.wrld.horr + skyfac*R.wrld.zenr;
@@ -1932,20 +1932,20 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
}
skyadded++;
}
-
+
samples++;
-
+
if (qsa && qsa->type == SAMP_TYPE_HALTON) {
/* adaptive sampling - consider samples below threshold as in shadow (or vice versa) and exit early */
if (adapt_thresh > 0.0f && (samples > max_samples/2) ) {
-
+
if (adaptive_sample_contrast_val(samples, prev, fac, adapt_thresh)) {
break;
}
}
}
}
-
+
/* average color times distances/hits formula */
ao[0]= ao[1]= ao[2]= 1.0f - fac/(float)samples;
@@ -1953,7 +1953,7 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
mul_v3_fl(env, (1.0f - fac/(float)samples)/((float)skyadded));
else
copy_v3_v3(env, ao);
-
+
if (qsa)
release_thread_qmcsampler(&R, shi->thread, qsa);
}
@@ -1967,7 +1967,7 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
float maxdist = R.wrld.aodist;
float dxyview[3];
int j= -1, tot, actual=0, skyadded=0, envcolor, resol= R.wrld.aosamp;
-
+
RE_RC_INIT(isec, *shi);
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
@@ -1977,9 +1977,9 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
isec.hit.ob = NULL;
isec.hit.face = NULL;
-
+
isec.last_hit = NULL;
-
+
isec.mode= (R.wrld.aomode & WO_AODIST)?RE_RAY_SHADOW_TRA:RE_RAY_SHADOW;
isec.lay= -1;
@@ -2006,13 +2006,13 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
envcolor= R.wrld.aocolor;
if (shi->mat->mode & MA_ONLYSHADOW)
envcolor= WO_AOPLAIN;
-
+
if (resol>32) resol= 32;
/* get sphere samples. for faces we get the same samples for sample x/y values,
* for strand render we always require a new sampler because x/y are not set */
vec= sphere_sampler(R.wrld.aomode, resol, shi->thread, shi->xs, shi->ys, shi->strand != NULL);
-
+
/* warning: since we use full sphere now, and dotproduct is below, we do twice as much */
tot= 2*resol*resol;
@@ -2021,9 +2021,9 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
dxyview[1]= 1.0f/(float)resol;
dxyview[2]= 0.0f;
}
-
+
while (tot--) {
-
+
if (dot_v3v3(vec, nrm) > bias) {
/* only ao samples for mask */
if (R.r.mode & R_OSA) {
@@ -2034,15 +2034,15 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
continue;
}
}
-
+
actual++;
-
+
/* always set start/vec/dist */
isec.dir[0] = -vec[0];
isec.dir[1] = -vec[1];
isec.dir[2] = -vec[2];
isec.dist = maxdist;
-
+
RE_instance_rotate_ray_dir(shi->obi, &isec);
/* do the trace */
@@ -2053,12 +2053,12 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
else if (envcolor!=WO_AOPLAIN) {
float skycol[4];
float view[3];
-
+
view[0]= -vec[0];
view[1]= -vec[1];
view[2]= -vec[2];
normalize_v3(view);
-
+
if (envcolor==WO_AOSKYCOL) {
const float fac = 0.5f * (1.0f + dot_v3v3(view, R.grvec));
env[0]+= (1.0f-fac)*R.wrld.horr + fac*R.wrld.zenr;
@@ -2078,10 +2078,10 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
/* samples */
vec+= 3;
}
-
+
if (actual==0) sh= 1.0f;
else sh = 1.0f - sh/((float)actual);
-
+
/* average color times distances/hits formula */
ao[0]= ao[1]= ao[2]= sh;
@@ -2169,10 +2169,10 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
}
else
shadfac[3]= 1.0f;
-
+
if (lar->ray_totsamp < 2) do_soft = false;
if ((R.r.mode & R_OSA) && (R.osa > 0) && (shi->vlr->flag & R_FULL_OSA)) full_osa = true;
-
+
if (full_osa) {
if (do_soft) max_samples = max_samples/R.osa + 1;
else max_samples = 1;
@@ -2182,7 +2182,7 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
else if (shi->depth == 0) max_samples = (R.osa > 4)?R.osa:5;
else max_samples = 1;
}
-
+
ray_shadow_jittered_coords(shi, max_samples, jitco, &totjitco);
/* sampling init */
@@ -2190,7 +2190,7 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
qsa = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HALTON, max_samples);
else if (lar->ray_samp_method==LA_SAMP_HAMMERSLEY)
qsa = get_thread_qmcsampler(&R, shi->thread, SAMP_TYPE_HAMMERSLEY, max_samples);
-
+
QMC_initPixel(qsa, shi->thread);
INIT_MINMAX(min, max);
@@ -2202,19 +2202,19 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
mul_m4_v3(shi->obi->imat, max);
}
RE_rayobject_hint_bb(R.raytree, &bb_hint, min, max);
-
+
isec->hint = &bb_hint;
isec->check = RE_CHECK_VLR_RENDER;
isec->skip = RE_SKIP_VLR_NEIGHBOUR;
copy_v3_v3(vec, lampco);
-
+
while (samples < max_samples) {
isec->orig.ob = shi->obi;
isec->orig.face = shi->vlr;
/* manually jitter the start shading co-ord per sample
- * based on the pre-generated OSA texture sampling offsets,
+ * based on the pre-generated OSA texture sampling offsets,
* for anti-aliasing sharp shadow edges. */
copy_v3_v3(start, jitco[samples % totjitco]);
@@ -2222,12 +2222,12 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
/* sphere shadow source */
if (lar->type == LA_LOCAL) {
float ru[3], rv[3], v[3], s[3];
-
+
/* calc tangent plane vectors */
sub_v3_v3v3(v, start, lampco);
normalize_v3(v);
ortho_basis_v3v3_v3(ru, rv, v);
-
+
/* sampling, returns quasi-random vector in area_size disc */
QMC_sampleDisc(samp3d, qsa, shi->thread, samples, lar->area_size);
@@ -2235,13 +2235,13 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
s[0] = samp3d[0]*ru[0] + samp3d[1]*rv[0];
s[1] = samp3d[0]*ru[1] + samp3d[1]*rv[1];
s[2] = samp3d[0]*ru[2] + samp3d[1]*rv[2];
-
+
copy_v3_v3(samp3d, s);
}
else {
/* sampling, returns quasi-random vector in [sizex,sizey]^2 plane */
QMC_sampleRect(samp3d, qsa, shi->thread, samples, lar->area_size, lar->area_sizey);
-
+
/* align samples to lamp vector */
mul_m3_v3(lar->mat, samp3d);
}
@@ -2265,23 +2265,23 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
start[1] -= jitbias*v[1];
start[2] -= jitbias*v[2];
}
-
+
copy_v3_v3(isec->start, start);
sub_v3_v3v3(isec->dir, end, start);
isec->dist = normalize_v3(isec->dir);
-
+
RE_instance_rotate_ray(shi->obi, isec);
/* trace the ray */
if (isec->mode==RE_RAY_SHADOW_TRA) {
float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
-
+
ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0, col);
shadfac[0] += col[0];
shadfac[1] += col[1];
shadfac[2] += col[2];
shadfac[3] += col[3];
-
+
/* for variance calc */
colsq[0] += col[0]*col[0];
colsq[1] += col[1]*col[1];
@@ -2290,11 +2290,11 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
else {
if ( RE_rayobject_raycast(R.raytree, isec) ) fac+= 1.0f;
}
-
+
samples++;
-
+
if (lar->ray_samp_method == LA_SAMP_HALTON) {
-
+
/* adaptive sampling - consider samples below threshold as in shadow (or vice versa) and exit early */
if ((max_samples > min_adapt_samples) && (adapt_thresh > 0.0f) && (samples > max_samples / 3)) {
if (isec->mode==RE_RAY_SHADOW_TRA) {
@@ -2310,7 +2310,7 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
}
}
}
-
+
if (isec->mode==RE_RAY_SHADOW_TRA) {
shadfac[0] /= samples;
shadfac[1] /= samples;
@@ -2331,32 +2331,32 @@ static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, const float lampco[
float fac=0.0f, div=0.0f, vec[3];
int a, j= -1, mask;
RayHint point_hint;
-
+
if (isec->mode==RE_RAY_SHADOW_TRA) {
shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 0.0f;
}
else shadfac[3]= 1.0f;
-
+
fac= 0.0f;
jitlamp= give_jitter_plane(lar, shi->thread, shi->xs, shi->ys);
a= lar->ray_totsamp;
-
+
/* this correction to make sure we always take at least 1 sample */
mask= shi->mask;
if (a==4) mask |= (mask>>4)|(mask>>8);
else if (a==9) mask |= (mask>>9);
-
+
copy_v3_v3(isec->start, shi->co);
RE_instance_rotate_ray_start(shi->obi, isec);
-
+
isec->orig.ob = shi->obi;
isec->orig.face = shi->vlr;
RE_rayobject_hint_bb(R.raytree, &point_hint, isec->start, isec->start);
isec->hint = &point_hint;
-
+
while (a--) {
-
+
if (R.r.mode & R_OSA) {
j++;
if (j>=R.osa) j= 0;
@@ -2365,27 +2365,27 @@ static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, const float lampco[
continue;
}
}
-
+
vec[0]= jitlamp[0];
vec[1]= jitlamp[1];
vec[2]= 0.0f;
mul_m3_v3(lar->mat, vec);
-
+
/* set start and vec */
isec->dir[0] = vec[0]+lampco[0]-shi->co[0];
isec->dir[1] = vec[1]+lampco[1]-shi->co[1];
isec->dir[2] = vec[2]+lampco[2]-shi->co[2];
-
+
RE_instance_rotate_ray_dir(shi->obi, isec);
-
+
isec->dist = 1.0f;
isec->check = RE_CHECK_VLR_RENDER;
isec->skip = RE_SKIP_VLR_NEIGHBOUR;
-
+
if (isec->mode==RE_RAY_SHADOW_TRA) {
/* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
-
+
ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0, col);
shadfac[0] += col[0];
shadfac[1] += col[1];
@@ -2393,11 +2393,11 @@ static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, const float lampco[
shadfac[3] += col[3];
}
else if ( RE_rayobject_raycast(R.raytree, isec) ) fac+= 1.0f;
-
+
div+= 1.0f;
jitlamp+= 2;
}
-
+
if (isec->mode==RE_RAY_SHADOW_TRA) {
shadfac[0] /= div;
shadfac[1] /= div;
@@ -2423,7 +2423,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float shadfac[4])
if (shi->mat->mode & MA_SHADOW_TRA) isec.mode= RE_RAY_SHADOW_TRA;
else isec.mode= RE_RAY_SHADOW;
isec.hint = NULL;
-
+
if (lar->mode & (LA_LAYER|LA_LAYER_SHADOW))
isec.lay= lar->lay;
else
@@ -2436,7 +2436,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float shadfac[4])
else {
isec.last_hit = NULL;
}
-
+
if (lar->type==LA_SUN || lar->type==LA_HEMI) {
/* jitter and QMC sampling add a displace vector to the lamp position
* that's incorrect because a SUN lamp does not has an exact position
@@ -2444,10 +2444,10 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float shadfac[4])
* lamp position.
* This is easily verified by noticing that shadows of SUN lights change
* with the scene BB.
- *
+ *
* This was detected during SoC 2009 - Raytrace Optimization, but to keep
* consistency with older render code it wasn't removed.
- *
+ *
* If the render code goes through some recode/serious bug-fix then this
* is something to consider!
*/
@@ -2458,18 +2458,18 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float shadfac[4])
else {
copy_v3_v3(lampco, lar->co);
}
-
+
if (ELEM(lar->ray_samp_method, LA_SAMP_HALTON, LA_SAMP_HAMMERSLEY)) {
-
+
ray_shadow_qmc(shi, lar, lampco, shadfac, &isec);
-
+
}
else {
if (lar->ray_totsamp<2) {
-
+
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
-
+
shadfac[3]= 1.0f; /* 1.0=full light */
/* set up isec.dir */
@@ -2493,7 +2493,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float shadfac[4])
ray_shadow_jitter(shi, lar, lampco, shadfac, &isec);
}
}
-
+
/* for first hit optim, set last interesected shadow face */
if (shi->depth==0) {
lar->last_hit[shi->thread] = isec.last_hit;
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index 1531d60c83b..d9e83b209b8 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -95,7 +95,7 @@ void render_result_free(RenderResult *res)
if (rl->acolrect) MEM_freeN(rl->acolrect);
if (rl->scolrect) MEM_freeN(rl->scolrect);
if (rl->display_buffer) MEM_freeN(rl->display_buffer);
-
+
while (rl->passes.first) {
RenderPass *rpass = rl->passes.first;
if (rpass->rect) MEM_freeN(rpass->rect);
@@ -128,13 +128,13 @@ void render_result_free(RenderResult *res)
void render_result_free_list(ListBase *lb, RenderResult *rr)
{
RenderResult *rrnext;
-
+
for (; rr; rr = rrnext) {
rrnext = rr->next;
-
+
if (lb && lb->first)
BLI_remlink(lb, rr);
-
+
render_result_free(rr);
}
}
@@ -206,7 +206,7 @@ static RenderPass *render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int
const int view_id = BLI_findstringindex(&rr->views, viewname, offsetof(RenderView, name));
RenderPass *rpass = MEM_callocN(sizeof(RenderPass), name);
size_t rectsize = ((size_t)rr->rectx) * rr->recty * channels;
-
+
rpass->channels = channels;
rpass->rectx = rl->rectx;
rpass->recty = rl->recty;
@@ -216,7 +216,7 @@ static RenderPass *render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int
BLI_strncpy(rpass->chan_id, chan_id, sizeof(rpass->chan_id));
BLI_strncpy(rpass->view, viewname, sizeof(rpass->view));
set_pass_full_name(rpass->fullname, rpass->name, -1, rpass->view, rpass->chan_id);
-
+
if (rl->exrhandle) {
int a;
for (a = 0; a < channels; a++) {
@@ -227,13 +227,13 @@ static RenderPass *render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int
else {
float *rect;
int x;
-
+
rpass->rect = MEM_mapallocN(sizeof(float) * rectsize, name);
if (rpass->rect == NULL) {
MEM_freeN(rpass);
return NULL;
}
-
+
if (STREQ(rpass->name, RE_PASSNAME_VECTOR)) {
/* initialize to max speed */
rect = rpass->rect;
@@ -269,13 +269,13 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
SceneRenderLayer *srl;
int rectx, recty;
int nr;
-
+
rectx = BLI_rcti_size_x(partrct);
recty = BLI_rcti_size_y(partrct);
-
+
if (rectx <= 0 || recty <= 0)
return NULL;
-
+
rr = MEM_callocN(sizeof(RenderResult), "new render result");
rr->rectx = rectx;
rr->recty = recty;
@@ -288,7 +288,7 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
rr->tilerect.xmax = partrct->xmax - re->disprect.xmin;
rr->tilerect.ymin = partrct->ymin - re->disprect.ymin;
rr->tilerect.ymax = partrct->ymax - re->disprect.ymin;
-
+
if (savebuffers) {
rr->do_exr_tile = true;
}
@@ -310,10 +310,10 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
if (srl->layflag & SCE_LAY_DISABLE)
continue;
}
-
+
rl = MEM_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
-
+
BLI_strncpy(rl->name, srl->name, sizeof(rl->name));
rl->lay = srl->lay;
rl->lay_zmask = srl->lay_zmask;
@@ -325,7 +325,7 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
rl->mat_override = srl->mat_override;
rl->rectx = rectx;
rl->recty = recty;
-
+
if (rr->do_exr_tile) {
rl->display_buffer = MEM_mapallocN((size_t)rectx * recty * sizeof(unsigned int),
"Combined display space rgba");
@@ -424,7 +424,7 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
if (BLI_listbase_is_empty(&rr->layers) && !(layername && layername[0])) {
rl = MEM_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
-
+
rl->rectx = rectx;
rl->recty = recty;
@@ -452,15 +452,15 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
rl->lay = (1 << 20) - 1;
rl->layflag = 0x7FFF; /* solid ztra halo strand */
rl->passflag = SCE_PASS_COMBINED;
-
+
re->r.actlay = 0;
}
-
+
/* border render; calculate offset for use in compositor. compo is centralized coords */
/* XXX obsolete? I now use it for drawing border render offset (ton) */
rr->xof = re->disprect.xmin + BLI_rcti_cent_x(&re->disprect) - (re->winx / 2);
rr->yof = re->disprect.ymin + BLI_rcti_cent_y(&re->disprect) - (re->winy / 2);
-
+
return rr;
}
@@ -522,16 +522,16 @@ void render_result_add_pass(RenderResult *rr, const char *name, int channels, co
RenderResult *render_result_new_full_sample(Render *re, ListBase *lb, rcti *partrct, int crop, int savebuffers, const char *viewname)
{
int a;
-
+
if (re->osa == 0)
return render_result_new(re, partrct, crop, savebuffers, RR_ALL_LAYERS, viewname);
-
+
for (a = 0; a < re->osa; a++) {
RenderResult *rr = render_result_new(re, partrct, crop, savebuffers, RR_ALL_LAYERS, viewname);
BLI_addtail(lb, rr);
rr->sample_nr = a;
}
-
+
return lb->first;
}
@@ -584,7 +584,7 @@ static void *ml_addlayer_cb(void *base, const char *str)
{
RenderResult *rr = base;
RenderLayer *rl;
-
+
rl = MEM_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
@@ -706,7 +706,7 @@ RenderResult *render_result_new_from_exr(void *exrhandle, const char *colorspace
rr->rectx = rectx;
rr->recty = recty;
-
+
IMB_exr_multilayer_convert(exrhandle, rr, ml_addview_cb, ml_addlayer_cb, ml_addpass_cb);
for (rl = rr->layers.first; rl; rl = rl->next) {
@@ -725,7 +725,7 @@ RenderResult *render_result_new_from_exr(void *exrhandle, const char *colorspace
}
}
}
-
+
return rr;
}
@@ -770,16 +770,16 @@ static void do_merge_tile(RenderResult *rr, RenderResult *rrpart, float *target,
{
int y, tilex, tiley;
size_t ofs, copylen;
-
+
copylen = tilex = rrpart->rectx;
tiley = rrpart->recty;
-
+
if (rrpart->crop) { /* filters add pixel extra */
tile += pixsize * (rrpart->crop + ((size_t)rrpart->crop) * tilex);
-
+
copylen = tilex - 2 * rrpart->crop;
tiley -= 2 * rrpart->crop;
-
+
ofs = (((size_t)rrpart->tilerect.ymin) + rrpart->crop) * rr->rectx + (rrpart->tilerect.xmin + rrpart->crop);
target += pixsize * ofs;
}
@@ -806,7 +806,7 @@ void render_result_merge(RenderResult *rr, RenderResult *rrpart)
{
RenderLayer *rl, *rlp;
RenderPass *rpass, *rpassp;
-
+
for (rl = rr->layers.first; rl; rl = rl->next) {
rlp = RE_GetRenderLayer(rrpart, rl->name);
if (rlp) {
@@ -986,7 +986,7 @@ void render_result_single_layer_begin(Render *re)
/* officially pushed result should be NULL... error can happen with do_seq */
RE_FreeRenderResult(re->pushedresult);
-
+
re->pushedresult = re->result;
re->result = NULL;
}
@@ -1010,10 +1010,10 @@ void render_result_single_layer_end(Render *re)
if (re->pushedresult->rectx == re->result->rectx && re->pushedresult->recty == re->result->recty) {
/* find which layer in re->pushedresult should be replaced */
rl = re->result->layers.first;
-
+
/* render result should be empty after this */
BLI_remlink(&re->result->layers, rl);
-
+
/* reconstruct render result layers */
for (nr = 0, srl = re->r.layers.first; srl; srl = srl->next, nr++) {
if (nr == re->r.actlay) {
@@ -1040,9 +1040,9 @@ static void save_render_result_tile(RenderResult *rr, RenderResult *rrpart, cons
RenderLayer *rlp, *rl;
RenderPass *rpassp;
int offs, partx, party;
-
+
BLI_thread_lock(LOCK_IMAGE);
-
+
for (rlp = rrpart->layers.first; rlp; rlp = rlp->next) {
rl = RE_GetRenderLayer(rr, rlp->name);
@@ -1072,7 +1072,7 @@ static void save_render_result_tile(RenderResult *rr, RenderResult *rrpart, cons
xstride, xstride * rrpart->rectx, rpassp->rect + a + xstride * offs);
}
}
-
+
}
party = rrpart->tilerect.ymin + rrpart->crop;
@@ -1098,7 +1098,7 @@ void render_result_save_empty_result_tiles(Render *re)
RenderPart *pa;
RenderResult *rr;
RenderLayer *rl;
-
+
for (rr = re->result; rr; rr = rr->next) {
for (rl = rr->layers.first; rl; rl = rl->next) {
for (pa = re->parts.first; pa; pa = pa->next) {
@@ -1142,7 +1142,7 @@ void render_result_exr_file_end(Render *re)
rr->do_exr_tile = false;
}
-
+
render_result_free_list(&re->fullresult, re->result);
re->result = NULL;
@@ -1161,7 +1161,7 @@ void render_result_exr_file_path(Scene *scene, const char *layname, int sample,
{
char name[FILE_MAXFILE + MAX_ID_NAME + MAX_ID_NAME + 100];
const char *fi = BLI_path_basename(BKE_main_blendfile_path_from_global());
-
+
if (sample == 0) {
BLI_snprintf(name, sizeof(name), "%s_%s_%s.exr", fi, scene->id.name + 2, layname);
}
@@ -1224,7 +1224,7 @@ int render_result_exr_file_read_path(RenderResult *rr, RenderLayer *rl_single, c
for (rl = rr->layers.first; rl; rl = rl->next) {
if (rl_single && rl_single != rl)
continue;
-
+
/* passes are allocated in sync */
for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
const int xstride = rpass->channels;
@@ -1322,7 +1322,7 @@ ImBuf *render_result_rect_to_ibuf(RenderResult *rr, RenderData *rd, const int vi
/* float factor for random dither, imbuf takes care of it */
ibuf->dither = rd->dither_intensity;
-
+
/* prepare to gamma correct to sRGB color space
* note that sequence editor can generate 8bpc render buffers
*/
@@ -1363,7 +1363,7 @@ void RE_render_result_rect_from_ibuf(RenderResult *rr, RenderData *UNUSED(rd), I
if (!rv->rectf)
rv->rectf = MEM_mallocN(4 * sizeof(float) * rr->rectx * rr->recty, "render_seq rectf");
-
+
memcpy(rv->rectf, ibuf->rect_float, 4 * sizeof(float) * rr->rectx * rr->recty);
/* TSK! Since sequence render doesn't free the *rr render result, the old rect32
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index e66dd86a75a..8450098d733 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -103,16 +103,16 @@ static void init_render_texture(Render *re, Tex *tex)
if (tex->ima && BKE_image_is_animated(tex->ima)) {
BKE_image_user_frame_calc(&tex->iuser, re ? re->r.cfra : 0, re ? re->flag & R_SEC_FIELD:0);
}
-
+
else if (tex->type==TEX_ENVMAP) {
/* just in case */
tex->imaflag |= TEX_INTERPOL | TEX_MIPMAP;
tex->extend= TEX_CLIP;
-
+
if (tex->env) {
if (tex->env->type==ENV_PLANE)
tex->extend= TEX_EXTEND;
-
+
/* only free envmap when rendermode was set to render envmaps, for previewrender */
if (G.is_rendering && re) {
if (re->r.mode & R_ENVMAP)
@@ -121,7 +121,7 @@ static void init_render_texture(Render *re, Tex *tex)
}
}
}
-
+
if (tex->nodetree && tex->use_nodes) {
ntreeTexBeginExecTree(tex->nodetree); /* has internal flag to detect it only does it once */
}
@@ -132,7 +132,7 @@ static void init_render_texture(Render *re, Tex *tex)
void init_render_textures(Render *re)
{
Tex *tex;
-
+
tex= re->main->tex.first;
while (tex) {
if (tex->id.us) init_render_texture(re, tex);
@@ -164,7 +164,7 @@ static void tex_normal_derivate(Tex *tex, TexResult *texres)
float col[4];
if (BKE_colorband_evaluate(tex->coba, texres->tin, col)) {
float fac0, fac1, fac2, fac3;
-
+
fac0= (col[0]+col[1]+col[2]);
BKE_colorband_evaluate(tex->coba, texres->nor[0], col);
fac1= (col[0]+col[1]+col[2]);
@@ -172,11 +172,11 @@ static void tex_normal_derivate(Tex *tex, TexResult *texres)
fac2= (col[0]+col[1]+col[2]);
BKE_colorband_evaluate(tex->coba, texres->nor[2], col);
fac3= (col[0]+col[1]+col[2]);
-
+
texres->nor[0]= (fac0 - fac1) / 3.0f;
texres->nor[1]= (fac0 - fac2) / 3.0f;
texres->nor[2]= (fac0 - fac3) / 3.0f;
-
+
return;
}
}
@@ -242,7 +242,7 @@ static int blend(Tex *tex, const float texvec[3], TexResult *texres)
static int clouds(Tex *tex, const float texvec[3], TexResult *texres)
{
int rv = TEX_INT;
-
+
texres->tin = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1], texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
if (texres->nor!=NULL) {
@@ -250,7 +250,7 @@ static int clouds(Tex *tex, const float texvec[3], TexResult *texres)
texres->nor[0] = BLI_gTurbulence(tex->noisesize, texvec[0] + tex->nabla, texvec[1], texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
texres->nor[1] = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1] + tex->nabla, texvec[2], tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
texres->nor[2] = BLI_gTurbulence(tex->noisesize, texvec[0], texvec[1], texvec[2] + tex->nabla, tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
-
+
tex_normal_derivate(tex, texres);
rv |= TEX_NOR;
}
@@ -284,7 +284,7 @@ static float tex_sin(float a)
static float tex_saw(float a)
{
const float b = 2*M_PI;
-
+
int n = (int)(a / b);
a -= n*b;
if (a < 0) a += b;
@@ -296,9 +296,9 @@ static float tex_tri(float a)
{
const float b = 2*M_PI;
const float rmax = 1.0;
-
+
a = rmax - 2.0f*fabsf(floorf((a*(1.0f/b))+0.5f) - (a*(1.0f/b)));
-
+
return a;
}
@@ -313,9 +313,9 @@ static float wood_int(Tex *tex, float x, float y, float z)
waveform[0] = tex_sin; /* assign address of tex_sin() function to pointer array */
waveform[1] = tex_saw;
waveform[2] = tex_tri;
-
+
if ((wf>TEX_TRI) || (wf<TEX_SIN)) wf=0; /* check to be sure noisebasis2 is initialized ahead of time */
-
+
if (wt==TEX_BAND) {
wi = waveform[wf]((x + y + z)*10.0f);
}
@@ -330,7 +330,7 @@ static float wood_int(Tex *tex, float x, float y, float z)
wi = tex->turbul*BLI_gNoise(tex->noisesize, x, y, z, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
wi = waveform[wf](sqrtf(x*x + y*y + z*z)*20.0f + wi);
}
-
+
return wi;
}
@@ -344,7 +344,7 @@ static int wood(Tex *tex, const float texvec[3], TexResult *texres)
texres->nor[0] = wood_int(tex, texvec[0] + tex->nabla, texvec[1], texvec[2]);
texres->nor[1] = wood_int(tex, texvec[0], texvec[1] + tex->nabla, texvec[2]);
texres->nor[2] = wood_int(tex, texvec[0], texvec[1], texvec[2] + tex->nabla);
-
+
tex_normal_derivate(tex, texres);
rv |= TEX_NOR;
}
@@ -360,16 +360,16 @@ static float marble_int(Tex *tex, float x, float y, float z)
float n, mi;
short wf = tex->noisebasis2; /* wave form: TEX_SIN=0, TEX_SAW=1, TEX_TRI=2 */
short mt = tex->stype; /* marble type: TEX_SOFT=0, TEX_SHARP=1,TEX_SHAPER=2 */
-
+
float (*waveform[3])(float); /* create array of pointers to waveform functions */
waveform[0] = tex_sin; /* assign address of tex_sin() function to pointer array */
waveform[1] = tex_saw;
waveform[2] = tex_tri;
-
+
if ((wf>TEX_TRI) || (wf<TEX_SIN)) wf=0; /* check to be sure noisebasis2 isn't initialized ahead of time */
-
+
n = 5.0f * (x + y + z);
-
+
mi = n + tex->turbul * BLI_gTurbulence(tex->noisesize, x, y, z, tex->noisedepth, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
if (mt>=TEX_SOFT) { /* TEX_SOFT always true */
@@ -396,9 +396,9 @@ static int marble(Tex *tex, const float texvec[3], TexResult *texres)
texres->nor[0] = marble_int(tex, texvec[0] + tex->nabla, texvec[1], texvec[2]);
texres->nor[1] = marble_int(tex, texvec[0], texvec[1] + tex->nabla, texvec[2]);
texres->nor[2] = marble_int(tex, texvec[0], texvec[1], texvec[2] + tex->nabla);
-
+
tex_normal_derivate(tex, texres);
-
+
rv |= TEX_NOR;
}
@@ -466,8 +466,8 @@ static int magic(Tex *tex, const float texvec[3], TexResult *texres)
if (turb!=0.0f) {
turb*= 2.0f;
- x/= turb;
- y/= turb;
+ x/= turb;
+ y/= turb;
z/= turb;
}
texres->tr = 0.5f - x;
@@ -475,10 +475,10 @@ static int magic(Tex *tex, const float texvec[3], TexResult *texres)
texres->tb = 0.5f - z;
texres->tin= (1.0f / 3.0f) * (texres->tr + texres->tg + texres->tb);
-
+
BRICONTRGB;
texres->ta = 1.0f;
-
+
return TEX_RGB;
}
@@ -489,9 +489,9 @@ static int stucci(Tex *tex, const float texvec[3], TexResult *texres)
{
float nor[3], b2, ofs;
int retval= TEX_INT;
-
+
b2= BLI_gNoise(tex->noisesize, texvec[0], texvec[1], texvec[2], (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
-
+
ofs= tex->turbul/200.0f;
if (tex->stype) ofs*=(b2*b2);
@@ -500,27 +500,27 @@ static int stucci(Tex *tex, const float texvec[3], TexResult *texres)
nor[2] = BLI_gNoise(tex->noisesize, texvec[0], texvec[1], texvec[2]+ofs, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
texres->tin= nor[2];
-
+
if (texres->nor) {
-
+
copy_v3_v3(texres->nor, nor);
tex_normal_derivate(tex, texres);
-
+
if (tex->stype==TEX_WALLOUT) {
texres->nor[0]= -texres->nor[0];
texres->nor[1]= -texres->nor[1];
texres->nor[2]= -texres->nor[2];
}
-
+
retval |= TEX_NOR;
}
-
+
if (tex->stype==TEX_WALLOUT)
texres->tin= 1.0f-texres->tin;
-
+
if (texres->tin<0.0f)
texres->tin= 0.0f;
-
+
return retval;
}
@@ -546,7 +546,7 @@ static float mg_mFractalOrfBmTex(Tex *tex, const float texvec[3], TexResult *tex
texres->nor[0] = tex->ns_outscale*mgravefunc(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
texres->nor[1] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
texres->nor[2] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->noisebasis);
-
+
tex_normal_derivate(tex, texres);
rv |= TEX_NOR;
}
@@ -576,7 +576,7 @@ static float mg_ridgedOrHybridMFTex(Tex *tex, const float texvec[3], TexResult *
texres->nor[0] = tex->ns_outscale*mgravefunc(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
texres->nor[1] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
texres->nor[2] = tex->ns_outscale*mgravefunc(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->mg_gain, tex->noisebasis);
-
+
tex_normal_derivate(tex, texres);
rv |= TEX_NOR;
}
@@ -601,7 +601,7 @@ static float mg_HTerrainTex(Tex *tex, const float texvec[3], TexResult *texres)
texres->nor[0] = tex->ns_outscale*mg_HeteroTerrain(texvec[0] + offs, texvec[1], texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
texres->nor[1] = tex->ns_outscale*mg_HeteroTerrain(texvec[0], texvec[1] + offs, texvec[2], tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
texres->nor[2] = tex->ns_outscale*mg_HeteroTerrain(texvec[0], texvec[1], texvec[2] + offs, tex->mg_H, tex->mg_lacunarity, tex->mg_octaves, tex->mg_offset, tex->noisebasis);
-
+
tex_normal_derivate(tex, texres);
rv |= TEX_NOR;
}
@@ -699,7 +699,7 @@ static float voronoiTex(Tex *tex, const float texvec[3], TexResult *texres)
texres->nor[1] = sc * fabsf(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
voronoi(texvec[0], texvec[1], texvec[2] + offs, da, pa, tex->vn_mexp, tex->vn_distm);
texres->nor[2] = sc * fabsf(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
-
+
tex_normal_derivate(tex, texres);
rv |= TEX_NOR;
}
@@ -709,7 +709,7 @@ static float voronoiTex(Tex *tex, const float texvec[3], TexResult *texres)
texres->ta = 1.0;
return (rv | TEX_RGB);
}
-
+
BRICONT;
return rv;
@@ -722,20 +722,20 @@ static int texnoise(Tex *tex, TexResult *texres, int thread)
{
float div=3.0;
int val, ran, loop, shift = 29;
-
+
ran= BLI_rng_thread_rand(random_tex_array, thread);
-
+
loop= tex->noisedepth;
/* start from top bits since they have more variance */
val= ((ran >> shift) & 3);
-
+
while (loop--) {
- shift -= 2;
+ shift -= 2;
val *= ((ran >> shift) & 3);
div *= 3.0f;
}
-
+
texres->tin= ((float)val)/div;
BRICONT;
@@ -748,7 +748,7 @@ static int cubemap_glob(const float n[3], float x, float y, float z, float *adr1
{
float x1, y1, z1, nor[3];
int ret;
-
+
if (n==NULL) {
nor[0]= x; nor[1]= y; nor[2]= z; /* use local render coord */
}
@@ -760,7 +760,7 @@ static int cubemap_glob(const float n[3], float x, float y, float z, float *adr1
x1 = fabsf(nor[0]);
y1 = fabsf(nor[1]);
z1 = fabsf(nor[2]);
-
+
if (z1>=x1 && z1>=y1) {
*adr1 = (x + 1.0f) / 2.0f;
*adr2 = (y + 1.0f) / 2.0f;
@@ -786,24 +786,24 @@ static int cubemap(
const MTex *mtex, VlakRen *vlr, const float n[3], float x, float y, float z, float *adr1, float *adr2)
{
int proj[4]={0, ME_PROJXY, ME_PROJXZ, ME_PROJYZ}, ret= 0;
-
+
if (vlr) {
int index;
-
+
/* Mesh vertices have such flags, for others we calculate it once based on orco */
if ((vlr->puno & (ME_PROJXY|ME_PROJXZ|ME_PROJYZ))==0) {
/* test for v1, vlr can be faked for baking */
if (vlr->v1 && vlr->v1->orco) {
float nor[3];
normal_tri_v3(nor, vlr->v1->orco, vlr->v2->orco, vlr->v3->orco);
-
+
if (fabsf(nor[0]) < fabsf(nor[2]) && fabsf(nor[1]) < fabsf(nor[2])) vlr->puno |= ME_PROJXY;
else if (fabsf(nor[0]) < fabsf(nor[1]) && fabsf(nor[2]) < fabsf(nor[1])) vlr->puno |= ME_PROJXZ;
else vlr->puno |= ME_PROJYZ;
}
else return cubemap_glob(n, x, y, z, adr1, adr2);
}
-
+
if (mtex) {
/* the mtex->proj{xyz} have type char. maybe this should be wider? */
/* casting to int ensures that the index type is right. */
@@ -816,7 +816,7 @@ static int cubemap(
index = (int) mtex->projz;
proj[index]= ME_PROJYZ;
}
-
+
if (vlr->puno & proj[1]) {
*adr1 = (x + 1.0f) / 2.0f;
*adr2 = (y + 1.0f) / 2.0f;
@@ -835,7 +835,7 @@ static int cubemap(
else {
return cubemap_glob(n, x, y, z, adr1, adr2);
}
-
+
return ret;
}
@@ -845,16 +845,16 @@ static int cubemap_ob(Object *ob, const float n[3], float x, float y, float z, f
{
float x1, y1, z1, nor[3];
int ret;
-
+
if (n==NULL) return 0;
-
+
copy_v3_v3(nor, n);
if (ob) mul_mat3_m4_v3(ob->imat, nor);
-
+
x1 = fabsf(nor[0]);
y1 = fabsf(nor[1]);
z1 = fabsf(nor[2]);
-
+
if (z1>=x1 && z1>=y1) {
*adr1 = (x + 1.0f) / 2.0f;
*adr2 = (y + 1.0f) / 2.0f;
@@ -882,7 +882,7 @@ static void do_2d_mapping(
Object *ob= NULL;
float fx, fy, fac1, area[8];
int ok, proj, areaflag= 0, wrap, texco;
-
+
/* mtex variables localized, only cubemap doesn't cooperate yet... */
wrap= mtex->mapping;
tex= mtex->tex;
@@ -890,7 +890,7 @@ static void do_2d_mapping(
texco= mtex->texco;
if (R.osa==0) {
-
+
if (wrap==MTEX_FLAT) {
fx = (texvec[0] + 1.0f) / 2.0f;
fy = (texvec[1] + 1.0f) / 2.0f;
@@ -902,15 +902,15 @@ static void do_2d_mapping(
else if (texco == TEXCO_GLOB) cubemap_glob(n, texvec[0], texvec[1], texvec[2], &fx, &fy);
else cubemap(mtex, vlr, n, texvec[0], texvec[1], texvec[2], &fx, &fy);
}
-
+
/* repeat */
if (tex->extend==TEX_REPEAT) {
if (tex->xrepeat>1) {
float origf= fx *= tex->xrepeat;
-
+
if (fx>1.0f) fx -= (int)(fx);
else if (fx<0.0f) fx+= 1-(int)(fx);
-
+
if (tex->flag & TEX_REPEAT_XMIR) {
int orig= (int)floor(origf);
if (orig & 1)
@@ -919,10 +919,10 @@ static void do_2d_mapping(
}
if (tex->yrepeat>1) {
float origf= fy *= tex->yrepeat;
-
+
if (fy>1.0f) fy -= (int)(fy);
else if (fy<0.0f) fy+= 1-(int)(fy);
-
+
if (tex->flag & TEX_REPEAT_YMIR) {
int orig= (int)floor(origf);
if (orig & 1)
@@ -944,7 +944,7 @@ static void do_2d_mapping(
texvec[1]= fy;
}
else {
-
+
if (wrap==MTEX_FLAT) {
fx= (texvec[0] + 1.0f) / 2.0f;
fy= (texvec[1] + 1.0f) / 2.0f;
@@ -1023,55 +1023,55 @@ static void do_2d_mapping(
dyt[2] *= 0.5f;
}
-
+
/* if area, then reacalculate dxt[] and dyt[] */
if (areaflag) {
- fx= area[0];
+ fx= area[0];
fy= area[1];
dxt[0]= area[2]-fx;
dxt[1]= area[3]-fy;
dyt[0]= area[4]-fx;
dyt[1]= area[5]-fy;
}
-
+
/* repeat */
if (tex->extend==TEX_REPEAT) {
float max= 1.0f;
if (tex->xrepeat>1) {
float origf= fx *= tex->xrepeat;
-
+
/* TXF: omit mirror here, see comments in do_material_tex() after do_2d_mapping() call */
if (tex->texfilter == TXF_BOX) {
if (fx>1.0f) fx -= (int)(fx);
else if (fx<0.0f) fx+= 1-(int)(fx);
-
+
if (tex->flag & TEX_REPEAT_XMIR) {
int orig= (int)floor(origf);
if (orig & 1)
fx= 1.0f-fx;
}
}
-
+
max= tex->xrepeat;
-
+
dxt[0]*= tex->xrepeat;
dyt[0]*= tex->xrepeat;
}
if (tex->yrepeat>1) {
float origf= fy *= tex->yrepeat;
-
+
/* TXF: omit mirror here, see comments in do_material_tex() after do_2d_mapping() call */
if (tex->texfilter == TXF_BOX) {
if (fy>1.0f) fy -= (int)(fy);
else if (fy<0.0f) fy+= 1-(int)(fy);
-
+
if (tex->flag & TEX_REPEAT_YMIR) {
int orig= (int)floor(origf);
if (orig & 1)
fy= 1.0f-fy;
}
}
-
+
if (max<tex->yrepeat)
max= tex->yrepeat;
@@ -1082,7 +1082,7 @@ static void do_2d_mapping(
dxt[2]*= max;
dyt[2]*= max;
}
-
+
}
/* crop */
if (tex->cropxmin!=0.0f || tex->cropxmax!=1.0f) {
@@ -1097,7 +1097,7 @@ static void do_2d_mapping(
dxt[1]*= fac1;
dyt[1]*= fac1;
}
-
+
texvec[0]= fx;
texvec[1]= fy;
@@ -1122,7 +1122,7 @@ static int multitex(Tex *tex,
int retval = 0; /* return value, int:0, col:1, nor:2, everything:3 */
texres->talpha = false; /* is set when image texture returns alpha (considered premul) */
-
+
if (use_nodes && tex->use_nodes && tex->nodetree) {
retval = ntreeTexExecTree(tex->nodetree, texres, texvec, dxt, dyt, osatex, thread,
tex, which_output, R.r.cfra, texnode_preview, NULL, NULL);
@@ -1253,7 +1253,7 @@ static int multitex_nodes_intern(Tex *tex,
if (mtex)
which_output= mtex->which_output;
-
+
if (tex->type==TEX_IMAGE) {
int rgbnor;
@@ -1274,7 +1274,7 @@ static int multitex_nodes_intern(Tex *tex,
if (mtex->mapto & (MAP_COL+MAP_COLSPEC+MAP_COLMIR)) {
ImBuf *ibuf = BKE_image_pool_acquire_ibuf(tex->ima, &tex->iuser, pool);
-
+
/* don't linearize float buffers, assumed to be linear */
if (ibuf != NULL &&
ibuf->rect_float == NULL &&
@@ -1291,12 +1291,12 @@ static int multitex_nodes_intern(Tex *tex,
/* we don't have mtex, do default flat 2d projection */
MTex localmtex;
float texvec_l[3], dxt_l[3], dyt_l[3];
-
+
localmtex.mapping= MTEX_FLAT;
localmtex.tex= tex;
localmtex.object= NULL;
localmtex.texco= TEXCO_ORCO;
-
+
copy_v3_v3(texvec_l, texvec);
if (dxt && dyt) {
copy_v3_v3(dxt_l, dxt);
@@ -1306,7 +1306,7 @@ static int multitex_nodes_intern(Tex *tex,
zero_v3(dxt_l);
zero_v3(dyt_l);
}
-
+
do_2d_mapping(&localmtex, texvec_l, NULL, NULL, dxt_l, dyt_l);
rgbnor = multitex(tex,
texvec_l,
@@ -1451,7 +1451,7 @@ int multitex_ext_safe(Tex *tex, float texvec[3], TexResult *texres, struct Image
void texture_rgb_blend(float in[3], const float tex[3], const float out[3], float fact, float facg, int blendtype)
{
float facm;
-
+
switch (blendtype) {
case MTEX_BLEND:
fact*= facg;
@@ -1461,7 +1461,7 @@ void texture_rgb_blend(float in[3], const float tex[3], const float out[3], floa
in[1]= (fact*tex[1] + facm*out[1]);
in[2]= (fact*tex[2] + facm*out[2]);
break;
-
+
case MTEX_MUL:
fact*= facg;
facm= 1.0f-fact;
@@ -1481,7 +1481,7 @@ void texture_rgb_blend(float in[3], const float tex[3], const float out[3], floa
case MTEX_OVERLAY:
fact*= facg;
facm= 1.0f-fact;
-
+
if (out[0] < 0.5f)
in[0] = out[0] * (facm + 2.0f*fact*tex[0]);
else
@@ -1495,7 +1495,7 @@ void texture_rgb_blend(float in[3], const float tex[3], const float out[3], floa
else
in[2] = 1.0f - (facm + 2.0f*fact*(1.0f - tex[2])) * (1.0f - out[2]);
break;
-
+
case MTEX_SUB:
fact= -fact;
ATTR_FALLTHROUGH;
@@ -1509,7 +1509,7 @@ void texture_rgb_blend(float in[3], const float tex[3], const float out[3], floa
case MTEX_DIV:
fact*= facg;
facm= 1.0f-fact;
-
+
if (tex[0]!=0.0f)
in[0]= facm*out[0] + fact*out[0]/tex[0];
if (tex[1]!=0.0f)
@@ -1530,7 +1530,7 @@ void texture_rgb_blend(float in[3], const float tex[3], const float out[3], floa
case MTEX_DARK:
fact*= facg;
facm= 1.0f-fact;
-
+
in[0] = min_ff(out[0], tex[0])*fact + out[0]*facm;
in[1] = min_ff(out[1], tex[1])*fact + out[1]*facm;
in[2] = min_ff(out[2], tex[2])*fact + out[2]*facm;
@@ -1543,7 +1543,7 @@ void texture_rgb_blend(float in[3], const float tex[3], const float out[3], floa
in[1] = max_ff(fact * tex[1], out[1]);
in[2] = max_ff(fact * tex[2], out[2]);
break;
-
+
case MTEX_BLEND_HUE:
fact*= facg;
copy_v3_v3(in, out);
@@ -1564,16 +1564,16 @@ void texture_rgb_blend(float in[3], const float tex[3], const float out[3], floa
copy_v3_v3(in, out);
ramp_blend(MA_RAMP_COLOR, in, fact, tex);
break;
- case MTEX_SOFT_LIGHT:
- fact*= facg;
+ case MTEX_SOFT_LIGHT:
+ fact*= facg;
copy_v3_v3(in, out);
ramp_blend(MA_RAMP_SOFT, in, fact, tex);
- break;
- case MTEX_LIN_LIGHT:
- fact*= facg;
+ break;
+ case MTEX_LIN_LIGHT:
+ fact*= facg;
copy_v3_v3(in, out);
ramp_blend(MA_RAMP_LINEAR, in, fact, tex);
- break;
+ break;
}
}
@@ -1583,7 +1583,7 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen
int flip= (facg < 0.0f);
facg= fabsf(facg);
-
+
fact*= facg;
facm= 1.0f-fact;
if (flip) SWAP(float, fact, facm);
@@ -1636,19 +1636,19 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen
if (col > out) in= col; else in= out;
break;
- case MTEX_SOFT_LIGHT:
+ case MTEX_SOFT_LIGHT:
scf=1.0f - (1.0f - tex) * (1.0f - out);
in= facm*out + fact * ((1.0f - out) * tex * out) + (out * scf);
- break;
+ break;
- case MTEX_LIN_LIGHT:
+ case MTEX_LIN_LIGHT:
if (tex > 0.5f)
in = out + fact*(2.0f*(tex - 0.5f));
- else
+ else
in = out + fact*(2.0f*tex - 1.0f);
break;
}
-
+
return in;
}
@@ -1690,7 +1690,7 @@ static void texco_mapping(ShadeInput *shi, Tex *tex, MTex *mtex,
dyt[0] = mtex->size[0] * dyt[0];
dyt[1] = mtex->size[1] * dyt[1];
}
-
+
/* problem: repeat-mirror is not a 'repeat' but 'extend' in imagetexture.c */
/* TXF: bug was here, only modify texvec when repeat mode set, old code affected other modes too.
* New texfilters solve mirroring differently so that it also works correctly when
@@ -1714,7 +1714,7 @@ static void texco_mapping(ShadeInput *shi, Tex *tex, MTex *mtex,
if (texvec[1] > 1.f) texvec[1] = 2.f - texvec[1];
}
}
-
+
}
else { /* procedural */
/* placement */
@@ -2036,7 +2036,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
copy_v3_v3(ntap_bump->vNorg, shi->vn);
ntap_bump->fPrevMagnitude = 1.0f;
ntap_bump->iPrevBumpSpace = 0;
-
+
ntap_bump->init_done = true;
}
@@ -2050,7 +2050,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
}
BKE_image_pool_release_ibuf(tex->ima, ibuf, pool);
}
-
+
if (found_deriv_map) {
float dBdu, dBdv, auto_bump = 1.0f;
float s = 1; /* negate this if flipped texture coordinate */
@@ -2178,7 +2178,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
copy_v3_v3(dPdx, shi->dxco);
copy_v3_v3(dPdy, shi->dyco);
copy_v3_v3(vN, ntap_bump->vNorg);
-
+
if ( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) {
/* TODO: these calculations happen for every pixel!
* -> move to shi->obi */
@@ -2193,7 +2193,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
mul_transposed_m3_v3(obj2view, vN);
normalize_v3(vN);
}
-
+
cross_v3_v3v3(ntap_bump->vR1, dPdy, vN);
cross_v3_v3v3(ntap_bump->vR2, vN, dPdx);
fDet = dot_v3v3(dPdx, ntap_bump->vR1);
@@ -2208,21 +2208,21 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
abs_fDet = 1.0f;
}
}
-
+
fMagnitude = abs_fDet;
if ( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) {
/* pre do transform of texres->nor by the inverse transposed of obj2view */
mul_transposed_m3_v3(view2obj, vN);
mul_transposed_m3_v3(view2obj, ntap_bump->vR1);
mul_transposed_m3_v3(view2obj, ntap_bump->vR2);
-
+
fMagnitude *= len_v3(vN);
}
-
+
if (ntap_bump->fPrevMagnitude > 0.0f)
for (xyz=0; xyz<3; xyz++)
ntap_bump->vNacc[xyz] *= fMagnitude / ntap_bump->fPrevMagnitude;
-
+
ntap_bump->fPrevMagnitude = fMagnitude;
ntap_bump->iPrevBumpSpace = iBumpSpace;
}
@@ -2232,7 +2232,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
/* crazy hack solution that gives results similar to normal mapping - part 2 */
float vec[2];
const float imag_tspace_dimension_y = aspect*imag_tspace_dimension_x;
-
+
vec[0] = imag_tspace_dimension_x*dxt[0];
vec[1] = imag_tspace_dimension_y*dxt[1];
dHdx *= 1.0f/len_v2(vec);
@@ -2241,7 +2241,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
dHdy *= 1.0f/len_v2(vec);
}
}
-
+
/* subtract the surface gradient from vNacc */
for (c=0; c<3; c++) {
float vSurfGrad_compi = ntap_bump->sgn_det * (dHdx * ntap_bump->vR1[c] + dHdy * ntap_bump->vR2[c]);
@@ -2276,13 +2276,13 @@ void do_material_tex(ShadeInput *shi, Render *re)
/* here: test flag if there's a tex (todo) */
for (tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
-
+
/* separate tex switching */
if (shi->mat->septex & (1<<tex_nr)) continue;
-
+
if (shi->mat->mtex[tex_nr]) {
mtex= shi->mat->mtex[tex_nr];
-
+
tex= mtex->tex;
if (tex == NULL) continue;
@@ -2295,13 +2295,13 @@ void do_material_tex(ShadeInput *shi, Render *re)
use_compat_bump = false;
use_ntap_bump = false;
}
-
+
/* case displacement mapping */
if (shi->osatex == 0 && use_ntap_bump) {
use_ntap_bump = false;
use_compat_bump = true;
}
-
+
/* case ocean */
if (tex->type == TEX_OCEAN) {
use_ntap_bump = false;
@@ -2377,7 +2377,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
co= suv->uv;
dx= suv->dxuv;
- dy= suv->dyuv;
+ dy= suv->dyuv;
compatible_bump_uv_derivs(&compat_bump, shi, mtex, i);
}
@@ -2413,7 +2413,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
norvec[0]= norvec[1]= norvec[2]= 0.0;
}
else texres.nor= NULL;
-
+
if (warp_done) {
add_v3_v3v3(tempvec, co, warpvec);
co= tempvec;
@@ -2470,7 +2470,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
else {
Tnor*= stencilTin;
}
-
+
if (texres.nor) {
if ((rgbnor & TEX_NOR)==0) {
/* make our own normal */
@@ -2494,7 +2494,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
/* warping, local space */
if (mtex->mapto & MAP_WARP) {
float *warpnor= texres.nor, warpnor_[3];
-
+
if (use_ntap_bump) {
copy_v3_v3(warpnor_, texres.nor);
warpnor= warpnor_;
@@ -2505,7 +2505,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
warpvec[2]= mtex->warpfac*warpnor[2];
warp_done = true;
}
-#if 0
+#if 0
if (mtex->texflag & MTEX_VIEWSPACE) {
/* rotate to global coords */
if (mtex->texco==TEXCO_ORCO || mtex->texco==TEXCO_UV) {
@@ -2524,7 +2524,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
/* mapping */
if (mtex->mapto & (MAP_COL | MAP_COLSPEC | MAP_COLMIR)) {
float tcol[3];
-
+
/* stencil maps on the texture control slider, not texture intensity value */
copy_v3_v3(tcol, &texres.tr);
@@ -2537,12 +2537,12 @@ void do_material_tex(ShadeInput *shi, Render *re)
else {
texres.tin = texres.ta;
}
-
+
/* inverse gamma correction */
if (tex->type==TEX_IMAGE) {
Image *ima = tex->ima;
ImBuf *ibuf = BKE_image_pool_acquire_ibuf(ima, &tex->iuser, re->pool);
-
+
/* don't linearize float buffers, assumed to be linear */
if (ibuf != NULL &&
ibuf->rect_float == NULL &&
@@ -2583,13 +2583,13 @@ void do_material_tex(ShadeInput *shi, Render *re)
if ( (mtex->mapto & MAP_NORM) ) {
if (texres.nor) {
float norfac= mtex->norfac;
-
+
/* we need to code blending modes for normals too once.. now 1 exception hardcoded */
-
+
if ((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP)) {
-
+
found_nmapping = 1;
-
+
/* qdn: for normalmaps, to invert the normalmap vector,
* it is better to negate x & y instead of subtracting the vector as was done before */
if (norfac < 0.0f) {
@@ -2648,27 +2648,27 @@ void do_material_tex(ShadeInput *shi, Render *re)
}
else {
float nor[3], dot;
-
+
if (shi->mat->mode & MA_TANGENT_V) {
shi->tang[0]+= Tnor*norfac*texres.nor[0];
shi->tang[1]+= Tnor*norfac*texres.nor[1];
shi->tang[2]+= Tnor*norfac*texres.nor[2];
}
-
+
/* prevent bump to become negative normal */
nor[0]= Tnor*norfac*texres.nor[0];
nor[1]= Tnor*norfac*texres.nor[1];
nor[2]= Tnor*norfac*texres.nor[2];
-
+
dot= 0.5f + 0.5f * dot_v3v3(nor, shi->vn);
-
+
shi->vn[0]+= dot*nor[0];
shi->vn[1]+= dot*nor[1];
shi->vn[2]+= dot*nor[2];
}
}
normalize_v3(shi->vn);
-
+
/* this makes sure the bump is passed on to the next texture */
shi->orn[0]= -shi->vn[0];
shi->orn[1]= -shi->vn[1];
@@ -2686,7 +2686,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
shi->displace[1]+= 0.2f*Tnor*norfac*texres.nor[1];
shi->displace[2]+= 0.2f*Tnor*norfac*texres.nor[2];
}
-
+
if (rgbnor & TEX_RGB) {
texres.tin = IMB_colormanagement_get_luminance(&texres.tr);
}
@@ -2713,7 +2713,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
if (mtex->mapto & MAP_VARS) {
/* stencil maps on the texture control slider, not texture intensity value */
-
+
if (rgbnor & TEX_RGB) {
if (texres.talpha) texres.tin = texres.ta;
else texres.tin = IMB_colormanagement_get_luminance(&texres.tr);
@@ -2727,7 +2727,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
}
if (mtex->mapto & MAP_SPEC) {
float specfac= mtex->specfac*stencilTin;
-
+
shi->spec= texture_value_blend(mtex->def_var, shi->spec, texres.tin, specfac, mtex->blendtype);
if (shi->spec<0.0f) shi->spec= 0.0f;
}
@@ -2747,10 +2747,10 @@ void do_material_tex(ShadeInput *shi, Render *re)
if (mtex->mapto & MAP_HAR) {
float har; /* have to map to 0-1 */
float hardfac= mtex->hardfac*stencilTin;
-
+
har= ((float)shi->har)/128.0f;
har= 128.0f*texture_value_blend(mtex->def_var, har, texres.tin, hardfac, mtex->blendtype);
-
+
if (har<1.0f) shi->har= 1;
else if (har>511) shi->har= 511;
else shi->har= (int)har;
@@ -2775,7 +2775,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
shi->amb= texture_value_blend(mtex->def_var, shi->amb, texres.tin, ambfac, mtex->blendtype);
if (shi->amb<0.0f) shi->amb= 0.0f;
else if (shi->amb>1.0f) shi->amb= 1.0f;
-
+
shi->ambr= shi->amb*re->wrld.ambr;
shi->ambg= shi->amb*re->wrld.ambg;
shi->ambb= shi->amb*re->wrld.ambb;
@@ -2802,23 +2802,23 @@ void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float col_
int tex_nr, rgbnor= 0;
float co[3], texvec[3];
float fact, stencilTin=1.0;
-
+
if (re->r.scemode & R_NO_TEX) return;
/* here: test flag if there's a tex (todo) */
-
+
for (tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
/* separate tex switching */
if (shi->mat->septex & (1<<tex_nr)) continue;
-
+
if (shi->mat->mtex[tex_nr]) {
mtex= shi->mat->mtex[tex_nr];
tex= mtex->tex;
if (tex == NULL) continue;
-
- /* only process if this texture is mapped
+
+ /* only process if this texture is mapped
* to one that we're interested in */
if (!(mtex->mapto & mapto_flag)) continue;
-
+
/* which coords */
if (mtex->texco==TEXCO_OBJECT) {
Object *ob= mtex->object;
@@ -2840,7 +2840,7 @@ void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float col_
}
/* not really orco, but 'local' */
else if (mtex->texco==TEXCO_ORCO) {
-
+
if (mtex->texflag & MTEX_DUPLI_MAPTO) {
copy_v3_v3(co, shi->duplilo);
}
@@ -2866,7 +2866,7 @@ void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float col_
}
texres.nor= NULL;
-
+
if (tex->type == TEX_IMAGE) {
continue; /* not supported yet */
//do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
@@ -2882,7 +2882,7 @@ void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float col_
if (mtex->projz) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]);
else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
}
-
+
rgbnor = multitex(tex,
texvec,
NULL, NULL,
@@ -2894,7 +2894,7 @@ void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float col_
skip_load_image,
texnode_preview,
true); /* NULL = dxt/dyt, 0 = shi->osatex - not supported */
-
+
/* texture output */
if ((rgbnor & TEX_RGB) && (mtex->texflag & MTEX_RGBTOINT)) {
@@ -2921,13 +2921,13 @@ void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float col_
stencilTin*= fact;
}
}
-
-
+
+
if ((mapto_flag & (MAP_EMISSION_COL+MAP_TRANSMISSION_COL+MAP_REFLECTION_COL)) && (mtex->mapto & (MAP_EMISSION_COL+MAP_TRANSMISSION_COL+MAP_REFLECTION_COL))) {
float tcol[3];
-
+
/* stencil maps on the texture control slider, not texture intensity value */
-
+
if ((rgbnor & TEX_RGB) == 0) {
copy_v3_v3(tcol, &mtex->r);
}
@@ -2943,33 +2943,33 @@ void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float col_
texres.tin= texres.ta;
}
}
-
+
/* used for emit */
if ((mapto_flag & MAP_EMISSION_COL) && (mtex->mapto & MAP_EMISSION_COL)) {
float colemitfac= mtex->colemitfac*stencilTin;
texture_rgb_blend(col_r, tcol, col_r, texres.tin, colemitfac, mtex->blendtype);
}
-
+
if ((mapto_flag & MAP_REFLECTION_COL) && (mtex->mapto & MAP_REFLECTION_COL)) {
float colreflfac= mtex->colreflfac*stencilTin;
texture_rgb_blend(col_r, tcol, col_r, texres.tin, colreflfac, mtex->blendtype);
}
-
+
if ((mapto_flag & MAP_TRANSMISSION_COL) && (mtex->mapto & MAP_TRANSMISSION_COL)) {
float coltransfac= mtex->coltransfac*stencilTin;
texture_rgb_blend(col_r, tcol, col_r, texres.tin, coltransfac, mtex->blendtype);
}
}
-
+
if ((mapto_flag & MAP_VARS) && (mtex->mapto & MAP_VARS)) {
/* stencil maps on the texture control slider, not texture intensity value */
-
+
/* convert RGB to intensity if intensity info isn't provided */
if (rgbnor & TEX_RGB) {
if (texres.talpha) texres.tin = texres.ta;
else texres.tin = IMB_colormanagement_get_luminance(&texres.tr);
}
-
+
if ((mapto_flag & MAP_EMISSION) && (mtex->mapto & MAP_EMISSION)) {
float emitfac= mtex->emitfac*stencilTin;
@@ -2984,13 +2984,13 @@ void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float col_
}
if ((mapto_flag & MAP_SCATTERING) && (mtex->mapto & MAP_SCATTERING)) {
float scatterfac= mtex->scatterfac*stencilTin;
-
+
*val = texture_value_blend(mtex->def_var, *val, texres.tin, scatterfac, mtex->blendtype);
CLAMP(*val, 0.0f, 1.0f);
}
if ((mapto_flag & MAP_REFLECTION) && (mtex->mapto & MAP_REFLECTION)) {
float reflfac= mtex->reflfac*stencilTin;
-
+
*val = texture_value_blend(mtex->def_var, *val, texres.tin, reflfac, mtex->blendtype);
CLAMP(*val, 0.0f, 1.0f);
}
@@ -3012,46 +3012,46 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float col_r[4])
int rgb, osatex;
if (R.r.scemode & R_NO_TEX) return;
-
+
mtex= har->mat->mtex[0];
if (har->mat->septex & (1<<0)) return;
if (mtex->tex==NULL) return;
-
+
/* no normal mapping */
texres.nor= NULL;
-
+
texvec[0]= xn/har->rad;
texvec[1]= yn/har->rad;
texvec[2]= 0.0;
-
+
osatex= (har->mat->texco & TEXCO_OSA);
/* placement */
if (mtex->projx) texvec[0]= mtex->size[0]*(texvec[mtex->projx-1]+mtex->ofs[0]);
else texvec[0]= mtex->size[0]*(mtex->ofs[0]);
-
+
if (mtex->projy) texvec[1]= mtex->size[1]*(texvec[mtex->projy-1]+mtex->ofs[1]);
else texvec[1]= mtex->size[1]*(mtex->ofs[1]);
-
+
if (mtex->projz) texvec[2]= mtex->size[2]*(texvec[mtex->projz-1]+mtex->ofs[2]);
else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
-
+
if (osatex) {
-
+
dx= 1.0f/har->rad;
-
+
if (mtex->projx) {
dxt[0]= mtex->size[0]*dx;
dyt[0]= mtex->size[0]*dx;
}
else dxt[0]= dyt[0]= 0.0;
-
+
if (mtex->projy) {
dxt[1]= mtex->size[1]*dx;
dyt[1]= mtex->size[1]*dx;
}
else dxt[1]= dyt[1]= 0.0;
-
+
if (mtex->projz) {
dxt[2]= 0.0;
dyt[2]= 0.0;
@@ -3061,7 +3061,7 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float col_r[4])
}
if (mtex->tex->type==TEX_IMAGE) do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
-
+
rgb = multitex(mtex->tex,
texvec,
dxt, dyt,
@@ -3090,7 +3090,7 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float col_r[4])
/* mapping */
if (mtex->mapto & MAP_COL) {
-
+
if (rgb==0) {
texres.tr= mtex->r;
texres.tg= mtex->g;
@@ -3105,7 +3105,7 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float col_r[4])
if (mtex->tex->type==TEX_IMAGE) {
Image *ima = mtex->tex->ima;
ImBuf *ibuf = BKE_image_pool_acquire_ibuf(ima, &mtex->tex->iuser, har->pool);
-
+
/* don't linearize float buffers, assumed to be linear */
if (ibuf && !(ibuf->rect_float) && R.scene_color_manage)
IMB_colormanagement_colorspace_to_scene_linear_v3(&texres.tr, ibuf->rect_colorspace);
@@ -3115,11 +3115,11 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float col_r[4])
fact= texres.tin*mtex->colfac;
facm= 1.0f-fact;
-
+
if (mtex->blendtype==MTEX_MUL) {
facm= 1.0f-mtex->colfac;
}
-
+
if (mtex->blendtype==MTEX_SUB) fact= -fact;
if (mtex->blendtype==MTEX_BLEND) {
@@ -3136,7 +3136,7 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float col_r[4])
col_r[0]= (fact*texres.tr + har->r);
col_r[1]= (fact*texres.tg + har->g);
col_r[2]= (fact*texres.tb + har->b);
-
+
CLAMP(col_r[0], 0.0f, 1.0f);
CLAMP(col_r[1], 0.0f, 1.0f);
CLAMP(col_r[2], 0.0f, 1.0f);
@@ -3171,24 +3171,24 @@ void do_sky_tex(
float fact, stencilTin=1.0;
float tempvec[3], texvec[3], dxt[3], dyt[3];
int tex_nr, rgb= 0;
-
+
if (R.r.scemode & R_NO_TEX) return;
/* todo: add flag to test if there's a tex */
texres.nor= NULL;
-
+
for (tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
if (R.wrld.mtex[tex_nr]) {
const float *co;
mtex= R.wrld.mtex[tex_nr];
-
+
tex= mtex->tex;
if (tex == NULL) continue;
/* if (mtex->mapto==0) continue; */
-
+
/* which coords */
co= lo;
-
+
/* dxt dyt just from 1 value */
if (dxyview) {
dxt[0]= dxt[1]= dxt[2]= dxyview[0];
@@ -3198,7 +3198,7 @@ void do_sky_tex(
dxt[0]= dxt[1]= dxt[2]= 0.0;
dyt[0]= dyt[1]= dyt[2]= 0.0;
}
-
+
/* Grab the mapping settings for this texture */
switch (mtex->texco) {
case TEXCO_ANGMAP:
@@ -3219,7 +3219,7 @@ void do_sky_tex(
}
co= tempvec;
break;
-
+
case TEXCO_H_SPHEREMAP:
case TEXCO_H_TUBEMAP:
if (skyflag & WO_ZENUP) {
@@ -3253,7 +3253,7 @@ void do_sky_tex(
co= tempvec;
}
break;
-
+
case TEXCO_GLOB:
if (rco) {
copy_v3_v3(tempvec, rco);
@@ -3262,7 +3262,7 @@ void do_sky_tex(
}
else
co= lo;
-
+
// copy_v3_v3(shi->dxgl, shi->dxco);
// mul_m3_v3(R.imat, shi->dxco);
// copy_v3_v3(shi->dygl, shi->dyco);
@@ -3272,20 +3272,20 @@ void do_sky_tex(
co = view;
break;
}
-
+
/* placement */
if (mtex->projx) texvec[0]= mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]);
else texvec[0]= mtex->size[0]*(mtex->ofs[0]);
-
+
if (mtex->projy) texvec[1]= mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]);
else texvec[1]= mtex->size[1]*(mtex->ofs[1]);
-
+
if (mtex->projz) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]);
else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
-
+
/* texture */
if (tex->type==TEX_IMAGE) do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
-
+
rgb = multitex(mtex->tex,
texvec,
dxt, dyt,
@@ -3297,7 +3297,7 @@ void do_sky_tex(
skip_load_image,
texnode_preview,
true);
-
+
/* texture output */
if (rgb && (mtex->texflag & MTEX_RGBTOINT)) {
texres.tin = IMB_colormanagement_get_luminance(&texres.tr);
@@ -3327,25 +3327,25 @@ void do_sky_tex(
if (rgb) texres.ta *= stencilTin;
else texres.tin*= stencilTin;
}
-
+
/* color mapping */
if (mtex->mapto & (WOMAP_HORIZ+WOMAP_ZENUP+WOMAP_ZENDOWN)) {
float tcol[3];
-
+
if (rgb==0) {
texres.tr= mtex->r;
texres.tg= mtex->g;
texres.tb= mtex->b;
}
else texres.tin= texres.ta;
-
+
tcol[0]= texres.tr; tcol[1]= texres.tg; tcol[2]= texres.tb;
/* inverse gamma correction */
if (tex->type==TEX_IMAGE) {
Image *ima = tex->ima;
ImBuf *ibuf = BKE_image_pool_acquire_ibuf(ima, &tex->iuser, R.pool);
-
+
/* don't linearize float buffers, assumed to be linear */
if (ibuf && !(ibuf->rect_float) && R.scene_color_manage)
IMB_colormanagement_colorspace_to_scene_linear_v3(tcol, ibuf->rect_colorspace);
@@ -3369,14 +3369,14 @@ void do_sky_tex(
if (mtex->mapto & WOMAP_ZENUP) zenfac= mtex->zenupfac;
else if (mtex->mapto & WOMAP_ZENDOWN) zenfac= mtex->zendownfac;
}
-
+
if (zenfac != 0.0f)
texture_rgb_blend(zen, tcol, zen, texres.tin, zenfac, mtex->blendtype);
}
}
if (mtex->mapto & WOMAP_BLEND) {
if (rgb) texres.tin = IMB_colormanagement_get_luminance(&texres.tr);
-
+
*blend= texture_value_blend(mtex->def_var, *blend, texres.tin, mtex->blendfac, mtex->blendtype);
}
}
@@ -3397,19 +3397,19 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r
float *co = NULL, *dx = NULL, *dy = NULL, fact, stencilTin=1.0;
float texvec[3], dxt[3], dyt[3], tempvec[3];
int i, tex_nr, rgb= 0;
-
+
if (R.r.scemode & R_NO_TEX) return;
tex_nr= 0;
-
+
for (; tex_nr<MAX_MTEX; tex_nr++) {
-
+
if (la->mtex[tex_nr]) {
mtex= la->mtex[tex_nr];
-
+
tex= mtex->tex;
if (tex==NULL) continue;
texres.nor= NULL;
-
+
/* which coords */
if (mtex->texco==TEXCO_OBJECT) {
ob= mtex->object;
@@ -3437,10 +3437,10 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r
mul_m4_v3(R.viewinv, shi->gl);
}
else if (mtex->texco==TEXCO_VIEW) {
-
+
copy_v3_v3(tempvec, lavec);
mul_m3_v3(la->imat, tempvec);
-
+
if (la->type==LA_SPOT) {
tempvec[0]*= la->spottexfac;
tempvec[1]*= la->spottexfac;
@@ -3448,8 +3448,8 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r
tempvec[0] /= -tempvec[2];
tempvec[1] /= -tempvec[2];
}
- co= tempvec;
-
+ co= tempvec;
+
dx= dxt; dy= dyt;
if (shi->osatex) {
copy_v3_v3(dxt, shi->dxlv);
@@ -3457,23 +3457,23 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r
/* need some matrix conversion here? la->imat is a [3][3] matrix!!! **/
mul_m3_v3(la->imat, dxt);
mul_m3_v3(la->imat, dyt);
-
+
mul_v3_fl(dxt, la->spottexfac);
mul_v3_fl(dyt, la->spottexfac);
}
}
-
-
+
+
/* placement */
if (mtex->projx && co) texvec[0]= mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]);
else texvec[0]= mtex->size[0]*(mtex->ofs[0]);
-
+
if (mtex->projy && co) texvec[1]= mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]);
else texvec[1]= mtex->size[1]*(mtex->ofs[1]);
-
+
if (mtex->projz && co) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]);
else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
-
+
if (shi->osatex) {
if (!dx) {
for (i=0;i<2;i++) {
@@ -3507,12 +3507,12 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r
}
}
}
-
+
/* texture */
if (tex->type==TEX_IMAGE) {
do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
}
-
+
rgb = multitex(tex,
texvec,
dxt, dyt,
@@ -3554,11 +3554,11 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r
if (rgb) texres.ta*= stencilTin;
else texres.tin*= stencilTin;
}
-
+
/* mapping */
if (((mtex->mapto & LAMAP_COL) && (effect & LA_TEXTURE))||((mtex->mapto & LAMAP_SHAD) && (effect & LA_SHAD_TEX))) {
float col[3];
-
+
if (rgb==0) {
texres.tr= mtex->r;
texres.tg= mtex->g;
@@ -3573,7 +3573,7 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r
if (tex->type==TEX_IMAGE) {
Image *ima = tex->ima;
ImBuf *ibuf = BKE_image_pool_acquire_ibuf(ima, &tex->iuser, R.pool);
-
+
/* don't linearize float buffers, assumed to be linear */
if (ibuf && !(ibuf->rect_float) && R.scene_color_manage)
IMB_colormanagement_colorspace_to_scene_linear_v3(&texres.tr, ibuf->rect_colorspace);
@@ -3609,26 +3609,26 @@ int externtex(const MTex *mtex,
TexResult texr;
float dxt[3], dyt[3], texvec[3];
int rgb;
-
+
tex= mtex->tex;
if (tex==NULL) return 0;
texr.nor= NULL;
-
+
/* placement */
if (mtex->projx) texvec[0]= mtex->size[0]*(vec[mtex->projx-1]+mtex->ofs[0]);
else texvec[0]= mtex->size[0]*(mtex->ofs[0]);
-
+
if (mtex->projy) texvec[1]= mtex->size[1]*(vec[mtex->projy-1]+mtex->ofs[1]);
else texvec[1]= mtex->size[1]*(mtex->ofs[1]);
-
+
if (mtex->projz) texvec[2]= mtex->size[2]*(vec[mtex->projz-1]+mtex->ofs[2]);
else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
-
+
/* texture */
if (tex->type==TEX_IMAGE) {
do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
}
-
+
rgb = multitex(tex,
texvec,
dxt, dyt,
@@ -3639,7 +3639,7 @@ int externtex(const MTex *mtex,
skip_load_image,
texnode_preview,
true);
-
+
if (rgb) {
texr.tin = IMB_colormanagement_get_luminance(&texr.tr);
}
@@ -3648,7 +3648,7 @@ int externtex(const MTex *mtex,
texr.tg= mtex->g;
texr.tb= mtex->b;
}
-
+
*tin= texr.tin;
*tr= texr.tr;
*tg= texr.tg;
@@ -3688,11 +3688,11 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
}
BLI_thread_unlock(LOCK_IMAGE);
}
-
+
tex= &imatex[shi->thread];
tex->iuser.ok= ima->ok;
tex->ima = ima;
-
+
texvec[0]= 0.5f+0.5f*suv->uv[0];
texvec[1]= 0.5f+0.5f*suv->uv[1];
texvec[2] = 0.0f; /* initalize it because imagewrap looks at it. */
@@ -3702,11 +3702,11 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
dy[0]= 0.5f*suv->dyuv[0];
dy[1]= 0.5f*suv->dyuv[1];
}
-
+
texr.nor= NULL;
-
+
if (shi->osatex) imagewraposa(tex, ima, NULL, texvec, dx, dy, &texr, R.pool, skip_load_image);
- else imagewrap(tex, ima, NULL, texvec, &texr, R.pool, skip_load_image);
+ else imagewrap(tex, ima, NULL, texvec, &texr, R.pool, skip_load_image);
shi->vcol[0]*= texr.tr;
shi->vcol[1]*= texr.tg;
@@ -3733,7 +3733,7 @@ static void textured_face_generate_uv(
t10= v3[axis1]-v2[axis1]; t11= v3[axis2]-v2[axis2];
detsh= 1.0f/(t00*t11-t10*t01);
- t00*= detsh; t01*=detsh;
+ t00*= detsh; t01*=detsh;
t10*=detsh; t11*=detsh;
r_uv[0] = (hit[axis1] - v3[axis1]) * t11 - (hit[axis2] - v3[axis2]) * t10;
@@ -3761,7 +3761,7 @@ Material *RE_sample_material_init(Material *orig_mat, Scene *scene)
/* strip material copy from unsupported flags */
for (tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
-
+
if (mat->mtex[tex_nr]) {
MTex *mtex = mat->mtex[tex_nr];
@@ -3793,7 +3793,7 @@ Material *RE_sample_material_init(Material *orig_mat, Scene *scene)
/* strip all mapto flags except color and alpha */
mtex->mapto = mtex->mapto & (MAP_TRANSMISSION_COL | MAP_REFLECTION_COL | MAP_DENSITY);
}
-
+
/* if mapped to an object, calculate inverse matrices */
if (mtex->texco==TEXCO_OBJECT) {
Object *ob= mtex->object;
@@ -3843,7 +3843,7 @@ void RE_sample_material_free(Material *mat)
if (mat->septex & (1<<tex_nr)) continue;
if (mat->mtex[tex_nr]) {
MTex *mtex= mat->mtex[tex_nr];
-
+
if (mtex->tex) {
/* don't update user counts as we are freeing a duplicate */
BKE_texture_free(mtex->tex);
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 77f399d08d1..99d2436d4bc 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -79,29 +79,29 @@ void calc_view_vector(float view[3], float x, float y)
{
view[2]= -ABS(R.clipsta);
-
+
if (R.r.mode & R_ORTHO) {
view[0]= view[1]= 0.0f;
}
else {
-
+
if (R.r.mode & R_PANORAMA) {
x-= R.panodxp;
}
-
+
/* move x and y to real viewplane coords */
x = (x / (float)R.winx);
view[0] = R.viewplane.xmin + x * BLI_rctf_size_x(&R.viewplane);
-
+
y = (y / (float)R.winy);
view[1] = R.viewplane.ymin + y * BLI_rctf_size_y(&R.viewplane);
-
+
// if (R.flag & R_SEC_FIELD) {
// if (R.r.mode & R_ODDFIELD) view[1]= (y+R.ystart)*R.ycor;
// else view[1]= (y+R.ystart+1.0)*R.ycor;
// }
// else view[1]= (y+R.ystart+R.bluroffsy+0.5)*R.ycor;
-
+
if (R.r.mode & R_PANORAMA) {
float u= view[0] + R.panodxv; float v= view[2];
view[0]= R.panoco*u + R.panosi*v;
@@ -116,10 +116,10 @@ void calc_renderco_ortho(float co[3], float x, float y, int z)
float fx= 2.0f/(R.winx*R.winmat[0][0]);
float fy= 2.0f/(R.winy*R.winmat[1][1]);
float zco;
-
+
co[0]= (x - 0.5f*R.winx)*fx - R.winmat[3][0]/R.winmat[0][0];
co[1]= (y - 0.5f*R.winy)*fy - R.winmat[3][1]/R.winmat[1][1];
-
+
zco= ((float)z)/2147483647.0f;
co[2]= R.winmat[3][2]/( R.winmat[2][3]*zco - R.winmat[2][2] );
}
@@ -127,7 +127,7 @@ void calc_renderco_ortho(float co[3], float x, float y, int z)
void calc_renderco_zbuf(float co[3], const float view[3], int z)
{
float fac, zco;
-
+
/* inverse of zbuf calc: zbuf = MAXZ*hoco_z/hoco_w */
zco= ((float)z)/2147483647.0f;
co[2]= R.winmat[3][2]/( R.winmat[2][3]*zco - R.winmat[2][2] );
@@ -147,7 +147,7 @@ int count_mask(unsigned short mask)
static int calchalo_z(HaloRen *har, int zz)
{
-
+
if (har->type & HA_ONLYSKY) {
if (zz < 0x7FFFFFF0) zz= - 0x7FFFFF; /* edge render messes zvalues */
}
@@ -163,17 +163,17 @@ static void halo_pixelstruct(HaloRen *har, RenderLayer **rlpp, int totsample, in
{
float col[4], accol[4], fac;
int amount, amountm, zz, flarec, sample, fullsample, mask=0;
-
+
fullsample= (totsample > 1);
amount= 0;
accol[0] = accol[1] = accol[2] = accol[3]= 0.0f;
col[0] = col[1] = col[2] = col[3]= 0.0f;
flarec= har->flarec;
-
+
while (ps) {
amountm= count_mask(ps->mask);
amount+= amountm;
-
+
zz= calchalo_z(har, ps->z);
if ((zz> har->zs) || (har->mat && (har->mat->mode & MA_HALO_SOFT))) {
if (shadeHaloFloat(har, col, zz, dist, xn, yn, flarec)) {
@@ -196,7 +196,7 @@ static void halo_pixelstruct(HaloRen *har, RenderLayer **rlpp, int totsample, in
}
}
}
-
+
mask |= ps->mask;
ps= ps->next;
}
@@ -228,7 +228,7 @@ static void halo_pixelstruct(HaloRen *har, RenderLayer **rlpp, int totsample, in
col[1]= accol[1];
col[2]= accol[2];
col[3]= accol[3];
-
+
for (sample=0; sample<totsample; sample++) {
float *pass = RE_RenderLayerGetPass(rlpp[sample], RE_PASSNAME_COMBINED, R.viewname);
addalphaAddfacFloat(pass + od*4, col, har->add);
@@ -255,7 +255,7 @@ static void halo_tile(RenderPart *pa, RenderLayer *rl)
testrect.ymin+= pa->crop;
testrect.ymax-= pa->crop;
}
-
+
totsample= get_sample_layers(pa, rl, rlpp);
for (a=0; a<R.tothalo; a++) {
@@ -272,10 +272,10 @@ static void halo_tile(RenderPart *pa, RenderLayer *rl)
/* pass */
}
else {
-
+
minx= floor(har->xs-har->rad);
maxx= ceil(har->xs+har->rad);
-
+
if (testrect.xmin > maxx) {
/* pass */
}
@@ -283,24 +283,24 @@ static void halo_tile(RenderPart *pa, RenderLayer *rl)
/* pass */
}
else {
-
+
minx = max_ii(minx, testrect.xmin);
maxx = min_ii(maxx, testrect.xmax);
-
+
miny = max_ii(har->miny, testrect.ymin);
maxy = min_ii(har->maxy, testrect.ymax);
-
+
for (y=miny; y<maxy; y++) {
int rectofs= (y-disprect.ymin)*pa->rectx + (minx - disprect.xmin);
rz= pa->rectz + rectofs;
od= rectofs;
-
+
if (pa->rectdaps)
rd= pa->rectdaps + rectofs;
-
+
yn= (y-har->ys)*R.ycor;
ysq= yn*yn;
-
+
for (x=minx; x<maxx; x++, rz++, od++) {
xn= x- har->xs;
xsq= xn*xn;
@@ -326,7 +326,7 @@ static void halo_tile(RenderPart *pa, RenderLayer *rl)
}
}
}
- if (R.test_break(R.tbh) ) break;
+ if (R.test_break(R.tbh) ) break;
}
}
@@ -339,27 +339,27 @@ static void lamphalo_tile(RenderPart *pa, RenderLayer *rl)
intptr_t *rd= pa->rectdaps;
const int *rz= pa->rectz;
int x, y, sample, totsample, fullsample, od;
-
+
totsample= get_sample_layers(pa, rl, rlpp);
fullsample= (totsample > 1);
shade_input_initialize(&shi, pa, rl, 0); /* this zero's ShadeInput for us */
-
+
for (od=0, y=pa->disprect.ymin; y<pa->disprect.ymax; y++) {
for (x=pa->disprect.xmin; x<pa->disprect.xmax; x++, rz++, od++) {
-
+
calc_view_vector(shi.view, x, y);
-
+
if (rd && *rd) {
PixStr *ps= (PixStr *)*rd;
int count, totsamp= 0, mask= 0;
-
+
while (ps) {
if (R.r.mode & R_ORTHO)
calc_renderco_ortho(shi.co, (float)x, (float)y, ps->z);
else
calc_renderco_zbuf(shi.co, shi.view, ps->z);
-
+
totsamp+= count= count_mask(ps->mask);
mask |= ps->mask;
@@ -430,7 +430,7 @@ static void lamphalo_tile(RenderPart *pa, RenderLayer *rl)
calc_renderco_ortho(shi.co, (float)x, (float)y, *rz);
else
calc_renderco_zbuf(shi.co, shi.view, *rz);
-
+
col[0]= col[1]= col[2]= col[3]= 0.0f;
renderspothalo(&shi, col, 1.0f);
@@ -444,13 +444,13 @@ static void lamphalo_tile(RenderPart *pa, RenderLayer *rl)
if (pass[3]>1.0f) pass[3]= 1.0f;
}
}
-
+
if (rd) rd++;
}
if (y&1)
- if (R.test_break(R.tbh)) break;
+ if (R.test_break(R.tbh)) break;
}
-}
+}
/* ********************* MAINLOOPS ******************** */
@@ -463,7 +463,7 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset,
for (rpass= rl->passes.first; rpass; rpass= rpass->next) {
float *fp, *col= NULL;
int pixsize= 3;
-
+
if (STREQ(rpass->name, RE_PASSNAME_COMBINED)) {
add_filt_fmask(curmask, shr->combined, rpass->rect + 4*offset, rectx);
}
@@ -570,7 +570,7 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult
for (rpass= rl->passes.first; rpass; rpass= rpass->next) {
float *col= NULL, uvcol[3];
int a, pixsize= 3;
-
+
if (STREQ(rpass->name, RE_PASSNAME_COMBINED)) {
/* copy combined to use for preview */
copy_v4_v4(rpass->rect + 4*offset, shr->combined);
@@ -656,13 +656,13 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult
int get_sample_layers(RenderPart *pa, RenderLayer *rl, RenderLayer **rlpp)
{
-
+
if (pa->fullresult.first) {
int sample, nr= BLI_findindex(&pa->result->layers, rl);
-
+
for (sample=0; sample<R.osa; sample++) {
RenderResult *rr= BLI_findlink(&pa->fullresult, sample);
-
+
rlpp[sample]= BLI_findlink(&rr->layers, nr);
}
return R.osa;
@@ -679,29 +679,29 @@ static void sky_tile(RenderPart *pa, RenderLayer *rl)
{
RenderLayer *rlpp[RE_MAX_OSA];
int x, y, od=0, totsample;
-
+
if (R.r.alphamode!=R_ADDSKY)
return;
-
+
totsample= get_sample_layers(pa, rl, rlpp);
-
+
for (y=pa->disprect.ymin; y<pa->disprect.ymax; y++) {
for (x=pa->disprect.xmin; x<pa->disprect.xmax; x++, od+=4) {
float col[4];
int sample;
bool done = false;
-
+
for (sample= 0; sample<totsample; sample++) {
float *pass = RE_RenderLayerGetPass(rlpp[sample], RE_PASSNAME_COMBINED, R.viewname);
pass += od;
-
+
if (pass[3]<1.0f) {
-
+
if (done==0) {
shadeSkyPixel(col, x, y, pa->thread);
done = true;
}
-
+
if (pass[3]==0.0f) {
copy_v4_v4(pass, col);
pass[3] = 1.0f;
@@ -713,9 +713,9 @@ static void sky_tile(RenderPart *pa, RenderLayer *rl)
}
}
}
-
+
if (y&1)
- if (R.test_break(R.tbh)) break;
+ if (R.test_break(R.tbh)) break;
}
}
@@ -727,7 +727,7 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl)
RenderLayer *rlpp[RE_MAX_OSA];
int totsample;
int x, y, od= 0;
-
+
totsample= get_sample_layers(pa, rl, rlpp);
/* check that z pass is enabled */
@@ -735,7 +735,7 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl)
for (zpass= rl->passes.first; zpass; zpass= zpass->next)
if (STREQ(zpass->name, RE_PASSNAME_Z))
break;
-
+
if (zpass==NULL) return;
/* check for at least one sun lamp that its atmosphere flag is enabled */
@@ -747,24 +747,24 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl)
/* do nothign and return if there is no sun lamp */
if (go==NULL)
return;
-
+
/* for each x,y and each sample, and each sun lamp*/
for (y=pa->disprect.ymin; y<pa->disprect.ymax; y++) {
for (x=pa->disprect.xmin; x<pa->disprect.xmax; x++, od++) {
int sample;
-
+
for (sample=0; sample<totsample; sample++) {
const float *zrect = RE_RenderLayerGetPass(rlpp[sample], RE_PASSNAME_Z, R.viewname) + od;
float *rgbrect = RE_RenderLayerGetPass(rlpp[sample], RE_PASSNAME_COMBINED, R.viewname) + 4*od;
float rgb[3] = {0};
bool done = false;
-
+
for (go=R.lights.first; go; go= go->next) {
-
-
+
+
lar= go->lampren;
if (lar->type==LA_SUN && lar->sunsky) {
-
+
/* if it's sky continue and don't apply atmosphere effect on it */
if (*zrect >= 9.9e10f || rgbrect[3]==0.0f) {
continue;
@@ -772,12 +772,12 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl)
if ((lar->sunsky->effect_type & LA_SUN_EFFECT_AP)) {
float tmp_rgb[3];
-
+
/* skip if worldspace lamp vector is below horizon */
if (go->ob->obmat[2][2] < 0.f) {
continue;
}
-
+
copy_v3_v3(tmp_rgb, rgbrect);
if (rgbrect[3]!=1.0f) { /* de-premul */
mul_v3_fl(tmp_rgb, 1.0f/rgbrect[3]);
@@ -786,7 +786,7 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl)
if (rgbrect[3]!=1.0f) { /* premul */
mul_v3_fl(tmp_rgb, rgbrect[3]);
}
-
+
if (done==0) {
copy_v3_v3(rgb, tmp_rgb);
done = true;
@@ -816,45 +816,45 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
intptr_t *rd, *rectdaps= pa->rectdaps;
int samp;
int x, y, seed, crop=0, offs=0, od;
-
- if (R.test_break(R.tbh)) return;
-
+
+ if (R.test_break(R.tbh)) return;
+
/* irregular shadowb buffer creation */
if (R.r.mode & R_SHADOW)
ISB_create(pa, NULL);
-
+
/* we set per pixel a fixed seed, for random AO and shadow samples */
seed= pa->rectx*pa->disprect.ymin;
-
+
/* general shader info, passes */
shade_sample_initialize(&ssamp, pa, rl);
/* occlusion caching */
if (R.occlusiontree)
cache_occ_samples(&R, pa, &ssamp);
-
+
/* filtered render, for now we assume only 1 filter size */
if (pa->crop) {
crop= 1;
rectdaps+= pa->rectx + 1;
offs= pa->rectx + 1;
}
-
+
/* scanline updates have to be 2 lines behind */
rr->renrect.ymin = 0;
rr->renrect.ymax = -2*crop;
rr->renlay= rl;
-
+
for (y=pa->disprect.ymin+crop; y<pa->disprect.ymax-crop; y++, rr->renrect.ymax++) {
rd= rectdaps;
od= offs;
-
+
for (x=pa->disprect.xmin+crop; x<pa->disprect.xmax-crop; x++, rd++, od++) {
BLI_thread_srandom(pa->thread, seed++);
-
+
if (*rd) {
if (shade_samples(&ssamp, (PixStr *)(*rd), x, y)) {
-
+
/* multisample buffers or filtered mask filling? */
if (pa->fullresult.first) {
int a;
@@ -874,16 +874,16 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
}
}
}
-
+
rectdaps+= pa->rectx;
offs+= pa->rectx;
-
- if (y&1) if (R.test_break(R.tbh)) break;
+
+ if (y&1) if (R.test_break(R.tbh)) break;
}
-
+
/* disable scanline updating */
rr->renlay= NULL;
-
+
if (R.r.mode & R_SHADOW)
ISB_free(pa);
@@ -897,20 +897,20 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
static PixStrMain *addpsmain(ListBase *lb)
{
PixStrMain *psm;
-
+
psm= (PixStrMain *)MEM_mallocN(sizeof(PixStrMain), "pixstrMain");
BLI_addtail(lb, psm);
-
+
psm->ps= (PixStr *)MEM_mallocN(4096*sizeof(PixStr), "pixstr");
psm->counter= 0;
-
+
return psm;
}
static void freeps(ListBase *lb)
{
PixStrMain *psm, *psmnext;
-
+
for (psm= lb->first; psm; psm= psmnext) {
psmnext= psm->next;
if (psm->ps)
@@ -924,10 +924,10 @@ static void addps(ListBase *lb, intptr_t *rd, int obi, int facenr, int z, int ma
{
PixStrMain *psm;
PixStr *ps, *last= NULL;
-
+
if (*rd) {
ps= (PixStr *)(*rd);
-
+
while (ps) {
if ( ps->obi == obi && ps->facenr == facenr ) {
ps->mask |= mask;
@@ -937,18 +937,18 @@ static void addps(ListBase *lb, intptr_t *rd, int obi, int facenr, int z, int ma
ps= ps->next;
}
}
-
+
/* make new PS (pixel struct) */
psm= lb->last;
-
+
if (psm->counter==4095)
psm= addpsmain(lb);
-
+
ps= psm->ps + psm->counter++;
-
+
if (last) last->next= ps;
else *rd= (intptr_t)ps;
-
+
ps->next= NULL;
ps->obi= obi;
ps->facenr= facenr;
@@ -962,10 +962,10 @@ static void edge_enhance_add(RenderPart *pa, float *rectf, float *arect)
{
float addcol[4];
int pix;
-
+
if (arect==NULL)
return;
-
+
for (pix= pa->rectx*pa->recty; pix>0; pix--, arect++, rectf+=4) {
if (*arect != 0.0f) {
addcol[0]= *arect * R.r.edgeR;
@@ -982,13 +982,13 @@ static void clamp_alpha_rgb_range(RenderPart *pa, RenderLayer *rl)
{
RenderLayer *rlpp[RE_MAX_OSA];
int y, sample, totsample;
-
+
totsample= get_sample_layers(pa, rl, rlpp);
/* not for full sample, there we clamp after compositing */
if (totsample > 1)
return;
-
+
for (sample= 0; sample<totsample; sample++) {
float *rectf = RE_RenderLayerGetPass(rlpp[sample], RE_PASSNAME_COMBINED, R.viewname);
@@ -1008,41 +1008,41 @@ static void edge_enhance_tile(RenderPart *pa, float *rectf, int *rectz)
int y, x, col, *rz, *rz1, *rz2, *rz3;
int zval1, zval2, zval3;
float *rf;
-
+
/* shift values in zbuffer 4 to the right (anti overflows), for filter we need multiplying with 12 max */
rz= rectz;
if (rz==NULL) return;
-
+
for (y=0; y<pa->recty; y++)
for (x=0; x<pa->rectx; x++, rz++) (*rz)>>= 4;
-
+
rz1= rectz;
rz2= rz1+pa->rectx;
rz3= rz2+pa->rectx;
-
+
rf= rectf+pa->rectx+1;
-
+
for (y=0; y<pa->recty-2; y++) {
for (x=0; x<pa->rectx-2; x++, rz1++, rz2++, rz3++, rf++) {
-
+
/* prevent overflow with sky z values */
zval1= rz1[0] + 2*rz1[1] + rz1[2];
zval2= 2*rz2[0] + 2*rz2[2];
zval3= rz3[0] + 2*rz3[1] + rz3[2];
-
+
col= ( 4*rz2[1] - (zval1 + zval2 + zval3)/3 );
if (col<0) col= -col;
-
+
col >>= 5;
if (col > (1<<16)) col= (1<<16);
else col= (R.r.edgeint*col)>>8;
-
+
if (col>0) {
float fcol;
-
+
if (col>255) fcol= 1.0f;
else fcol= (float)col/255.0f;
-
+
if (R.osa)
*rf+= fcol/(float)R.osa;
else
@@ -1054,12 +1054,12 @@ static void edge_enhance_tile(RenderPart *pa, float *rectf, int *rectz)
rz3+= 2;
rf+= 2;
}
-
+
/* shift back zbuf values, we might need it still */
rz= rectz;
for (y=0; y<pa->recty; y++)
for (x=0; x<pa->rectx; x++, rz++) (*rz)<<= 4;
-
+
}
static void reset_sky_speed(RenderPart *pa, RenderLayer *rl)
@@ -1068,7 +1068,7 @@ static void reset_sky_speed(RenderPart *pa, RenderLayer *rl)
RenderLayer *rlpp[RE_MAX_OSA];
float *fp;
int a, sample, totsample;
-
+
totsample= get_sample_layers(pa, rl, rlpp);
for (sample= 0; sample<totsample; sample++) {
@@ -1081,7 +1081,7 @@ static void reset_sky_speed(RenderPart *pa, RenderLayer *rl)
}
static unsigned short *make_solid_mask(RenderPart *pa)
-{
+{
intptr_t *rd= pa->rectdaps;
unsigned short *solidmask, *sp;
int x;
@@ -1093,7 +1093,7 @@ static unsigned short *make_solid_mask(RenderPart *pa)
for (x=pa->rectx*pa->recty; x>0; x--, rd++, sp++) {
if (*rd) {
PixStr *ps= (PixStr *)*rd;
-
+
*sp= ps->mask;
for (ps= ps->next; ps; ps= ps->next)
*sp |= ps->mask;
@@ -1109,14 +1109,14 @@ static void addAlphaOverFloatMask(float *dest, float *source, unsigned short dma
{
unsigned short shared= dmask & smask;
float mul= 1.0f - source[3];
-
+
if (shared) { /* overlapping masks */
-
+
/* masks differ, we make a mixture of 'add' and 'over' */
if (shared!=dmask) {
float shared_bits= (float)count_mask(shared); /* alpha over */
float tot_bits= (float)count_mask(smask|dmask); /* alpha add */
-
+
float add= (tot_bits - shared_bits)/tot_bits; /* add level */
mul= add + (1.0f-add)*mul;
}
@@ -1127,7 +1127,7 @@ static void addAlphaOverFloatMask(float *dest, float *source, unsigned short dma
dest[1]+= source[1];
dest[2]+= source[2];
dest[3]+= source[3];
-
+
return;
}
@@ -1163,8 +1163,8 @@ static void make_pixelstructs(RenderPart *pa, ZSpan *zspan, int sample, void *da
}
}
- if (sdata->rl->layflag & SCE_LAY_EDGE)
- if (R.r.mode & R_EDGE)
+ if (sdata->rl->layflag & SCE_LAY_EDGE)
+ if (R.r.mode & R_EDGE)
edge_enhance_tile(pa, sdata->edgerect, zspan->rectz);
}
@@ -1176,7 +1176,7 @@ void zbufshadeDA_tile(RenderPart *pa)
RenderLayer *rl;
ListBase psmlist= {NULL, NULL};
float *edgerect= NULL;
-
+
/* allocate the necessary buffers */
/* zbuffer inits these rects */
pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
@@ -1187,15 +1187,15 @@ void zbufshadeDA_tile(RenderPart *pa)
if ((rl->layflag & SCE_LAY_ZMASK) && (rl->layflag & SCE_LAY_NEG_ZMASK))
pa->rectmask= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectmask");
-
+
/* initialize pixelstructs and edge buffer */
addpsmain(&psmlist);
pa->rectdaps= MEM_callocN(sizeof(intptr_t)*pa->rectx*pa->recty+4, "zbufDArectd");
-
- if (rl->layflag & SCE_LAY_EDGE)
- if (R.r.mode & R_EDGE)
+
+ if (rl->layflag & SCE_LAY_EDGE)
+ if (R.r.mode & R_EDGE)
edgerect= MEM_callocN(sizeof(float)*pa->rectx*pa->recty, "rectedge");
-
+
/* always fill visibility */
for (pa->sample=0; pa->sample<R.osa; pa->sample+=4) {
ZbufSolidData sdata;
@@ -1204,18 +1204,18 @@ void zbufshadeDA_tile(RenderPart *pa)
sdata.psmlist= &psmlist;
sdata.edgerect= edgerect;
zbuffer_solid(pa, rl, make_pixelstructs, &sdata);
- if (R.test_break(R.tbh)) break;
+ if (R.test_break(R.tbh)) break;
}
-
+
/* shades solid */
- if (rl->layflag & SCE_LAY_SOLID)
+ if (rl->layflag & SCE_LAY_SOLID)
shadeDA_tile(pa, rl);
-
+
/* lamphalo after solid, before ztra, looks nicest because ztra does own halo */
if (R.flag & R_LAMPHALO)
if (rl->layflag & SCE_LAY_HALO)
lamphalo_tile(pa, rl);
-
+
/* halo before ztra, because ztra fills in zbuffer now */
if (R.flag & R_HALO)
if (rl->layflag & SCE_LAY_HALO)
@@ -1229,15 +1229,15 @@ void zbufshadeDA_tile(RenderPart *pa)
}
else {
unsigned short *ztramask, *solidmask= NULL; /* 16 bits, MAX_OSA */
-
+
/* allocate, but not free here, for asynchronous display of this rect in main thread */
rl->acolrect= MEM_callocN(4*sizeof(float)*pa->rectx*pa->recty, "alpha layer");
-
+
/* swap for live updates, and it is used in zbuf.c!!! */
SWAP(float *, rl->acolrect, rect);
ztramask = zbuffer_transp_shade(pa, rl, rect, &psmlist);
SWAP(float *, rl->acolrect, rect);
-
+
/* zbuffer transp only returns ztramask if there's solid rendered */
if (ztramask)
solidmask= make_solid_mask(pa);
@@ -1248,7 +1248,7 @@ void zbufshadeDA_tile(RenderPart *pa)
float *fcol= rect;
float *acol= rl->acolrect;
int x;
-
+
for (x=pa->rectx*pa->recty; x>0; x--, acol+=4, fcol+=4, sps++, spz++) {
if (*sps == fullmask)
addAlphaOverFloat(fcol, acol);
@@ -1273,26 +1273,26 @@ void zbufshadeDA_tile(RenderPart *pa)
/* sun/sky */
if (rl->layflag & SCE_LAY_SKY)
atm_tile(pa, rl);
-
+
/* sky before edge */
if (rl->layflag & SCE_LAY_SKY)
sky_tile(pa, rl);
/* extra layers */
- if (rl->layflag & SCE_LAY_EDGE)
- if (R.r.mode & R_EDGE)
+ if (rl->layflag & SCE_LAY_EDGE)
+ if (R.r.mode & R_EDGE)
edge_enhance_add(pa, rect, edgerect);
-
+
if (rl->passflag & SCE_PASS_VECTOR)
reset_sky_speed(pa, rl);
/* clamp alpha to 0..1 range, can go outside due to filter */
clamp_alpha_rgb_range(pa, rl);
-
+
/* free stuff within loop! */
MEM_freeN(pa->rectdaps); pa->rectdaps= NULL;
freeps(&psmlist);
-
+
if (edgerect) MEM_freeN(edgerect);
edgerect= NULL;
@@ -1301,12 +1301,12 @@ void zbufshadeDA_tile(RenderPart *pa)
pa->rectmask= NULL;
}
}
-
+
/* free all */
MEM_freeN(pa->recto); pa->recto= NULL;
MEM_freeN(pa->rectp); pa->rectp= NULL;
MEM_freeN(pa->rectz); pa->rectz= NULL;
-
+
/* display active layer */
rr->renrect.ymin=rr->renrect.ymax = 0;
rr->renlay= render_get_active_layer(&R, rr);
@@ -1324,11 +1324,11 @@ void zbufshade_tile(RenderPart *pa)
RenderLayer *rl;
PixStr ps;
float *edgerect= NULL;
-
+
/* fake pixel struct, to comply to osa render */
ps.next= NULL;
ps.mask= 0xFFFF;
-
+
/* zbuffer code clears/inits rects */
pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
@@ -1341,11 +1341,11 @@ void zbufshade_tile(RenderPart *pa)
/* general shader info, passes */
shade_sample_initialize(&ssamp, pa, rl);
-
+
zbuffer_solid(pa, rl, NULL, NULL);
-
+
if (!R.test_break(R.tbh)) { /* NOTE: this if () is not consistent */
-
+
/* edges only for solid part, ztransp doesn't support it yet anti-aliased */
if (rl->layflag & SCE_LAY_EDGE) {
if (R.r.mode & R_EDGE) {
@@ -1353,31 +1353,31 @@ void zbufshade_tile(RenderPart *pa)
edge_enhance_tile(pa, edgerect, pa->rectz);
}
}
-
+
/* initialize scanline updates for main thread */
rr->renrect.ymin = 0;
rr->renlay= rl;
-
+
if (rl->layflag & SCE_LAY_SOLID) {
const float *fcol = rect;
const int *ro= pa->recto, *rp= pa->rectp, *rz= pa->rectz;
int x, y, offs=0, seed;
-
+
/* we set per pixel a fixed seed, for random AO and shadow samples */
seed= pa->rectx*pa->disprect.ymin;
-
+
/* irregular shadowb buffer creation */
if (R.r.mode & R_SHADOW)
ISB_create(pa, NULL);
if (R.occlusiontree)
cache_occ_samples(&R, pa, &ssamp);
-
+
for (y=pa->disprect.ymin; y<pa->disprect.ymax; y++, rr->renrect.ymax++) {
for (x=pa->disprect.xmin; x<pa->disprect.xmax; x++, ro++, rz++, rp++, fcol+=4, offs++) {
/* per pixel fixed seed */
BLI_thread_srandom(pa->thread, seed++);
-
+
if (*rp) {
ps.obi= *ro;
ps.facenr= *rp;
@@ -1389,67 +1389,67 @@ void zbufshade_tile(RenderPart *pa)
}
}
if (y&1)
- if (R.test_break(R.tbh)) break;
+ if (R.test_break(R.tbh)) break;
}
-
+
if (R.occlusiontree)
free_occ_samples(&R, pa);
-
+
if (R.r.mode & R_SHADOW)
ISB_free(pa);
}
-
+
/* disable scanline updating */
rr->renlay= NULL;
}
-
+
/* lamphalo after solid, before ztra, looks nicest because ztra does own halo */
if (R.flag & R_LAMPHALO)
if (rl->layflag & SCE_LAY_HALO)
lamphalo_tile(pa, rl);
-
+
/* halo before ztra, because ztra fills in zbuffer now */
if (R.flag & R_HALO)
if (rl->layflag & SCE_LAY_HALO)
halo_tile(pa, rl);
-
+
if (R.flag & R_ZTRA || R.totstrand) {
if (rl->layflag & (SCE_LAY_ZTRA|SCE_LAY_STRAND)) {
float *fcol, *acol;
int x;
-
+
/* allocate, but not free here, for asynchronous display of this rect in main thread */
rl->acolrect= MEM_callocN(4*sizeof(float)*pa->rectx*pa->recty, "alpha layer");
-
+
/* swap for live updates */
SWAP(float *, rl->acolrect, rect);
zbuffer_transp_shade(pa, rl, rect, NULL);
SWAP(float *, rl->acolrect, rect);
-
+
fcol= rect; acol= rl->acolrect;
for (x=pa->rectx*pa->recty; x>0; x--, acol+=4, fcol+=4) {
addAlphaOverFloat(fcol, acol);
}
}
}
-
+
/* sun/sky */
if (rl->layflag & SCE_LAY_SKY)
atm_tile(pa, rl);
-
+
/* sky before edge */
if (rl->layflag & SCE_LAY_SKY)
sky_tile(pa, rl);
-
+
if (!R.test_break(R.tbh)) {
- if (rl->layflag & SCE_LAY_EDGE)
+ if (rl->layflag & SCE_LAY_EDGE)
if (R.r.mode & R_EDGE)
edge_enhance_add(pa, rect, edgerect);
}
-
+
if (rl->passflag & SCE_PASS_VECTOR)
reset_sky_speed(pa, rl);
-
+
if (edgerect) MEM_freeN(edgerect);
edgerect= NULL;
@@ -1462,7 +1462,7 @@ void zbufshade_tile(RenderPart *pa)
/* display active layer */
rr->renrect.ymin=rr->renrect.ymax = 0;
rr->renlay= render_get_active_layer(&R, rr);
-
+
MEM_freeN(pa->recto); pa->recto= NULL;
MEM_freeN(pa->rectp); pa->rectp= NULL;
MEM_freeN(pa->rectz); pa->rectz= NULL;
@@ -1486,7 +1486,7 @@ static void addps_sss(void *cb_handle, int obi, int facenr, int x, int y, int z)
return;
if (y<pa->crop || y>=pa->recty-pa->crop)
return;
-
+
if (pa->rectall) {
intptr_t *rs= pa->rectall + pa->rectx*y + x;
@@ -1529,8 +1529,8 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRe
/* cache for shadow */
shi->samplenr= R.shadowsamplenr[shi->thread]++;
-
- if (quad)
+
+ if (quad)
shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
else
shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
@@ -1576,13 +1576,13 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRe
/* init material vars */
shade_input_init_material(shi);
-
+
/* render */
shade_input_set_shade_texco(shi);
-
+
shade_samples_do_AO(ssamp);
shade_material_loop(shi, &shr);
-
+
copy_v3_v3(co, shi->co);
copy_v3_v3(color, shr.combined);
@@ -1649,7 +1649,7 @@ void zbufshade_sss_tile(RenderPart *pa)
memset(&ssamp, 0, sizeof(ssamp));
shade_sample_initialize(&ssamp, pa, rr->layers.first);
ssamp.tot= 1;
-
+
for (rl=rr->layers.first; rl; rl=rl->next) {
ssamp.shi[0].lay |= rl->lay;
ssamp.shi[0].layflag |= rl->layflag;
@@ -1671,7 +1671,7 @@ void zbufshade_sss_tile(RenderPart *pa)
zbufshade_sss_free(pa);
return;
}
-
+
fcol= RE_RenderLayerGetPass(rl, RE_PASSNAME_COMBINED, R.viewname);
co= MEM_mallocN(sizeof(float)*3*handle.totps, "SSSCo");
@@ -1689,7 +1689,7 @@ void zbufshade_sss_tile(RenderPart *pa)
rr->renrect.ymin = 0;
rr->renlay= rl;
}
-
+
seed= pa->rectx*pa->disprect.ymin;
#if 0
rs= pa->rectall;
@@ -1707,7 +1707,7 @@ void zbufshade_sss_tile(RenderPart *pa)
for (x=pa->disprect.xmin; x<pa->disprect.xmax; x++, fcol+=4) {
/* per pixel fixed seed */
BLI_thread_srandom(pa->thread, seed++);
-
+
#if 0
if (rs) {
/* for each sample in this pixel, shade it */
@@ -1741,7 +1741,7 @@ void zbufshade_sss_tile(RenderPart *pa)
shade_sample_sss(&ssamp, mat, obi, vlr, quad, x, y, *rz,
co[totpoint], color[totpoint], &area[totpoint]);
-
+
add_v3_v3(fcol, color[totpoint]);
fcol[3]= 1.0f;
totpoint++;
@@ -1761,7 +1761,7 @@ void zbufshade_sss_tile(RenderPart *pa)
shade_sample_sss(&ssamp, mat, obi, vlr, quad, x, y, *rbz,
co[totpoint], color[totpoint], &area[totpoint]);
-
+
/* to indicate this is a back sample */
area[totpoint]= -area[totpoint];
@@ -1776,7 +1776,7 @@ void zbufshade_sss_tile(RenderPart *pa)
}
if (y&1)
- if (re->test_break(re->tbh)) break;
+ if (re->test_break(re->tbh)) break;
}
/* note: after adding we do not free these arrays, sss keeps them */
@@ -1788,18 +1788,18 @@ void zbufshade_sss_tile(RenderPart *pa)
MEM_freeN(color);
MEM_freeN(area);
}
-
+
#if 0
if (re->r.mode & R_SHADOW)
ISB_free(pa);
#endif
-
+
if (display) {
/* display active layer */
rr->renrect.ymin=rr->renrect.ymax = 0;
rr->renlay= render_get_active_layer(&R, rr);
}
-
+
zbufshade_sss_free(pa);
}
@@ -1814,10 +1814,10 @@ static void renderhalo_post(RenderResult *rr, float *rectf, HaloRen *har) /* pos
/* calculate the disprect mapped coordinate for halo. note: rectx is disprect corrected */
haloxs= har->xs - R.disprect.xmin;
haloys= har->ys - R.disprect.ymin;
-
+
har->miny= miny= haloys - har->rad/R.ycor;
har->maxy= maxy= haloys + har->rad/R.ycor;
-
+
if (maxy < 0) {
/* pass */
}
@@ -1827,7 +1827,7 @@ static void renderhalo_post(RenderResult *rr, float *rectf, HaloRen *har) /* pos
else {
minx = floor(haloxs - har->rad);
maxx = ceil(haloxs + har->rad);
-
+
if (maxx < 0) {
/* pass */
}
@@ -1839,35 +1839,35 @@ static void renderhalo_post(RenderResult *rr, float *rectf, HaloRen *har) /* pos
if (maxx>=rr->rectx) maxx= rr->rectx-1;
if (miny<0) miny= 0;
if (maxy>rr->recty) maxy= rr->recty;
-
+
rectft= rectf+ 4*rr->rectx*miny;
for (y=miny; y<maxy; y++) {
-
+
rtf= rectft+4*minx;
-
+
yn= (y - haloys)*R.ycor;
ysq= yn*yn;
-
+
for (x=minx; x<=maxx; x++) {
xn= x - haloxs;
xsq= xn*xn;
dist= xsq+ysq;
if (dist<har->radsq) {
-
+
if (shadeHaloFloat(har, colf, 0x7FFFFF, dist, xn, yn, har->flarec))
addalphaAddfacFloat(rtf, colf, har->add);
}
rtf+=4;
}
-
+
rectft+= 4*rr->rectx;
-
- if (R.test_break(R.tbh)) break;
+
+ if (R.test_break(R.tbh)) break;
}
}
}
-}
+}
/* ------------------------------------------------------------------------ */
static void renderflare(RenderResult *rr, float *rectf, HaloRen *har)
@@ -1878,57 +1878,57 @@ static void renderflare(RenderResult *rr, float *rectf, HaloRen *har)
const float *rc;
float rad, alfa, visifac, vec[3];
int b, type;
-
+
fla= *har;
fla.linec= fla.ringc= fla.flarec= 0;
-
+
rad= har->rad;
alfa= har->alfa;
-
+
visifac= R.ycor*(har->pixels);
/* all radials added / r^3 == 1.0f! */
visifac /= (har->rad*har->rad*har->rad);
visifac*= visifac;
ma= har->mat;
-
+
/* first halo: just do */
-
+
har->rad= rad*ma->flaresize*visifac;
har->radsq= har->rad*har->rad;
har->zs= fla.zs= 0;
-
+
har->alfa= alfa*visifac;
renderhalo_post(rr, rectf, har);
-
+
/* next halo's: the flares */
rc= hashvectf + ma->seed2;
-
+
for (b=1; b<har->flarec; b++) {
-
+
fla.r = fabsf(rc[0]);
fla.g = fabsf(rc[1]);
fla.b = fabsf(rc[2]);
fla.alfa= ma->flareboost*fabsf(alfa*visifac*rc[3]);
fla.hard= 20.0f + fabsf(70.0f*rc[7]);
fla.tex= 0;
-
+
type= (int)(fabsf(3.9f*rc[6]));
fla.rad = ma->subsize * sqrtf(fabsf(2.0f * har->rad * rc[4]));
-
+
if (type==3) {
fla.rad*= 3.0f;
fla.rad+= R.rectx/10;
}
-
+
fla.radsq= fla.rad*fla.rad;
-
+
vec[0]= 1.4f*rc[5]*(har->xs-R.winx/2);
vec[1]= 1.4f*rc[5]*(har->ys-R.winy/2);
vec[2]= 32.0f*sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + 1.0f);
-
+
fla.xs= R.winx/2 + vec[0] + (1.2f+rc[8])*R.rectx*vec[0]/vec[2];
fla.ys= R.winy/2 + vec[1] + (1.2f+rc[8])*R.rectx*vec[1]/vec[2];
@@ -1944,7 +1944,7 @@ static void renderflare(RenderResult *rr, float *rectf, HaloRen *har)
if (type & 2) fla.type= HA_FLARECIRC;
else fla.type= 0;
renderhalo_post(rr, rectf, &fla);
-
+
rc+= 7;
}
}
@@ -1957,11 +1957,11 @@ void add_halo_flare(Render *re)
HaloRen *har;
int a, mode;
float *rect;
-
+
/* for now, we get the first renderlayer in list with halos set */
for (rl= rr->layers.first; rl; rl= rl->next) {
bool do_draw = false;
-
+
if ((rl->layflag & SCE_LAY_HALO) == 0)
continue;
@@ -1972,18 +1972,18 @@ void add_halo_flare(Render *re)
mode= R.r.mode;
R.r.mode &= ~R_PANORAMA;
-
+
project_renderdata(&R, projectverto, 0, 0, 0);
-
+
for (a=0; a<R.tothalo; a++) {
har= R.sortedhalos[a];
-
+
if (har->flarec && (har->lay & rl->lay)) {
do_draw = true;
renderflare(rr, rect, har);
}
}
-
+
if (do_draw) {
/* weak... the display callback wants an active renderlayer pointer... */
rr->renlay= rl;
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 79e41bc64cf..67bfd1bfdc7 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -68,8 +68,8 @@
#include "BLI_utildefines.h"
#include "BLI_hash.h"
-#include "DNA_material_types.h"
-#include "DNA_meshdata_types.h"
+#include "DNA_material_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_texture_types.h"
#include "DNA_listBase.h"
#include "DNA_particle_types.h"
@@ -114,10 +114,10 @@ float *RE_vertren_get_stress(ObjectRen *obr, VertRen *ver, int verify)
{
float *stress;
int nr= ver->index>>8;
-
+
stress= obr->vertnodes[nr].stress;
if (stress==NULL) {
- if (verify)
+ if (verify)
stress= obr->vertnodes[nr].stress= MEM_mallocN(256*RE_STRESS_ELEMS*sizeof(float), "stress table");
else
return NULL;
@@ -130,10 +130,10 @@ float *RE_vertren_get_rad(ObjectRen *obr, VertRen *ver, int verify)
{
float *rad;
int nr= ver->index>>8;
-
+
rad= obr->vertnodes[nr].rad;
if (rad==NULL) {
- if (verify)
+ if (verify)
rad= obr->vertnodes[nr].rad= MEM_callocN(256*RE_RAD_ELEMS*sizeof(float), "rad table");
else
return NULL;
@@ -145,10 +145,10 @@ float *RE_vertren_get_strand(ObjectRen *obr, VertRen *ver, int verify)
{
float *strand;
int nr= ver->index>>8;
-
+
strand= obr->vertnodes[nr].strand;
if (strand==NULL) {
- if (verify)
+ if (verify)
strand= obr->vertnodes[nr].strand= MEM_mallocN(256*RE_STRAND_ELEMS*sizeof(float), "strand table");
else
return NULL;
@@ -161,10 +161,10 @@ float *RE_vertren_get_tangent(ObjectRen *obr, VertRen *ver, int verify)
{
float *tangent;
int nr= ver->index>>8;
-
+
tangent= obr->vertnodes[nr].tangent;
if (tangent==NULL) {
- if (verify)
+ if (verify)
tangent= obr->vertnodes[nr].tangent= MEM_callocN(256*RE_TANGENT_ELEMS*sizeof(float), "tangent table");
else
return NULL;
@@ -178,7 +178,7 @@ float *RE_vertren_get_winspeed(ObjectInstanceRen *obi, VertRen *ver, int verify)
{
float *winspeed;
int totvector;
-
+
winspeed= obi->vectors;
if (winspeed==NULL) {
if (verify) {
@@ -212,7 +212,7 @@ VertRen *RE_vertren_copy(ObjectRen *obr, VertRen *ver)
float *fp1, *fp2;
int *int1, *int2;
int index= v1->index;
-
+
*v1= *ver;
v1->index= index;
@@ -255,25 +255,25 @@ VertRen *RE_findOrAddVert(ObjectRen *obr, int nr)
return NULL;
}
a= nr>>8;
-
+
if (a>=obr->vertnodeslen-1) { /* Need to allocate more columns..., and keep last element NULL for free loop */
temp= obr->vertnodes;
-
+
obr->vertnodes= MEM_mallocN(sizeof(VertTableNode)*(obr->vertnodeslen+TABLEINITSIZE), "vertnodes");
if (temp) memcpy(obr->vertnodes, temp, obr->vertnodeslen*sizeof(VertTableNode));
memset(obr->vertnodes+obr->vertnodeslen, 0, TABLEINITSIZE*sizeof(VertTableNode));
-
- obr->vertnodeslen+=TABLEINITSIZE;
+
+ obr->vertnodeslen+=TABLEINITSIZE;
if (temp) MEM_freeN(temp);
}
-
+
v= obr->vertnodes[a].vert;
if (v==NULL) {
int i;
-
+
v= (VertRen *)MEM_callocN(256*sizeof(VertRen), "findOrAddVert");
obr->vertnodes[a].vert= v;
-
+
for (i= (nr & 0xFFFFFF00), a=0; a<256; a++, i++) {
v[a].index= i;
}
@@ -371,10 +371,10 @@ float *RE_vlakren_get_surfnor(ObjectRen *obr, VlakRen *vlak, int verify)
{
float *surfnor;
int nr= vlak->index>>8;
-
+
surfnor= obr->vlaknodes[nr].surfnor;
if (surfnor==NULL) {
- if (verify)
+ if (verify)
surfnor= obr->vlaknodes[nr].surfnor= MEM_callocN(256*RE_SURFNOR_ELEMS*sizeof(float), "surfnor table");
else
return NULL;
@@ -410,10 +410,10 @@ RadFace **RE_vlakren_get_radface(ObjectRen *obr, VlakRen *vlak, int verify)
{
RadFace **radface;
int nr= vlak->index>>8;
-
+
radface= obr->vlaknodes[nr].radface;
if (radface==NULL) {
- if (verify)
+ if (verify)
radface = obr->vlaknodes[nr].radface= MEM_callocN(256 * RE_RADFACE_ELEMS * sizeof(void *), "radface table");
else
return NULL;
@@ -493,7 +493,7 @@ void RE_set_customdata_names(ObjectRen *obr, CustomData *data)
{
/* CustomData layer names are stored per object here, because the
* DerivedMesh which stores the layers is freed */
-
+
CustomDataLayer *layer;
int numtf = 0, numcol = 0, i, mtfn, mcn;
@@ -533,10 +533,10 @@ VlakRen *RE_findOrAddVlak(ObjectRen *obr, int nr)
return obr->vlaknodes[0].vlak;
}
a= nr>>8;
-
+
if (a>=obr->vlaknodeslen-1) { /* Need to allocate more columns..., and keep last element NULL for free loop */
temp= obr->vlaknodes;
-
+
obr->vlaknodes= MEM_mallocN(sizeof(VlakTableNode)*(obr->vlaknodeslen+TABLEINITSIZE), "vlaknodes");
if (temp) memcpy(obr->vlaknodes, temp, obr->vlaknodeslen*sizeof(VlakTableNode));
memset(obr->vlaknodes+obr->vlaknodeslen, 0, TABLEINITSIZE*sizeof(VlakTableNode));
@@ -546,7 +546,7 @@ VlakRen *RE_findOrAddVlak(ObjectRen *obr, int nr)
}
v= obr->vlaknodes[a].vlak;
-
+
if (v==NULL) {
int i;
@@ -566,10 +566,10 @@ float *RE_strandren_get_surfnor(ObjectRen *obr, StrandRen *strand, int verify)
{
float *surfnor;
int nr= strand->index>>8;
-
+
surfnor= obr->strandnodes[nr].surfnor;
if (surfnor==NULL) {
- if (verify)
+ if (verify)
surfnor= obr->strandnodes[nr].surfnor= MEM_callocN(256*RE_SURFNOR_ELEMS*sizeof(float), "surfnor strand table");
else
return NULL;
@@ -649,10 +649,10 @@ float *RE_strandren_get_simplify(struct ObjectRen *obr, struct StrandRen *strand
{
float *simplify;
int nr= strand->index>>8;
-
+
simplify= obr->strandnodes[nr].simplify;
if (simplify==NULL) {
- if (verify)
+ if (verify)
simplify= obr->strandnodes[nr].simplify= MEM_callocN(256*RE_SIMPLIFY_ELEMS*sizeof(float), "simplify strand table");
else
return NULL;
@@ -664,10 +664,10 @@ int *RE_strandren_get_face(ObjectRen *obr, StrandRen *strand, int verify)
{
int *face;
int nr= strand->index>>8;
-
+
face= obr->strandnodes[nr].face;
if (face==NULL) {
- if (verify)
+ if (verify)
face= obr->strandnodes[nr].face= MEM_callocN(256*RE_FACE_ELEMS*sizeof(int), "face strand table");
else
return NULL;
@@ -680,7 +680,7 @@ float *RE_strandren_get_winspeed(ObjectInstanceRen *obi, StrandRen *strand, int
{
float *winspeed;
int totvector;
-
+
winspeed= obi->vectors;
if (winspeed==NULL) {
if (verify) {
@@ -704,10 +704,10 @@ StrandRen *RE_findOrAddStrand(ObjectRen *obr, int nr)
return obr->strandnodes[0].strand;
}
a= nr>>8;
-
+
if (a>=obr->strandnodeslen-1) { /* Need to allocate more columns..., and keep last element NULL for free loop */
temp= obr->strandnodes;
-
+
obr->strandnodes= MEM_mallocN(sizeof(StrandTableNode)*(obr->strandnodeslen+TABLEINITSIZE), "strandnodes");
if (temp) memcpy(obr->strandnodes, temp, obr->strandnodeslen*sizeof(StrandTableNode));
memset(obr->strandnodes+obr->strandnodeslen, 0, TABLEINITSIZE*sizeof(StrandTableNode));
@@ -717,7 +717,7 @@ StrandRen *RE_findOrAddStrand(ObjectRen *obr, int nr)
}
v= obr->strandnodes[a].strand;
-
+
if (v==NULL) {
int i;
@@ -750,7 +750,7 @@ StrandBuffer *RE_addStrandBuffer(ObjectRen *obr, int totvert)
ObjectRen *RE_addRenderObject(Render *re, Object *ob, Object *par, int index, int psysindex, int lay)
{
ObjectRen *obr= MEM_callocN(sizeof(ObjectRen), "object render struct");
-
+
BLI_addtail(&re->objecttable, obr);
obr->ob= ob;
obr->par= par;
@@ -764,12 +764,12 @@ ObjectRen *RE_addRenderObject(Render *re, Object *ob, Object *par, int index, in
void free_renderdata_vertnodes(VertTableNode *vertnodes)
{
int a;
-
+
if (vertnodes==NULL) return;
-
+
for (a=0; vertnodes[a].vert; a++) {
MEM_freeN(vertnodes[a].vert);
-
+
if (vertnodes[a].rad)
MEM_freeN(vertnodes[a].rad);
if (vertnodes[a].strand)
@@ -783,19 +783,19 @@ void free_renderdata_vertnodes(VertTableNode *vertnodes)
if (vertnodes[a].origindex)
MEM_freeN(vertnodes[a].origindex);
}
-
+
MEM_freeN(vertnodes);
}
void free_renderdata_vlaknodes(VlakTableNode *vlaknodes)
{
int a;
-
+
if (vlaknodes==NULL) return;
-
+
for (a=0; vlaknodes[a].vlak; a++) {
MEM_freeN(vlaknodes[a].vlak);
-
+
if (vlaknodes[a].mtface)
MEM_freeN(vlaknodes[a].mtface);
if (vlaknodes[a].mcol)
@@ -811,19 +811,19 @@ void free_renderdata_vlaknodes(VlakTableNode *vlaknodes)
if (vlaknodes[a].radface)
MEM_freeN(vlaknodes[a].radface);
}
-
+
MEM_freeN(vlaknodes);
}
static void free_renderdata_strandnodes(StrandTableNode *strandnodes)
{
int a;
-
+
if (strandnodes==NULL) return;
-
+
for (a=0; strandnodes[a].strand; a++) {
MEM_freeN(strandnodes[a].strand);
-
+
if (strandnodes[a].uv)
MEM_freeN(strandnodes[a].uv);
if (strandnodes[a].mcol)
@@ -837,7 +837,7 @@ static void free_renderdata_strandnodes(StrandTableNode *strandnodes)
if (strandnodes[a].face)
MEM_freeN(strandnodes[a].face);
}
-
+
MEM_freeN(strandnodes);
}
@@ -847,7 +847,7 @@ void free_renderdata_tables(Render *re)
ObjectRen *obr;
StrandBuffer *strandbuf;
int a=0;
-
+
for (obr=re->objecttable.first; obr; obr=obr->next) {
if (obr->vertnodes) {
free_renderdata_vertnodes(obr->vertnodes);
@@ -889,7 +889,7 @@ void free_renderdata_tables(Render *re)
if (obr->mcol)
MEM_freeN(obr->mcol);
-
+
if (obr->rayfaces) {
MEM_freeN(obr->rayfaces);
obr->rayfaces = NULL;
@@ -943,19 +943,19 @@ HaloRen *RE_findOrAddHalo(ObjectRen *obr, int nr)
return NULL;
}
a= nr>>8;
-
+
if (a>=obr->blohalen-1) { /* Need to allocate more columns..., and keep last element NULL for free loop */
- //printf("Allocating %i more halo groups. %i total.\n",
+ //printf("Allocating %i more halo groups. %i total.\n",
// TABLEINITSIZE, obr->blohalen+TABLEINITSIZE );
temp=obr->bloha;
-
+
obr->bloha = (HaloRen **)MEM_callocN(sizeof(void *) * (obr->blohalen + TABLEINITSIZE), "Bloha");
if (temp) memcpy(obr->bloha, temp, obr->blohalen*sizeof(void *));
memset(&(obr->bloha[obr->blohalen]), 0, TABLEINITSIZE * sizeof(void *));
obr->blohalen+=TABLEINITSIZE; /*Does this really need to be power of 2?*/
if (temp) MEM_freeN(temp);
}
-
+
h= obr->bloha[a];
if (h==NULL) {
h= (HaloRen *)MEM_callocN(256*sizeof(HaloRen), "findOrAdHalo");
@@ -997,9 +997,9 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma,
har->xs= 0.5f*re->winx*(hoco[0]/zn);
har->ys= 0.5f*re->winy*(hoco[1]/zn);
har->zs= 0x7FFFFF*(hoco[2]/zn);
-
- har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
-
+
+ har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
+
/* halovect */
if (vec1) {
@@ -1015,7 +1015,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma,
zn= len_v3v3(vec1, vec);
har->hasize= vectsize*zn + (1.0f-vectsize)*hasize;
-
+
sub_v3_v3v3(har->no, vec, vec1);
normalize_v3(har->no);
}
@@ -1127,9 +1127,9 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
har->xs= 0.5f*re->winx*(hoco[0]/zn);
har->ys= 0.5f*re->winy*(hoco[1]/zn);
har->zs= 0x7FFFFF*(hoco[2]/zn);
-
- har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
-
+
+ har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
+
/* halovect */
if (vec1) {
@@ -1145,7 +1145,7 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
zn= len_v3v3(vec1, vec)*0.5f;
har->hasize= vectsize*zn + (1.0f-vectsize)*hasize;
-
+
sub_v3_v3v3(har->no, vec, vec1);
normalize_v3(har->no);
}
@@ -1168,7 +1168,7 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
if ((ma->mode & MA_HALOTEX) && ma->mtex[0])
har->tex= 1;
-
+
for (i=0; i<MAX_MTEX; i++)
if (ma->mtex[i] && (ma->septex & (1<<i))==0) {
mtex= ma->mtex[i];
@@ -1317,7 +1317,7 @@ void project_renderdata(Render *re,
if (do_pano) {
float panophi= xoffs;
-
+
re->panosi = sinf(panophi);
re->panoco = cosf(panophi);
}
@@ -1338,11 +1338,11 @@ void project_renderdata(Render *re,
}
projectfunc(vec, re->winmat, hoco);
-
+
/* we clip halos less critical, but not for the Z */
hoco[0]*= 0.5f;
hoco[1]*= 0.5f;
-
+
if ( panotestclip(re, do_pano, hoco) ) {
har->miny= har->maxy= -10000; /* that way render clips it */
}
@@ -1353,42 +1353,42 @@ void project_renderdata(Render *re,
/* bring back hocos */
hoco[0]*= 2.0f;
hoco[1]*= 2.0f;
-
+
zn= hoco[3];
har->xs= 0.5f*re->winx*(1.0f+hoco[0]/zn); /* the 0.5 negates the previous 2...*/
har->ys= 0.5f*re->winy*(1.0f+hoco[1]/zn);
-
+
/* this should be the zbuffer coordinate */
har->zs= 0x7FFFFF*(hoco[2]/zn);
/* taking this from the face clip functions? seems ok... */
har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
-
+
vec[0]+= har->hasize;
projectfunc(vec, re->winmat, hoco);
vec[0]-= har->hasize;
zn= hoco[3];
har->rad= fabsf(har->xs- 0.5f*re->winx*(1.0f+hoco[0]/zn));
-
+
/* this clip is not really OK, to prevent stars to become too large */
if (har->type & HA_ONLYSKY) {
if (har->rad>3.0f) har->rad= 3.0f;
}
-
+
har->radsq= har->rad*har->rad;
-
+
har->miny= har->ys - har->rad/re->ycor;
har->maxy= har->ys + har->rad/re->ycor;
-
+
/* the Zd value is still not really correct for pano */
-
+
vec[2] -= har->hasize; /* z negative, otherwise it's clipped */
projectfunc(vec, re->winmat, hoco);
zn = hoco[3];
zn = fabsf((float)har->zs - 0x7FFFFF * (hoco[2] / zn));
har->zd = CLAMPIS(zn, 0, INT_MAX);
-
+
}
-
+
}
}
}
@@ -1578,14 +1578,14 @@ int clip_render_object(float boundbox[2][3], float bounds[4], float winmat[4][4]
if (bounds) {
if (vec[0] < bounds[0] * vec[3]) fl |= 1;
else if (vec[0] > bounds[1] * vec[3]) fl |= 2;
-
+
if (vec[1] > bounds[3] * vec[3]) fl |= 4;
else if (vec[1] < bounds[2] * vec[3]) fl |= 8;
}
else {
if (vec[0] < -vec[3]) fl |= 1;
else if (vec[0] > vec[3]) fl |= 2;
-
+
if (vec[1] > vec[3]) fl |= 4;
else if (vec[1] < -vec[3]) fl |= 8;
}
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index fb441662829..04e9177241b 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -89,7 +89,7 @@ static void copy_to_ztile(int *rectz, int size, int x1, int y1, int tile, char *
{
int len4, *rz;
int x2, y2;
-
+
x2= x1+tile;
y2= y1+tile;
if (x2>=size) x2= size-1;
@@ -111,12 +111,12 @@ static int sizeoflampbuf(ShadBuf *shb)
{
int num, count=0;
char *cp;
-
+
cp= shb->cbuf;
num= (shb->size*shb->size)/256;
while (num--) count+= *(cp++);
-
+
return 256*count;
}
#endif
@@ -132,7 +132,7 @@ static float *give_jitter_tab(int samp)
static float jit[1496][2];
static char ctab[17]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int a, offset=0;
-
+
if (samp<2) samp= 2;
else if (samp>16) samp= 16;
@@ -142,19 +142,19 @@ static float *give_jitter_tab(int samp)
ctab[samp]= 1;
BLI_jitter_init((float (*)[2])jit[offset], samp*samp);
}
-
+
return jit[offset];
-
+
}
-static void make_jitter_weight_tab(Render *re, ShadBuf *shb, short filtertype)
+static void make_jitter_weight_tab(Render *re, ShadBuf *shb, short filtertype)
{
float *jit, totw= 0.0f;
int samp= get_render_shadow_samples(&re->r, shb->samp);
int a, tot=samp*samp;
-
+
shb->weight= MEM_mallocN(sizeof(float)*tot, "weight tab lamp");
-
+
for (jit= shb->jit, a=0; a<tot; a++, jit+=2) {
if (filtertype==LA_SHADBUF_TENT)
shb->weight[a] = 0.71f - sqrtf(jit[0] * jit[0] + jit[1] * jit[1]);
@@ -162,10 +162,10 @@ static void make_jitter_weight_tab(Render *re, ShadBuf *shb, short filtertype)
shb->weight[a] = RE_filter_value(R_FILTER_GAUSS, 1.8f * sqrtf(jit[0] * jit[0] + jit[1] * jit[1]));
else
shb->weight[a]= 1.0f;
-
+
totw+= shb->weight[a];
}
-
+
totw= 1.0f/totw;
for (a=0; a<tot; a++) {
shb->weight[a]*= totw;
@@ -319,7 +319,7 @@ static void compress_deepshadowbuf(Render *re, ShadBuf *shb, APixstr *apixbuf, A
int a, b, c, tot, minz, found, prevtot, newtot;
int sampletot[RE_MAX_OSA], totsample = 0, totsamplec = 0;
-
+
shsample= MEM_callocN(sizeof(ShadSampleBuf), "shad sample buf");
BLI_addtail(&shb->buffers, shsample);
@@ -511,32 +511,32 @@ static void compress_shadowbuf(ShadBuf *shb, int *rectz, int square)
int *rz, *rz1, verg, verg1, size= shb->size;
int a, x, y, minx, miny, byt1, byt2;
char *rc, *rcline, *ctile, *zt;
-
+
shsample= MEM_callocN(sizeof(ShadSampleBuf), "shad sample buf");
BLI_addtail(&shb->buffers, shsample);
-
+
shsample->zbuf= MEM_mallocN(sizeof(uintptr_t)*(size*size)/256, "initshadbuf2");
shsample->cbuf= MEM_callocN((size*size)/256, "initshadbuf3");
-
+
ztile= (uintptr_t *)shsample->zbuf;
ctile= shsample->cbuf;
-
+
/* help buffer */
rcline= MEM_mallocN(256*4+sizeof(int), "makeshadbuf2");
-
+
for (y=0; y<size; y+=16) {
if (y< size/2) miny= y+15-size/2;
else miny= y-size/2;
-
+
for (x=0; x<size; x+=16) {
-
+
/* is tile within spotbundle? */
a= size/2;
if (x< a) minx= x+15-a;
else minx= x-a;
-
+
dist = sqrtf((float)(minx * minx + miny * miny));
-
+
if (square==0 && dist>(float)(a+12)) { /* 12, tested with a onlyshadow lamp */
a= 256; verg= 0; /* 0x80000000; */ /* 0x7FFFFFFF; */
rz1= (&verg)+1;
@@ -544,9 +544,9 @@ static void compress_shadowbuf(ShadBuf *shb, int *rectz, int square)
else {
copy_to_ztile(rectz, size, x, y, 16, rcline);
rz1= (int *)rcline;
-
+
verg= (*rz1 & 0xFFFFFF00);
-
+
for (a=0;a<256;a++, rz1++) {
if ( (*rz1 & 0xFFFFFF00) !=verg) break;
}
@@ -556,9 +556,9 @@ static void compress_shadowbuf(ShadBuf *shb, int *rectz, int square)
*ztile= *(rz1-1);
}
else {
-
+
/* ACOMP etc. are defined to work L/B endian */
-
+
rc= rcline;
rz1= (int *)rcline;
verg= rc[ACOMP];
@@ -568,7 +568,7 @@ static void compress_shadowbuf(ShadBuf *shb, int *rectz, int square)
for (a=1;a<256;a++, rc+=4) {
byt1 &= (verg==rc[ACOMP]);
byt2 &= (verg1==rc[BCOMP]);
-
+
if (byt1==0) break;
}
if (byt1 && byt2) { /* only store byte */
@@ -576,7 +576,7 @@ static void compress_shadowbuf(ShadBuf *shb, int *rectz, int square)
*ztile= (uintptr_t)MEM_mallocN(256+4, "tile1");
rz= (int *)*ztile;
*rz= *rz1;
-
+
zt= (char *)(rz+1);
rc= rcline;
for (a=0; a<256; a++, zt++, rc+=4) *zt= rc[GCOMP];
@@ -586,7 +586,7 @@ static void compress_shadowbuf(ShadBuf *shb, int *rectz, int square)
*ztile= (uintptr_t)MEM_mallocN(2*256+4, "Tile2");
rz= (int *)*ztile;
*rz= *rz1;
-
+
zt= (char *)(rz+1);
rc= rcline;
for (a=0; a<256; a++, zt+=2, rc+=4) {
@@ -627,10 +627,10 @@ static void shadowbuf_autoclip(Render *re, LampRen *lar)
unsigned int lay = -1;
int i, a, maxtotvert, ok= 1;
char *clipflag;
-
+
minz= 1.0e30f; maxz= -1.0e30f;
copy_m4_m4(viewmat, lar->shb->viewmat);
-
+
if (lar->mode & (LA_LAYER|LA_LAYER_SHADOW)) lay= lar->lay;
maxtotvert= 0;
@@ -654,14 +654,14 @@ static void shadowbuf_autoclip(Render *re, LampRen *lar)
for (a=0; a<obr->totvlak; a++) {
if ((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
else vlr++;
-
+
/* note; these conditions are copied from zbuffer_shadow() */
if (vlr->mat!= ma) {
ma= vlr->mat;
ok= 1;
if ((ma->mode2 & MA_CASTSHADOW)==0 || (ma->mode & MA_SHADBUF)==0) ok= 0;
}
-
+
if (ok && (obi->lay & lay)) {
clipflag[vlr->v1->index]= 1;
clipflag[vlr->v2->index]= 1;
@@ -669,19 +669,19 @@ static void shadowbuf_autoclip(Render *re, LampRen *lar)
if (vlr->v4) clipflag[vlr->v4->index]= 1;
}
}
-
+
/* calculate min and max */
for (a=0; a< obr->totvert;a++) {
if ((a & 255)==0) ver= RE_findOrAddVert(obr, a);
else ver++;
-
+
if (clipflag[a]) {
copy_v3_v3(vec, ver->co);
mul_m4_v3(obviewmat, vec);
/* Z on visible side of lamp space */
if (vec[2] < 0.0f) {
float inpr, z= -vec[2];
-
+
/* since vec is rotated in lampspace, this is how to get the cosine of angle */
/* precision is set 20% larger */
vec[2]*= 1.2f;
@@ -698,17 +698,17 @@ static void shadowbuf_autoclip(Render *re, LampRen *lar)
}
MEM_freeN(clipflag);
-
+
/* set clipping min and max */
if (minz < maxz) {
float delta= (maxz - minz); /* threshold to prevent precision issues */
-
+
//printf("minz %f maxz %f delta %f\n", minz, maxz, delta);
if (lar->bufflag & LA_SHADBUF_AUTO_START)
lar->shb->d= minz - delta*0.02f; /* 0.02 is arbitrary... needs more thinking! */
if (lar->bufflag & LA_SHADBUF_AUTO_END)
lar->shb->clipend= maxz + delta*0.1f;
-
+
/* bias was calculated as percentage, we scale it to prevent animation issues */
delta= (lar->clipend-lar->clipsta)/(lar->shb->clipend-lar->shb->d);
//printf("bias delta %f\n", delta);
@@ -723,7 +723,7 @@ static void makeflatshadowbuf(Render *re, LampRen *lar, float *jitbuf)
/* zbuffering */
rectz= MEM_mapallocN(sizeof(int)*shb->size*shb->size, "makeshadbuf");
-
+
for (samples=0; samples<shb->totbuf; samples++) {
zbuffer_shadow(re, shb->persmat, lar, rectz, shb->size, jitbuf[2*samples], jitbuf[2*samples+1]);
/* create Z tiles (for compression): this system is 24 bits!!! */
@@ -732,7 +732,7 @@ static void makeflatshadowbuf(Render *re, LampRen *lar, float *jitbuf)
if (re->test_break(re->tbh))
break;
}
-
+
MEM_freeN(rectz);
}
@@ -753,7 +753,7 @@ static void makedeepshadowbuf(Render *re, LampRen *lar, float *jitbuf)
/* create Z tiles (for compression): this system is 24 bits!!! */
compress_deepshadowbuf(re, shb, apixbuf, apixbufstrand);
-
+
MEM_freeN(apixbuf);
if (apixbufstrand)
MEM_freeN(apixbufstrand);
@@ -764,22 +764,22 @@ void makeshadowbuf(Render *re, LampRen *lar)
{
ShadBuf *shb= lar->shb;
float wsize, *jitbuf, twozero[2]= {0.0f, 0.0f}, angle, temp;
-
+
if (lar->bufflag & (LA_SHADBUF_AUTO_START|LA_SHADBUF_AUTO_END))
shadowbuf_autoclip(re, lar);
-
+
/* just to enforce identical behavior of all irregular buffers */
if (lar->buftype==LA_SHADBUF_IRREGULAR)
shb->size= 1024;
-
+
/* matrices and window: in winmat the transformation is being put,
* transforming from observer view to lamp view, including lamp window matrix */
-
+
angle= saacos(lar->spotsi);
temp = 0.5f * shb->size * cosf(angle) / sinf(angle);
shb->pixsize= (shb->d)/temp;
wsize= shb->pixsize*(shb->size/2.0f);
-
+
perspective_m4(shb->winmat, -wsize, wsize, -wsize, wsize, shb->d, shb->clipend);
mul_m4_m4m4(shb->persmat, shb->winmat, shb->viewmat);
@@ -791,11 +791,11 @@ void makeshadowbuf(Render *re, LampRen *lar)
shb->jit= give_jitter_tab(get_render_shadow_samples(&re->r, shb->samp));
make_jitter_weight_tab(re, shb, lar->filtertype);
BLI_thread_unlock(LOCK_CUSTOM1);
-
+
if (shb->totbuf==4) jitbuf= give_jitter_tab(2);
else if (shb->totbuf==9) jitbuf= give_jitter_tab(3);
else jitbuf= twozero;
-
+
/* zbuffering */
if (lar->buftype == LA_SHADBUF_DEEP) {
makedeepshadowbuf(re, lar, jitbuf);
@@ -853,7 +853,7 @@ void threaded_makeshadowbufs(Render *re)
for (lar=re->lampren.first; lar; lar= lar->next)
if (lar->shb)
totthread++;
-
+
totthread = min_ii(totthread, re->r.threads);
}
else
@@ -879,7 +879,7 @@ void threaded_makeshadowbufs(Render *re)
}
BLI_threadpool_init(&threads, do_shadow_thread, totthread);
-
+
for (a=0; a<totthread; a++)
BLI_threadpool_insert(&threads, re);
@@ -896,7 +896,7 @@ void threaded_makeshadowbufs(Render *re)
break;
BLI_thread_unlock(LOCK_CUSTOM1);
} while (lar);
-
+
BLI_threadpool_end(&threads);
/* unset threadsafety */
@@ -911,34 +911,34 @@ void freeshadowbuf(LampRen *lar)
ShadBuf *shb= lar->shb;
ShadSampleBuf *shsample;
int b, v;
-
+
for (shsample= shb->buffers.first; shsample; shsample= shsample->next) {
if (shsample->deepbuf) {
v= shb->size*shb->size;
for (b=0; b<v; b++)
if (shsample->deepbuf[b])
MEM_freeN(shsample->deepbuf[b]);
-
+
MEM_freeN(shsample->deepbuf);
MEM_freeN(shsample->totbuf);
}
else {
intptr_t *ztile= shsample->zbuf;
const char *ctile= shsample->cbuf;
-
+
v= (shb->size*shb->size)/256;
for (b=0; b<v; b++, ztile++, ctile++)
if (*ctile) MEM_freeN((void *) *ztile);
-
+
MEM_freeN(shsample->zbuf);
MEM_freeN(shsample->cbuf);
}
}
BLI_freelistN(&shb->buffers);
-
+
if (shb->weight) MEM_freeN(shb->weight);
MEM_freeN(lar->shb);
-
+
lar->shb= NULL;
}
}
@@ -966,10 +966,10 @@ static int firstreadshadbuf(ShadBuf *shb, ShadSampleBuf *shsample, int **rz, int
return 1;
}
else if (*rz!= *( (int **)(shsample->zbuf+ofs) )) return 0;
-
+
return 1;
}
-
+
return 0;
}
@@ -989,7 +989,7 @@ static float readdeepvisibility(DeepSample *dsample, int tot, int z, int bias, f
*biast= 0.0f;
return (ds-1)->v; /* completely behind all samples */
}
-
+
/* check if this read needs bias blending */
if (biast) {
if (z > ds->z)
@@ -1035,7 +1035,7 @@ static float readdeepshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias,
}
/* return 1.0 : fully in light */
-static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int xs, int ys, int zs)
+static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int xs, int ys, int zs)
{
float temp;
int *rz, ofs;
@@ -1045,7 +1045,7 @@ static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int
/* simpleclip */
/* if (xs<0 || ys<0) return 1.0; */
/* if (xs>=shb->size || ys>=shb->size) return 1.0; */
-
+
/* always test borders of shadowbuffer */
if (xs<0) xs= 0; else if (xs>=shb->size) xs= shb->size-1;
if (ys<0) ys= 0; else if (ys>=shb->size) ys= shb->size-1;
@@ -1069,7 +1069,7 @@ static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int
ct= ((char *)rz);
ct+= 4+2*16*(ys & 15)+2*(xs & 15);
zsamp= *rz;
-
+
cz= (char *)&zsamp;
cz[BCOMP]= ct[0];
cz[GCOMP]= ct[1];
@@ -1090,15 +1090,15 @@ static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int
}
/* tricky stuff here; we use ints which can overflow easily with bias values */
-
+
if (zsamp > zs) return 1.0; /* absolute no shadow */
else if (zs < - 0x7FFFFE00 + bias) return 1.0; /* extreme close to clipstart */
else if (zsamp < zs-bias) return 0.0; /* absolute in shadow */
else { /* soft area */
-
+
temp= ( (float)(zs- zsamp) )/(float)bias;
return 1.0f - temp*temp;
-
+
}
}
@@ -1125,11 +1125,11 @@ float testshadowbuf(Render *re, ShadBuf *shb, const float co[3], const float dxc
float xs1, ys1, zs1, *jit, *weight, xres, yres, biasf;
int xs, ys, zs, bias, *rz;
short a, num;
-
+
/* crash preventer */
if (shb->buffers.first==NULL)
return 1.0f;
-
+
/* when facing away, assume fully in shadow */
if (inp <= 0.0f)
return 0.0f;
@@ -1150,19 +1150,19 @@ float testshadowbuf(Render *re, ShadBuf *shb, const float co[3], const float dxc
num= get_render_shadow_samples(&re->r, shb->samp);
num= num*num;
fac= shb->soft;
-
+
/* compute z bias */
if (mat_bias!=0.0f) biasf= shb->bias*mat_bias;
else biasf= shb->bias;
- /* with inp==1.0, bias is half the size. correction value was 1.1, giving errors
+ /* with inp==1.0, bias is half the size. correction value was 1.1, giving errors
* on cube edges, with one side being almost frontal lighted (ton) */
bias= (1.5f-inp*inp)*biasf;
-
+
/* in case of no filtering we can do things simpler */
if (num==1) {
for (shsample= shb->buffers.first; shsample; shsample= shsample->next)
shadfac += readshadowbuf(shb, shsample, bias, (int)xs1, (int)ys1, zs);
-
+
return shadfac/(float)shb->totbuf;
}
@@ -1176,12 +1176,12 @@ float testshadowbuf(Render *re, ShadBuf *shb, const float co[3], const float dxc
shadowbuf_project_co(&dy[0], &dy[1], NULL, shb, dco);
dy[0]= xs1 - dy[0];
dy[1]= ys1 - dy[1];
-
+
xres = fac * (fabsf(dx[0]) + fabsf(dy[0]));
yres = fac * (fabsf(dx[1]) + fabsf(dy[1]));
if (xres<1.0f) xres= 1.0f;
if (yres<1.0f) yres= 1.0f;
-
+
/* make xs1/xs1 corner of sample area */
xs1 -= xres*0.5f;
ys1 -= yres*0.5f;
@@ -1199,19 +1199,19 @@ float testshadowbuf(Render *re, ShadBuf *shb, const float co[3], const float dxc
}
}
}
-
+
/* full jittered shadow buffer lookup */
for (shsample= shb->buffers.first; shsample; shsample= shsample->next) {
jit= shb->jit;
weight= shb->weight;
-
+
for (a=num; a>0; a--, jit+=2, weight++) {
/* instead of jit i tried random: ugly! */
/* note: the plus 0.5 gives best sampling results, jit goes from -0.5 to 0.5 */
/* xs1 and ys1 are already corrected to be corner of sample area */
xs= xs1 + xres*(jit[0] + 0.5f);
ys= ys1 + yres*(jit[1] + 0.5f);
-
+
shadfac+= *weight * readshadowbuf(shb, shsample, bias, xs, ys, zs);
}
}
@@ -1231,7 +1231,7 @@ static float readshadowbuf_halo(ShadBuf *shb, ShadSampleBuf *shsample, int xs, i
/* negative! The other side is more important */
bias= -shb->bias;
-
+
/* simpleclip */
if (xs<0 || ys<0) return 0.0;
if (xs>=shb->size || ys>=shb->size) return 0.0;
@@ -1253,7 +1253,7 @@ static float readshadowbuf_halo(ShadBuf *shb, ShadSampleBuf *shsample, int xs, i
ct= ((char *)rz);
ct+= 4+2*16*(ys & 15)+2*(xs & 15);
zsamp= *rz;
-
+
cz= (char *)&zsamp;
cz[BCOMP]= ct[0];
cz[GCOMP]= ct[1];
@@ -1288,7 +1288,7 @@ static float readshadowbuf_halo(ShadBuf *shb, ShadSampleBuf *shsample, int xs, i
}
/* soft area */
-
+
temp= ( (float)(zs- zsamp) )/(float)bias;
return 1.0f - temp*temp;
}
@@ -1305,9 +1305,9 @@ float shadow_halo(LampRen *lar, const float p1[3], const float p2[3])
float count, lightcount;
int x, y, z, xs1, ys1;
int dx = 0, dy = 0;
-
+
siz= 0.5f*(float)shb->size;
-
+
co[0]= p1[0];
co[1]= p1[1];
co[2]= p1[2]/lar->sh_zfac;
@@ -1365,7 +1365,7 @@ float shadow_halo(LampRen *lar, const float p1[3], const float p2[3])
lambda_y= 1.0;
ldy= 0.0;
}
-
+
x= xs1;
y= ys1;
lambda= count= lightcount= 0.0;
@@ -1374,7 +1374,7 @@ float shadow_halo(LampRen *lar, const float p1[3], const float p2[3])
do {
lambda_o= lambda;
-
+
if (lambda_x==lambda_y) {
lambda_x+= ldx;
x+= dx;
@@ -1391,7 +1391,7 @@ float shadow_halo(LampRen *lar, const float p1[3], const float p2[3])
y+= dy;
}
}
-
+
lambda = min_ff(lambda_x, lambda_y);
/* not making any progress? */
@@ -1405,21 +1405,21 @@ float shadow_halo(LampRen *lar, const float p1[3], const float p2[3])
if (zf<= -1.0f) lightcount += 1.0f; /* close to the spot */
else {
-
+
/* make sure, behind the clipend we extend halolines. */
if (zf>=1.0f) z= 0x7FFFF000;
else z= (int)(0x7FFFF000*zf);
-
+
for (shsample= shb->buffers.first; shsample; shsample= shsample->next)
lightcount+= readshadowbuf_halo(shb, shsample, x, y, z);
-
+
}
}
while (lambda < 1.0f);
if (count!=0.0f) return (lightcount/count);
return 0.0f;
-
+
}
@@ -1461,7 +1461,7 @@ typedef struct BSPFace {
int facenr; /* index to retrieve VlakRen */
int type; /* only for strand now */
short shad_alpha, is_full;
-
+
/* strand caching data, optimize for point_behind_strand() */
float radline, radline_end, len;
float vec1[3], vec2[3], rc[3];
@@ -1502,25 +1502,25 @@ static void bound_rectf(rctf *box, const float v1[2])
/* halfway splitting, for initializing a more regular tree */
static void isb_bsp_split_init(ISBBranch *root, MemArena *mem, int level)
{
-
+
/* if level > 0 we create new branches and go deeper */
if (level > 0) {
ISBBranch *left, *right;
int i;
-
+
/* splitpoint */
root->divider[0]= 0.5f*(root->box.xmin+root->box.xmax);
root->divider[1]= 0.5f*(root->box.ymin+root->box.ymax);
-
+
/* find best splitpoint */
if (RCT_SIZE_X(&root->box) > RCT_SIZE_Y(&root->box))
i = root->index = 0;
else
i = root->index = 1;
-
+
left= root->left= BLI_memarena_alloc(mem, sizeof(ISBBranch));
right= root->right= BLI_memarena_alloc(mem, sizeof(ISBBranch));
-
+
/* box info */
left->box= root->box;
right->box= root->box;
@@ -1556,13 +1556,13 @@ static void isb_bsp_split(ISBBranch *root, MemArena *mem)
}
root->divider[0]/= BSPMAX_SAMPLE;
root->divider[1]/= BSPMAX_SAMPLE;
-
+
/* find best splitpoint */
if (RCT_SIZE_X(&root->box) > RCT_SIZE_Y(&root->box))
i = root->index = 0;
else
i = root->index = 1;
-
+
/* new branches */
left= root->left= BLI_memarena_alloc(mem, sizeof(ISBBranch));
right= root->right= BLI_memarena_alloc(mem, sizeof(ISBBranch));
@@ -1579,7 +1579,7 @@ static void isb_bsp_split(ISBBranch *root, MemArena *mem)
comp= a & 1;
else if (root->samples[a]->zco[i] < root->divider[i])
comp= 1;
-
+
if (comp==1) {
left->samples[left->totsamp]= root->samples[a];
left->totsamp++;
@@ -1589,12 +1589,12 @@ static void isb_bsp_split(ISBBranch *root, MemArena *mem)
right->totsamp++;
}
}
-
+
/* copy samples from tmp */
memcpy(root->samples, samples, right->totsamp*(sizeof(void *)));
right->samples= root->samples;
root->samples= NULL;
-
+
/* box info */
left->box= root->box;
right->box= root->box;
@@ -1615,10 +1615,10 @@ static int isb_bsp_insert(ISBBranch *root, MemArena *memarena, ISBSample *sample
ISBBranch *bspn= root;
const float *zco= sample->zco;
int i= 0;
-
+
/* debug counter, also used to check if something was filled in ever */
root->totsamp++;
-
+
/* going over branches until last one found */
while (bspn->left) {
if (zco[bspn->index] <= bspn->divider[bspn->index])
@@ -1628,12 +1628,12 @@ static int isb_bsp_insert(ISBBranch *root, MemArena *memarena, ISBSample *sample
i++;
}
/* bspn now is the last branch */
-
+
if (bspn->totsamp==BSPMAX_SAMPLE) {
printf("error in bsp branch\n"); /* only for debug, cannot happen */
return 1;
}
-
+
/* insert */
bspn->samples[bspn->totsamp]= sample;
bspn->totsamp++;
@@ -1650,23 +1650,23 @@ static int isb_bsp_insert(ISBBranch *root, MemArena *memarena, ISBSample *sample
}
/* initialize vars in face, for optimal point-in-face test */
-static void bspface_init_strand(BSPFace *face)
+static void bspface_init_strand(BSPFace *face)
{
-
+
face->radline= 0.5f* len_v2v2(face->v1, face->v2);
-
+
mid_v3_v3v3(face->vec1, face->v1, face->v2);
if (face->v4)
mid_v3_v3v3(face->vec2, face->v3, face->v4);
else
copy_v3_v3(face->vec2, face->v3);
-
+
face->rc[0]= face->vec2[0]-face->vec1[0];
face->rc[1]= face->vec2[1]-face->vec1[1];
face->rc[2]= face->vec2[2]-face->vec1[2];
-
+
face->len= face->rc[0]*face->rc[0]+ face->rc[1]*face->rc[1];
-
+
if (face->len != 0.0f) {
face->radline_end = face->radline / sqrtf(face->len);
face->len = 1.0f / face->len;
@@ -1678,31 +1678,31 @@ static int point_behind_strand(const float p[3], BSPFace *face)
{
/* v1 - v2 is radius, v1 - v3 length */
float dist, rc[2], pt[2];
-
+
/* using code from dist_to_line_segment_v2(), distance vec to line-piece */
if (face->len==0.0f) {
rc[0]= p[0]-face->vec1[0];
rc[1]= p[1]-face->vec1[1];
dist = len_v2(rc);
-
+
if (dist < face->radline)
return 1;
}
else {
float lambda= ( face->rc[0]*(p[0]-face->vec1[0]) + face->rc[1]*(p[1]-face->vec1[1]) )*face->len;
-
+
if (lambda > -face->radline_end && lambda < 1.0f+face->radline_end) {
/* hesse for dist: */
//dist= (float)(fabs( (p[0]-vec2[0])*rc[1] + (p[1]-vec2[1])*rc[0])/len);
-
+
pt[0]= lambda*face->rc[0]+face->vec1[0];
pt[1]= lambda*face->rc[1]+face->vec1[1];
rc[0]= pt[0]-p[0];
rc[1]= pt[1]-p[1];
dist = len_v2(rc);
-
+
if (dist < face->radline) {
float zval= face->vec1[2] + lambda*face->rc[2];
if (p[2] > zval)
@@ -1719,21 +1719,21 @@ static int point_behind_tria2d(const float p[3], const float v1[3], const float
{
float a[2], c[2], h[2], div;
float u, v;
-
+
a[0] = v2[0] - v1[0];
a[1] = v2[1] - v1[1];
c[0] = v3[0] - v1[0];
c[1] = v3[1] - v1[1];
-
+
div = a[0]*c[1] - a[1]*c[0];
if (div==0.0f)
return 0;
-
+
h[0] = p[0] - v1[0];
h[1] = p[1] - v1[1];
-
+
div = 1.0f/div;
-
+
u = (h[0]*c[1] - h[1]*c[0])*div;
if (u >= 0.0f) {
v = (a[0]*h[1] - a[1]*h[0])*div;
@@ -1746,7 +1746,7 @@ static int point_behind_tria2d(const float p[3], const float v1[3], const float
}
}
}
-
+
return 0;
}
@@ -1758,13 +1758,13 @@ static int rect_outside_line(rctf *rect, const float v1[3], const float v2[3], c
{
float a, b, c;
int side;
-
+
/* line formula for v1-v2 */
a= v2[1]-v1[1];
b= v1[0]-v2[0];
c= -a*v1[0] - b*v1[1];
side= a*v3[0] + b*v3[1] + c < 0.0f;
-
+
/* the four quad points */
if ( side==(rect->xmin*a + rect->ymin*b + c >= 0.0f) )
if ( side==(rect->xmax*a + rect->ymin*b + c >= 0.0f) )
@@ -1790,7 +1790,7 @@ static int rect_isect_tria(rctf *rect, const float v1[3], const float v2[3], con
/* if face overlaps a branch, it executes func. recursive */
static void isb_bsp_face_inside(ISBBranch *bspn, BSPFace *face)
{
-
+
/* are we descending? */
if (bspn->left) {
/* hrmf, the box struct cannot be addressed with index */
@@ -1810,30 +1810,30 @@ static void isb_bsp_face_inside(ISBBranch *bspn, BSPFace *face)
else {
/* else: end branch reached */
int a;
-
+
if (bspn->totsamp==0) return;
-
+
/* check for nodes entirely in shadow, can be skipped */
if (bspn->totsamp==bspn->full)
return;
-
+
/* if bsp node is entirely in front of face, give up */
if (bspn->box.zmax < face->box.zmin)
return;
-
+
/* if face boundbox is outside of branch rect, give up */
if (0==BLI_rctf_isect((rctf *)&face->box, (rctf *)&bspn->box, NULL))
return;
-
+
/* test all points inside branch */
for (a=bspn->totsamp-1; a>=0; a--) {
ISBSample *samp= bspn->samples[a];
-
+
if ((samp->facenr!=face->facenr || samp->obi!=face->obi) && samp->shadfac) {
if (face->box.zmin < samp->zco[2]) {
if (BLI_rctf_isect_pt_v((rctf *)&face->box, samp->zco)) {
int inshadow= 0;
-
+
if (face->type) {
if (point_behind_strand(samp->zco, face))
inshadow= 1;
@@ -1867,7 +1867,7 @@ static void isb_bsp_recalc_box(ISBBranch *root)
}
else if (root->totsamp) {
int a;
-
+
init_box(&root->box);
for (a=root->totsamp-1; a>=0; a--)
bound_boxf(&root->box, root->samples[a]->zco);
@@ -1879,7 +1879,7 @@ static void isb_bsp_test_strand(ZSpan *zspan, int obi, int zvlnr,
const float *v1, const float *v2, const float *v3, const float *v4)
{
BSPFace face;
-
+
face.v1= v1;
face.v2= v2;
face.v3= v3;
@@ -1891,9 +1891,9 @@ static void isb_bsp_test_strand(ZSpan *zspan, int obi, int zvlnr,
face.shad_alpha= (short)ceil(4096.0f*zspan->shad_alpha/(float)R.osa);
else
face.shad_alpha= (short)ceil(4096.0f*zspan->shad_alpha);
-
+
face.is_full= (zspan->shad_alpha==1.0f);
-
+
/* setup boundbox */
init_box(&face.box);
bound_boxf(&face.box, v1);
@@ -1901,12 +1901,12 @@ static void isb_bsp_test_strand(ZSpan *zspan, int obi, int zvlnr,
bound_boxf(&face.box, v3);
if (v4)
bound_boxf(&face.box, v4);
-
+
/* optimize values */
bspface_init_strand(&face);
-
+
isb_bsp_face_inside((ISBBranch *)zspan->rectz, &face);
-
+
}
/* callback function for zbuf clip */
@@ -1914,7 +1914,7 @@ static void isb_bsp_test_face(ZSpan *zspan, int obi, int zvlnr,
const float *v1, const float *v2, const float *v3, const float *v4)
{
BSPFace face;
-
+
face.v1= v1;
face.v2= v2;
face.v3= v3;
@@ -1926,9 +1926,9 @@ static void isb_bsp_test_face(ZSpan *zspan, int obi, int zvlnr,
face.shad_alpha= (short)ceil(4096.0f*zspan->shad_alpha/(float)R.osa);
else
face.shad_alpha= (short)ceil(4096.0f*zspan->shad_alpha);
-
+
face.is_full= (zspan->shad_alpha==1.0f);
-
+
/* setup boundbox */
init_box(&face.box);
bound_boxf(&face.box, v1);
@@ -1944,13 +1944,13 @@ static int testclip_minmax(const float ho[4], const float minmax[4])
{
float wco= ho[3];
int flag= 0;
-
+
if ( ho[0] > minmax[1]*wco) flag = 1;
else if ( ho[0]< minmax[0]*wco) flag = 2;
-
+
if ( ho[1] > minmax[3]*wco) flag |= 4;
else if ( ho[1]< minmax[2]*wco) flag |= 8;
-
+
return flag;
}
@@ -1966,35 +1966,35 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
float minmaxf[4], winmat[4][4];
int size= shb->size;
int i, a, ok=1, lay= -1;
-
+
/* further optimize, also sets minz maxz */
isb_bsp_recalc_box(root);
-
+
/* extra clipping for minmax */
minmaxf[0]= (2.0f*root->box.xmin - size-2.0f)/size;
minmaxf[1]= (2.0f*root->box.xmax - size+2.0f)/size;
minmaxf[2]= (2.0f*root->box.ymin - size-2.0f)/size;
minmaxf[3]= (2.0f*root->box.ymax - size+2.0f)/size;
-
+
if (lar->mode & (LA_LAYER|LA_LAYER_SHADOW)) lay= lar->lay;
-
+
/* (ab)use zspan, since we use zbuffer clipping code */
zbuf_alloc_span(&zspan, size, size, re->clipcrop);
-
+
zspan.zmulx= ((float)size)/2.0f;
zspan.zmuly= ((float)size)/2.0f;
zspan.zofsx= -0.5f;
zspan.zofsy= -0.5f;
-
+
/* pass on bsp root to zspan */
zspan.rectz= (int *)root;
-
+
/* filling methods */
zspanstrand= zspan;
// zspan.zbuflinefunc= zbufline_onlyZ;
zspan.zbuffunc= isb_bsp_test_face;
zspanstrand.zbuffunc= isb_bsp_test_strand;
-
+
for (i=0, obi=re->instancetable.first; obi; i++, obi=obi->next) {
obr= obi->obr;
@@ -2004,10 +2004,10 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
copy_m4_m4(winmat, shb->persmat);
for (a=0; a<obr->totvlak; a++) {
-
+
if ((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
else vlr++;
-
+
/* note, these conditions are copied in shadowbuf_autoclip() */
if (vlr->mat!= ma) {
ma= vlr->mat;
@@ -2016,13 +2016,13 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
if (ma->material_type == MA_TYPE_WIRE) ok= 0;
zspanstrand.shad_alpha= zspan.shad_alpha= ma->shad_alpha;
}
-
+
if (ok && (obi->lay & lay)) {
float hoco[4][4];
int c1, c2, c3, c4=0;
int d1, d2, d3, d4=0;
int partclip;
-
+
/* create hocos per face, it is while render */
projectvert(vlr->v1->co, winmat, hoco[0]); d1= testclip_minmax(hoco[0], minmaxf);
projectvert(vlr->v2->co, winmat, hoco[1]); d2= testclip_minmax(hoco[1], minmaxf);
@@ -2034,16 +2034,16 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
/* minmax clipping */
if (vlr->v4) partclip= d1 & d2 & d3 & d4;
else partclip= d1 & d2 & d3;
-
+
if (partclip==0) {
-
+
/* window clipping */
- c1= testclip(hoco[0]);
- c2= testclip(hoco[1]);
- c3= testclip(hoco[2]);
+ c1= testclip(hoco[0]);
+ c2= testclip(hoco[1]);
+ c3= testclip(hoco[2]);
if (vlr->v4)
- c4= testclip(hoco[3]);
-
+ c4= testclip(hoco[3]);
+
/* ***** NO WIRE YET */
if (ma->material_type == MA_TYPE_WIRE) {
if (vlr->v4)
@@ -2059,12 +2059,12 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
}
else
zbufclip(&zspan, i, a+1, hoco[0], hoco[1], hoco[2], c1, c2, c3);
-
+
}
}
}
}
-
+
zbuf_free_span(&zspan);
}
@@ -2073,7 +2073,7 @@ static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *v
{
float hoco[4], v1[3], nor[3];
float dface, fac, siz;
-
+
RE_vlakren_get_normal(&R, obi, vlr, nor);
copy_v3_v3(v1, vlr->v1->co);
if (obi->flag & R_TRANSFORMED)
@@ -2082,16 +2082,16 @@ static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *v
/* from shadepixel() */
dface = dot_v3v3(v1, nor);
hoco[3]= 1.0f;
-
+
/* ortho viewplane cannot intersect using view vector originating in (0, 0, 0) */
if (R.r.mode & R_ORTHO) {
/* x and y 3d coordinate can be derived from pixel coord and winmat */
float fx= 2.0f/(R.winx*R.winmat[0][0]);
float fy= 2.0f/(R.winy*R.winmat[1][1]);
-
+
hoco[0]= (x - 0.5f*R.winx)*fx - R.winmat[3][0]/R.winmat[0][0];
hoco[1]= (y - 0.5f*R.winy)*fy - R.winmat[3][1]/R.winmat[1][1];
-
+
/* using a*x + b*y + c*z = d equation, (a b c) is normal */
if (nor[2]!=0.0f)
hoco[2]= (dface - nor[0]*hoco[0] - nor[1]*hoco[1])/nor[2];
@@ -2100,23 +2100,23 @@ static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *v
}
else {
float div, view[3];
-
+
calc_view_vector(view, x, y);
-
+
div = dot_v3v3(nor, view);
- if (div==0.0f)
+ if (div==0.0f)
return 0;
-
+
fac= dface/div;
-
+
hoco[0]= fac*view[0];
hoco[1]= fac*view[1];
hoco[2]= fac*view[2];
}
-
+
/* move 3d vector to lampbuf */
mul_m4_v4(shb->persmat, hoco); /* rational hom co */
-
+
/* clip We can test for -1.0/1.0 because of the properties of the
* coordinate transformations. */
fac = fabsf(hoco[3]);
@@ -2126,15 +2126,15 @@ static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *v
return 0;
if (hoco[2]<-fac || hoco[2]>fac)
return 0;
-
+
siz= 0.5f*(float)shb->size;
co_r[0]= siz*(1.0f+hoco[0]/hoco[3]) -0.5f;
co_r[1]= siz*(1.0f+hoco[1]/hoco[3]) -0.5f;
co_r[2]= ((float)0x7FFFFFFF)*(hoco[2]/hoco[3]);
-
+
/* XXXX bias, much less than normal shadbuf, or do we need a constant? */
co_r[2] -= 0.05f*shb->bias;
-
+
return 1;
}
@@ -2143,13 +2143,13 @@ static void isb_add_shadfac(ISBShadfacA **isbsapp, MemArena *mem, int obi, int f
{
ISBShadfacA *new;
float shadfacf;
-
+
/* in osa case, the samples were filled in with factor 1.0/R.osa. if fewer samples we have to correct */
if (R.osa)
shadfacf= ((float)shadfac*R.osa)/(4096.0f*samples);
else
shadfacf= ((float)shadfac)/(4096.0f);
-
+
new= BLI_memarena_alloc(mem, sizeof(ISBShadfacA));
new->obi= obi;
new->facenr= facenr & ~RE_QUAD_OFFS;
@@ -2158,7 +2158,7 @@ static void isb_add_shadfac(ISBShadfacA **isbsapp, MemArena *mem, int obi, int f
new->next= (*isbsapp);
else
new->next= NULL;
-
+
*isbsapp= new;
}
@@ -2167,7 +2167,7 @@ static int isb_add_samples(RenderPart *pa, ISBBranch *root, MemArena *memarena,
{
int xi, yi, *xcos, *ycos;
int sample, bsp_err= 0;
-
+
/* bsp split doesn't like to handle regular sequences */
xcos= MEM_mallocN(pa->rectx*sizeof(int), "xcos");
ycos= MEM_mallocN(pa->recty*sizeof(int), "ycos");
@@ -2177,10 +2177,10 @@ static int isb_add_samples(RenderPart *pa, ISBBranch *root, MemArena *memarena,
ycos[yi]= yi;
BLI_array_randomize(xcos, sizeof(int), pa->rectx, 12345);
BLI_array_randomize(ycos, sizeof(int), pa->recty, 54321);
-
+
for (sample=0; sample<(R.osa?R.osa:1); sample++) {
ISBSample *samp= samplebuf[sample], *samp1;
-
+
for (yi=0; yi<pa->recty; yi++) {
int y= ycos[yi];
for (xi=0; xi<pa->rectx; xi++) {
@@ -2192,7 +2192,7 @@ static int isb_add_samples(RenderPart *pa, ISBBranch *root, MemArena *memarena,
if (bsp_err) break;
}
}
-
+
MEM_freeN(xcos);
MEM_freeN(ycos);
@@ -2210,37 +2210,37 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
MemArena *memarena;
intptr_t *rd;
int *recto, *rectp, x, y, sindex, sample, bsp_err=0;
-
+
/* storage for shadow, per thread */
isbdata= shb->isb_result[pa->thread];
-
+
/* to map the shi->xs and ys coordinate */
isbdata->minx= pa->disprect.xmin;
isbdata->miny= pa->disprect.ymin;
isbdata->rectx= pa->rectx;
isbdata->recty= pa->recty;
-
+
/* branches are added using memarena (32k branches) */
memarena = BLI_memarena_new(0x8000 * sizeof(ISBBranch), "isb arena");
BLI_memarena_use_calloc(memarena);
-
+
/* samplebuf is in camera view space (pixels) */
for (sample=0; sample<(R.osa?R.osa:1); sample++)
samplebuf[sample]= MEM_callocN(sizeof(ISBSample)*pa->rectx*pa->recty, "isb samplebuf");
-
+
/* for end result, ISBSamples point to this in non OSA case, otherwise to pixstruct->shadfac */
if (R.osa==0)
isbdata->shadfacs= MEM_callocN(pa->rectx*pa->recty*sizeof(short), "isb shadfacs");
-
+
/* setup bsp root */
memset(&root, 0, sizeof(ISBBranch));
root.box.xmin = (float)shb->size;
root.box.ymin = (float)shb->size;
-
+
/* create the sample buffers */
for (sindex=0, y=0; y<pa->recty; y++) {
for (x=0; x<pa->rectx; x++, sindex++) {
-
+
/* this makes it a long function, but splitting it out would mean 10+ arguments */
/* first check OSA case */
if (R.osa) {
@@ -2248,11 +2248,11 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
if (*rd) {
float xs= (float)(x + pa->disprect.xmin);
float ys= (float)(y + pa->disprect.ymin);
-
+
for (sample=0; sample<R.osa; sample++) {
PixStr *ps= (PixStr *)(*rd);
int mask= (1<<sample);
-
+
while (ps) {
if (ps->mask & mask)
break;
@@ -2262,7 +2262,7 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
ObjectInstanceRen *obi= &R.objectinstance[ps->obi];
ObjectRen *obr= obi->obr;
VlakRen *vlr= RE_findOrAddVlak(obr, (ps->facenr-1) & RE_QUAD_MASK);
-
+
samp= samplebuf[sample] + sindex;
/* convert image plane pixel location to lamp buffer space */
if (viewpixel_to_lampbuf(shb, obi, vlr, xs + R.jit[sample][0], ys + R.jit[sample][1], samp->zco)) {
@@ -2285,7 +2285,7 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
VlakRen *vlr= RE_findOrAddVlak(obr, (*rectp-1) & RE_QUAD_MASK);
float xs= (float)(x + pa->disprect.xmin);
float ys= (float)(y + pa->disprect.ymin);
-
+
samp= samplebuf[0] + sindex;
/* convert image plane pixel location to lamp buffer space */
if (viewpixel_to_lampbuf(shb, obi, vlr, xs, ys, samp->zco)) {
@@ -2298,30 +2298,30 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
}
}
}
-
+
/* simple method to see if we have samples */
if (root.box.xmin != (float)shb->size) {
/* now create a regular split, root.box has the initial bounding box of all pixels */
/* split bsp 8 levels deep, in regular grid (16 x 16) */
isb_bsp_split_init(&root, memarena, 8);
-
+
/* insert all samples in BSP now */
bsp_err= isb_add_samples(pa, &root, memarena, samplebuf);
-
+
if (bsp_err==0) {
/* go over all faces and fill in shadow values */
-
+
isb_bsp_fillfaces(&R, lar, &root); /* shb->persmat should have been calculated */
-
+
/* copy shadow samples to persistent buffer, reduce memory overhead */
if (R.osa) {
ISBShadfacA **isbsa= isbdata->shadfaca= MEM_callocN(pa->rectx*pa->recty*sizeof(void *), "isb shadfacs");
-
+
isbdata->memarena = BLI_memarena_new(0x8000 * sizeof(ISBSampleA), "isb arena");
BLI_memarena_use_calloc(isbdata->memarena);
for (rd= pa->rectdaps, x=pa->rectx*pa->recty; x>0; x--, rd++, isbsa++) {
-
+
if (*rd) {
PixStr *ps= (PixStr *)(*rd);
while (ps) {
@@ -2343,11 +2343,11 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
/* free BSP */
BLI_memarena_free(memarena);
-
+
/* free samples */
for (x=0; x<(R.osa?R.osa:1); x++)
MEM_freeN(samplebuf[x]);
-
+
if (bsp_err) printf("error in filling bsp\n");
}
@@ -2355,13 +2355,13 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
static ISBSampleA *isb_alloc_sample_transp(ISBSampleA **isbsa, MemArena *mem)
{
ISBSampleA *new;
-
+
new= BLI_memarena_alloc(mem, sizeof(ISBSampleA));
if (*isbsa)
new->next= (*isbsa);
else
new->next= NULL;
-
+
*isbsa= new;
return new;
}
@@ -2371,7 +2371,7 @@ static int isb_add_samples_transp(RenderPart *pa, ISBBranch *root, MemArena *mem
{
int xi, yi, *xcos, *ycos;
int sample, bsp_err= 0;
-
+
/* bsp split doesn't like to handle regular sequences */
xcos= MEM_mallocN(pa->rectx*sizeof(int), "xcos");
ycos= MEM_mallocN(pa->recty*sizeof(int), "ycos");
@@ -2381,15 +2381,15 @@ static int isb_add_samples_transp(RenderPart *pa, ISBBranch *root, MemArena *mem
ycos[yi]= yi;
BLI_array_randomize(xcos, sizeof(int), pa->rectx, 12345);
BLI_array_randomize(ycos, sizeof(int), pa->recty, 54321);
-
+
for (sample=0; sample<(R.osa?R.osa:1); sample++) {
ISBSampleA **samp= samplebuf[sample], *samp1;
-
+
for (yi=0; yi<pa->recty; yi++) {
int y= ycos[yi];
for (xi=0; xi<pa->rectx; xi++) {
int x= xcos[xi];
-
+
samp1= *(samp + y*pa->rectx + x);
while (samp1) {
bsp_err |= isb_bsp_insert(root, memarena, (ISBSample *)samp1);
@@ -2399,10 +2399,10 @@ static int isb_add_samples_transp(RenderPart *pa, ISBBranch *root, MemArena *mem
if (bsp_err) break;
}
}
-
+
MEM_freeN(xcos);
MEM_freeN(ycos);
-
+
return bsp_err;
}
@@ -2418,24 +2418,24 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
MemArena *memarena;
APixstr *ap;
int x, y, sindex, sample, bsp_err=0;
-
+
/* storage for shadow, per thread */
isbdata= shb->isb_result[pa->thread];
-
+
/* to map the shi->xs and ys coordinate */
isbdata->minx= pa->disprect.xmin;
isbdata->miny= pa->disprect.ymin;
isbdata->rectx= pa->rectx;
isbdata->recty= pa->recty;
-
+
/* branches are added using memarena (32k branches) */
memarena = BLI_memarena_new(0x8000 * sizeof(ISBBranch), "isb arena");
BLI_memarena_use_calloc(memarena);
-
+
/* samplebuf is in camera view space (pixels) */
for (sample=0; sample<(R.osa?R.osa:1); sample++)
samplebuf[sample]= MEM_callocN(sizeof(void *)*pa->rectx*pa->recty, "isb alpha samplebuf");
-
+
/* setup bsp root */
memset(&root, 0, sizeof(ISBBranch));
root.box.xmin = (float)shb->size;
@@ -2444,12 +2444,12 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
/* create the sample buffers */
for (ap= apixbuf, sindex=0, y=0; y<pa->recty; y++) {
for (x=0; x<pa->rectx; x++, sindex++, ap++) {
-
+
if (ap->p[0]) {
APixstr *apn;
float xs= (float)(x + pa->disprect.xmin);
float ys= (float)(y + pa->disprect.ymin);
-
+
for (apn=ap; apn; apn= apn->next) {
int a;
for (a=0; a<4; a++) {
@@ -2458,23 +2458,23 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
ObjectRen *obr= obi->obr;
VlakRen *vlr= RE_findOrAddVlak(obr, (apn->p[a]-1) & RE_QUAD_MASK);
float zco[3];
-
+
/* here we store shadfac, easier to create the end storage buffer. needs zero'ed, multiple shadowbufs use it */
apn->shadfac[a]= 0;
-
+
if (R.osa) {
for (sample=0; sample<R.osa; sample++) {
int mask= (1<<sample);
-
+
if (apn->mask[a] & mask) {
-
+
/* convert image plane pixel location to lamp buffer space */
if (viewpixel_to_lampbuf(shb, obi, vlr, xs + R.jit[sample][0], ys + R.jit[sample][1], zco)) {
samp= isb_alloc_sample_transp(samplebuf[sample] + sindex, memarena);
samp->obi= apn->obi[a];
samp->facenr= apn->p[a] & ~RE_QUAD_OFFS;
samp->shadfac= &apn->shadfac[a];
-
+
copy_v3_v3(samp->zco, zco);
bound_rectf((rctf *)&root.box, samp->zco);
}
@@ -2482,15 +2482,15 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
}
}
else {
-
+
/* convert image plane pixel location to lamp buffer space */
if (viewpixel_to_lampbuf(shb, obi, vlr, xs, ys, zco)) {
-
+
samp= isb_alloc_sample_transp(samplebuf[0] + sindex, memarena);
samp->obi= apn->obi[a];
samp->facenr= apn->p[a] & ~RE_QUAD_OFFS;
samp->shadfac= &apn->shadfac[a];
-
+
copy_v3_v3(samp->zco, zco);
bound_rectf((rctf *)&root.box, samp->zco);
}
@@ -2501,29 +2501,29 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
}
}
}
-
+
/* simple method to see if we have samples */
if (root.box.xmin != (float)shb->size) {
/* now create a regular split, root.box has the initial bounding box of all pixels */
/* split bsp 8 levels deep, in regular grid (16 x 16) */
isb_bsp_split_init(&root, memarena, 8);
-
+
/* insert all samples in BSP now */
bsp_err= isb_add_samples_transp(pa, &root, memarena, samplebuf);
-
+
if (bsp_err==0) {
ISBShadfacA **isbsa;
-
+
/* go over all faces and fill in shadow values */
isb_bsp_fillfaces(&R, lar, &root); /* shb->persmat should have been calculated */
-
+
/* copy shadow samples to persistent buffer, reduce memory overhead */
isbsa= isbdata->shadfaca= MEM_callocN(pa->rectx*pa->recty*sizeof(void *), "isb shadfacs");
-
+
isbdata->memarena = BLI_memarena_new(0x8000 * sizeof(ISBSampleA), "isb arena");
-
+
for (ap= apixbuf, x=pa->rectx*pa->recty; x>0; x--, ap++, isbsa++) {
-
+
if (ap->p[0]) {
APixstr *apn;
for (apn=ap; apn; apn= apn->next) {
@@ -2563,14 +2563,14 @@ float ISB_getshadow(ShadeInput *shi, ShadBuf *shb)
/* if raytracing, we can't accept irregular shadow */
if (shi->depth==0) {
ISBData *isbdata= shb->isb_result[shi->thread];
-
+
if (isbdata) {
if (isbdata->shadfacs || isbdata->shadfaca) {
int x= shi->xs - isbdata->minx;
-
+
if (x >= 0 && x < isbdata->rectx) {
int y= shi->ys - isbdata->miny;
-
+
if (y >= 0 && y < isbdata->recty) {
if (isbdata->shadfacs) {
const short *sp= isbdata->shadfacs + y*isbdata->rectx + x;
@@ -2580,7 +2580,7 @@ float ISB_getshadow(ShadeInput *shi, ShadBuf *shb)
int sindex= y*isbdata->rectx + x;
int obi= shi->obi - R.objectinstance;
ISBShadfacA *isbsa= *(isbdata->shadfaca + sindex);
-
+
while (isbsa) {
if (isbsa->facenr==shi->facenr+1 && isbsa->obi==obi)
return isbsa->shadfac>=1.0f?0.0f:1.0f - isbsa->shadfac;
@@ -2599,16 +2599,16 @@ float ISB_getshadow(ShadeInput *shi, ShadBuf *shb)
void ISB_create(RenderPart *pa, APixstr *apixbuf)
{
GroupObject *go;
-
+
/* go over all lamps, and make the irregular buffers */
for (go=R.lights.first; go; go= go->next) {
LampRen *lar= go->lampren;
-
+
if (lar->type==LA_SPOT && lar->shb && lar->buftype==LA_SHADBUF_IRREGULAR) {
-
+
/* create storage for shadow, per thread */
lar->shb->isb_result[pa->thread]= MEM_callocN(sizeof(ISBData), "isb data");
-
+
if (apixbuf)
isb_make_buffer_transp(pa, apixbuf, lar);
else
@@ -2622,11 +2622,11 @@ void ISB_create(RenderPart *pa, APixstr *apixbuf)
void ISB_free(RenderPart *pa)
{
GroupObject *go;
-
+
/* go over all lamps, and free the irregular buffers */
for (go=R.lights.first; go; go= go->next) {
LampRen *lar= go->lampren;
-
+
if (lar->type==LA_SPOT && lar->shb && lar->buftype==LA_SHADBUF_IRREGULAR) {
ISBData *isbdata= lar->shb->isb_result[pa->thread];
@@ -2635,10 +2635,10 @@ void ISB_free(RenderPart *pa)
MEM_freeN(isbdata->shadfacs);
if (isbdata->shadfaca)
MEM_freeN(isbdata->shadfaca);
-
+
if (isbdata->memarena)
BLI_memarena_free(isbdata->memarena);
-
+
MEM_freeN(isbdata);
lar->shb->isb_result[pa->thread]= NULL;
}
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index b4ff5f52fcf..d79749871c3 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -82,7 +82,7 @@ extern struct Render R;
*
*/
-/* initialize material variables in shadeinput,
+/* initialize material variables in shadeinput,
* doing inverse gamma correction where applicable */
void shade_input_init_material(ShadeInput *shi)
{
@@ -97,11 +97,11 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
{
shade_lamp_loop(shi, shr); /* clears shr */
-
+
if (shi->translucency != 0.0f) {
ShadeResult shr_t;
float fac = shi->translucency;
-
+
shade_input_init_material(shi);
negate_v3_v3(shi->vn, shi->vno);
negate_v3(shi->facenor);
@@ -123,7 +123,7 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
negate_v3(shi->vn);
negate_v3(shi->facenor);
}
-
+
/* depth >= 1 when ray-shading */
if (shi->depth == 0 || shi->volume_depth > 0) {
if (R.r.mode & R_RAYTRACE) {
@@ -137,7 +137,7 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
if ((shi->layflag & SCE_LAY_SKY) && (R.r.alphamode == R_ADDSKY))
shr->alpha = 1.0f;
}
-
+
if (R.r.mode & R_RAYTRACE) {
if (R.render_volumes_inside.first)
shade_volume_inside(shi, shr);
@@ -150,12 +150,12 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
{
bool compat = false;
float alpha;
-
+
/* ------ main shading loop -------- */
#ifdef RE_RAYCOUNTER
memset(&shi->raycounter, 0, sizeof(shi->raycounter));
#endif
-
+
if (shi->mat->nodetree && shi->mat->use_nodes) {
compat = ntreeShaderExecTree(shi->mat->nodetree, shi, shr);
}
@@ -164,7 +164,7 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
if (compat == false) {
/* copy all relevant material vars, note, keep this synced with render_types.h */
shade_input_init_material(shi);
-
+
if (shi->mat->material_type == MA_TYPE_VOLUME) {
if (R.r.mode & R_RAYTRACE) {
shade_volume_outside(shi, shr);
@@ -174,13 +174,13 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
shade_material_loop(shi, shr);
}
}
-
+
/* copy additional passes */
if (shi->passflag & (SCE_PASS_VECTOR | SCE_PASS_NORMAL)) {
copy_v4_v4(shr->winspeed, shi->winspeed);
copy_v3_v3(shr->nor, shi->vn);
}
-
+
/* MIST */
if ((shi->passflag & SCE_PASS_MIST) || ((R.wrld.mode & WO_MIST) && (shi->mat->mode & MA_NOMIST) == 0)) {
if (R.r.mode & R_ORTHO)
@@ -189,26 +189,26 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
shr->mist = mistfactor(len_v3(shi->co), shi->co);
}
else shr->mist = 0.0f;
-
+
if ((R.wrld.mode & WO_MIST) && (shi->mat->mode & MA_NOMIST) == 0) {
alpha = shr->mist;
}
else alpha = 1.0f;
-
+
/* add mist and premul color */
if (shr->alpha != 1.0f || alpha != 1.0f) {
float fac = alpha * (shr->alpha);
shr->combined[3] = fac;
-
+
if (shi->mat->material_type != MA_TYPE_VOLUME)
mul_v3_fl(shr->combined, fac);
}
else
shr->combined[3] = 1.0f;
-
+
/* add z */
shr->z = -shi->co[2];
-
+
/* RAYHITS */
#if 0
if (1 || shi->passflag & SCE_PASS_RAYHITS) {
@@ -234,7 +234,7 @@ void vlr_set_uv_indices(VlakRen *vlr, int *i1, int *i2, int *i3)
/* |\ 1| or |1 /| */
/* |0\ | |/ 0| */
/* 1---2 1---2 0 = orig face, 1 = new face */
-
+
/* Update vert nums to point to correct verts of original face */
if (vlr->flag & R_DIVIDE_24) {
if (vlr->flag & R_FACE_SPLIT) {
@@ -245,7 +245,7 @@ void vlr_set_uv_indices(VlakRen *vlr, int *i1, int *i2, int *i3)
}
}
else if (vlr->flag & R_FACE_SPLIT) {
- (*i2)++; (*i3)++;
+ (*i2)++; (*i3)++;
}
}
@@ -254,7 +254,7 @@ void vlr_set_uv_indices(VlakRen *vlr, int *i1, int *i2, int *i3)
void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen *vlr, short i1, short i2, short i3)
{
VertRen **vpp = &vlr->v1;
-
+
shi->vlr = vlr;
shi->obi = obi;
shi->obr = obi->obr;
@@ -266,10 +266,10 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen
shi->i1 = i1;
shi->i2 = i2;
shi->i3 = i3;
-
+
/* note, shi->mat is set in node shaders */
shi->mat = shi->mat_override ? shi->mat_override : vlr->mat;
-
+
shi->osatex = (shi->mat->texco & TEXCO_OSA);
shi->mode = shi->mat->mode_l; /* or-ed result for all nodes */
shi->mode2 = shi->mat->mode2_l;
@@ -277,7 +277,7 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen
/* facenormal copy, can get flipped */
shi->flippednor = 0;
RE_vlakren_get_normal(&R, obi, vlr, shi->facenor);
-
+
/* calculate vertexnormals */
if (vlr->flag & R_SMOOTH) {
copy_v3_v3(shi->n1, shi->v1->n);
@@ -301,7 +301,7 @@ void shade_input_set_triangle(ShadeInput *shi, int obi, int facenr, int UNUSED(n
shi->facenr = (facenr - 1) & RE_QUAD_MASK;
if (shi->facenr < shi->obr->totvlak) {
VlakRen *vlr = RE_findOrAddVlak(shi->obr, shi->facenr);
-
+
if (facenr & RE_QUAD_OFFS)
shade_input_set_triangle_i(shi, shi->obi, vlr, 0, 2, 3);
else
@@ -326,7 +326,7 @@ void shade_input_set_strand(ShadeInput *shi, StrandRen *strand, StrandPoint *spo
{
/* note, shi->mat is set in node shaders */
shi->mat = shi->mat_override ? shi->mat_override : strand->buffer->ma;
-
+
shi->osatex = (shi->mat->texco & TEXCO_OSA);
shi->mode = shi->mat->mode_l; /* or-ed result for all nodes */
@@ -405,7 +405,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
if (R.r.mode & R_SPEED) {
const float *speed;
-
+
speed = RE_strandren_get_winspeed(shi->obi, strand, 0);
if (speed)
copy_v4_v4(shi->winspeed, speed);
@@ -422,7 +422,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
if (texco & TEXCO_GLOB) {
mul_v3_m4v3(shi->gl, R.viewinv, shi->co);
-
+
if (shi->osatex) {
mul_v3_mat3_m4v3(shi->dxgl, R.viewinv, shi->dxco);
mul_v3_mat3_m4v3(shi->dygl, R.viewinv, shi->dyco);
@@ -453,7 +453,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
for (i = 0; (mcol = RE_strandren_get_mcol(obr, strand, i, &name, 0)); i++) {
ShadeInputCol *scol = &shi->col[i];
const char *cp = (char *)mcol;
-
+
shi->totcol++;
scol->name = name;
@@ -517,7 +517,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
suv->uv[0] = 0.0f;
suv->uv[1] = spoint->strandco;
suv->uv[2] = 0.0f; /* texture.c assumes there are 3 coords */
-
+
if (mode & MA_FACETEXTURE) {
/* no tface? set at 1.0f */
shi->vcol[0] = 1.0f;
@@ -564,13 +564,13 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
}
}
}
-
+
if (shi->do_manage) {
if (mode & (MA_VERTEXCOL | MA_VERTEXCOLP | MA_FACETEXTURE)) {
srgb_to_linearrgb_v3_v3(shi->vcol, shi->vcol);
}
}
-
+
}
/* from scanline pixel coordinates to 3d coordinates, requires set_triangle */
@@ -578,7 +578,7 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float v
{
/* returns not normalized, so is in viewplane coords */
calc_view_vector(view, x, y);
-
+
if (shi->mat->material_type == MA_TYPE_WIRE) {
/* wire cannot use normal for calculating shi->co, so
* we reconstruct the coordinate less accurate */
@@ -590,43 +590,43 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float v
else {
/* for non-wire, intersect with the triangle to get the exact coord */
float fac, dface, v1[3];
-
+
copy_v3_v3(v1, shi->v1->co);
if (shi->obi->flag & R_TRANSFORMED)
mul_m4_v3(shi->obi->mat, v1);
-
+
dface = dot_v3v3(v1, shi->facenor);
-
+
/* ortho viewplane cannot intersect using view vector originating in (0,0,0) */
if (R.r.mode & R_ORTHO) {
/* x and y 3d coordinate can be derived from pixel coord and winmat */
float fx = 2.0f / (R.winx * R.winmat[0][0]);
float fy = 2.0f / (R.winy * R.winmat[1][1]);
-
+
co[0] = (x - 0.5f * R.winx) * fx - R.winmat[3][0] / R.winmat[0][0];
co[1] = (y - 0.5f * R.winy) * fy - R.winmat[3][1] / R.winmat[1][1];
-
+
/* using a*x + b*y + c*z = d equation, (a b c) is normal */
if (shi->facenor[2] != 0.0f)
co[2] = (dface - shi->facenor[0] * co[0] - shi->facenor[1] * co[1]) / shi->facenor[2];
else
co[2] = 0.0f;
-
+
if (dxco && dyco) {
dxco[0] = fx;
dxco[1] = 0.0f;
if (shi->facenor[2] != 0.0f)
dxco[2] = -(shi->facenor[0] * fx) / shi->facenor[2];
- else
+ else
dxco[2] = 0.0f;
-
+
dyco[0] = 0.0f;
dyco[1] = fy;
if (shi->facenor[2] != 0.0f)
dyco[2] = -(shi->facenor[1] * fy) / shi->facenor[2];
- else
+ else
dyco[2] = 0.0f;
-
+
if (dxyview) {
fac = (co[2] != 0.0f) ? (1.0f / co[2]) : 0.0f;
dxyview[0] = -R.viewdx * fac;
@@ -636,20 +636,20 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float v
}
else {
float div;
-
+
div = dot_v3v3(shi->facenor, view);
if (div != 0.0f) fac = dface / div;
else fac = 0.0f;
-
+
co[0] = fac * view[0];
co[1] = fac * view[1];
co[2] = fac * view[2];
-
+
/* pixel dx/dy for render coord */
if (dxco && dyco) {
float u = dface / (div - R.viewdx * shi->facenor[0]);
float v = dface / (div - R.viewdy * shi->facenor[1]);
-
+
dxco[0] = co[0] - (view[0] - R.viewdx) * u;
dxco[1] = co[1] - (view[1]) * u;
dxco[2] = co[2] - (view[2]) * u;
@@ -657,7 +657,7 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float v
dyco[0] = co[0] - (view[0]) * v;
dyco[1] = co[1] - (view[1] - R.viewdy) * v;
dyco[2] = co[2] - (view[2]) * v;
-
+
if (dxyview) {
if (fac != 0.0f) fac = 1.0f / fac;
dxyview[0] = -R.viewdx * fac;
@@ -666,11 +666,11 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float v
}
}
}
-
+
/* set camera coords - for scanline, it's always 0.0,0.0,0.0 (render is in camera space)
* however for raytrace it can be different - the position of the last intersection */
shi->camera_co[0] = shi->camera_co[1] = shi->camera_co[2] = 0.0f;
-
+
/* cannot normalize earlier, code above needs it at viewplane level */
normalize_v3(view);
}
@@ -679,7 +679,7 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float v
void shade_input_set_viewco(ShadeInput *shi, float x, float y, float xs, float ys, float z)
{
float *dxyview = NULL, *dxco = NULL, *dyco = NULL;
-
+
/* currently in use for dithering (soft shadow), node preview, irregular shad */
shi->xs = (int)xs;
shi->ys = (int)ys;
@@ -734,7 +734,7 @@ void barycentric_differentials_from_position(
void shade_input_set_uv(ShadeInput *shi)
{
VlakRen *vlr = shi->vlr;
-
+
if ((vlr->flag & R_SMOOTH) || (shi->mat->texco & NEED_UV) || (shi->passflag & SCE_PASS_UV)) {
float v1[3], v2[3], v3[3];
@@ -751,10 +751,10 @@ void shade_input_set_uv(ShadeInput *shi)
/* exception case for wire render of edge */
if (vlr->v2 == vlr->v3) {
float lend, lenc;
-
+
lend = len_v3v3(v2, v1);
lenc = len_v3v3(shi->co, v1);
-
+
if (lend == 0.0f) {
shi->u = shi->v = 0.0f;
}
@@ -762,7 +762,7 @@ void shade_input_set_uv(ShadeInput *shi)
shi->u = -(1.0f - lenc / lend);
shi->v = 0.0f;
}
-
+
if (shi->osatex) {
shi->dx_u = 0.0f;
shi->dx_v = 0.0f;
@@ -799,7 +799,7 @@ void shade_input_set_normals(ShadeInput *shi)
shi->flippednor = 1;
}
}
-
+
/* calculate vertexnormals */
if (shi->vlr->flag & R_SMOOTH) {
float *n1 = shi->n1, *n2 = shi->n2, *n3 = shi->n3;
@@ -809,21 +809,21 @@ void shade_input_set_normals(ShadeInput *shi)
negate_v3(n2);
negate_v3(n3);
}
-
+
shi->vn[0] = l * n3[0] - u * n1[0] - v * n2[0];
shi->vn[1] = l * n3[1] - u * n1[1] - v * n2[1];
shi->vn[2] = l * n3[2] - u * n1[2] - v * n2[2];
/* use unnormalized normal (closer to games) */
copy_v3_v3(shi->nmapnorm, shi->vn);
-
+
normalize_v3(shi->vn);
}
else {
copy_v3_v3(shi->vn, shi->facenor);
copy_v3_v3(shi->nmapnorm, shi->vn);
}
-
+
/* used in nodes */
copy_v3_v3(shi->vno, shi->vn);
@@ -838,25 +838,25 @@ void shade_input_set_vertex_normals(ShadeInput *shi)
{
float u = shi->u, v = shi->v;
float l = 1.0f + u + v;
-
+
/* calculate vertexnormals */
if (shi->vlr->flag & R_SMOOTH) {
const float *n1 = shi->n1, *n2 = shi->n2, *n3 = shi->n3;
-
+
shi->vn[0] = l * n3[0] - u * n1[0] - v * n2[0];
shi->vn[1] = l * n3[1] - u * n1[1] - v * n2[1];
shi->vn[2] = l * n3[2] - u * n1[2] - v * n2[2];
-
+
/* use unnormalized normal (closer to games) */
copy_v3_v3(shi->nmapnorm, shi->vn);
-
+
normalize_v3(shi->vn);
}
else {
copy_v3_v3(shi->vn, shi->facenor);
copy_v3_v3(shi->nmapnorm, shi->vn);
}
-
+
/* used in nodes */
copy_v3_v3(shi->vno, shi->vn);
}
@@ -887,10 +887,10 @@ void shade_input_set_shade_texco(ShadeInput *shi)
/* calculate dxno */
if (shi->vlr->flag & R_SMOOTH) {
-
+
if (shi->osatex && (texco & (TEXCO_NORM | TEXCO_REFL)) ) {
const float *n1 = shi->n1, *n2 = shi->n2, *n3 = shi->n3;
-
+
dl = shi->dx_u + shi->dx_v;
shi->dxno[0] = dl * n3[0] - shi->dx_u * n1[0] - shi->dx_v * n2[0];
shi->dxno[1] = dl * n3[1] - shi->dx_u * n1[1] - shi->dx_v * n2[1];
@@ -899,7 +899,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->dyno[0] = dl * n3[0] - shi->dy_u * n1[0] - shi->dy_v * n2[0];
shi->dyno[1] = dl * n3[1] - shi->dy_u * n1[1] - shi->dy_v * n2[1];
shi->dyno[2] = dl * n3[2] - shi->dy_u * n1[2] - shi->dy_v * n2[2];
-
+
}
}
@@ -999,10 +999,10 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->surfdist = 0.0f;
}
-
+
if (R.r.mode & R_SPEED) {
const float *s1, *s2, *s3;
-
+
s1 = RE_vertren_get_winspeed(obi, v1, 0);
s2 = RE_vertren_get_winspeed(obi, v2, 0);
s3 = RE_vertren_get_winspeed(obi, v3, 0);
@@ -1020,14 +1020,14 @@ void shade_input_set_shade_texco(ShadeInput *shi)
/* pass option forces UV calc */
if ((shi->passflag & SCE_PASS_UV) || (R.flag & R_NEED_VCOL))
texco |= (NEED_UV | TEXCO_UV);
-
+
/* texture coordinates. shi->dxuv shi->dyuv have been set */
if (texco & NEED_UV) {
-
+
if (texco & TEXCO_ORCO) {
if (v1->orco) {
const float *o1, *o2, *o3;
-
+
o1 = v1->orco;
o2 = v2->orco;
o3 = v3->orco;
@@ -1035,7 +1035,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->lo[0] = l * o3[0] - u * o1[0] - v * o2[0];
shi->lo[1] = l * o3[1] - u * o1[1] - v * o2[1];
shi->lo[2] = l * o3[2] - u * o1[2] - v * o2[2];
-
+
if (shi->osatex) {
dl = shi->dx_u + shi->dx_v;
shi->dxlo[0] = dl * o3[0] - shi->dx_u * o1[0] - shi->dx_v * o2[0];
@@ -1050,18 +1050,18 @@ void shade_input_set_shade_texco(ShadeInput *shi)
copy_v3_v3(shi->duplilo, obi->dupliorco);
}
-
+
if (texco & TEXCO_GLOB) {
copy_v3_v3(shi->gl, shi->co);
mul_m4_v3(R.viewinv, shi->gl);
if (shi->osatex) {
copy_v3_v3(shi->dxgl, shi->dxco);
- mul_mat3_m4_v3(R.viewinv, shi->dxgl);
+ mul_mat3_m4_v3(R.viewinv, shi->dxgl);
copy_v3_v3(shi->dygl, shi->dyco);
mul_mat3_m4_v3(R.viewinv, shi->dygl);
}
}
-
+
if (texco & TEXCO_STRAND) {
shi->strandco = (l * v3->accum - u * v1->accum - v * v2->accum);
if (shi->osatex) {
@@ -1071,7 +1071,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->dystrand = dl * v3->accum - shi->dy_u * v1->accum - shi->dy_v * v2->accum;
}
}
-
+
if ((texco & TEXCO_UV) || (mode & (MA_VERTEXCOL | MA_VERTEXCOLP | MA_FACETEXTURE)) || (R.flag & R_NEED_VCOL)) {
VlakRen *vlr = shi->vlr;
MTFace *tface;
@@ -1092,7 +1092,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
ShadeInputCol *scol = &shi->col[i];
const char *cp1, *cp2, *cp3;
float a[3];
-
+
shi->totcol++;
scol->name = name;
@@ -1252,7 +1252,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
suv->uv[0] = 2.0f * (u + .5f);
suv->uv[1] = 2.0f * (v + .5f);
suv->uv[2] = 0.0f; /* texture.c assumes there are 3 coords */
-
+
if (mode & MA_FACETEXTURE) {
/* no tface? set at 1.0f */
shi->vcol[0] = 1.0f;
@@ -1262,16 +1262,16 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
}
}
-
+
if (texco & TEXCO_NORM) {
shi->orn[0] = -shi->vn[0];
shi->orn[1] = -shi->vn[1];
shi->orn[2] = -shi->vn[2];
}
-
+
if (texco & TEXCO_STRESS) {
const float *s1, *s2, *s3;
-
+
s1 = RE_vertren_get_stress(obr, v1, 0);
s2 = RE_vertren_get_stress(obr, v2, 0);
s3 = RE_vertren_get_stress(obr, v3, 0);
@@ -1282,7 +1282,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
else shi->stress = 0.0f;
}
-
+
if (texco & TEXCO_TANGENT) {
if ((mode & MA_TANGENT_V) == 0) {
/* just prevent surprises */
@@ -1291,12 +1291,12 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
}
}
-
+
/* this only avalailable for scanline renders */
if (shi->depth == 0) {
float x = shi->xs;
float y = shi->ys;
-
+
if (texco & TEXCO_WINDOW) {
shi->winco[0] = -1.0f + 2.0f * x / (float)R.winx;
shi->winco[1] = -1.0f + 2.0f * y / (float)R.winy;
@@ -1319,7 +1319,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
srgb_to_linearrgb_v3_v3(shi->vcol, shi->vcol);
}
}
-
+
}
/* ****************** ShadeSample ************************************** */
@@ -1327,9 +1327,9 @@ void shade_input_set_shade_texco(ShadeInput *shi)
/* initialize per part, not per pixel! */
void shade_input_initialize(ShadeInput *shi, RenderPart *pa, RenderLayer *rl, int sample)
{
-
+
memset(shi, 0, sizeof(ShadeInput));
-
+
shi->sample = sample;
shi->thread = pa->thread;
shi->do_preview = (R.r.scemode & R_MATNODE_PREVIEW) != 0;
@@ -1345,21 +1345,21 @@ void shade_input_initialize(ShadeInput *shi, RenderPart *pa, RenderLayer *rl, in
shi->light_override = rl->light_override;
// shi->rl= rl;
/* note shi.depth==0 means first hit, not raytracing */
-
+
}
/* initialize per part, not per pixel! */
void shade_sample_initialize(ShadeSample *ssamp, RenderPart *pa, RenderLayer *rl)
{
int a, tot;
-
+
tot = R.osa == 0 ? 1 : R.osa;
-
+
for (a = 0; a < tot; a++) {
shade_input_initialize(&ssamp->shi[a], pa, rl, a);
memset(&ssamp->shr[a], 0, sizeof(ShadeResult));
}
-
+
get_sample_layers(pa, rl, ssamp->rlpp);
}
@@ -1370,7 +1370,7 @@ void shade_samples_do_AO(ShadeSample *ssamp)
return;
if (!(R.r.mode & R_RAYTRACE) && !(R.wrld.ao_gather_method == WO_AOGATHER_APPROX))
return;
-
+
if (R.wrld.mode & (WO_AMB_OCC | WO_ENV_LIGHT | WO_INDIRECT_LIGHT)) {
ShadeInput *shi = &ssamp->shi[0];
int sample;
@@ -1390,28 +1390,28 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
{
ShadeInput *shi;
float xs, ys;
-
+
ssamp->tot = 0;
-
+
for (shi = ssamp->shi; ps; ps = ps->next) {
shade_input_set_triangle(shi, ps->obi, ps->facenr, 1);
-
+
if (shi->vlr) { /* NULL happens for env material or for 'all z' */
unsigned short curmask = ps->mask;
-
+
/* full osa is only set for OSA renders */
if (shi->vlr->flag & R_FULL_OSA) {
short shi_cp = 0, samp;
-
+
for (samp = 0; samp < R.osa; samp++) {
if (curmask & (1 << samp)) {
/* zbuffer has this inverse corrected, ensures xs,ys are inside pixel */
xs = (float)x + R.jit[samp][0] + 0.5f;
ys = (float)y + R.jit[samp][1] + 0.5f;
-
+
if (shi_cp)
shade_input_copy_triangle(shi, shi - 1);
-
+
shi->mask = (1 << samp);
// shi->rl= ssamp->rlpp[samp];
shi->samplenr = R.shadowsamplenr[shi->thread]++; /* this counter is not being reset per pixel */
@@ -1421,7 +1421,7 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
shade_input_set_normals(shi);
else /* XXX shi->flippednor messes up otherwise */
shade_input_set_vertex_normals(shi);
-
+
shi_cp = 1;
shi++;
}
@@ -1449,7 +1449,7 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
shade_input_set_normals(shi);
shi++;
}
-
+
/* total sample amount, shi->sample is static set in initialize */
if (shi != ssamp->shi)
ssamp->tot = (shi - 1)->sample + 1;
@@ -1461,15 +1461,15 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
int shade_samples(ShadeSample *ssamp, PixStr *ps, int x, int y)
{
shade_samples_fill_with_ps(ssamp, ps, x, y);
-
+
if (ssamp->tot) {
ShadeInput *shi = ssamp->shi;
ShadeResult *shr = ssamp->shr;
int samp;
-
+
/* if shadow or AO? */
shade_samples_do_AO(ssamp);
-
+
/* if shade (all shadepinputs have same passflag) */
if (ssamp->shi[0].passflag & ~(SCE_PASS_Z | SCE_PASS_INDEXOB | SCE_PASS_INDEXMA)) {
@@ -1482,7 +1482,7 @@ int shade_samples(ShadeSample *ssamp, PixStr *ps, int x, int y)
for (samp = 0; samp < ssamp->tot; samp++, shi++, shr++)
shr->z = -shi->co[2];
}
-
+
return 1;
}
return 0;
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 83827067775..090c249defb 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -68,14 +68,14 @@ extern struct Render R;
ListBase *get_lights(ShadeInput *shi)
{
-
+
if (R.r.scemode & R_BUTS_PREVIEW)
return &R.lights;
if (shi->light_override)
return &shi->light_override->gobject;
if (shi->mat && shi->mat->group)
return &shi->mat->group->gobject;
-
+
return &R.lights;
}
@@ -84,15 +84,15 @@ static void fogcolor(const float colf[3], float *rco, float *view)
{
float alpha, stepsize, startdist, dist, hor[4], zen[3], vec[3], dview[3];
float div=0.0f, distfac;
-
+
hor[0]= R.wrld.horr; hor[1]= R.wrld.horg; hor[2]= R.wrld.horb;
zen[0]= R.wrld.zenr; zen[1]= R.wrld.zeng; zen[2]= R.wrld.zenb;
-
+
copy_v3_v3(vec, rco);
-
+
/* we loop from cur coord to mist start in steps */
stepsize= 1.0f;
-
+
div= ABS(view[2]);
dview[0]= view[0]/(stepsize*div);
dview[1]= view[1]/(stepsize*div);
@@ -100,22 +100,22 @@ static void fogcolor(const float colf[3], float *rco, float *view)
startdist= -rco[2] + BLI_frand();
for (dist= startdist; dist>R.wrld.miststa; dist-= stepsize) {
-
+
hor[0]= R.wrld.horr; hor[1]= R.wrld.horg; hor[2]= R.wrld.horb;
alpha= 1.0f;
do_sky_tex(vec, vec, NULL, hor, zen, &alpha);
-
+
distfac= (dist-R.wrld.miststa)/R.wrld.mistdist;
-
+
hor[3]= hor[0]*distfac*distfac;
-
+
/* premul! */
alpha= hor[3];
hor[0]= hor[0]*alpha;
hor[1]= hor[1]*alpha;
hor[2]= hor[2]*alpha;
addAlphaOverFloat(colf, hor);
-
+
sub_v3_v3(vec, dview);
}
}
@@ -125,16 +125,16 @@ static void fogcolor(const float colf[3], float *rco, float *view)
float mistfactor(float zcor, float const co[3])
{
float fac, hi;
-
+
fac = zcor - R.wrld.miststa; /* zcor is calculated per pixel */
/* fac= -co[2]-R.wrld.miststa; */
if (fac > 0.0f) {
if (fac < R.wrld.mistdist) {
-
+
fac = (fac / R.wrld.mistdist);
-
+
if (R.wrld.mistype == 0) {
fac *= fac;
}
@@ -152,7 +152,7 @@ float mistfactor(float zcor, float const co[3])
else {
fac = 0.0f;
}
-
+
/* height switched off mist */
if (R.wrld.misthi!=0.0f && fac!=0.0f) {
/* at height misthi the mist is completely gone */
@@ -161,7 +161,7 @@ float mistfactor(float zcor, float const co[3])
R.viewinv[1][2] * co[1] +
R.viewinv[2][2] * co[2] +
R.viewinv[3][2];
-
+
if (hi > R.wrld.misthi) {
fac = 0.0f;
}
@@ -184,7 +184,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
*intens= 0.0f;
haint= lar->haint;
-
+
if (R.r.mode & R_ORTHO) {
/* camera pos (view vector) cannot be used... */
/* camera position (cox,coy,0) rotate around lamp */
@@ -193,18 +193,18 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
p1[2]= -lar->co[2];
mul_m3_v3(lar->imat, p1);
copy_v3db_v3fl(npos, p1); /* npos is double! */
-
+
/* pre-scale */
npos[2] *= (double)lar->sh_zfac;
}
else {
copy_v3db_v3fl(npos, lar->sh_invcampos); /* in initlamp calculated */
}
-
+
/* rotate view */
copy_v3db_v3fl(nray, shi->view);
mul_m3_v3_double(lar->imat, nray);
-
+
if (R.wrld.mode & WO_MIST) {
/* patchy... */
haint *= mistfactor(-lar->co[2], lar->co);
@@ -222,7 +222,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
p1[0]= shi->co[0]-lar->co[0];
p1[1]= shi->co[1]-lar->co[1];
p1[2]= shi->co[2]-lar->co[2];
-
+
maxz= lar->imat[0][2]*p1[0]+lar->imat[1][2]*p1[1]+lar->imat[2][2]*p1[2];
maxz*= lar->sh_zfac;
maxy= lar->imat[0][1]*p1[0]+lar->imat[1][1]*p1[1]+lar->imat[2][1]*p1[2];
@@ -231,13 +231,13 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
use_yco = true;
}
}
-
+
/* scale z to make sure volume is normalized */
nray[2] *= (double)lar->sh_zfac;
/* nray does not need normalization */
-
+
ladist= lar->sh_zfac*lar->dist;
-
+
/* solve */
a = nray[0] * nray[0] + nray[1] * nray[1] - nray[2]*nray[2];
b = nray[0] * npos[0] + nray[1] * npos[1] - nray[2]*npos[2];
@@ -252,7 +252,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
}
else {
disc = b*b - a*c;
-
+
if (disc==0.0) {
t1=t2= (-b)/ a;
cuts= 2;
@@ -279,14 +279,14 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
/* evaluate both points */
if (p1[2]<=0.0f) ok1= 1;
if (p2[2]<=0.0f && t1!=t2) ok2= 1;
-
+
/* at least 1 point with negative z */
if (ok1==0 && ok2==0) return;
-
+
/* intersction point with -ladist, the bottom of the cone */
if (use_yco == false) {
t3= ((double)(-ladist)-npos[2])/nray[2];
-
+
/* de we have to replace one of the intersection points? */
if (ok1) {
if (p1[2]<-ladist) t1= t3;
@@ -302,21 +302,21 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
}
}
else if (ok1==0 || ok2==0) return;
-
+
/* at least 1 visible interesction point */
if (t1<0.0 && t2<0.0) return;
-
+
if (t1<0.0) t1= 0.0;
if (t2<0.0) t2= 0.0;
-
+
if (t1==t2) return;
-
+
/* sort again to be sure */
if (t1>t2) {
a= t1; t1= t2; t2= a;
}
-
- /* calculate t0: is the maximum visible z (when halo is intersected by face) */
+
+ /* calculate t0: is the maximum visible z (when halo is intersected by face) */
if (do_clip) {
if (use_yco == false) t0 = ((double)maxz - npos[2]) / nray[2];
else t0 = ((double)maxy - npos[1]) / nray[1];
@@ -332,20 +332,20 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
p2[0]= npos[0] + t2*nray[0];
p2[1]= npos[1] + t2*nray[1];
p2[2]= npos[2] + t2*nray[2];
-
-
+
+
/* now we have 2 points, make three lengths with it */
-
+
a = len_v3(p1);
b = len_v3(p2);
c = len_v3v3(p1, p2);
-
+
a/= ladist;
a= sqrt(a);
- b/= ladist;
+ b/= ladist;
b= sqrt(b);
c/= ladist;
-
+
*intens= c*( (1.0-a)+(1.0-b) );
/* WATCH IT: do not clip a,b en c at 1.0, this gives nasty little overflows
@@ -357,13 +357,13 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
/* if (doclip && t0<t2) { */
/* *intens *= (t0-t1)/(t2-t1); */
/* } */
-
+
*intens *= haint;
-
+
if (lar->shb && lar->shb->shadhalostep) {
*intens *= shadow_halo(lar, p1, p2);
}
-
+
}
}
@@ -373,22 +373,22 @@ void renderspothalo(ShadeInput *shi, float col[4], float alpha)
GroupObject *go;
LampRen *lar;
float i;
-
+
if (alpha==0.0f) return;
-
+
lights= get_lights(shi);
for (go=lights->first; go; go= go->next) {
lar= go->lampren;
if (lar==NULL) continue;
-
+
if (lar->type==LA_SPOT && (lar->mode & LA_HALO) && (lar->buftype != LA_SHADBUF_DEEP) && lar->haint>0) {
-
- if (lar->mode & LA_LAYER)
- if (shi->vlr && (lar->lay & shi->obi->lay)==0)
+
+ if (lar->mode & LA_LAYER)
+ if (shi->vlr && (lar->lay & shi->obi->lay)==0)
continue;
- if ((lar->lay & shi->lay)==0)
+ if ((lar->lay & shi->lay)==0)
continue;
-
+
spothalo(lar, shi, &i);
if (i > 0.0f) {
const float i_alpha = i * alpha;
@@ -410,14 +410,14 @@ void renderspothalo(ShadeInput *shi, float col[4], float alpha)
static double Normalize_d(double *n)
{
double d;
-
+
d= n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
if (d>0.00000000000000001) {
d= sqrt(d);
- n[0]/=d;
- n[1]/=d;
+ n[0]/=d;
+ n[1]/=d;
n[2]/=d;
}
else {
@@ -431,15 +431,15 @@ static double Normalize_d(double *n)
float fresnel_fac(const float view[3], const float vn[3], float grad, float fac)
{
float t1, t2;
-
+
if (fac==0.0f) return 1.0f;
-
+
t1 = dot_v3v3(view, vn);
if (t1>0.0f) t2= 1.0f+t1;
else t2= 1.0f-t1;
-
+
t2= grad + (1.0f-grad)*powf(t2, fac);
-
+
if (t2<0.0f) return 0.0f;
else if (t2>1.0f) return 1.0f;
return t2;
@@ -464,7 +464,7 @@ static float area_lamp_energy(float (*area)[3], const float co[3], const float v
VECSUB(vec[1], co, area[1]);
VECSUB(vec[2], co, area[2]);
VECSUB(vec[3], co, area[3]);
-
+
Normalize_d(vec[0]);
Normalize_d(vec[1]);
Normalize_d(vec[2]);
@@ -528,32 +528,32 @@ static float area_lamp_energy_multisample(LampRen *lar, const float co[3], float
vec[1]= jitlamp[1];
vec[2]= 0.0f;
mul_m3_v3(lar->mat, vec);
-
+
add_v3_v3v3(area[0], lar->area[0], vec);
add_v3_v3v3(area[1], lar->area[1], vec);
add_v3_v3v3(area[2], lar->area[2], vec);
add_v3_v3v3(area[3], lar->area[3], vec);
-
+
intens+= area_lamp_energy(area, co, vn);
-
+
jitlamp+= 2;
}
intens /= (float)lar->ray_totsamp;
-
+
return pow(intens * lar->areasize, lar->k); /* corrected for buttons size and lar->dist^2 */
}
-static float spec(float inp, int hard)
+static float spec(float inp, int hard)
{
float b1;
-
+
if (inp>=1.0f) return 1.0f;
else if (inp<=0.0f) return 0.0f;
-
+
b1= inp*inp;
/* avoid FPE */
if (b1<0.01f) b1= 0.01f;
-
+
if ((hard & 1)==0) inp= 1.0f;
if (hard & 2) inp*= b1;
b1*= b1;
@@ -587,18 +587,18 @@ static float Phong_Spec(const float n[3], const float l[3], const float v[3], in
{
float h[3];
float rslt;
-
+
h[0] = l[0] + v[0];
h[1] = l[1] + v[1];
h[2] = l[2] + v[2];
normalize_v3(h);
-
+
rslt = h[0]*n[0] + h[1]*n[1] + h[2]*n[2];
if (tangent) rslt= sasqrt(1.0f - rslt*rslt);
-
+
if ( rslt > 0.0f ) rslt= spec(rslt, hard);
else rslt = 0.0f;
-
+
return rslt;
}
@@ -616,7 +616,7 @@ static float CookTorr_Spec(const float n[3], const float l[3], const float v[3],
nh= n[0]*h[0]+n[1]*h[1]+n[2]*h[2];
if (tangent) nh= sasqrt(1.0f - nh*nh);
else if (nh<0.0f) return 0.0f;
-
+
nv= n[0]*v[0]+n[1]*v[1]+n[2]*v[2];
if (tangent) nv= sasqrt(1.0f - nv*nv);
else if (nv<0.0f) nv= 0.0f;
@@ -635,12 +635,12 @@ static float Blinn_Spec(const float n[3], const float l[3], const float v[3], fl
if (refrac < 1.0f) return 0.0f;
if (spec_power == 0.0f) return 0.0f;
-
+
/* conversion from 'hardness' (1-255) to 'spec_power' (50 maps at 0.1) */
if (spec_power<100.0f)
spec_power = sqrtf(1.0f / spec_power);
else spec_power= 10.0f/spec_power;
-
+
h[0]= v[0]+l[0];
h[1]= v[1]+l[1];
h[2]= v[2]+l[2];
@@ -677,7 +677,7 @@ static float Blinn_Spec(const float n[3], const float l[3], const float v[3], fl
i= f * g * exp((double)(-(ang*ang) / (2.0f*spec_power*spec_power)));
if (i<0.0f) i= 0.0f;
-
+
return i;
}
@@ -687,21 +687,21 @@ static float Toon_Spec(const float n[3], const float l[3], const float v[3], flo
float h[3];
float ang;
float rslt;
-
+
h[0] = l[0] + v[0];
h[1] = l[1] + v[1];
h[2] = l[2] + v[2];
normalize_v3(h);
-
+
rslt = h[0]*n[0] + h[1]*n[1] + h[2]*n[2];
if (tangent) rslt = sasqrt(1.0f - rslt*rslt);
-
- ang = saacos( rslt );
-
+
+ ang = saacos( rslt );
+
if ( ang < size ) rslt = 1.0f;
else if ( ang >= (size + smooth) || smooth == 0.0f ) rslt = 0.0f;
else rslt = 1.0f - ((ang - size) / smooth);
-
+
return rslt;
}
@@ -720,7 +720,7 @@ static float WardIso_Spec(const float n[3], const float l[3], const float v[3],
nh = n[0]*h[0]+n[1]*h[1]+n[2]*h[2]; /* Dot product between surface normal and half-way vector */
if (tangent) nh = sasqrt(1.0f - nh*nh);
if (nh<=0.0f) nh = 0.001f;
-
+
nv = n[0]*v[0]+n[1]*v[1]+n[2]*v[2]; /* Dot product between surface normal and view vector */
if (tangent) nv = sasqrt(1.0f - nv*nv);
if (nv<=0.0f) nv = 0.001f;
@@ -762,41 +762,41 @@ static float OrenNayar_Diff(float nl, const float n[3], const float l[3], const
float i/*, nh*/, nv /*, vh */, realnl, h[3];
float a, b, t, A, B;
float Lit_A, View_A, Lit_B[3], View_B[3];
-
+
h[0]= v[0]+l[0];
h[1]= v[1]+l[1];
h[2]= v[2]+l[2];
normalize_v3(h);
-
+
/* nh= n[0]*h[0]+n[1]*h[1]+n[2]*h[2]; */ /* Dot product between surface normal and half-way vector */
/* if (nh<0.0f) nh = 0.0f; */
-
+
nv= n[0]*v[0]+n[1]*v[1]+n[2]*v[2]; /* Dot product between surface normal and view vector */
if (nv<=0.0f) nv= 0.0f;
-
+
realnl= n[0]*l[0]+n[1]*l[1]+n[2]*l[2]; /* Dot product between surface normal and light vector */
if (realnl<=0.0f) return 0.0f;
if (nl<0.0f) return 0.0f; /* value from area light */
-
+
/* vh= v[0]*h[0]+v[1]*h[1]+v[2]*h[2]; */ /* Dot product between view vector and halfway vector */
/* if (vh<=0.0f) vh= 0.0f; */
-
+
Lit_A = saacos(realnl);
View_A = saacos( nv );
-
+
Lit_B[0] = l[0] - (realnl * n[0]);
Lit_B[1] = l[1] - (realnl * n[1]);
Lit_B[2] = l[2] - (realnl * n[2]);
normalize_v3(Lit_B);
-
+
View_B[0] = v[0] - (nv * n[0]);
View_B[1] = v[1] - (nv * n[1]);
View_B[2] = v[2] - (nv * n[2]);
normalize_v3(View_B);
-
+
t = Lit_B[0]*View_B[0] + Lit_B[1]*View_B[1] + Lit_B[2]*View_B[2];
if ( t < 0 ) t = 0;
-
+
if ( Lit_A > View_A ) {
a = Lit_A;
b = View_A;
@@ -805,14 +805,14 @@ static float OrenNayar_Diff(float nl, const float n[3], const float l[3], const
a = View_A;
b = Lit_A;
}
-
+
A = 1.0f - (0.5f * ((rough * rough) / ((rough * rough) + 0.33f)));
B = 0.45f * ((rough * rough) / ((rough * rough) + 0.09f));
-
+
b*= 0.95f; /* prevent tangens from shooting to inf, 'nl' can be not a dot product here. */
/* overflow only happens with extreme size area light, and higher roughness */
i = nl * ( A + ( B * t * sinf(a) * tanf(b) ) );
-
+
return i;
}
@@ -910,15 +910,15 @@ void shade_color(ShadeInput *shi, ShadeResult *shr)
shi->g= shi->g*neg_alpha + shi->vcol[1]*shi->vcol[3];
shi->b= shi->b*neg_alpha + shi->vcol[2]*shi->vcol[3];
}
-
+
if (ma->texco)
do_material_tex(shi, &R);
- if (ma->fresnel_tra!=0.0f)
+ if (ma->fresnel_tra!=0.0f)
shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
-
+
if (!(shi->mode & MA_TRANSP)) shi->alpha= 1.0f;
-
+
shr->diff[0]= shi->r;
shr->diff[1]= shi->g;
shr->diff[2]= shi->b;
@@ -950,10 +950,10 @@ static void ramp_diffuse_result(float *diff, ShadeInput *shi)
if (ma->rampin_col==MA_RAMP_IN_RESULT) {
float fac = IMB_colormanagement_get_luminance(diff);
BKE_colorband_evaluate(ma->ramp_col, fac, col);
-
+
/* blending method */
fac= col[3]*ma->rampfac_col;
-
+
ramp_blend(ma->rampblend_col, diff, fac, col);
}
}
@@ -965,7 +965,7 @@ static void add_to_diffuse(float diff[3], const ShadeInput *shi, const float is,
Material *ma= shi->mat;
if (ma->ramp_col && (ma->mode & MA_RAMP_COL)) {
-
+
/* MA_RAMP_IN_RESULT is exceptional */
if (ma->rampin_col==MA_RAMP_IN_RESULT) {
/* normal add */
@@ -992,9 +992,9 @@ static void add_to_diffuse(float diff[3], const ShadeInput *shi, const float is,
fac = 0.0f;
break;
}
-
+
BKE_colorband_evaluate(ma->ramp_col, fac, col);
-
+
/* blending method */
fac = col[3] * ma->rampfac_col;
copy_v3_v3(colt, &shi->r);
@@ -1023,12 +1023,12 @@ static void ramp_spec_result(float spec_col[3], ShadeInput *shi)
float fac = IMB_colormanagement_get_luminance(spec_col);
BKE_colorband_evaluate(ma->ramp_spec, fac, col);
-
+
/* blending method */
fac= col[3]*ma->rampfac_spec;
-
+
ramp_blend(ma->rampblend_spec, spec_col, fac, col);
-
+
}
}
@@ -1061,12 +1061,12 @@ static void do_specular_ramp(ShadeInput *shi, float is, float t, float spec[3])
fac= 0.0f;
break;
}
-
+
BKE_colorband_evaluate(ma->ramp_spec, fac, col);
-
+
/* blending method */
fac= col[3]*ma->rampfac_spec;
-
+
ramp_blend(ma->rampblend_spec, spec, fac, col);
}
}
@@ -1128,7 +1128,7 @@ void environment_lighting_apply(ShadeInput *shi, ShadeResult *shr)
return;
if (f == 0.0f)
return;
-
+
shr->combined[0] += shi->env[0]*shi->r*shi->refl*f;
shr->combined[1] += shi->env[1]*shi->g*shi->refl*f;
shr->combined[2] += shi->env[2]*shi->b*shi->refl*f;
@@ -1152,11 +1152,11 @@ static void indirect_lighting_apply(ShadeInput *shi, ShadeResult *shr)
void lamp_get_shadow(LampRen *lar, ShadeInput *shi, float inp, float shadfac[4], int do_real)
{
LampShadowSubSample *lss= &(lar->shadsamp[shi->thread].s[shi->sample]);
-
+
if (do_real || lss->samplenr!=shi->samplenr) {
-
+
shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 1.0f;
-
+
if (lar->shb) {
if (lar->buftype==LA_SHADBUF_IRREGULAR)
shadfac[3]= ISB_getshadow(shi, lar->shb);
@@ -1166,7 +1166,7 @@ void lamp_get_shadow(LampRen *lar, ShadeInput *shi, float inp, float shadfac[4],
else if (lar->mode & LA_SHAD_RAY) {
ray_shadow(shi, lar, shadfac);
}
-
+
if (shi->depth==0) {
copy_v4_v4(lss->shadfac, shadfac);
lss->samplenr= shi->samplenr;
@@ -1187,10 +1187,10 @@ float lamp_get_visibility(LampRen *lar, const float co[3], float lv[3], float *d
}
else {
float visifac= 1.0f, visifac_r;
-
+
sub_v3_v3v3(lv, co, lar->co);
mul_v3_fl(lv, 1.0f / (*dist = len_v3(lv)));
-
+
/* area type has no quad or sphere option */
if (lar->type==LA_AREA) {
/* area is single sided */
@@ -1235,30 +1235,30 @@ float lamp_get_visibility(LampRen *lar, const float co[3], float lv[3], float *d
visifac = curvemapping_evaluateF(lar->curfalloff, 0, dist[0]/lar->dist);
break;
}
-
+
if (lar->mode & LA_SPHERE) {
float t= lar->dist - dist[0];
- if (t<=0.0f)
+ if (t<=0.0f)
visifac= 0.0f;
else
visifac*= t/lar->dist;
}
-
+
if (visifac > 0.0f) {
if (lar->type==LA_SPOT) {
float inpr, t;
-
+
if (lar->mode & LA_SQUARE) {
if (dot_v3v3(lv, lar->vec) > 0.0f) {
float lvrot[3], x;
-
+
/* rotate view to lampspace */
copy_v3_v3(lvrot, lv);
mul_m3_v3(lar->imat, lvrot);
-
+
x = max_ff(fabsf(lvrot[0]/lvrot[2]), fabsf(lvrot[1]/lvrot[2]));
/* 1.0f/(sqrt(1+x*x)) is equivalent to cos(atan(x)) */
-
+
inpr = 1.0f / (sqrtf(1.0f + x * x));
}
else inpr= 0.0f;
@@ -1266,9 +1266,9 @@ float lamp_get_visibility(LampRen *lar, const float co[3], float lv[3], float *d
else {
inpr= lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2];
}
-
+
t= lar->spotsi;
- if (inpr<=t)
+ if (inpr<=t)
visifac= 0.0f;
else {
t= inpr-t;
@@ -1296,11 +1296,11 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
float lv[3], lampdist, lacol[3], shadfac[4], lashdw[3];
float i, is, i_noshad, inp, *vn, *view, vnor[3], phongcorr=1.0f;
float visifac;
-
+
vn= shi->vn;
view= shi->view;
-
-
+
+
if (lar->energy == 0.0f) return;
/* only shadow lamps shouldn't affect shadow-less materials at all */
if ((lar->mode & LA_ONLYSHADOW) && (!(ma->mode & MA_SHADOW) || !(R.r.mode & R_SHADOW)))
@@ -1308,35 +1308,35 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
/* optimization, don't render fully black lamps */
if (!(lar->mode & LA_TEXTURE) && (lar->r + lar->g + lar->b == 0.0f))
return;
-
+
/* lampdist, spot angle, area side, ... */
visifac= lamp_get_visibility(lar, shi->co, lv, &lampdist);
if (visifac==0.0f)
return;
-
+
if (lar->type==LA_SPOT) {
if (lar->mode & LA_OSATEX) {
shi->osatex= 1; /* signal for multitex() */
-
+
shi->dxlv[0]= lv[0] - (shi->co[0]-lar->co[0]+shi->dxco[0])/lampdist;
shi->dxlv[1]= lv[1] - (shi->co[1]-lar->co[1]+shi->dxco[1])/lampdist;
shi->dxlv[2]= lv[2] - (shi->co[2]-lar->co[2]+shi->dxco[2])/lampdist;
-
+
shi->dylv[0]= lv[0] - (shi->co[0]-lar->co[0]+shi->dyco[0])/lampdist;
shi->dylv[1]= lv[1] - (shi->co[1]-lar->co[1]+shi->dyco[1])/lampdist;
shi->dylv[2]= lv[2] - (shi->co[2]-lar->co[2]+shi->dyco[2])/lampdist;
}
}
-
+
/* lamp color texture */
lacol[0]= lar->r;
lacol[1]= lar->g;
lacol[2]= lar->b;
-
+
lashdw[0]= lar->shdwr;
lashdw[1]= lar->shdwg;
lashdw[2]= lar->shdwb;
-
+
if (lar->mode & LA_TEXTURE) do_lamp_tex(lar, lv, shi, lacol, LA_TEXTURE);
if (lar->mode & LA_SHAD_TEX) do_lamp_tex(lar, lv, shi, lashdw, LA_SHAD_TEX);
@@ -1381,7 +1381,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
vnor[0]= -vnor[0];vnor[1]= -vnor[1];vnor[2]= -vnor[2];
vn= vnor;
}
-
+
/* dot product and reflectivity */
/* inp = dotproduct, is = shader result, i = lamp energy (with shadow), i_noshad = i without shadow */
inp= dot_v3v3(vn, lv);
@@ -1408,7 +1408,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
}
}
-
+
/* diffuse shaders */
if (lar->mode & LA_NO_DIFF) {
is = 0.0f; /* skip shaders */
@@ -1417,10 +1417,10 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
is = 0.5f * inp + 0.5f;
}
else {
-
+
if (lar->type==LA_AREA)
inp= area_lamp_energy_multisample(lar, shi->co, vn);
-
+
/* diffuse shaders (oren nayer gets inp from area light) */
if (ma->diff_shader==MA_DIFF_ORENNAYAR) is= OrenNayar_Diff(inp, vn, lv, view, ma->roughness);
else if (ma->diff_shader==MA_DIFF_TOON) is= Toon_Diff(vn, lv, view, ma->param[0], ma->param[1]);
@@ -1435,48 +1435,48 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
i= is*phongcorr;
-
+
if (i>0.0f) {
i*= visifac*shi->refl;
}
i_noshad= i;
-
+
vn = shi->vn; /* bring back original vector, we use special specular shaders for tangent */
if (ma->mode & MA_TANGENT_V)
vn= shi->tang;
-
+
/* init transp shadow */
shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 1.0f;
-
+
/* shadow and spec, (visifac==0 outside spot) */
if (visifac> 0.0f) {
-
+
if ((R.r.mode & R_SHADOW)) {
if (ma->mode & MA_SHADOW) {
if (lar->shb || (lar->mode & LA_SHAD_RAY)) {
-
+
if (vn==vnor) /* tangent trigger */
lamp_get_shadow(lar, shi, dot_v3v3(shi->vn, lv), shadfac, shi->depth);
else
lamp_get_shadow(lar, shi, inp, shadfac, shi->depth);
-
+
/* warning, here it skips the loop */
if ((lar->mode & LA_ONLYSHADOW) && i>0.0f) {
-
+
shadfac[3]= i*lar->energy*(1.0f-shadfac[3]);
shr->shad[0] -= shadfac[3]*shi->r*(1.0f-lashdw[0]);
shr->shad[1] -= shadfac[3]*shi->g*(1.0f-lashdw[1]);
shr->shad[2] -= shadfac[3]*shi->b*(1.0f-lashdw[2]);
-
+
if (!(lar->mode & LA_NO_SPEC)) {
shr->spec[0] -= shadfac[3]*shi->specr*(1.0f-lashdw[0]);
shr->spec[1] -= shadfac[3]*shi->specg*(1.0f-lashdw[1]);
shr->spec[2] -= shadfac[3]*shi->specb*(1.0f-lashdw[2]);
}
-
+
return;
}
-
+
i*= shadfac[3];
shr->shad[3] = shadfac[3]; /* store this for possible check in troublesome cases */
}
@@ -1485,7 +1485,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
}
}
-
+
/* in case 'no diffuse' we still do most calculus, spec can be in shadow.*/
if (!(lar->mode & LA_NO_DIFF)) {
if (i>0.0f) {
@@ -1531,33 +1531,33 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
}
}
-
+
/* specularity */
shadfac[3]*= phongcorr; /* note, shadfac not allowed to be stored nonlocal */
-
+
if (shadfac[3]>0.0f && shi->spec!=0.0f && !(lar->mode & LA_NO_SPEC) && !(lar->mode & LA_ONLYSHADOW)) {
-
+
if (!(passflag & (SCE_PASS_COMBINED | SCE_PASS_SPEC))) {
/* pass */
}
else if (lar->type == LA_HEMI) {
float t;
/* hemi uses no spec shaders (yet) */
-
+
lv[0]+= view[0];
lv[1]+= view[1];
lv[2]+= view[2];
-
+
normalize_v3(lv);
-
+
t= vn[0]*lv[0]+vn[1]*lv[1]+vn[2]*lv[2];
-
+
if (lar->type==LA_HEMI) {
t= 0.5f*t+0.5f;
}
-
+
t= shadfac[3]*shi->spec*spec(t, shi->har);
-
+
shr->spec[0]+= t*(lacol[0] * shi->specr);
shr->spec[1]+= t*(lacol[1] * shi->specg);
shr->spec[2]+= t*(lacol[2] * shi->specb);
@@ -1565,23 +1565,23 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
else {
/* specular shaders */
float specfac, t;
-
- if (ma->spec_shader==MA_SPEC_PHONG)
+
+ if (ma->spec_shader==MA_SPEC_PHONG)
specfac= Phong_Spec(vn, lv, view, shi->har, (vlr->flag & R_TANGENT) || (ma->mode & MA_TANGENT_V));
- else if (ma->spec_shader==MA_SPEC_COOKTORR)
+ else if (ma->spec_shader==MA_SPEC_COOKTORR)
specfac= CookTorr_Spec(vn, lv, view, shi->har, (vlr->flag & R_TANGENT) || (ma->mode & MA_TANGENT_V));
- else if (ma->spec_shader==MA_SPEC_BLINN)
+ else if (ma->spec_shader==MA_SPEC_BLINN)
specfac= Blinn_Spec(vn, lv, view, ma->refrac, (float)shi->har, (vlr->flag & R_TANGENT) || (ma->mode & MA_TANGENT_V));
else if (ma->spec_shader==MA_SPEC_WARDISO)
specfac= WardIso_Spec( vn, lv, view, ma->rms, (vlr->flag & R_TANGENT) || (ma->mode & MA_TANGENT_V));
- else
+ else
specfac= Toon_Spec(vn, lv, view, ma->param[2], ma->param[3], (vlr->flag & R_TANGENT) || (ma->mode & MA_TANGENT_V));
-
+
/* area lamp correction */
if (lar->type==LA_AREA) specfac*= inp;
-
+
t= shadfac[3]*shi->spec*visifac*specfac;
-
+
if (ma->mode & MA_RAMP_SPEC) {
float spec[3];
do_specular_ramp(shi, specfac, t, spec);
@@ -1601,7 +1601,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
{
-
+
if (R.r.mode & R_SHADOW) {
ListBase *lights;
LampRen *lar;
@@ -1610,19 +1610,19 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
float /* *view, */ shadfac[4];
float ir, accum, visifac, lampdist;
float shaded = 0.0f, lightness = 0.0f;
-
+
/* view= shi->view; */ /* UNUSED */
accum= ir= 0.0f;
-
+
lights= get_lights(shi);
for (go=lights->first; go; go= go->next) {
lar= go->lampren;
if (lar==NULL) continue;
-
+
if (lar->mode & LA_LAYER) if ((lar->lay & shi->obi->lay)==0) continue;
if ((lar->lay & shi->lay)==0) continue;
-
+
if (lar->shb || (lar->mode & LA_SHAD_RAY)) {
visifac= lamp_get_visibility(lar, shi->co, lv, &lampdist);
ir+= 1.0f;
@@ -1687,14 +1687,14 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
else shr->alpha= 0.f;
}
}
-
+
/* quite disputable this... also note it doesn't mirror-raytrace */
if ((R.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT)) && shi->amb!=0.0f) {
float f;
-
+
if (R.wrld.mode & WO_AMB_OCC) {
f= R.wrld.aoenergy*shi->amb;
-
+
if (R.wrld.aomix==WO_AOADD) {
if (shi->mat->shadowonly_flag == MA_SO_OLD) {
f= f*(1.0f - IMB_colormanagement_get_luminance(shi->ao));
@@ -1726,7 +1726,7 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
/* let's map negative light as if it mirrors positive light, otherwise negative values disappear */
static void wrld_exposure_correct(float diff[3])
{
-
+
diff[0]= R.wrld.linfac*(1.0f-expf( diff[0]*R.wrld.logfac) );
diff[1]= R.wrld.linfac*(1.0f-expf( diff[1]*R.wrld.logfac) );
diff[2]= R.wrld.linfac*(1.0f-expf( diff[2]*R.wrld.logfac) );
@@ -1748,18 +1748,18 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
int passflag= shi->passflag;
memset(shr, 0, sizeof(ShadeResult));
-
+
if (!(shi->mode & MA_TRANSP)) shi->alpha = 1.0f;
-
+
/* separate loop */
if (ma->mode & MA_ONLYSHADOW) {
shade_lamp_loop_only_shadow(shi, shr);
return;
}
-
+
/* envmap hack, always reset */
shi->refcol[0]= shi->refcol[1]= shi->refcol[2]= shi->refcol[3]= 0.0f;
-
+
/* material color itself */
if (passflag & color_passes) {
if (ma->mode & (MA_FACETEXTURE)) {
@@ -1787,7 +1787,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
do_material_tex(shi, &R);
if (!(shi->mode & MA_TRANSP)) shi->alpha = 1.0f;
}
-
+
shr->col[0]= shi->r*shi->alpha;
shr->col[1]= shi->g*shi->alpha;
shr->col[2]= shi->b*shi->alpha;
@@ -1803,7 +1803,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shi->g= pow(max_ff(shi->g, 0.0f), ma->sss_texfac);
shi->b= pow(max_ff(shi->b, 0.0f), ma->sss_texfac);
shi->alpha= pow(max_ff(shi->alpha, 0.0f), ma->sss_texfac);
-
+
shr->col[0]= pow(max_ff(shr->col[0], 0.0f), ma->sss_texfac);
shr->col[1]= pow(max_ff(shr->col[1], 0.0f), ma->sss_texfac);
shr->col[2]= pow(max_ff(shr->col[2], 0.0f), ma->sss_texfac);
@@ -1811,7 +1811,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
}
}
-
+
if (ma->mode & MA_SHLESS) {
shr->combined[0]= shi->r;
shr->combined[1]= shi->g;
@@ -1830,7 +1830,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shr->emit[1]= shi->g*shi->emit;
shr->emit[2]= shi->b*shi->emit;
}
-
+
/* AO pass */
if (((passflag & SCE_PASS_COMBINED) && (shi->combinedflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))) ||
(passflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))) {
@@ -1848,22 +1848,22 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
zero_v3(shr->indirect);
}
}
-
+
/* lighting pass */
if (passflag & (SCE_PASS_COMBINED|SCE_PASS_DIFFUSE|SCE_PASS_SPEC|SCE_PASS_SHADOW)) {
GroupObject *go;
ListBase *lights;
LampRen *lar;
-
+
lights= get_lights(shi);
for (go=lights->first; go; go= go->next) {
lar= go->lampren;
if (lar==NULL) continue;
-
+
/* test for lamp layer */
if (lar->mode & LA_LAYER) if ((lar->lay & shi->obi->lay)==0) continue;
if ((lar->lay & shi->lay)==0) continue;
-
+
/* accumulates in shr->diff and shr->spec and shr->shad (diffuse with shadow!) */
shade_one_light(lar, shi, shr, passflag);
}
@@ -1877,7 +1877,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if (shr->shad[0] < 0) shr->shad[0] = 0;
if (shr->shad[1] < 0) shr->shad[1] = 0;
if (shr->shad[2] < 0) shr->shad[2] = 0;
-
+
if (ma->sss_flag & MA_DIFF_SSS) {
float sss[3], col[3], invalpha, texfac= ma->sss_texfac;
@@ -1912,14 +1912,14 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
}
}
-
+
if (shi->combinedflag & SCE_PASS_SHADOW)
copy_v3_v3(shr->diffshad, shr->shad);
else
copy_v3_v3(shr->diffshad, shr->diff);
copy_v3_v3(shr->combined, shr->diffshad);
-
+
/* calculate shadow pass, we use a multiplication mask */
/* Even if diff = 0,0,0, it does matter what the shadow pass is, since we may want it 'for itself'! */
if (passflag & SCE_PASS_SHADOW) {
@@ -1933,19 +1933,19 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if (shr->diff[2]!=0.0f) shr->shad[2]= shr->shad[2]/shr->diff[2];
else if (shr->shad[2]==0.0f) shr->shad[2]= shr->shad[3];
}
-
+
/* exposure correction */
if ((R.wrld.exp!=0.0f || R.wrld.range!=1.0f) && !R.sss_points) {
wrld_exposure_correct(shr->combined); /* has no spec! */
wrld_exposure_correct(shr->spec);
}
}
-
+
/* alpha in end, spec can influence it */
if (passflag & (SCE_PASS_COMBINED)) {
if ((ma->fresnel_tra!=0.0f) && (shi->mode & MA_TRANSP))
shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
-
+
/* note: shi->mode! */
if (shi->mode & MA_TRANSP && (shi->mode & (MA_ZTRANSP|MA_RAYTRANSP))) {
if (shi->spectra!=0.0f) {
@@ -1957,7 +1957,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
}
shr->alpha= shi->alpha;
-
+
/* from now stuff everything in shr->combined: ambient, AO, ramps, exposure */
if (!(ma->sss_flag & MA_DIFF_SSS) || !sss_pass_done(&R, ma)) {
if (R.r.mode & R_SHADOW) {
@@ -1974,32 +1974,32 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if (shi->combinedflag & SCE_PASS_INDIRECT)
indirect_lighting_apply(shi, shr);
}
-
+
shr->combined[0]+= shi->ambr;
shr->combined[1]+= shi->ambg;
shr->combined[2]+= shi->ambb;
-
+
if (ma->mode & MA_RAMP_COL) ramp_diffuse_result(shr->combined, shi);
}
if (ma->mode & MA_RAMP_SPEC) ramp_spec_result(shr->spec, shi);
-
+
/* refcol is for envmap only */
if (shi->refcol[0]!=0.0f) {
float result[3];
-
+
result[0]= shi->mirr*shi->refcol[1] + (1.0f - shi->mirr*shi->refcol[0])*shr->combined[0];
result[1]= shi->mirg*shi->refcol[2] + (1.0f - shi->mirg*shi->refcol[0])*shr->combined[1];
result[2]= shi->mirb*shi->refcol[3] + (1.0f - shi->mirb*shi->refcol[0])*shr->combined[2];
-
+
if (passflag & SCE_PASS_REFLECT)
sub_v3_v3v3(shr->refl, result, shr->combined);
-
+
if (shi->combinedflag & SCE_PASS_REFLECT)
copy_v3_v3(shr->combined, result);
-
+
}
-
+
/* and add emit and spec */
if (shi->combinedflag & SCE_PASS_EMIT)
add_v3_v3(shr->combined, shr->emit);
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index c29da9b17c6..5919b8130d7 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -190,7 +190,7 @@ static float compute_reduced_albedo(ScatterSettings *ss)
if (xn > 1.0f) xn= 1.0f;
if (xn_1 > 1.0f) xn_1= 1.0f;
-
+
fxn= f_Rd(xn, ss->A, ss->ro);
}
@@ -299,7 +299,7 @@ static void build_Rd_table(ScatterSettings *ss)
ScatterSettings *scatter_settings_new(float refl, float radius, float ior, float reflfac, float frontweight, float backweight)
{
ScatterSettings *ss;
-
+
ss= MEM_callocN(sizeof(ScatterSettings), "ScatterSettings");
/* see [1] and [3] for these formulas */
@@ -346,7 +346,7 @@ void scatter_settings_free(ScatterSettings *ss)
#define SUBNODE_INDEX(co, split) \
((co[0]>=split[0]) + (co[1]>=split[1])*2 + (co[2]>=split[2])*4)
-
+
static void add_radiance(ScatterTree *tree, float *frontrad, float *backrad, float area, float backarea, float rr, ScatterResult *result)
{
float rd[3], frontrd[3], backrd[3];
@@ -694,7 +694,7 @@ static void create_octree_node(ScatterTree *tree, ScatterNode *node, float *mid,
if (i != 0)
noffset[i]= noffset[i-1]+nsize[i-1];
}
-
+
if (used_nodes <= 1) {
subnode_middle(usedi, mid, subsize, submid);
create_octree_node(tree, node, submid, subsize, refpoints, depth+1);
@@ -807,7 +807,7 @@ void scatter_tree_build(ScatterTree *tree)
tree->refpoints= NULL;
tree->tmppoints= NULL;
tree->points= newpoints;
-
+
/* sum radiance at nodes */
sum_radiance(tree, tree->root);
}
@@ -827,7 +827,7 @@ void scatter_tree_free(ScatterTree *tree)
if (tree->arena) BLI_memarena_free(tree->arena);
if (tree->points) MEM_freeN(tree->points);
if (tree->refpoints) MEM_freeN(tree->refpoints);
-
+
MEM_freeN(tree);
}
@@ -859,7 +859,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
if (re->test_break(re->tbh))
return;
-
+
points.first= points.last= NULL;
/* TODO: this is getting a bit ugly, copying all those variables and
@@ -884,7 +884,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
BLI_rw_mutex_unlock(&re->resultmutex);
RE_TileProcessor(re);
-
+
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
if (!(re->r.scemode & (R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))) {
RE_FreeRenderResult(re->result);
@@ -907,7 +907,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
if (!re->test_break(re->tbh)) {
for (totpoint=0, p=points.first; p; p=p->next)
totpoint += p->totpoint;
-
+
co= MEM_mallocN(sizeof(*co)*totpoint, "SSSCo");
color= MEM_mallocN(sizeof(*color)*totpoint, "SSSColor");
area= MEM_mallocN(sizeof(*area)*totpoint, "SSSArea");
@@ -939,7 +939,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
error= get_render_aosss_error(&re->r, error);
if ((re->r.scemode & (R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW)) && error < 0.5f)
error= 0.5f;
-
+
sss->ss[0]= scatter_settings_new(mat->sss_col[0], radius[0], ior, cfac, fw, bw);
sss->ss[1]= scatter_settings_new(mat->sss_col[1], radius[1], ior, cfac, fw, bw);
sss->ss[2]= scatter_settings_new(mat->sss_col[2], radius[2], ior, cfac, fw, bw);
@@ -964,7 +964,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
void sss_add_points(Render *re, float (*co)[3], float (*color)[3], float *area, int totpoint)
{
SSSPoints *p;
-
+
if (totpoint > 0) {
p= MEM_callocN(sizeof(SSSPoints), "SSSPoints");
@@ -997,11 +997,11 @@ void make_sss_tree(Render *re)
const char *prevstr = NULL;
free_sss(re);
-
+
re->sss_hash= BLI_ghash_ptr_new("make_sss_tree gh");
re->stats_draw(re->sdh, &re->i);
-
+
for (mat= re->main->mat.first; mat; mat= mat->id.next) {
if (mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS)) {
if (!infostr_set) {
@@ -1013,7 +1013,7 @@ void make_sss_tree(Render *re)
sss_create_tree_mat(re, mat);
}
}
-
+
/* XXX preview exception */
/* localizing preview render data is not fun for node trees :( */
if (re->main!=G.main) {
@@ -1029,7 +1029,7 @@ void make_sss_tree(Render *re)
}
}
}
-
+
if (infostr_set)
re->i.infostr = prevstr;
}
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 6b52d4aa419..5fde688481a 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -68,7 +68,7 @@ static float strand_eval_width(Material *ma, float strandco)
fac= pow(strandco, 1.0f/(1.0f-ma->strand_ease));
}
else fac= strandco;
-
+
return ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end);
}
@@ -131,7 +131,7 @@ void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint)
negate_v3(spoint->nor);
spoint->width= strand_eval_width(ma, spoint->strandco);
-
+
/* simplification */
simplify= RE_strandren_get_simplify(strandbuf->obr, sseg->strand, 0);
spoint->alpha= (simplify)? simplify[1]: 1.0f;
@@ -285,10 +285,10 @@ static void strand_shade_point(Render *re, ShadeSample *ssamp, StrandSegment *ss
shade_input_set_strand(shi, sseg->strand, spoint);
shade_input_set_strand_texco(shi, sseg->strand, sseg->v[1], spoint);
-
+
/* init material vars */
shade_input_init_material(shi);
-
+
/* shade */
shade_samples_do_AO(ssamp);
shade_input_do_shade(shi, shr);
@@ -300,7 +300,7 @@ static void strand_shade_point(Render *re, ShadeSample *ssamp, StrandSegment *ss
if (re->flag & R_LAMPHALO)
if (shi->layflag & SCE_LAY_HALO)
renderspothalo(shi, shr->combined, shr->combined[3]);
-
+
shi->strand= NULL;
}
@@ -325,7 +325,7 @@ StrandShadeCache *strand_shade_cache_create(void)
cache->resulthash= BLI_ghash_pair_new("strand_shade_cache_create1 gh");
cache->refcounthash= BLI_ghash_pair_new("strand_shade_cache_create2 gh");
cache->memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "strand shade cache arena");
-
+
return cache;
}
@@ -367,7 +367,7 @@ static void strand_shade_get(Render *re, StrandShadeCache *cache, ShadeSample *s
else
/* already shaded, just copy previous result from hash */
ssamp->shr[0]= entry->shr;
-
+
/* lower reference count and remove if not needed anymore by any samples */
(*refcount)--;
if (*refcount == 0) {
@@ -536,10 +536,10 @@ static void do_strand_fillac(void *handle, int x, int y, float u, float v, float
/* find the z of the sample */
PixStr *ps;
intptr_t *rd= spart->rectdaps + offset;
-
+
bufferz= 0x7FFFFFFF;
if (spart->rectmask) maskz= 0x7FFFFFFF;
-
+
if (*rd) {
for (ps= (PixStr *)(*rd); ps; ps= ps->next) {
if (mask & ps->mask) {
@@ -609,7 +609,7 @@ static int strand_test_clip(float winmat[4][4], ZSpan *UNUSED(zspan), float *bou
if (hoco[0]+widthx < bounds[0]*hoco[3]) clipflag |= 1;
else if (hoco[0]-widthx > bounds[1]*hoco[3]) clipflag |= 2;
-
+
if (hoco[1]-widthy > bounds[3]*hoco[3]) clipflag |= 4;
else if (hoco[1]+widthy < bounds[2]*hoco[3]) clipflag |= 8;
@@ -713,7 +713,7 @@ static int strand_segment_recursive(Render *re, float winmat[4][4], StrandPart *
if (len1 == 0.0f || len2 == 0.0f)
return 0;
-
+
dot= d1[0]*d2[0] + d1[1]*d2[1];
if (dot*dot > sseg->sqadaptcos*len1*len2)
return 0;
@@ -735,7 +735,7 @@ static int strand_segment_recursive(Render *re, float winmat[4][4], StrandPart *
strand_render(re, sseg, winmat, spart, zspan, totzspan, p1, &p);
if (!strand_segment_recursive(re, winmat, spart, zspan, totzspan, sseg, &p, p2, depth+1))
strand_render(re, sseg, winmat, spart, zspan, totzspan, &p, p2);
-
+
return 1;
}
@@ -818,7 +818,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
/* needed for transform from hoco to zbuffer co */
zspan.zmulx= ((float)winx)/2.0f;
zspan.zmuly= ((float)winy)/2.0f;
-
+
zspan.zofsx= -pa->disprect.xmin;
zspan.zofsy= -pa->disprect.ymin;
@@ -866,7 +866,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
if (clip_render_object(obi->obr->boundbox, bounds, obwinmat))
continue;
-
+
widthx= obr->strandbuf->maxwidth*obwinmat[0][0];
widthy= obr->strandbuf->maxwidth*obwinmat[1][1];
@@ -962,7 +962,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
if (sortsegments)
MEM_freeN(sortsegments);
MEM_freeN(spart.totapixbuf);
-
+
zbuf_free_span(&zspan);
return totsegment;
@@ -1057,7 +1057,7 @@ void strand_minmax(StrandRen *strand, float min[3], float max[3], const float wi
for (a=0, svert=strand->vert; a<strand->totvert; a++, svert++) {
copy_v3_v3(vec, svert->co);
minmax_v3v3_v3(min, max, vec);
-
+
if (width!=0.0f) {
add_v3_fl(vec, width);
minmax_v3v3_v3(min, max, vec);
diff --git a/source/blender/render/intern/source/sunsky.c b/source/blender/render/intern/source/sunsky.c
index 7aed5f87dbc..80dd52c220c 100644
--- a/source/blender/render/intern/source/sunsky.c
+++ b/source/blender/render/intern/source/sunsky.c
@@ -122,13 +122,13 @@ static void DirectionToThetaPhi(float *toSun, float *theta, float *phi)
static float PerezFunction(struct SunSky *sunsky, const float *lam, float theta, float gamma, float lvz)
{
float den, num;
-
+
den = ((1 + lam[0] * expf(lam[1])) *
(1 + lam[2] * expf(lam[3] * sunsky->theta) + lam[4] * cosf(sunsky->theta) * cosf(sunsky->theta)));
-
+
num = ((1 + lam[0] * expf(lam[1] / cosf(theta))) *
(1 + lam[2] * expf(lam[3] * gamma) + lam[4] * cosf(gamma) * cosf(gamma)));
-
+
return(lvz * num / den);
}
@@ -166,7 +166,7 @@ void InitSunSky(struct SunSky *sunsky, float turb, const float toSun[3], float h
sunsky->skyblendtype = skyblendtype;
sunsky->sky_exposure = -sky_exposure;
sunsky->sky_colorspace = sky_colorspace;
-
+
sunsky->toSun[0] = toSun[0];
sunsky->toSun[1] = toSun[1];
sunsky->toSun[2] = toSun[2];
@@ -186,7 +186,7 @@ void InitSunSky(struct SunSky *sunsky, float turb, const float toSun[3], float h
if (sunsky->zenith_Y <= 0)
sunsky->zenith_Y = 1e-6;
-
+
sunsky->zenith_x =
(+0.00165f * theta3 - 0.00374f * theta2 + 0.00208f * sunsky->theta + 0.0f) * T2 +
(-0.02902f * theta3 + 0.06377f * theta2 - 0.03202f * sunsky->theta + 0.00394f) * T +
@@ -197,7 +197,7 @@ void InitSunSky(struct SunSky *sunsky, float turb, const float toSun[3], float h
(-0.04214f * theta3 + 0.08970f * theta2 - 0.04153f * sunsky->theta + 0.00515f) * T +
(+0.15346f * theta3 - 0.26756f * theta2 + 0.06669f * sunsky->theta + 0.26688f);
-
+
sunsky->perez_Y[0] = 0.17872f * T - 1.46303f;
sunsky->perez_Y[1] = -0.35540f * T + 0.42749f;
sunsky->perez_Y[2] = -0.02266f * T + 5.32505f;
@@ -215,12 +215,12 @@ void InitSunSky(struct SunSky *sunsky, float turb, const float toSun[3], float h
sunsky->perez_y[2] = -0.00792f * T + 0.21023f;
sunsky->perez_y[3] = -0.04405f * T - 1.65369f;
sunsky->perez_y[4] = -0.01092f * T + 0.05291f;
-
+
/* suggested by glome in patch [#8063] */
sunsky->perez_Y[0] *= sunsky->horizon_brightness;
sunsky->perez_x[0] *= sunsky->horizon_brightness;
sunsky->perez_y[0] *= sunsky->horizon_brightness;
-
+
sunsky->perez_Y[1] *= sunsky->spread;
sunsky->perez_x[1] *= sunsky->spread;
sunsky->perez_y[1] *= sunsky->spread;
@@ -228,11 +228,11 @@ void InitSunSky(struct SunSky *sunsky, float turb, const float toSun[3], float h
sunsky->perez_Y[2] *= sunsky->sun_brightness;
sunsky->perez_x[2] *= sunsky->sun_brightness;
sunsky->perez_y[2] *= sunsky->sun_brightness;
-
+
sunsky->perez_Y[3] *= sunsky->sun_size;
sunsky->perez_x[3] *= sunsky->sun_size;
sunsky->perez_y[3] *= sunsky->sun_size;
-
+
sunsky->perez_Y[4] *= sunsky->backscattered_light;
sunsky->perez_x[4] *= sunsky->backscattered_light;
sunsky->perez_y[4] *= sunsky->backscattered_light;
@@ -269,7 +269,7 @@ void GetSkyXYZRadiance(struct SunSky *sunsky, float theta, float phi, float colo
}
gamma = AngleBetween(theta, phi, sunsky->theta, sunsky->phi);
-
+
/* Compute xyY values */
x = PerezFunction(sunsky, sunsky->perez_x, theta, gamma, sunsky->zenith_x);
y = PerezFunction(sunsky, sunsky->perez_y, theta, gamma, sunsky->zenith_y);
@@ -277,7 +277,7 @@ void GetSkyXYZRadiance(struct SunSky *sunsky, float theta, float phi, float colo
if (sunsky->sky_exposure != 0.0f)
Y = 1.0 - exp(Y * sunsky->sky_exposure);
-
+
X = (x / y) * Y;
Z = ((1 - x - y) / y) * Y;
@@ -326,14 +326,14 @@ static void ComputeAttenuatedSunlight(float theta, int turbidity, float fTau[3])
float fAlpha;
int i;
- float fLambda[3];
+ float fLambda[3];
fLambda[0] = 0.65f;
fLambda[1] = 0.57f;
fLambda[2] = 0.475f;
fAlpha = 1.3f;
fBeta = 0.04608365822050f * turbidity - 0.04586025928522f;
-
+
m = 1.0f / (cosf(theta) + 0.15f * powf(93.885f - theta / (float)M_PI * 180.0f, -1.253f));
for (i = 0; i < 3; i++) {
@@ -371,11 +371,11 @@ void InitAtmosphere(struct SunSky *sunSky, float sun_intens, float mief, float r
float c = (6.544f * T - 6.51f) * 1e-17f;
float K[3] = {0.685f, 0.679f, 0.670f};
float vBetaMieTemp[3];
-
+
float fLambda[3], fLambda2[3], fLambda4[3];
float vLambda2[3];
float vLambda4[3];
-
+
int i;
sunSky->atm_SunIntensity = sun_intens;
@@ -384,7 +384,7 @@ void InitAtmosphere(struct SunSky *sunSky, float sun_intens, float mief, float r
sunSky->atm_InscatteringMultiplier = inscattf;
sunSky->atm_ExtinctionMultiplier = extincf;
sunSky->atm_DistanceMultiplier = disf;
-
+
sunSky->atm_HGg = 0.8;
fLambda[0] = 1 / 650e-9f;
@@ -415,12 +415,12 @@ void InitAtmosphere(struct SunSky *sunSky, float sun_intens, float mief, float r
/* Mie scattering constants. */
fTemp2 = 0.434f * c * (2 * pi) * (2 * pi) * 0.5f;
VEC3OPF(sunSky->atm_BetaDashMie, vLambda2, *, fTemp2);
-
+
fTemp3 = 0.434f * c * pi * (2 * pi) * (2 * pi);
-
+
VEC3OPV(vBetaMieTemp, K, *, fLambda);
VEC3OPF(sunSky->atm_BetaMie, vBetaMieTemp, *, fTemp3);
-
+
}
/**
@@ -438,19 +438,19 @@ void AtmospherePixleShader(struct SunSky *sunSky, float view[3], float s, float
float Phase_1;
float Phase_2;
float sunColor[3];
-
+
float E[3];
float E1[3];
-
-
+
+
float I[3];
float fTemp;
float vTemp1[3], vTemp2[3];
float sunDirection[3];
-
+
s *= sunSky->atm_DistanceMultiplier;
-
+
sunDirection[0] = sunSky->toSun[0];
sunDirection[1] = sunSky->toSun[1];
sunDirection[2] = sunSky->toSun[2];
@@ -474,7 +474,7 @@ void AtmospherePixleShader(struct SunSky *sunSky, float view[3], float s, float
fTemp = 1 + sunSky->atm_HGg - 2 * sunSky->atm_HGg * costheta;
fTemp = fTemp * sqrtf(fTemp);
Phase_2 = (1 - sunSky->atm_HGg * sunSky->atm_HGg) / fTemp;
-
+
VEC3OPF(vTemp1, sunSky->atm_BetaDashRay, *, Phase_1);
VEC3OPF(vTemp2, sunSky->atm_BetaDashMie, *, Phase_2);
@@ -485,7 +485,7 @@ void AtmospherePixleShader(struct SunSky *sunSky, float view[3], float s, float
FOPVEC3(vTemp2, 1.0f, /, sunSky->atm_BetaRM);
VEC3OPV(I, vTemp1, *, vTemp2);
-
+
VEC3OPF(I, I, *, sunSky->atm_InscatteringMultiplier);
VEC3OPF(E, E, *, sunSky->atm_ExtinctionMultiplier);
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
index 8ef35828be9..8e79f309814 100644
--- a/source/blender/render/intern/source/volume_precache.c
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -76,18 +76,18 @@ extern struct Render R;
static int intersect_outside_volume(RayObject *tree, Isect *isect, float *offset, int limit, int depth)
{
if (limit == 0) return depth;
-
+
if (RE_rayobject_raycast(tree, isect)) {
-
+
isect->start[0] = isect->start[0] + isect->dist*isect->dir[0];
isect->start[1] = isect->start[1] + isect->dist*isect->dir[1];
isect->start[2] = isect->start[2] + isect->dist*isect->dir[2];
-
+
isect->dist = FLT_MAX;
isect->skip = RE_SKIP_VLR_NEIGHBOUR;
isect->orig.face= isect->hit.face;
isect->orig.ob= isect->hit.ob;
-
+
return intersect_outside_volume(tree, isect, offset, limit-1, depth+1);
}
else {
@@ -101,14 +101,14 @@ static int point_inside_obi(RayObject *tree, ObjectInstanceRen *obi, const float
Isect isect= {{0}};
float dir[3] = {0.0f, 0.0f, 1.0f};
int final_depth=0, depth=0, limit=20;
-
+
/* set up the isect */
copy_v3_v3(isect.start, co);
copy_v3_v3(isect.dir, dir);
isect.mode= RE_RAY_MIRROR;
isect.last_hit= NULL;
isect.lay= -1;
-
+
isect.dist = FLT_MAX;
isect.orig.face= NULL;
isect.orig.ob = NULL;
@@ -116,7 +116,7 @@ static int point_inside_obi(RayObject *tree, ObjectInstanceRen *obi, const float
RE_instance_rotate_ray(obi, &isect);
final_depth = intersect_outside_volume(tree, &isect, dir, limit, depth);
RE_instance_rotate_ray_restore(obi, &isect);
-
+
/* even number of intersections: point is outside
* odd number: point is inside */
if (final_depth % 2 == 0) return 0;
@@ -131,37 +131,37 @@ void global_bounds_obi(Render *re, ObjectInstanceRen *obi, float bbmin[3], float
VertRen *ver= NULL;
float co[3];
int a;
-
+
if (vp->bbmin != NULL && vp->bbmax != NULL) {
copy_v3_v3(bbmin, vp->bbmin);
copy_v3_v3(bbmax, vp->bbmax);
return;
}
-
+
vp->bbmin = MEM_callocN(sizeof(float)*3, "volume precache min boundbox corner");
vp->bbmax = MEM_callocN(sizeof(float)*3, "volume precache max boundbox corner");
-
+
INIT_MINMAX(bbmin, bbmax);
-
+
for (a=0; a<obr->totvert; a++) {
if ((a & 255)==0) ver= obr->vertnodes[a>>8].vert;
else ver++;
-
+
copy_v3_v3(co, ver->co);
-
+
/* transformed object instance in camera space */
if (obi->flag & R_TRANSFORMED)
mul_m4_v3(obi->mat, co);
-
+
/* convert to global space */
mul_m4_v3(re->viewinv, co);
-
+
minmax_v3v3_v3(vp->bbmin, vp->bbmax, co);
}
-
+
copy_v3_v3(bbmin, vp->bbmin);
copy_v3_v3(bbmax, vp->bbmax);
-
+
}
/* *** light cache filtering *** */
@@ -171,34 +171,34 @@ static float get_avg_surrounds(float *cache, int *res, int xx, int yy, int zz)
int x, y, z, x_, y_, z_;
int added=0;
float tot=0.0f;
-
+
for (z=-1; z <= 1; z++) {
z_ = zz+z;
if (z_ >= 0 && z_ <= res[2]-1) {
-
+
for (y=-1; y <= 1; y++) {
y_ = yy+y;
if (y_ >= 0 && y_ <= res[1]-1) {
-
+
for (x=-1; x <= 1; x++) {
x_ = xx+x;
if (x_ >= 0 && x_ <= res[0]-1) {
const int64_t i = BLI_VOXEL_INDEX(x_, y_, z_, res);
-
+
if (cache[i] > 0.0f) {
tot += cache[i];
added++;
}
-
+
}
}
}
}
}
}
-
+
if (added > 0) tot /= added;
-
+
return tot;
}
@@ -215,7 +215,7 @@ static void lightcache_filter(VolumePrecache *vp)
for (x=0; x < vp->res[0]; x++) {
/* trigger for outside mesh */
const int64_t i = BLI_VOXEL_INDEX(x, y, z, vp->res);
-
+
if (vp->data_r[i] < -0.f)
vp->data_r[i] = get_avg_surrounds(vp->data_r, vp->res, x, y, z);
if (vp->data_g[i] < -0.f)
@@ -233,15 +233,15 @@ static void lightcache_filter2(VolumePrecache *vp)
int x, y, z;
float *new_r, *new_g, *new_b;
int field_size = vp->res[0]*vp->res[1]*vp->res[2]*sizeof(float);
-
+
new_r = MEM_mallocN(field_size, "temp buffer for light cache filter r channel");
new_g = MEM_mallocN(field_size, "temp buffer for light cache filter g channel");
new_b = MEM_mallocN(field_size, "temp buffer for light cache filter b channel");
-
+
memcpy(new_r, vp->data_r, field_size);
memcpy(new_g, vp->data_g, field_size);
memcpy(new_b, vp->data_b, field_size);
-
+
for (z=0; z < vp->res[2]; z++) {
for (y=0; y < vp->res[1]; y++) {
for (x=0; x < vp->res[0]; x++) {
@@ -256,11 +256,11 @@ static void lightcache_filter2(VolumePrecache *vp)
}
}
}
-
+
SWAP(float *, vp->data_r, new_r);
SWAP(float *, vp->data_g, new_g);
SWAP(float *, vp->data_b, new_b);
-
+
if (new_r) { MEM_freeN(new_r); new_r=NULL; }
if (new_g) { MEM_freeN(new_g); new_g=NULL; }
if (new_b) { MEM_freeN(new_b); new_b=NULL; }
@@ -286,7 +286,7 @@ BLI_INLINE int64_t v_I_pad(int x, int y, int z, const int *n)
}
BLI_INLINE int64_t lc_to_ms_I(int x, int y, int z, const int *n)
-{
+{
/* converting light cache index to multiple scattering index */
return ((int64_t)(x - 1) * ((int64_t)n[1] * (int64_t)n[2]) +
(int64_t)(y - 1) * ((int64_t)n[2]) +
@@ -301,12 +301,12 @@ static float total_ss_energy(Render *re, int do_test_break, VolumePrecache *vp)
int x, y, z;
const int *res = vp->res;
float energy=0.f;
-
+
for (z=0; z < res[2]; z++) {
for (y=0; y < res[1]; y++) {
for (x=0; x < res[0]; x++) {
const int64_t i = BLI_VOXEL_INDEX(x, y, z, res);
-
+
if (vp->data_r[i] > 0.f) energy += vp->data_r[i];
if (vp->data_g[i] > 0.f) energy += vp->data_g[i];
if (vp->data_b[i] > 0.f) energy += vp->data_b[i];
@@ -315,7 +315,7 @@ static float total_ss_energy(Render *re, int do_test_break, VolumePrecache *vp)
if (do_test_break && re->test_break(re->tbh)) break;
}
-
+
return energy;
}
@@ -323,12 +323,12 @@ static float total_ms_energy(Render *re, int do_test_break, float *sr, float *sg
{
int x, y, z;
float energy=0.f;
-
+
for (z=1;z<=res[2];z++) {
for (y=1;y<=res[1];y++) {
for (x=1;x<=res[0];x++) {
const int64_t i = ms_I(x, y, z, res);
-
+
if (sr[i] > 0.f) energy += sr[i];
if (sg[i] > 0.f) energy += sg[i];
if (sb[i] > 0.f) energy += sb[i];
@@ -337,7 +337,7 @@ static float total_ms_energy(Render *re, int do_test_break, float *sr, float *sg
if (do_test_break && re->test_break(re->tbh)) break;
}
-
+
return energy;
}
@@ -350,7 +350,7 @@ static void ms_diffuse(Render *re, int do_test_break, const float *x0, float *x,
const float dt = VOL_MS_TIMESTEP;
int64_t size = (int64_t)n[0] * (int64_t)n[1] * (int64_t)n[2];
const float a = dt * diff * size;
-
+
for (l=0; l<20; l++) {
for (k=1; k<=n[2]; k++) {
for (j=1; j<=n[1]; j++) {
@@ -379,7 +379,7 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
const int simframes = (int)(ma->vol.ms_spread * (float)max_iii(vp->res[0], vp->res[1], vp->res[2]));
const int shade_type = ma->vol.shade_type;
float fac = ma->vol.ms_intensity;
-
+
int x, y, z, m;
const int *n = vp->res;
const int size = (n[0]+2)*(n[1]+2)*(n[2]+2);
@@ -398,9 +398,9 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
float *sb=(float *)MEM_callocN(size*sizeof(float), "temporary multiple scattering buffer");
total = (float)(n[0]*n[1]*n[2]*simframes);
-
+
energy_ss = total_ss_energy(re, do_test_break, vp);
-
+
/* Scattering as diffusion pass */
for (m=0; m<simframes; m++) {
/* add sources */
@@ -409,7 +409,7 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
for (x=1; x<=n[0]; x++) {
const int64_t i = lc_to_ms_I(x, y, z, n); //lc index
const int64_t j = ms_I(x, y, z, n); //ms index
-
+
time= PIL_check_seconds_timer();
c++;
if (vp->data_r[i] > 0.0f)
@@ -418,7 +418,7 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
sg[j] += vp->data_g[i];
if (vp->data_b[i] > 0.0f)
sb[j] += vp->data_b[i];
-
+
/* Displays progress every second */
if (time-lasttime>1.0) {
char str[64];
@@ -445,14 +445,14 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
ms_diffuse(re, do_test_break, sr0, sr, diff, n);
ms_diffuse(re, do_test_break, sg0, sg, diff, n);
ms_diffuse(re, do_test_break, sb0, sb, diff, n);
-
+
if (re->test_break(re->tbh)) break;
}
-
+
/* normalization factor to conserve energy */
energy_ms = total_ms_energy(re, do_test_break, sr, sg, sb, n);
fac *= (energy_ss / energy_ms);
-
+
/* blend multiple scattering back in the light cache */
if (shade_type == MA_VOL_SHADE_SHADEDPLUSMULTIPLE) {
/* conserve energy - half single, half multiple */
@@ -468,7 +468,7 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
for (x=1;x<=n[0];x++) {
const int64_t i = lc_to_ms_I(x, y, z, n); //lc index
const int64_t j = ms_I(x, y, z, n); //ms index
-
+
vp->data_r[i] = origf * vp->data_r[i] + fac * sr[j];
vp->data_g[i] = origf * vp->data_g[i] + fac * sg[j];
vp->data_b[i] = origf * vp->data_b[i] + fac * sb[j];
@@ -532,7 +532,7 @@ static void vol_precache_part(TaskPool * __restrict pool, void *taskdata, int UN
if (re->test_break && re->test_break(re->tbh))
return;
-
+
//printf("thread id %d\n", threadid);
res[0]= pa->res[0];
@@ -541,17 +541,17 @@ static void vol_precache_part(TaskPool * __restrict pool, void *taskdata, int UN
for (z= pa->minz; z < pa->maxz; z++) {
co[2] = pa->bbmin[2] + (pa->voxel[2] * (z + 0.5f));
-
+
for (y= pa->miny; y < pa->maxy; y++) {
co[1] = pa->bbmin[1] + (pa->voxel[1] * (y + 0.5f));
-
+
for (x=pa->minx; x < pa->maxx; x++) {
int64_t i;
co[0] = pa->bbmin[0] + (pa->voxel[0] * (x + 0.5f));
-
+
if (re->test_break && re->test_break(re->tbh))
break;
-
+
/* convert from world->camera space for shading */
mul_v3_m4v3(cco, pa->viewmat, co);
@@ -564,15 +564,15 @@ static void vol_precache_part(TaskPool * __restrict pool, void *taskdata, int UN
obi->volume_precache->data_b[i] = -1.0f;
continue;
}
-
+
copy_v3_v3(view, cco);
normalize_v3(view);
vol_get_scattering(shi, scatter_col, cco, view);
-
+
obi->volume_precache->data_r[i] = scatter_col[0];
obi->volume_precache->data_g[i] = scatter_col[1];
obi->volume_precache->data_b[i] = scatter_col[2];
-
+
}
}
}
@@ -599,7 +599,7 @@ static void vol_precache_part(TaskPool * __restrict pool, void *taskdata, int UN
static void precache_setup_shadeinput(Render *re, ObjectInstanceRen *obi, Material *ma, ShadeInput *shi)
{
- memset(shi, 0, sizeof(ShadeInput));
+ memset(shi, 0, sizeof(ShadeInput));
shi->depth= 1;
shi->mask= 1;
shi->mat = ma;
@@ -627,26 +627,26 @@ static void precache_launch_parts(Render *re, RayObject *tree, ShadeInput *shi,
int minz, maxz;
int totthread = re->r.threads;
int parts[3];
-
+
if (!vp) return;
/* currently we just subdivide the box, number of threads per side */
parts[0] = parts[1] = parts[2] = totthread;
res = vp->res;
-
+
/* setup task scheduler */
memset(&state, 0, sizeof(state));
state.doneparts = 0;
state.totparts = parts[0]*parts[1]*parts[2];
state.lasttime = PIL_check_seconds_timer();
-
+
task_scheduler = BLI_task_scheduler_create(totthread);
task_pool = BLI_task_pool_create(task_scheduler, &state);
/* using boundbox in worldspace */
global_bounds_obi(re, obi, bbmin, bbmax);
sub_v3_v3v3(voxel, bbmax, bbmin);
-
+
voxel[0] /= (float)res[0];
voxel[1] /= (float)res[1];
voxel[2] /= (float)res[2];
@@ -656,38 +656,38 @@ static void precache_launch_parts(Render *re, RayObject *tree, ShadeInput *shi,
minx = x * sizex;
maxx = minx + sizex;
maxx = (maxx>res[0])?res[0]:maxx;
-
+
for (y=0; y < parts[1]; y++) {
sizey = ceil(res[1] / (float)parts[1]);
miny = y * sizey;
maxy = miny + sizey;
maxy = (maxy>res[1])?res[1]:maxy;
-
+
for (z=0; z < parts[2]; z++) {
VolPrecachePart *pa= MEM_callocN(sizeof(VolPrecachePart), "new precache part");
-
+
sizez = ceil(res[2] / (float)parts[2]);
minz = z * sizez;
maxz = minz + sizez;
maxz = (maxz>res[2])?res[2]:maxz;
-
+
pa->re = re;
pa->num = i;
pa->tree = tree;
pa->shi = shi;
pa->obi = obi;
copy_m4_m4(pa->viewmat, re->viewmat);
-
+
copy_v3_v3(pa->bbmin, bbmin);
copy_v3_v3(pa->voxel, voxel);
copy_v3_v3_int(pa->res, res);
-
+
pa->minx = minx; pa->maxx = maxx;
pa->miny = miny; pa->maxy = maxy;
pa->minz = minz; pa->maxz = maxz;
-
+
BLI_task_pool_push(task_pool, vol_precache_part, pa, true, TASK_PRIORITY_HIGH);
-
+
i++;
}
}
@@ -706,23 +706,23 @@ static int precache_resolution(Render *re, VolumePrecache *vp, ObjectInstanceRen
{
float dim[3], div;
float bbmin[3], bbmax[3];
-
+
/* bound box in global space */
global_bounds_obi(re, obi, bbmin, bbmax);
sub_v3_v3v3(dim, bbmax, bbmin);
-
+
div = max_fff(dim[0], dim[1], dim[2]);
dim[0] /= div;
dim[1] /= div;
dim[2] /= div;
-
+
vp->res[0] = ceil(dim[0] * res);
vp->res[1] = ceil(dim[1] * res);
vp->res[2] = ceil(dim[2] * res);
-
+
if ((vp->res[0] < 1) || (vp->res[1] < 1) || (vp->res[2] < 1))
return 0;
-
+
return 1;
}
@@ -736,17 +736,17 @@ static void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *o
VolumePrecache *vp;
RayObject *tree;
ShadeInput shi;
-
+
R = *re;
- /* create a raytree with just the faces of the instanced ObjectRen,
+ /* create a raytree with just the faces of the instanced ObjectRen,
* used for checking if the cached point is inside or outside. */
tree = makeraytree_object(&R, obi);
if (!tree) return;
vp = MEM_callocN(sizeof(VolumePrecache), "volume light cache");
obi->volume_precache = vp;
-
+
if (!precache_resolution(re, vp, obi, ma->vol.precache_resolution)) {
MEM_freeN(vp);
vp = NULL;
@@ -763,7 +763,7 @@ static void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *o
/* Need a shadeinput to calculate scattering */
precache_setup_shadeinput(re, obi, ma, &shi);
-
+
precache_launch_parts(re, tree, &shi, obi);
if (tree) {
@@ -772,12 +772,12 @@ static void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *o
//RE_rayobject_free(tree);
//tree= NULL;
}
-
+
if (ELEM(ma->vol.shade_type, MA_VOL_SHADE_MULTIPLE, MA_VOL_SHADE_SHADEDPLUSMULTIPLE)) {
/* this should be before the filtering */
multiple_scattering_diffusion(re, obi->volume_precache, ma);
}
-
+
lightcache_filter(obi->volume_precache);
}
@@ -812,7 +812,7 @@ void volume_precache(Render *re)
break;
}
}
-
+
re->i.infostr = NULL;
re->stats_draw(re->sdh, &re->i);
}
@@ -820,7 +820,7 @@ void volume_precache(Render *re)
void free_volume_precache(Render *re)
{
ObjectInstanceRen *obi;
-
+
for (obi= re->instancetable.first; obi; obi= obi->next) {
if (obi->volume_precache != NULL) {
MEM_freeN(obi->volume_precache->data_r);
@@ -832,7 +832,7 @@ void free_volume_precache(Render *re)
obi->volume_precache = NULL;
}
}
-
+
BLI_freelistN(&re->volumes);
}
@@ -840,16 +840,16 @@ int point_inside_volume_objectinstance(Render *re, ObjectInstanceRen *obi, const
{
RayObject *tree;
int inside=0;
-
+
tree = makeraytree_object(re, obi);
if (!tree) return 0;
-
+
inside = point_inside_obi(tree, obi, co);
-
+
//TODO: makeraytree_object creates a tree and saves it on OBI, if we free this tree we should also clear other pointers to it
//RE_rayobject_free(tree);
//tree= NULL;
-
+
return inside;
}
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index 7f3f14a1593..583353ed8cf 100644
--- a/source/blender/render/intern/source/volumetric.c
+++ b/source/blender/render/intern/source/volumetric.c
@@ -70,16 +70,16 @@ extern struct Render R;
static float vol_get_shadow(ShadeInput *shi, LampRen *lar, const float co[3])
{
float visibility = 1.f;
-
+
if (lar->shb) {
float dxco[3] = {0.f, 0.f, 0.f}, dyco[3] = {0.f, 0.f, 0.f};
-
+
visibility = testshadowbuf(&R, lar->shb, co, dxco, dyco, 1.0, 0.0);
}
else if (lar->mode & LA_SHAD_RAY) {
/* trace shadow manually, no good lamp api atm */
Isect is;
-
+
copy_v3_v3(is.start, co);
if (lar->type == LA_SUN || lar->type == LA_HEMI) {
is.dir[0] = -lar->vec[0];
@@ -95,16 +95,16 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, const float co[3])
is.mode = RE_RAY_MIRROR;
is.check = RE_CHECK_VLR_NON_SOLID_MATERIAL;
is.skip = 0;
-
+
if (lar->mode & (LA_LAYER | LA_LAYER_SHADOW))
is.lay = lar->lay;
else
is.lay = -1;
-
+
is.orig.ob = NULL;
is.orig.face = NULL;
is.last_hit = lar->last_hit[shi->thread];
-
+
RE_instance_rotate_ray(shi->obi, &is);
if (RE_rayobject_raycast(R.raytree, &is)) {
@@ -112,7 +112,7 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, const float co[3])
visibility = 0.f;
}
-
+
lar->last_hit[shi->thread] = is.last_hit;
}
return visibility;
@@ -120,7 +120,7 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, const float co[3])
static int vol_get_bounds(ShadeInput *shi, const float co[3], const float vec[3], float hitco[3], Isect *isect, int intersect_type)
{
-
+
copy_v3_v3(isect->start, co);
copy_v3_v3(isect->dir, vec);
isect->dist = FLT_MAX;
@@ -128,7 +128,7 @@ static int vol_get_bounds(ShadeInput *shi, const float co[3], const float vec[3]
isect->last_hit = NULL;
isect->lay = -1;
isect->check = RE_CHECK_VLR_NONE;
-
+
if (intersect_type == VOL_BOUNDS_DEPTH) {
isect->skip = RE_SKIP_VLR_NEIGHBOUR;
isect->orig.face = (void *)shi->vlr;
@@ -141,7 +141,7 @@ static int vol_get_bounds(ShadeInput *shi, const float co[3], const float vec[3]
}
RE_instance_rotate_ray(shi->obi, isect);
-
+
if (RE_rayobject_raycast(R.raytree, isect)) {
RE_instance_rotate_ray_restore(shi->obi, isect);
@@ -159,9 +159,9 @@ static void shade_intersection(ShadeInput *shi, float col_r[4], Isect *is)
{
ShadeInput shi_new;
ShadeResult shr_new;
-
- memset(&shi_new, 0, sizeof(ShadeInput));
-
+
+ memset(&shi_new, 0, sizeof(ShadeInput));
+
shi_new.mask = shi->mask;
shi_new.osatex = shi->osatex;
shi_new.thread = shi->thread;
@@ -174,16 +174,16 @@ static void shade_intersection(ShadeInput *shi, float col_r[4], Isect *is)
shi_new.combinedflag = 0xFFFFFF; /* ray trace does all options */
shi_new.light_override = shi->light_override;
shi_new.mat_override = shi->mat_override;
-
+
copy_v3_v3(shi_new.camera_co, is->start);
-
+
memset(&shr_new, 0, sizeof(ShadeResult));
-
+
/* hardcoded limit of 100 for now - prevents problems in weird geometry */
if (shi->volume_depth < 100) {
shade_ray(is, &shi_new, &shr_new);
}
-
+
copy_v3_v3(col_r, shr_new.combined);
col_r[3] = shr_new.alpha;
}
@@ -191,11 +191,11 @@ static void shade_intersection(ShadeInput *shi, float col_r[4], Isect *is)
static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, const float co[3], float col_r[4])
{
Isect isect;
-
+
copy_v3_v3(isect.start, co);
copy_v3_v3(isect.dir, shi->view);
isect.dist = FLT_MAX;
-
+
isect.mode = RE_RAY_MIRROR;
isect.check = RE_CHECK_VLR_NONE;
isect.skip = RE_SKIP_VLR_NEIGHBOUR;
@@ -203,7 +203,7 @@ static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, const float co[3], f
isect.orig.face = (void *)vlr;
isect.last_hit = NULL;
isect.lay = -1;
-
+
/* check to see if there's anything behind the volume, otherwise shade the sky */
RE_instance_rotate_ray(shi->obi, &isect);
@@ -225,9 +225,9 @@ static void vol_get_precached_scattering(Render *re, ShadeInput *shi, float scat
VolumePrecache *vp = shi->obi->volume_precache;
float bbmin[3], bbmax[3], dim[3];
float world_co[3], sample_co[3];
-
+
if (!vp) return;
-
+
/* find sample point in global space bounding box 0.0-1.0 */
global_bounds_obi(re, shi->obi, bbmin, bbmax);
sub_v3_v3v3(dim, bbmax, bbmin);
@@ -243,23 +243,23 @@ static void vol_get_precached_scattering(Render *re, ShadeInput *shi, float scat
scatter_col[2] = BLI_voxel_sample_triquadratic(vp->data_b, vp->res, sample_co);
}
-/* Meta object density, brute force for now
+/* Meta object density, brute force for now
* (might be good enough anyway, don't need huge number of metaobs to model volumetric objects */
static float metadensity(Object *ob, const float co[3])
{
float mat[4][4], imat[4][4], dens = 0.f;
MetaBall *mb = (MetaBall *)ob->data;
MetaElem *ml;
-
+
/* transform co to meta-element */
float tco[3] = {co[0], co[1], co[2]};
mul_m4_m4m4(mat, R.viewmat, ob->obmat);
invert_m4_m4(imat, mat);
mul_m4_v3(imat, tco);
-
+
for (ml = mb->elems.first; ml; ml = ml->next) {
float bmat[3][3], dist2;
-
+
/* element rotation transform */
float tp[3] = {ml->x - tco[0], ml->y - tco[1], ml->z - tco[2]};
quat_to_mat3(bmat, ml->quat);
@@ -290,7 +290,7 @@ static float metadensity(Object *ob, const float co[3])
if (dist2 > 0.f)
dens += (ml->flag & MB_NEGATIVE) ? -ml->s * dist2 * dist2 * dist2 : ml->s * dist2 * dist2 * dist2;
}
-
+
dens -= mb->thresh;
return (dens < 0.f) ? 0.f : dens;
}
@@ -299,36 +299,36 @@ float vol_get_density(struct ShadeInput *shi, const float co[3])
{
float density = shi->mat->vol.density;
float density_scale = shi->mat->vol.density_scale;
-
+
if (shi->mat->mapto_textured & MAP_DENSITY)
do_volume_tex(shi, co, MAP_DENSITY, NULL, &density, &R);
-
+
/* if meta-object, modulate by metadensity without increasing it */
if (shi->obi->obr->ob->type == OB_MBALL) {
const float md = metadensity(shi->obi->obr->ob, co);
if (md < 1.f) density *= md;
}
-
+
return density * density_scale;
}
/* Color of light that gets scattered out by the volume */
-/* Uses same physically based scattering parameter as in transmission calculations,
+/* Uses same physically based scattering parameter as in transmission calculations,
* along with artificial reflection scale/reflection color tint */
static void vol_get_reflection_color(ShadeInput *shi, float ref_col[3], const float co[3])
{
float scatter = shi->mat->vol.scattering;
float reflection = shi->mat->vol.reflection;
copy_v3_v3(ref_col, shi->mat->vol.reflection_col);
-
+
if (shi->mat->mapto_textured & (MAP_SCATTERING + MAP_REFLECTION_COL))
do_volume_tex(shi, co, MAP_SCATTERING + MAP_REFLECTION_COL, ref_col, &scatter, &R);
-
+
/* only one single float parameter at a time... :s */
if (shi->mat->mapto_textured & (MAP_REFLECTION))
do_volume_tex(shi, co, MAP_REFLECTION, NULL, &reflection, &R);
-
+
ref_col[0] = reflection * ref_col[0] * scatter;
ref_col[1] = reflection * ref_col[1] * scatter;
ref_col[2] = reflection * ref_col[2] * scatter;
@@ -340,10 +340,10 @@ static void vol_get_emission(ShadeInput *shi, float emission_col[3], const float
{
float emission = shi->mat->vol.emission;
copy_v3_v3(emission_col, shi->mat->vol.emission_col);
-
+
if (shi->mat->mapto_textured & (MAP_EMISSION + MAP_EMISSION_COL))
do_volume_tex(shi, co, MAP_EMISSION + MAP_EMISSION_COL, emission_col, &emission, &R);
-
+
emission_col[0] = emission_col[0] * emission;
emission_col[1] = emission_col[1] * emission;
emission_col[2] = emission_col[2] * emission;
@@ -356,26 +356,26 @@ static void vol_get_emission(ShadeInput *shi, float emission_col[3], const float
* It's easy enough to get a good wide range of results with just these two parameters. */
static void vol_get_sigma_t(ShadeInput *shi, float sigma_t[3], const float co[3])
{
- /* technically absorption, but named transmission color
+ /* technically absorption, but named transmission color
* since it describes the effect of the coloring *after* absorption */
float transmission_col[3] = {shi->mat->vol.transmission_col[0], shi->mat->vol.transmission_col[1], shi->mat->vol.transmission_col[2]};
float scattering = shi->mat->vol.scattering;
-
+
if (shi->mat->mapto_textured & (MAP_SCATTERING + MAP_TRANSMISSION_COL))
do_volume_tex(shi, co, MAP_SCATTERING + MAP_TRANSMISSION_COL, transmission_col, &scattering, &R);
-
+
sigma_t[0] = (1.0f - transmission_col[0]) + scattering;
sigma_t[1] = (1.0f - transmission_col[1]) + scattering;
sigma_t[2] = (1.0f - transmission_col[2]) + scattering;
}
-/* phase function - determines in which directions the light
+/* phase function - determines in which directions the light
* is scattered in the volume relative to incoming direction
* and view direction */
static float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, const float w[3], const float wp[3])
{
const float normalize = 0.25f; // = 1.f/4.f = M_PI/(4.f*M_PI)
-
+
/* normalization constant is 1/4 rather than 1/4pi, since
* Blender's shading system doesn't normalize for
* energy conservation - eg. multiplying by pdf ( 1/pi for a lambert brdf ).
@@ -385,7 +385,7 @@ static float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, const float w[3
* To correct this, scale up the phase function values by pi
* until Blender's shading system supports this better. --matt
*/
-
+
if (g == 0.f) { /* isotropic */
return normalize * 1.f;
}
@@ -394,7 +394,7 @@ static float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, const float w[3
const float kcostheta = k * dot_v3v3(w, wp);
return normalize * (1.f - k * k) / ((1.f - kcostheta) * (1.f - kcostheta));
}
-
+
/* not used, but here for reference: */
#if 0
switch (phasefunc_type) {
@@ -426,14 +426,14 @@ static void vol_get_transmittance_seg(ShadeInput *shi, float tr[3], float stepsi
float tau[3] = {0.f, 0.f, 0.f};
const float stepd = density * stepsize;
float sigma_t[3];
-
+
vol_get_sigma_t(shi, sigma_t, co);
-
+
/* homogeneous volume within the sampled distance */
tau[0] += stepd * sigma_t[0];
tau[1] += stepd * sigma_t[1];
tau[2] += stepd * sigma_t[2];
-
+
tr[0] *= expf(-tau[0]);
tr[1] *= expf(-tau[1]);
tr[2] *= expf(-tau[2]);
@@ -449,7 +449,7 @@ static void vol_get_transmittance(ShadeInput *shi, float tr[3], const float co[3
float t0 = 0.f;
float t1 = normalize_v3(step_vec);
float pt0 = t0;
-
+
t0 += shi->mat->vol.stepsize * ((shi->mat->vol.stepsize_type == MA_VOL_STEP_CONSTANT) ? 0.5f : BLI_thread_frand(shi->thread));
p[0] += t0 * step_vec[0];
p[1] += t0 * step_vec[1];
@@ -460,16 +460,16 @@ static void vol_get_transmittance(ShadeInput *shi, float tr[3], const float co[3
const float d = vol_get_density(shi, p);
const float stepd = (t0 - pt0) * d;
float sigma_t[3];
-
+
vol_get_sigma_t(shi, sigma_t, p);
-
+
tau[0] += stepd * sigma_t[0];
tau[1] += stepd * sigma_t[1];
tau[2] += stepd * sigma_t[2];
-
+
add_v3_v3(p, step_vec);
}
-
+
/* return transmittance */
tr[0] = expf(-tau[0]);
tr[1] = expf(-tau[1]);
@@ -482,15 +482,15 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, const float co[3], const
float tr[3] = {1.0, 1.0, 1.0};
float hitco[3], *atten_co;
float p, ref_col[3];
-
+
if (lar->mode & LA_LAYER) if ((lar->lay & shi->obi->lay) == 0) return;
if ((lar->lay & shi->lay) == 0) return;
if (lar->energy == 0.0f) return;
-
+
if ((visifac = lamp_get_visibility(lar, co, lv, &lampdist)) == 0.f) return;
-
+
copy_v3_v3(lacol, &lar->r);
-
+
if (lar->mode & LA_TEXTURE) {
shi->osatex = 0;
do_lamp_tex(lar, lv, shi, lacol, LA_TEXTURE);
@@ -501,23 +501,23 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, const float co[3], const
if (ELEM(lar->type, LA_SUN, LA_HEMI))
copy_v3_v3(lv, lar->vec);
negate_v3(lv);
-
+
if (shi->mat->vol.shade_type == MA_VOL_SHADE_SHADOWED) {
mul_v3_fl(lacol, vol_get_shadow(shi, lar, co));
}
else if (ELEM(shi->mat->vol.shade_type, MA_VOL_SHADE_SHADED, MA_VOL_SHADE_MULTIPLE, MA_VOL_SHADE_SHADEDPLUSMULTIPLE)) {
Isect is;
-
+
if (shi->mat->vol.shadeflag & MA_VOL_RECV_EXT_SHADOW) {
mul_v3_fl(lacol, vol_get_shadow(shi, lar, co));
if (IMB_colormanagement_get_luminance(lacol) < 0.001f) return;
}
-
+
/* find minimum of volume bounds, or lamp coord */
if (vol_get_bounds(shi, co, lv, hitco, &is, VOL_BOUNDS_SS)) {
float dist = len_v3v3(co, hitco);
VlakRen *vlr = (VlakRen *)is.hit.face;
-
+
/* simple internal shadowing */
if (vlr->mat->material_type == MA_TYPE_SURFACE) {
lacol[0] = lacol[1] = lacol[2] = 0.0f;
@@ -532,9 +532,9 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, const float co[3], const
}
else
atten_co = hitco;
-
+
vol_get_transmittance(shi, tr, co, atten_co);
-
+
mul_v3_v3v3(lacol, lacol, tr);
}
else {
@@ -543,15 +543,15 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, const float co[3], const
* Radiance from lamp remains unchanged */
}
}
-
+
if (IMB_colormanagement_get_luminance(lacol) < 0.001f) return;
-
+
normalize_v3(lv);
p = vol_get_phasefunc(shi, shi->mat->vol.asymmetry, view, lv);
-
+
/* physically based scattering with non-physically based RGB gain */
vol_get_reflection_color(shi, ref_col, co);
-
+
lacol[0] *= p * ref_col[0];
lacol[1] *= p * ref_col[1];
lacol[2] *= p * ref_col[2];
@@ -570,7 +570,7 @@ void vol_get_scattering(ShadeInput *shi, float scatter_col[3], const float co[3]
for (go = lights->first; go; go = go->next) {
float lacol[3] = {0.f, 0.f, 0.f};
lar = go->lampren;
-
+
if (lar) {
vol_shade_one_lamp(shi, co, view, lar, lacol);
add_v3_v3(scatter_col, lacol);
@@ -578,7 +578,7 @@ void vol_get_scattering(ShadeInput *shi, float scatter_col[3], const float co[3]
}
}
-
+
/*
* The main volumetric integrator, using an emission/absorption/scattering model.
*
@@ -590,7 +590,7 @@ void vol_get_scattering(ShadeInput *shi, float scatter_col[3], const float co[3]
* (radiance added by scattering + radiance added by emission) * beam transmittance/attenuation
*/
-/* For ease of use, I've also introduced a 'reflection' and 'reflection color' parameter, which isn't
+/* For ease of use, I've also introduced a 'reflection' and 'reflection color' parameter, which isn't
* physically correct. This works as an RGB tint/gain on out-scattered light, but doesn't affect the light
* that is transmitted through the volume. While having wavelength dependent absorption/scattering is more correct,
* it also makes it harder to control the overall look of the volume since coloring the outscattered light results
@@ -603,57 +603,57 @@ static void volumeintegrate(struct ShadeInput *shi, float col[4], const float co
float p[3] = {co[0], co[1], co[2]};
float step_vec[3] = {endco[0] - co[0], endco[1] - co[1], endco[2] - co[2]};
const float stepsize = shi->mat->vol.stepsize;
-
+
float t0 = 0.f;
float pt0 = t0;
float t1 = normalize_v3(step_vec); /* returns vector length */
-
+
t0 += stepsize * ((shi->mat->vol.stepsize_type == MA_VOL_STEP_CONSTANT) ? 0.5f : BLI_thread_frand(shi->thread));
p[0] += t0 * step_vec[0];
p[1] += t0 * step_vec[1];
p[2] += t0 * step_vec[2];
mul_v3_fl(step_vec, stepsize);
-
+
for (; t0 < t1; pt0 = t0, t0 += stepsize) {
const float density = vol_get_density(shi, p);
-
+
if (density > 0.00001f) {
float scatter_col[3] = {0.f, 0.f, 0.f}, emit_col[3];
const float stepd = (t0 - pt0) * density;
-
+
/* transmittance component (alpha) */
vol_get_transmittance_seg(shi, tr, stepsize, co, density);
-
+
if (t0 > t1 * 0.25f) {
/* only use depth cutoff after we've traced a little way into the volume */
if (IMB_colormanagement_get_luminance(tr) < shi->mat->vol.depth_cutoff) break;
}
-
+
vol_get_emission(shi, emit_col, p);
-
+
if (shi->obi->volume_precache) {
float p2[3];
-
+
p2[0] = p[0] + (step_vec[0] * 0.5f);
p2[1] = p[1] + (step_vec[1] * 0.5f);
p2[2] = p[2] + (step_vec[2] * 0.5f);
-
+
vol_get_precached_scattering(&R, shi, scatter_col, p2);
}
else
vol_get_scattering(shi, scatter_col, p, shi->view);
-
+
radiance[0] += stepd * tr[0] * (emit_col[0] + scatter_col[0]);
radiance[1] += stepd * tr[1] * (emit_col[1] + scatter_col[1]);
radiance[2] += stepd * tr[2] * (emit_col[2] + scatter_col[2]);
}
add_v3_v3(p, step_vec);
}
-
+
/* multiply original color (from behind volume) with transmittance over entire distance */
mul_v3_v3v3(col, tr, col);
add_v3_v3(col, radiance);
-
+
/* alpha <-- transmission luminance */
col[3] = 1.0f - IMB_colormanagement_get_luminance(tr);
}
@@ -674,11 +674,11 @@ static void volume_trace(struct ShadeInput *shi, struct ShadeResult *shr, int in
if (shi->flippednor)
inside_volume = VOL_SHADE_INSIDE;
}
-
+
if (ztransp && inside_volume == VOL_SHADE_INSIDE) {
MatInside *mi;
int render_this = 0;
-
+
/* don't render the backfaces of ztransp volume materials.
*
* volume shading renders the internal volume from between the
@@ -687,33 +687,33 @@ static void volume_trace(struct ShadeInput *shi, struct ShadeResult *shr, int in
* the front face.
*
* Because ztransp renders both front and back faces independently
- * this will double up, so here we prevent rendering the backface as well,
+ * this will double up, so here we prevent rendering the backface as well,
* which would otherwise render the volume in between the camera and the backface
* --matt */
-
+
for (mi = R.render_volumes_inside.first; mi; mi = mi->next) {
/* weak... */
if (mi->ma == shi->mat) render_this = 1;
}
if (!render_this) return;
}
-
+
if (inside_volume == VOL_SHADE_INSIDE) {
startco = shi->camera_co;
endco = shi->co;
-
+
if (trace_behind) {
if (!ztransp)
/* trace behind the volume object */
vol_trace_behind(shi, shi->vlr, endco, col);
}
else {
- /* we're tracing through the volume between the camera
+ /* we're tracing through the volume between the camera
* and a solid surface, so use that pre-shaded radiance */
copy_v4_v4(col, shr->combined);
}
-
+
/* shade volume from 'camera' to 1st hit point */
volumeintegrate(shi, col, startco, endco);
}
@@ -721,10 +721,10 @@ static void volume_trace(struct ShadeInput *shi, struct ShadeResult *shr, int in
/* (ray intersect ignores front faces here) */
else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, VOL_BOUNDS_DEPTH)) {
VlakRen *vlr = (VlakRen *)is.hit.face;
-
+
startco = shi->co;
endco = hitco;
-
+
if (!ztransp) {
/* if it's another face in the same material */
if (vlr->mat == shi->mat) {
@@ -735,24 +735,24 @@ static void volume_trace(struct ShadeInput *shi, struct ShadeResult *shr, int in
shade_intersection(shi, col, &is);
}
}
-
+
/* shade volume from 1st hit point to 2nd hit point */
volumeintegrate(shi, col, startco, endco);
}
-
+
if (ztransp)
col[3] = col[3] > 1.f ? 1.f : col[3];
else
col[3] = 1.f;
-
+
copy_v3_v3(shr->combined, col);
shr->alpha = col[3];
-
+
copy_v3_v3(shr->diff, shr->combined);
copy_v3_v3(shr->diffshad, shr->diff);
}
-/* Traces a shadow through the object,
+/* Traces a shadow through the object,
* pretty much gets the transmission over a ray path */
void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct Isect *last_is)
{
@@ -762,14 +762,14 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
const float *startco, *endco;
memset(shr, 0, sizeof(ShadeResult));
-
- /* if 1st hit normal is facing away from the camera,
+
+ /* if 1st hit normal is facing away from the camera,
* then we're inside the volume already. */
if (shi->flippednor) {
startco = last_is->start;
endco = shi->co;
}
-
+
/* trace to find a backface, the other side bounds of the volume */
/* (ray intersect ignores front faces here) */
else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, VOL_BOUNDS_DEPTH)) {
@@ -784,7 +784,7 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
vol_get_transmittance(shi, tr, startco, endco);
-
+
/* if we hit another face in the same volume bounds */
/* shift raytrace coordinates to the hit point, to avoid shading volume twice */
/* due to idiosyncracy in ray_trace_shadow_tra() */
@@ -794,7 +794,7 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
shi->vlr = (VlakRen *)is.hit.face;
}
-
+
copy_v3_v3(shr->combined, tr);
shr->combined[3] = 1.0f - IMB_colormanagement_get_luminance(tr);
shr->alpha = shr->combined[3];
@@ -819,14 +819,14 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr)
/* XXX: extend to multiple volumes perhaps later */
mat_backup = shi->mat;
obi_backup = shi->obi;
-
+
m = R.render_volumes_inside.first;
shi->mat = m->ma;
shi->obi = m->obi;
shi->obr = m->obi->obr;
-
+
volume_trace(shi, shr, VOL_SHADE_INSIDE);
-
+
shr->alpha = shr->alpha + prev_alpha;
CLAMP(shr->alpha, 0.0f, 1.0f);
diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c
index 0d9f7b197e1..2daa4123536 100644
--- a/source/blender/render/intern/source/voxeldata.c
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -88,10 +88,10 @@ static size_t vd_resol_size(VoxelData *vd)
}
static int load_frame_blendervoxel(VoxelData *vd, FILE *fp, int frame)
-{
+{
const size_t size = vd_resol_size(vd);
size_t offset = sizeof(VoxelDataHeader);
-
+
if (is_vd_res_ok(vd) == false)
return 0;
@@ -102,7 +102,7 @@ static int load_frame_blendervoxel(VoxelData *vd, FILE *fp, int frame)
return 0;
if (fread(vd->dataset, sizeof(float), size, fp) != size)
return 0;
-
+
vd->cachedframe = frame;
vd->ok = 1;
return 1;
@@ -138,12 +138,12 @@ static int load_frame_raw8(VoxelData *vd, FILE *fp, int frame)
vd->dataset = NULL;
return 0;
}
-
+
for (i = 0; i < size; i++) {
vd->dataset[i] = (float)data_c[i] / 255.f;
}
MEM_freeN(data_c);
-
+
vd->cachedframe = frame;
vd->ok = 1;
return 1;
@@ -160,7 +160,7 @@ static void load_frame_image_sequence(VoxelData *vd, Tex *tex)
if (!ima) return;
if (iuser.frames == 0) return;
-
+
ima->source = IMA_SRC_SEQUENCE;
iuser.framenr = 1 + iuser.offset;
@@ -173,13 +173,13 @@ static void load_frame_image_sequence(VoxelData *vd, Tex *tex)
}
if (!ibuf) return;
if (!ibuf->rect_float) IMB_float_from_rect(ibuf);
-
+
vd->flag |= TEX_VD_STILL;
vd->resol[0] = ibuf->x;
vd->resol[1] = ibuf->y;
vd->resol[2] = iuser.frames;
vd->dataset = MEM_mapallocN(sizeof(float) * vd_resol_size(vd), "voxel dataset");
-
+
for (z = 0; z < iuser.frames; z++) {
/* get a new ibuf for each frame */
if (z > 0) {
@@ -190,7 +190,7 @@ static void load_frame_image_sequence(VoxelData *vd, Tex *tex)
if (!ibuf->rect_float) IMB_float_from_rect(ibuf);
}
rf = ibuf->rect_float;
-
+
for (y = 0; y < ibuf->y; y++) {
for (x = 0; x < ibuf->x; x++) {
/* currently averaged to monchrome */
@@ -198,7 +198,7 @@ static void load_frame_image_sequence(VoxelData *vd, Tex *tex)
rf += 4;
}
}
-
+
BKE_image_free_anim_ibufs(ima, iuser.framenr);
}
@@ -211,13 +211,13 @@ static void load_frame_image_sequence(VoxelData *vd, Tex *tex)
static int read_voxeldata_header(FILE *fp, struct VoxelData *vd)
{
VoxelDataHeader *h = (VoxelDataHeader *)MEM_mallocN(sizeof(VoxelDataHeader), "voxel data header");
-
+
rewind(fp);
if (fread(h, sizeof(VoxelDataHeader), 1, fp) != 1) {
MEM_freeN(h);
return 0;
}
-
+
vd->resol[0] = h->resolX;
vd->resol[1] = h->resolY;
vd->resol[2] = h->resolZ;
@@ -231,16 +231,16 @@ static void init_frame_smoke(VoxelData *vd, int cfra)
#ifdef WITH_SMOKE
Object *ob;
ModifierData *md;
-
+
vd->dataset = NULL;
if (vd->object == NULL) return;
ob = vd->object;
-
+
/* draw code for smoke */
if ((md = (ModifierData *)modifiers_findByType(ob, eModifierType_Smoke))) {
SmokeModifierData *smd = (SmokeModifierData *)md;
SmokeDomainSettings *sds = smd->domain;
-
+
if (sds && sds->fluid) {
BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
@@ -356,7 +356,7 @@ static void init_frame_smoke(VoxelData *vd, int cfra)
BLI_rw_mutex_unlock(sds->fluid_mutex);
}
}
-
+
vd->ok = 1;
#else // WITH_SMOKE
@@ -371,14 +371,14 @@ static void init_frame_hair(VoxelData *vd, int UNUSED(cfra))
{
Object *ob;
ModifierData *md;
-
+
vd->dataset = NULL;
if (vd->object == NULL) return;
ob = vd->object;
-
+
if ((md = (ModifierData *)modifiers_findByType(ob, eModifierType_ParticleSystem))) {
ParticleSystemModifierData *pmd = (ParticleSystemModifierData *)md;
-
+
if (pmd->psys && pmd->psys->clmd) {
vd->ok |= BPH_cloth_solver_get_texture_data(ob, pmd->psys->clmd, vd);
}
@@ -386,16 +386,16 @@ static void init_frame_hair(VoxelData *vd, int UNUSED(cfra))
}
void cache_voxeldata(Tex *tex, int scene_frame)
-{
+{
VoxelData *vd = tex->vd;
FILE *fp;
int curframe;
char path[sizeof(vd->source_path)];
-
+
/* only re-cache if dataset needs updating */
if ((vd->flag & TEX_VD_STILL) || (vd->cachedframe == scene_frame))
if (vd->ok) return;
-
+
/* clear out old cache, ready for new */
if (vd->dataset) {
MEM_freeN(vd->dataset);
@@ -408,9 +408,9 @@ void cache_voxeldata(Tex *tex, int scene_frame)
curframe = vd->still_frame;
else
curframe = scene_frame;
-
+
BLI_strncpy(path, vd->source_path, sizeof(path));
-
+
/* each type is responsible for setting to true */
vd->ok = false;
@@ -428,7 +428,7 @@ void cache_voxeldata(Tex *tex, int scene_frame)
BLI_path_abs(path, BKE_main_blendfile_path_from_global());
fp = BLI_fopen(path, "rb");
if (!fp) return;
-
+
if (read_voxeldata_header(fp, vd))
load_frame_blendervoxel(vd, fp, curframe - 1);
@@ -438,7 +438,7 @@ void cache_voxeldata(Tex *tex, int scene_frame)
BLI_path_abs(path, BKE_main_blendfile_path_from_global());
fp = BLI_fopen(path, "rb");
if (!fp) return;
-
+
load_frame_raw8(vd, fp, curframe);
fclose(fp);
return;
@@ -448,24 +448,24 @@ void cache_voxeldata(Tex *tex, int scene_frame)
void make_voxeldata(struct Render *re)
{
Tex *tex;
-
+
re->i.infostr = IFACE_("Loading voxel datasets");
re->stats_draw(re->sdh, &re->i);
-
+
/* XXX: should be doing only textures used in this render */
for (tex = re->main->tex.first; tex; tex = tex->id.next) {
if (tex->id.us && tex->type == TEX_VOXELDATA) {
cache_voxeldata(tex, re->r.cfra);
}
}
-
+
re->i.infostr = NULL;
re->stats_draw(re->sdh, &re->i);
-
+
}
int voxeldatatex(struct Tex *tex, const float texvec[3], struct TexResult *texres)
-{
+{
VoxelData *vd = tex->vd;
float co[3], offset[3] = {0.5, 0.5, 0.5}, a;
int retval = (vd->data_type == TEX_VD_RGBA_PREMUL) ? TEX_RGB : TEX_INT;
@@ -476,7 +476,7 @@ int voxeldatatex(struct Tex *tex, const float texvec[3], struct TexResult *texre
texres->tin = 0.0f;
return 0;
}
-
+
/* scale lookup from 0.0-1.0 (original location) to -1.0, 1.0, consistent with image texture tex coords */
/* in implementation this works backwards, bringing sample locations from -1.0, 1.0
* to the range 0.0, 1.0, before looking up in the voxel structure. */
@@ -531,7 +531,7 @@ int voxeldatatex(struct Tex *tex, const float texvec[3], struct TexResult *texre
switch (vd->interp_type) {
case TEX_VD_NEARESTNEIGHBOR:
*result = BLI_voxel_sample_nearest(dataset, vd->resol, co);
- break;
+ break;
case TEX_VD_LINEAR:
*result = BLI_voxel_sample_trilinear(dataset, vd->resol, co);
break;
@@ -548,7 +548,7 @@ int voxeldatatex(struct Tex *tex, const float texvec[3], struct TexResult *texre
a = texres->tin;
texres->tin *= vd->int_multiplier;
BRICONT;
-
+
if (vd->data_type == TEX_VD_RGBA_PREMUL) {
/* unmultiply */
if (a>0.001f) {
@@ -566,6 +566,6 @@ int voxeldatatex(struct Tex *tex, const float texvec[3], struct TexResult *texre
texres->ta = texres->tin;
BRICONTRGB;
-
+
return retval;
}
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 82bb3b9c951..6c11dee5dde 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -90,10 +90,10 @@ extern struct Render R;
void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty, float clipcrop)
{
memset(zspan, 0, sizeof(ZSpan));
-
+
zspan->rectx= rectx;
zspan->recty= recty;
-
+
zspan->span1= MEM_mallocN(recty*sizeof(float), "zspan");
zspan->span2= MEM_mallocN(recty*sizeof(float), "zspan");
@@ -123,27 +123,27 @@ static void zbuf_add_to_span(ZSpan *zspan, const float v1[2], const float v2[2])
float *span;
float xx1, dx0, xs0;
int y, my0, my2;
-
+
if (v1[1]<v2[1]) {
minv= v1; maxv= v2;
}
else {
minv= v2; maxv= v1;
}
-
+
my0= ceil(minv[1]);
my2= floor(maxv[1]);
-
+
if (my2<0 || my0>= zspan->recty) return;
-
+
/* clip top */
if (my2>=zspan->recty) my2= zspan->recty-1;
/* clip bottom */
if (my0<0) my0= 0;
-
+
if (my0>my2) return;
/* if (my0>my2) should still fill in, that way we get spans that skip nicely */
-
+
xx1= maxv[1]-minv[1];
if (xx1>FLT_EPSILON) {
dx0= (minv[0]-maxv[0])/xx1;
@@ -153,7 +153,7 @@ static void zbuf_add_to_span(ZSpan *zspan, const float v1[2], const float v2[2])
dx0 = 0.0f;
xs0 = min_ff(minv[0], maxv[0]);
}
-
+
/* empty span */
if (zspan->maxp1 == NULL) {
span= zspan->span1;
@@ -196,9 +196,9 @@ static void zbuf_add_to_span(ZSpan *zspan, const float v1[2], const float v2[2])
}
}
-/*-----------------------------------------------------------*/
+/*-----------------------------------------------------------*/
/* Functions */
-/*-----------------------------------------------------------*/
+/*-----------------------------------------------------------*/
void fillrect(int *rect, int x, int y, int val)
{
@@ -217,7 +217,7 @@ void fillrect(int *rect, int x, int y, int val)
static short cliptestf(float a, float b, float c, float d, float *u1, float *u2)
{
float p= a + b, q= c + d, r;
-
+
if (p<0.0f) {
if (q<p) return 0;
else if (q<0.0f) {
@@ -244,20 +244,20 @@ int testclip(const float v[4])
{
float abs4; /* WATCH IT: this function should do the same as cliptestf, otherwise troubles in zbufclip()*/
short c=0;
-
- /* if we set clip flags, the clipping should be at least larger than epsilon.
+
+ /* if we set clip flags, the clipping should be at least larger than epsilon.
* prevents issues with vertices lying exact on borders */
abs4= fabsf(v[3]) + FLT_EPSILON;
-
+
if ( v[0] < -abs4) c+=1;
else if ( v[0] > abs4) c+=2;
-
+
if ( v[1] > abs4) c+=4;
else if ( v[1] < -abs4) c+=8;
-
+
if (v[2] < -abs4) c+=16; /* this used to be " if (v[2]<0) ", see clippz() */
else if (v[2]> abs4) c+= 32;
-
+
return c;
}
@@ -313,10 +313,10 @@ static void zbuffillAc4(ZSpan *zspan, int obi, int zvlnr,
const float *span1, *span2;
int *rz, *rm, x, y;
int sn1, sn2, rectx, *rectzofs, *rectmaskofs, my0, my2, mask;
-
+
/* init */
zbuf_init_span(zspan);
-
+
/* set spans */
zbuf_add_to_span(zspan, v1, v2);
zbuf_add_to_span(zspan, v2, v3);
@@ -326,15 +326,15 @@ static void zbuffillAc4(ZSpan *zspan, int obi, int zvlnr,
}
else
zbuf_add_to_span(zspan, v3, v1);
-
+
/* clipped */
if (zspan->minp2==NULL || zspan->maxp2==NULL) return;
my0 = max_ii(zspan->miny1, zspan->miny2);
my2 = min_ii(zspan->maxy1, zspan->maxy2);
-
+
if (my2<my0) return;
-
+
/* ZBUF DX DY, in floats still */
x1= v1[0]- v2[0];
x2= v2[0]- v3[0];
@@ -345,15 +345,15 @@ static void zbuffillAc4(ZSpan *zspan, int obi, int zvlnr,
x0= y1*z2-z1*y2;
y0= z1*x2-x1*z2;
z0= x1*y2-y1*x2;
-
+
if (z0==0.0f) return;
-
+
xx1= (x0*v1[0] + y0*v1[1])/z0 + v1[2];
-
+
zxd= -(double)x0/(double)z0;
zyd= -(double)y0/(double)z0;
zy0= ((double)my2)*zyd + (double)xx1;
-
+
/* start-offset in rect */
rectx= zspan->rectx;
rectzofs= (int *)(zspan->arectz+rectx*(my2));
@@ -371,33 +371,33 @@ static void zbuffillAc4(ZSpan *zspan, int obi, int zvlnr,
span1= zspan->span2+my2;
span2= zspan->span1+my2;
}
-
+
for (y=my2; y>=my0; y--, span1--, span2--) {
-
+
sn1= floor(*span1);
sn2= floor(*span2);
- sn1++;
-
+ sn1++;
+
if (sn2>=rectx) sn2= rectx-1;
if (sn1<0) sn1= 0;
-
+
if (sn2>=sn1) {
int intzverg;
-
+
zverg= (double)sn1*zxd + zy0;
rz= rectzofs+sn1;
rm= rectmaskofs+sn1;
ap= apofs+sn1;
x= sn2-sn1;
-
+
zverg-= zspan->polygon_offset;
-
+
while (x>=0) {
intzverg = round_db_to_int_clamp(zverg);
if ( intzverg < *rz) {
if (!zspan->rectmask || intzverg > *rm) {
-
+
apn= ap;
while (apn) {
if (apn->p[0]==0) {apn->obi[0]= obi; apn->p[0]= zvlnr; apn->z[0]= intzverg; apn->mask[0]= mask; break; }
@@ -414,13 +414,13 @@ static void zbuffillAc4(ZSpan *zspan, int obi, int zvlnr,
}
}
zverg+= zxd;
- rz++;
+ rz++;
rm++;
- ap++;
+ ap++;
x--;
}
}
-
+
zy0-=zyd;
rectzofs-= rectx;
rectmaskofs-= rectx;
@@ -438,12 +438,12 @@ static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], co
int dz, vergz, mask, maxtest=0;
float dx, dy;
float v1[3], v2[3];
-
+
dx= vec2[0]-vec1[0];
dy= vec2[1]-vec1[1];
-
+
mask= zspan->mask;
-
+
if (fabsf(dx) > fabsf(dy)) {
/* all lines from left to right */
@@ -460,24 +460,24 @@ static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], co
start= floor(v1[0]);
end= start+floor(dx);
if (end>=zspan->rectx) end= zspan->rectx-1;
-
+
oldy= floor(v1[1]);
dy/= dx;
-
+
vergz= v1[2];
vergz-= zspan->polygon_offset;
dz= (v2[2]-v1[2])/dx;
if (vergz>0x50000000 && dz>0) maxtest= 1; /* prevent overflow */
-
+
rectz= (int *)(zspan->arectz+zspan->rectx*(oldy) +start);
rectmask= (int *)(zspan->rectmask+zspan->rectx*(oldy) +start);
ap= (zspan->apixbuf+ zspan->rectx*(oldy) +start);
if (dy<0) ofs= -zspan->rectx;
else ofs= zspan->rectx;
-
+
for (x= start; x<=end; x++, rectz++, rectmask++, ap++) {
-
+
y= floor(v1[1]);
if (y!=oldy) {
oldy= y;
@@ -485,11 +485,11 @@ static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], co
rectmask+= ofs;
ap+= ofs;
}
-
+
if (x>=0 && y>=0 && y<zspan->recty) {
if (vergz<*rectz) {
if (!zspan->rectmask || vergz>*rectmask) {
-
+
apn= ap;
while (apn) { /* loop unrolled */
if (apn->p[0]==0) {apn->obi[0]= obi; apn->p[0]= zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
@@ -506,14 +506,14 @@ static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], co
}
}
}
-
+
v1[1]+= dy;
if (maxtest && (vergz > 0x7FFFFFF0 - dz)) vergz= 0x7FFFFFF0;
else vergz+= dz;
}
}
else {
-
+
/* all lines from top to bottom */
if (vec1[1]<vec2[1]) {
copy_v3_v3(v1, vec1);
@@ -527,14 +527,14 @@ static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], co
start= floor(v1[1]);
end= start+floor(dy);
-
+
if (start>=zspan->recty || end<0) return;
-
+
if (end>=zspan->recty) end= zspan->recty-1;
-
+
oldx= floor(v1[0]);
dx/= dy;
-
+
vergz= v1[2];
vergz-= zspan->polygon_offset;
dz= (v2[2]-v1[2])/dy;
@@ -543,12 +543,12 @@ static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], co
rectz= (int *)( zspan->arectz+ (start)*zspan->rectx+ oldx );
rectmask= (int *)( zspan->rectmask+ (start)*zspan->rectx+ oldx );
ap= (zspan->apixbuf+ zspan->rectx*(start) +oldx);
-
+
if (dx<0) ofs= -1;
else ofs= 1;
for (y= start; y<=end; y++, rectz+=zspan->rectx, rectmask+=zspan->rectx, ap+=zspan->rectx) {
-
+
x= floor(v1[0]);
if (x!=oldx) {
oldx= x;
@@ -556,11 +556,11 @@ static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], co
rectmask+= ofs;
ap+= ofs;
}
-
+
if (x>=0 && y>=0 && x<zspan->rectx) {
if (vergz<*rectz) {
if (!zspan->rectmask || vergz>*rectmask) {
-
+
apn= ap;
while (apn) { /* loop unrolled */
if (apn->p[0]==0) {apn->obi[0]= obi; apn->p[0]= zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
@@ -577,7 +577,7 @@ static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], co
}
}
}
-
+
v1[0]+= dx;
if (maxtest && (vergz > 0x7FFFFFF0 - dz)) vergz= 0x7FFFFFF0;
else vergz+= dz;
@@ -594,10 +594,10 @@ static void zbufline(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], cons
int dz, vergz, maxtest= 0;
float dx, dy;
float v1[3], v2[3];
-
+
dx= vec2[0]-vec1[0];
dy= vec2[1]-vec1[1];
-
+
if (fabsf(dx) > fabsf(dy)) {
/* all lines from left to right */
@@ -614,24 +614,24 @@ static void zbufline(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], cons
start= floor(v1[0]);
end= start+floor(dx);
if (end>=zspan->rectx) end= zspan->rectx-1;
-
+
oldy= floor(v1[1]);
dy/= dx;
-
+
vergz= floor(v1[2]);
dz= floor((v2[2]-v1[2])/dx);
if (vergz>0x50000000 && dz>0) maxtest= 1; /* prevent overflow */
-
+
rectz= zspan->rectz + oldy*zspan->rectx+ start;
rectp= zspan->rectp + oldy*zspan->rectx+ start;
recto= zspan->recto + oldy*zspan->rectx+ start;
rectmask= zspan->rectmask + oldy*zspan->rectx+ start;
-
+
if (dy<0) ofs= -zspan->rectx;
else ofs= zspan->rectx;
-
+
for (x= start; x<=end; x++, rectz++, rectp++, recto++, rectmask++) {
-
+
y= floor(v1[1]);
if (y!=oldy) {
oldy= y;
@@ -640,7 +640,7 @@ static void zbufline(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], cons
recto+= ofs;
rectmask+= ofs;
}
-
+
if (x>=0 && y>=0 && y<zspan->recty) {
if (vergz<*rectz) {
if (!zspan->rectmask || vergz>*rectmask) {
@@ -650,9 +650,9 @@ static void zbufline(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], cons
}
}
}
-
+
v1[1]+= dy;
-
+
if (maxtest && (vergz > 0x7FFFFFF0 - dz)) vergz= 0x7FFFFFF0;
else vergz+= dz;
}
@@ -671,26 +671,26 @@ static void zbufline(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], cons
start= floor(v1[1]);
end= start+floor(dy);
-
+
if (end>=zspan->recty) end= zspan->recty-1;
-
+
oldx= floor(v1[0]);
dx/= dy;
-
+
vergz= floor(v1[2]);
dz= floor((v2[2]-v1[2])/dy);
if (vergz>0x50000000 && dz>0) maxtest= 1; /* prevent overflow */
-
+
rectz= zspan->rectz + start*zspan->rectx+ oldx;
rectp= zspan->rectp + start*zspan->rectx+ oldx;
recto= zspan->recto + start*zspan->rectx+ oldx;
rectmask= zspan->rectmask + start*zspan->rectx+ oldx;
-
+
if (dx<0) ofs= -1;
else ofs= 1;
for (y= start; y<=end; y++, rectz+=zspan->rectx, rectp+=zspan->rectx, recto+=zspan->rectx, rectmask+=zspan->rectx) {
-
+
x= floor(v1[0]);
if (x!=oldx) {
oldx= x;
@@ -699,7 +699,7 @@ static void zbufline(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], cons
recto+= ofs;
rectmask+= ofs;
}
-
+
if (x>=0 && y>=0 && x<zspan->rectx) {
if (vergz<*rectz) {
if (!zspan->rectmask || vergz>*rectmask) {
@@ -709,7 +709,7 @@ static void zbufline(ZSpan *zspan, int obi, int zvlnr, const float vec1[3], cons
}
}
}
-
+
v1[0]+= dx;
if (maxtest && (vergz > 0x7FFFFFF0 - dz)) vergz= 0x7FFFFFF0;
else vergz+= dz;
@@ -724,12 +724,12 @@ static void zbufline_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr), con
int dz, vergz, maxtest= 0;
float dx, dy;
float v1[3], v2[3];
-
+
dx= vec2[0]-vec1[0];
dy= vec2[1]-vec1[1];
-
+
if (fabsf(dx) > fabsf(dy)) {
-
+
/* all lines from left to right */
if (vec1[0]<vec2[0]) {
copy_v3_v3(v1, vec1);
@@ -740,34 +740,34 @@ static void zbufline_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr), con
copy_v3_v3(v1, vec2);
dx= -dx; dy= -dy;
}
-
+
start= floor(v1[0]);
end= start+floor(dx);
if (end>=zspan->rectx) end= zspan->rectx-1;
-
+
oldy= floor(v1[1]);
dy/= dx;
-
+
vergz= floor(v1[2]);
dz= floor((v2[2]-v1[2])/dx);
if (vergz>0x50000000 && dz>0) maxtest= 1; /* prevent overflow */
-
+
rectz= zspan->rectz + oldy*zspan->rectx+ start;
if (zspan->rectz1)
rectz1= zspan->rectz1 + oldy*zspan->rectx+ start;
-
+
if (dy<0) ofs= -zspan->rectx;
else ofs= zspan->rectx;
-
+
for (x= start; x<=end; x++, rectz++) {
-
+
y= floor(v1[1]);
if (y!=oldy) {
oldy= y;
rectz+= ofs;
if (rectz1) rectz1+= ofs;
}
-
+
if (x>=0 && y>=0 && y<zspan->recty) {
if (vergz < *rectz) {
if (rectz1) *rectz1= *rectz;
@@ -776,12 +776,12 @@ static void zbufline_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr), con
else if (rectz1 && vergz < *rectz1)
*rectz1= vergz;
}
-
+
v1[1]+= dy;
-
+
if (maxtest && (vergz > 0x7FFFFFF0 - dz)) vergz= 0x7FFFFFF0;
else vergz+= dz;
-
+
if (rectz1) rectz1++;
}
}
@@ -796,15 +796,15 @@ static void zbufline_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr), con
copy_v3_v3(v1, vec2);
dx= -dx; dy= -dy;
}
-
+
start= floor(v1[1]);
end= start+floor(dy);
-
+
if (end>=zspan->recty) end= zspan->recty-1;
-
+
oldx= floor(v1[0]);
dx/= dy;
-
+
vergz= floor(v1[2]);
dz= floor((v2[2]-v1[2])/dy);
if (vergz>0x50000000 && dz>0) maxtest= 1; /* prevent overflow */
@@ -812,19 +812,19 @@ static void zbufline_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr), con
rectz= zspan->rectz + start*zspan->rectx+ oldx;
if (zspan->rectz1)
rectz1= zspan->rectz1 + start*zspan->rectx+ oldx;
-
+
if (dx<0) ofs= -1;
else ofs= 1;
-
+
for (y= start; y<=end; y++, rectz+=zspan->rectx) {
-
+
x= floor(v1[0]);
if (x!=oldx) {
oldx= x;
rectz+= ofs;
if (rectz1) rectz1+= ofs;
}
-
+
if (x>=0 && y>=0 && x<zspan->rectx) {
if (vergz < *rectz) {
if (rectz1) *rectz1= *rectz;
@@ -833,11 +833,11 @@ static void zbufline_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr), con
else if (rectz1 && vergz < *rectz1)
*rectz1= vergz;
}
-
+
v1[0]+= dx;
if (maxtest && (vergz > 0x7FFFFFF0 - dz)) vergz= 0x7FFFFFF0;
else vergz+= dz;
-
+
if (rectz1)
rectz1+=zspan->rectx;
}
@@ -849,29 +849,29 @@ static int clipline(float v1[4], float v2[4]) /* return 0: do not draw */
{
float dz, dw, u1=0.0, u2=1.0;
float dx, dy, v13;
-
+
dz= v2[2]-v1[2];
dw= v2[3]-v1[3];
-
+
/* this 1.01 is for clipping x and y just a tinsy larger. that way it is
* filled in with zbufwire correctly when rendering in parts. otherwise
* you see line endings at edges... */
-
+
if (cliptestf(-dz, -dw, v1[3], v1[2], &u1, &u2)) {
if (cliptestf(dz, -dw, v1[3], -v1[2], &u1, &u2)) {
-
+
dx= v2[0]-v1[0];
dz= 1.01f*(v2[3]-v1[3]);
v13= 1.01f*v1[3];
-
+
if (cliptestf(-dx, -dz, v1[0], v13, &u1, &u2)) {
if (cliptestf(dx, -dz, v13, -v1[0], &u1, &u2)) {
-
+
dy= v2[1]-v1[1];
-
+
if (cliptestf(-dy, -dz, v1[1], v13, &u1, &u2)) {
if (cliptestf(dy, -dz, v13, -v1[1], &u1, &u2)) {
-
+
if (u2<1.0f) {
v2[0]= v1[0]+u2*dx;
v2[1]= v1[1]+u2*dy;
@@ -891,14 +891,14 @@ static int clipline(float v1[4], float v2[4]) /* return 0: do not draw */
}
}
}
-
+
return 0;
}
void hoco_to_zco(ZSpan *zspan, float zco[3], const float hoco[4])
{
float div;
-
+
div= 1.0f/hoco[3];
zco[0]= zspan->zmulx*(1.0f+hoco[0]*div) + zspan->zofsx;
zco[1]= zspan->zmuly*(1.0f+hoco[1]*div) + zspan->zofsy;
@@ -923,7 +923,7 @@ void zbufclipwire(ZSpan *zspan, int obi, int zvlnr, int ec,
and= (c1 & c2 & c3);
or= (c1 | c2 | c3);
}
-
+
if (or) { /* not in the middle */
if (and) { /* out completely */
return;
@@ -979,7 +979,7 @@ void zbufclipwire(ZSpan *zspan, int obi, int zvlnr, int ec,
}
}
}
-
+
return;
}
}
@@ -1307,10 +1307,10 @@ static void zbuffillGL_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr),
const float *span1, *span2;
int *rz, *rz1, x, y;
int sn1, sn2, rectx, *rectzofs, *rectzofs1= NULL, my0, my2;
-
+
/* init */
zbuf_init_span(zspan);
-
+
/* set spans */
zbuf_add_to_span(zspan, v1, v2);
zbuf_add_to_span(zspan, v2, v3);
@@ -1318,19 +1318,19 @@ static void zbuffillGL_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr),
zbuf_add_to_span(zspan, v3, v4);
zbuf_add_to_span(zspan, v4, v1);
}
- else
+ else
zbuf_add_to_span(zspan, v3, v1);
-
+
/* clipped */
if (zspan->minp2==NULL || zspan->maxp2==NULL) return;
-
+
my0 = max_ii(zspan->miny1, zspan->miny2);
my2 = min_ii(zspan->maxy1, zspan->maxy2);
-
+
// printf("my %d %d\n", my0, my2);
if (my2<my0) return;
-
-
+
+
/* ZBUF DX DY, in floats still */
x1= v1[0]- v2[0];
x2= v2[0]- v3[0];
@@ -1341,21 +1341,21 @@ static void zbuffillGL_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr),
x0= y1*z2-z1*y2;
y0= z1*x2-x1*z2;
z0= x1*y2-y1*x2;
-
+
if (z0==0.0f) return;
-
+
xx1= (x0*v1[0] + y0*v1[1])/z0 + v1[2];
-
+
zxd= -(double)x0/(double)z0;
zyd= -(double)y0/(double)z0;
zy0= ((double)my2)*zyd + (double)xx1;
-
+
/* start-offset in rect */
rectx= zspan->rectx;
rectzofs= (zspan->rectz+rectx*my2);
if (zspan->rectz1)
rectzofs1= (zspan->rectz1+rectx*my2);
-
+
/* correct span */
sn1= (my0 + my2)/2;
if (zspan->span1[sn1] < zspan->span2[sn1]) {
@@ -1366,22 +1366,22 @@ static void zbuffillGL_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr),
span1= zspan->span2+my2;
span2= zspan->span1+my2;
}
-
+
for (y=my2; y>=my0; y--, span1--, span2--) {
-
+
sn1= floor(*span1);
sn2= floor(*span2);
- sn1++;
-
+ sn1++;
+
if (sn2>=rectx) sn2= rectx-1;
if (sn1<0) sn1= 0;
-
+
if (sn2>=sn1) {
zverg= (double)sn1*zxd + zy0;
rz= rectzofs+sn1;
rz1= rectzofs1+sn1;
x= sn2-sn1;
-
+
while (x>=0) {
int zvergi = round_db_to_int_clamp(zverg);
@@ -1394,13 +1394,13 @@ static void zbuffillGL_onlyZ(ZSpan *zspan, int UNUSED(obi), int UNUSED(zvlnr),
*rz1= zvergi;
zverg+= zxd;
-
- rz++;
+
+ rz++;
rz1++;
x--;
}
}
-
+
zy0-=zyd;
rectzofs-= rectx;
if (rectzofs1) rectzofs1-= rectx;
@@ -1414,24 +1414,24 @@ void zspan_scanconvert_strand(ZSpan *zspan, void *handle, float *v1, float *v2,
float u, v, uxd, uyd, vxd, vyd, uy0, vy0, zxd, zyd, zy0, xx1;
const float *span1, *span2;
int x, y, sn1, sn2, rectx= zspan->rectx, my0, my2;
-
+
/* init */
zbuf_init_span(zspan);
-
+
/* set spans */
zbuf_add_to_span(zspan, v1, v2);
zbuf_add_to_span(zspan, v2, v3);
zbuf_add_to_span(zspan, v3, v1);
-
+
/* clipped */
if (zspan->minp2==NULL || zspan->maxp2==NULL) return;
-
+
my0 = max_ii(zspan->miny1, zspan->miny2);
my2 = min_ii(zspan->maxy1, zspan->maxy2);
-
+
// printf("my %d %d\n", my0, my2);
if (my2<my0) return;
-
+
/* ZBUF DX DY, in floats still */
x1= v1[0]- v2[0];
x2= v2[0]- v3[0];
@@ -1443,7 +1443,7 @@ void zspan_scanconvert_strand(ZSpan *zspan, void *handle, float *v1, float *v2,
x0= y1*z2-z1*y2;
y0= z1*x2-x1*z2;
z0= x1*y2-y1*x2;
-
+
if (z0==0.0f) return;
xx1= (x0*v1[0] + y0*v1[1])/z0 + v1[2];
@@ -1467,12 +1467,12 @@ void zspan_scanconvert_strand(ZSpan *zspan, void *handle, float *v1, float *v2,
x0= y1*z2-z1*y2;
y0= z1*x2-x1*z2;
-
+
xx1= (x0*v1[0] + y0*v1[1])/z0;
vxd= -(double)x0/(double)z0;
vyd= -(double)y0/(double)z0;
vy0= ((double)my2)*vyd + (double)xx1;
-
+
/* correct span */
sn1= (my0 + my2)/2;
if (zspan->span1[sn1] < zspan->span2[sn1]) {
@@ -1483,23 +1483,23 @@ void zspan_scanconvert_strand(ZSpan *zspan, void *handle, float *v1, float *v2,
span1= zspan->span2+my2;
span2= zspan->span1+my2;
}
-
+
for (y=my2; y>=my0; y--, span1--, span2--) {
-
+
sn1= floor(*span1);
sn2= floor(*span2);
- sn1++;
-
+ sn1++;
+
if (sn2>=rectx) sn2= rectx-1;
if (sn1<0) sn1= 0;
-
+
u= (double)sn1*uxd + uy0;
v= (double)sn1*vxd + vy0;
z= (double)sn1*zxd + zy0;
-
+
for (x= sn1; x<=sn2; x++, u+=uxd, v+=vxd, z+=zxd)
func(handle, x, y, u, v, z);
-
+
uy0 -= uyd;
vy0 -= vyd;
zy0 -= zyd;
@@ -1514,30 +1514,30 @@ void zspan_scanconvert(ZSpan *zspan, void *handle, float *v1, float *v2, float *
float u, v, uxd, uyd, vxd, vyd, uy0, vy0, xx1;
const float *span1, *span2;
int i, j, x, y, sn1, sn2, rectx = zspan->rectx, my0, my2;
-
+
/* init */
zbuf_init_span(zspan);
-
+
/* set spans */
zbuf_add_to_span(zspan, v1, v2);
zbuf_add_to_span(zspan, v2, v3);
zbuf_add_to_span(zspan, v3, v1);
-
+
/* clipped */
if (zspan->minp2==NULL || zspan->maxp2==NULL) return;
-
+
my0 = max_ii(zspan->miny1, zspan->miny2);
my2 = min_ii(zspan->maxy1, zspan->maxy2);
-
+
// printf("my %d %d\n", my0, my2);
if (my2<my0) return;
-
+
/* ZBUF DX DY, in floats still */
x1= v1[0]- v2[0];
x2= v2[0]- v3[0];
y1= v1[1]- v2[1];
y2= v2[1]- v3[1];
-
+
z1= 1.0f; /* (u1 - u2) */
z2= 0.0f; /* (u2 - u3) */
@@ -1557,28 +1557,28 @@ void zspan_scanconvert(ZSpan *zspan, void *handle, float *v1, float *v2, float *
x0= y1*z2-z1*y2;
y0= z1*x2-x1*z2;
-
+
xx1= (x0*v1[0] + y0*v1[1])/z0;
vxd= -(double)x0/(double)z0;
vyd= -(double)y0/(double)z0;
vy0= ((double)my2)*vyd + (double)xx1;
-
+
/* correct span */
span1= zspan->span1+my2;
span2= zspan->span2+my2;
-
+
for (i = 0, y = my2; y >= my0; i++, y--, span1--, span2--) {
-
+
sn1= floor(min_ff(*span1, *span2));
sn2= floor(max_ff(*span1, *span2));
- sn1++;
-
+ sn1++;
+
if (sn2>=rectx) sn2= rectx-1;
if (sn1<0) sn1= 0;
-
+
u = (((double)sn1 * uxd) + uy0) - (i * uyd);
v = (((double)sn1 * vxd) + vy0) - (i * vyd);
-
+
for (j = 0, x = sn1; x <= sn2; j++, x++) {
func(handle, x, y, u + (j * uxd), v + (j * vxd));
}
@@ -1603,7 +1603,7 @@ static void clippyra(float *lambda, float *v1, float *v2, int *b2, int *b3, int
{
float da, dw, u1=0.0, u2=1.0;
float v13;
-
+
lambda[0]= -1.0;
lambda[1]= -1.0;
@@ -1677,7 +1677,7 @@ static void makevertpyra(float *vez, float *lambda, float **trias, float *v1, fl
adr[3]= v1[3]+l1*(v2[3]-v1[3]);
}
else trias[*b1]= v1;
-
+
(*b1)++;
}
if (l2!= -1.0f) {
@@ -1841,7 +1841,7 @@ void zbufclip(ZSpan *zspan, int obi, int zvlnr,
{
float *vlzp[32][3], lambda[3][2];
float vez[400], *trias[40];
-
+
if (c1 | c2 | c3) { /* not in middle */
if (c1 & c2 & c3) { /* completely out */
return;
@@ -1864,22 +1864,22 @@ void zbufclip(ZSpan *zspan, int obi, int zvlnr,
clipflag[2]= ( (c1 & 12) | (c2 & 12) | (c3 & 12) );
}
else clipflag[1]=clipflag[2]= 0;
-
+
for (b=0;b<3;b++) {
-
+
if (clipflag[b]) {
-
+
clvlo= clvl;
-
+
for (v=0; v<clvlo; v++) {
-
+
if (vlzp[v][0]!=NULL) { /* face is still there */
b2= b3 =0; /* clip flags */
if (b==0) arg= 2;
else if (b==1) arg= 0;
else arg= 1;
-
+
clippyra(lambda[0], vlzp[v][0], vlzp[v][1], &b2, &b3, arg, zspan->clipcrop);
clippyra(lambda[1], vlzp[v][1], vlzp[v][2], &b2, &b3, arg, zspan->clipcrop);
clippyra(lambda[2], vlzp[v][2], vlzp[v][0], &b2, &b3, arg, zspan->clipcrop);
@@ -1913,7 +1913,7 @@ void zbufclip(ZSpan *zspan, int obi, int zvlnr,
f1+= 4;
}
}
-
+
vlzp[v][0]= NULL;
if (b1>2) {
for (b3=3; b3<=b1; b3++) {
@@ -1959,7 +1959,7 @@ void zbufclip4(ZSpan *zspan, int obi, int zvlnr,
const int c1, const int c2, const int c3, const int c4)
{
float vez[16];
-
+
if (c1 | c2 | c3 | c4) { /* not in middle */
if (c1 & c2 & c3 & c4) { /* completely out */
return;
@@ -1990,11 +1990,11 @@ static void zmask_rect(int *rectz, int *rectp, int xs, int ys, int neg)
int len=0, x, y;
int *temprectp;
int row1, row2, row3, *curp, *curz;
-
+
temprectp= MEM_dupallocN(rectp);
-
+
/* extend: if pixel is not filled in, we check surrounding pixels and average z value */
-
+
for (y=1; y<=ys; y++) {
/* setup row indices */
row1= (y-2)*xs;
@@ -2004,15 +2004,15 @@ static void zmask_rect(int *rectz, int *rectp, int xs, int ys, int neg)
row1= row2;
else if (y==ys)
row3= row2;
-
+
curp= rectp + (y-1)*xs;
curz= rectz + (y-1)*xs;
-
+
for (x=0; x<xs; x++, curp++, curz++) {
if (curp[0]==0) {
int tot= 0;
float z= 0.0f;
-
+
EXTEND_PIXEL(row1);
EXTEND_PIXEL(row2);
EXTEND_PIXEL(row3);
@@ -2029,7 +2029,7 @@ static void zmask_rect(int *rectz, int *rectp, int xs, int ys, int neg)
curp[0]= -1; /* env */
}
}
-
+
if (x!=0) {
row1++; row2++; row3++;
}
@@ -2037,7 +2037,7 @@ static void zmask_rect(int *rectz, int *rectp, int xs, int ys, int neg)
}
MEM_freeN(temprectp);
-
+
if (neg) {
/* z values for negative are already correct */
}
@@ -2073,7 +2073,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
const bool neg_zmask = (rl->layflag & SCE_LAY_ZMASK) && (rl->layflag & SCE_LAY_NEG_ZMASK);
zbuf_make_winmat(&R, winmat);
-
+
samples= (R.osa? R.osa: 1);
samples= MIN2(4, samples-pa->sample);
@@ -2082,11 +2082,11 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
zbuffer_part_bounds(R.winx, R.winy, pa, bounds);
zbuf_alloc_span(zspan, pa->rectx, pa->recty, R.clipcrop);
-
+
/* needed for transform from hoco to zbuffer co */
zspan->zmulx= ((float)R.winx)/2.0f;
zspan->zmuly= ((float)R.winy)/2.0f;
-
+
if (R.osa) {
zspan->zofsx= -pa->disprect.xmin - R.jit[pa->sample+zsample][0];
zspan->zofsy= -pa->disprect.ymin - R.jit[pa->sample+zsample][1];
@@ -2102,7 +2102,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
/* to center the sample position */
zspan->zofsx -= 0.5f;
zspan->zofsy -= 0.5f;
-
+
/* the buffers */
if (zsample == samples-1) {
zspan->rectp= pa->rectp;
@@ -2127,7 +2127,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
/* in case zmask we fill Z for objects in lay_zmask first, then clear Z, and then do normal zbuffering */
if (rl->layflag & SCE_LAY_ZMASK)
zmaskpass= 1;
-
+
for (; zmaskpass >=0; zmaskpass--) {
ma= NULL;
@@ -2153,7 +2153,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
}
else if (!all_z && !(obi->lay & (lay|lay_zmask)))
continue;
-
+
if (obi->flag & R_TRANSFORMED)
mul_m4_m4m4(obwinmat, winmat, obi->mat);
else
@@ -2175,7 +2175,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
nofill= (ma->mode & MA_ONLYCAST) || ((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP));
env= (ma->mode & MA_ENV);
wire= (ma->material_type == MA_TYPE_WIRE);
-
+
for (zsample=0; zsample<samples; zsample++) {
if (ma->mode & MA_ZINV || (zmaskpass && neg_zmask))
zspans[zsample].zbuffunc= zbuffillGLinv4;
@@ -2187,7 +2187,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
else if (all_z || (obi->lay & lay_zmask)) {
env= 1;
nofill= 0;
- ma= NULL;
+ ma= NULL;
}
else {
nofill= 1;
@@ -2196,7 +2196,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
if (!(vlr->flag & R_HIDDEN) && nofill==0) {
unsigned short partclip;
-
+
v1= vlr->v1;
v2= vlr->v2;
v3= vlr->v3;
@@ -2214,7 +2214,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
}
if (partclip==0) {
-
+
if (env) zvlnr= -1;
else zvlnr= v+1;
@@ -2249,7 +2249,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart *
}
}
}
-
+
/* clear all z to close value, so it works as mask for next passes (ztra+strand) */
if (zmaskpass) {
for (zsample=0; zsample<samples; zsample++) {
@@ -2313,7 +2313,7 @@ void zbuffer_shadow(Render *re, float winmat[4][4], LampRen *lar, int *rectz, in
/* -0.5f to center the sample position */
zspan.zofsx= jitx - 0.5f;
zspan.zofsy= jity - 0.5f;
-
+
/* the buffers */
zspan.rectz= rectz;
fillrect(rectz, size, size, 0x7FFFFFFE);
@@ -2321,7 +2321,7 @@ void zbuffer_shadow(Render *re, float winmat[4][4], LampRen *lar, int *rectz, in
zspan.rectz1= MEM_mallocN(size*size*sizeof(int), "seconday z buffer");
fillrect(zspan.rectz1, size, size, 0x7FFFFFFE);
}
-
+
/* filling methods */
zspan.zbuflinefunc= zbufline_onlyZ;
zspan.zbuffunc= zbuffillGL_onlyZ;
@@ -2380,7 +2380,7 @@ void zbuffer_shadow(Render *re, float winmat[4][4], LampRen *lar, int *rectz, in
}
}
- if ((a & 255)==255 && re->test_break(re->tbh))
+ if ((a & 255)==255 && re->test_break(re->tbh))
break;
}
@@ -2429,24 +2429,24 @@ void zbuffer_shadow(Render *re, float winmat[4][4], LampRen *lar, int *rectz, in
}
}
- if ((a & 255)==255 && re->test_break(re->tbh))
+ if ((a & 255)==255 && re->test_break(re->tbh))
break;
}
}
}
- if (re->test_break(re->tbh))
+ if (re->test_break(re->tbh))
break;
}
-
+
/* merge buffers */
if (lar->buftype==LA_SHADBUF_HALFWAY) {
for (a=size*size -1; a>=0; a--)
rectz[a]= (rectz[a]>>1) + (zspan.rectz1[a]>>1);
-
+
MEM_freeN(zspan.rectz1);
}
-
+
zbuf_free_span(&zspan);
}
@@ -2458,7 +2458,7 @@ static void zbuffill_sss(ZSpan *zspan, int obi, int zvlnr,
int x, y, sn1, sn2, rectx= zspan->rectx, my0, my2;
/* init */
zbuf_init_span(zspan);
-
+
/* set spans */
zbuf_add_to_span(zspan, v1, v2);
zbuf_add_to_span(zspan, v2, v3);
@@ -2466,17 +2466,17 @@ static void zbuffill_sss(ZSpan *zspan, int obi, int zvlnr,
zbuf_add_to_span(zspan, v3, v4);
zbuf_add_to_span(zspan, v4, v1);
}
- else
+ else
zbuf_add_to_span(zspan, v3, v1);
-
+
/* clipped */
if (zspan->minp2==NULL || zspan->maxp2==NULL) return;
-
+
my0 = max_ii(zspan->miny1, zspan->miny2);
my2 = min_ii(zspan->maxy1, zspan->maxy2);
-
+
if (my2<my0) return;
-
+
/* ZBUF DX DY, in floats still */
x1= v1[0]- v2[0];
x2= v2[0]- v3[0];
@@ -2484,18 +2484,18 @@ static void zbuffill_sss(ZSpan *zspan, int obi, int zvlnr,
y2= v2[1]- v3[1];
z1= v1[2]- v2[2];
z2= v2[2]- v3[2];
-
+
x0= y1*z2-z1*y2;
y0= z1*x2-x1*z2;
z0= x1*y2-y1*x2;
-
+
if (z0==0.0f) return;
-
+
xx1= (x0*v1[0] + y0*v1[1])/z0 + v1[2];
zxd= -(double)x0/(double)z0;
zyd= -(double)y0/(double)z0;
zy0= ((double)my2)*zyd + (double)xx1;
-
+
/* correct span */
sn1= (my0 + my2)/2;
if (zspan->span1[sn1] < zspan->span2[sn1]) {
@@ -2506,20 +2506,20 @@ static void zbuffill_sss(ZSpan *zspan, int obi, int zvlnr,
span1= zspan->span2+my2;
span2= zspan->span1+my2;
}
-
+
for (y=my2; y>=my0; y--, span1--, span2--) {
sn1= floor(*span1);
sn2= floor(*span2);
- sn1++;
-
+ sn1++;
+
if (sn2>=rectx) sn2= rectx-1;
if (sn1<0) sn1= 0;
-
+
z= (double)sn1*zxd + zy0;
-
+
for (x= sn1; x<=sn2; x++, z+=zxd)
zspan->sss_func(zspan->sss_handle, obi, zvlnr, x, y, z);
-
+
zy0 -= zyd;
}
}
@@ -2537,34 +2537,34 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo
float ho1[4], ho2[4], ho3[4], ho4[4]={0};
int i, v, zvlnr, c1, c2, c3, c4=0;
short nofill=0, env=0, wire=0;
-
+
zbuf_make_winmat(&R, winmat);
zbuffer_part_bounds(R.winx, R.winy, pa, bounds);
zbuf_alloc_span(&zspan, pa->rectx, pa->recty, R.clipcrop);
zspan.sss_handle= handle;
zspan.sss_func= func;
-
+
/* needed for transform from hoco to zbuffer co */
zspan.zmulx= ((float)R.winx)/2.0f;
zspan.zmuly= ((float)R.winy)/2.0f;
-
+
/* -0.5f to center the sample position */
zspan.zofsx= -pa->disprect.xmin - 0.5f;
zspan.zofsy= -pa->disprect.ymin - 0.5f;
-
+
/* filling methods */
zspan.zbuffunc= zbuffill_sss;
/* fill front and back zbuffer */
if (pa->rectz) {
- fillrect(pa->recto, pa->rectx, pa->recty, 0);
- fillrect(pa->rectp, pa->rectx, pa->recty, 0);
+ fillrect(pa->recto, pa->rectx, pa->recty, 0);
+ fillrect(pa->rectp, pa->rectx, pa->recty, 0);
fillrect(pa->rectz, pa->rectx, pa->recty, 0x7FFFFFFF);
}
if (pa->rectbackz) {
- fillrect(pa->rectbacko, pa->rectx, pa->recty, 0);
- fillrect(pa->rectbackp, pa->rectx, pa->recty, 0);
+ fillrect(pa->rectbacko, pa->rectx, pa->recty, 0);
+ fillrect(pa->rectbackp, pa->rectx, pa->recty, 0);
fillrect(pa->rectbackz, pa->rectx, pa->recty, -0x7FFFFFFF);
}
@@ -2587,7 +2587,7 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo
for (v=0; v<obr->totvlak; v++) {
if ((v & 255)==0) vlr= obr->vlaknodes[v>>8].vlak;
else vlr++;
-
+
if (material_in_material(vlr->mat, sss_ma)) {
/* three cases, visible for render, only z values and nothing */
if (obi->lay & lay) {
@@ -2602,10 +2602,10 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo
nofill= 1;
ma= NULL; /* otherwise nofill can hang */
}
-
+
if (nofill==0 && wire==0 && env==0) {
unsigned short partclip;
-
+
v1= vlr->v1;
v2= vlr->v2;
v3= vlr->v3;
@@ -2638,7 +2638,7 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo
}
}
}
-
+
zbuf_free_span(&zspan);
}
@@ -2653,7 +2653,7 @@ static void copyto_abufz(RenderPart *pa, int *arectz, int *rectmask, int sample)
PixStr *ps;
int x, y, *rza, *rma;
intptr_t *rd;
-
+
if (R.osa==0) {
if (!pa->rectz)
fillrect(arectz, pa->rectx, pa->recty, 0x7FFFFFFE);
@@ -2669,16 +2669,16 @@ static void copyto_abufz(RenderPart *pa, int *arectz, int *rectmask, int sample)
fillrect(arectz, pa->rectx, pa->recty, 0x7FFFFFFE);
return;
}
-
+
rza= arectz;
rma= rectmask;
rd= pa->rectdaps;
sample= (1<<sample);
-
+
for (y=0; y<pa->recty; y++) {
for (x=0; x<pa->rectx; x++) {
-
+
*rza= 0x7FFFFFFF;
if (rectmask) *rma= 0x7FFFFFFF;
if (*rd) {
@@ -2691,7 +2691,7 @@ static void copyto_abufz(RenderPart *pa, int *arectz, int *rectmask, int sample)
}
}
}
-
+
rza++;
rma++;
rd++;
@@ -2726,16 +2726,16 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
zspan= &zspans[zsample];
zbuf_alloc_span(zspan, pa->rectx, pa->recty, re->clipcrop);
-
+
/* needed for transform from hoco to zbuffer co */
zspan->zmulx= ((float)winx)/2.0f;
zspan->zmuly= ((float)winy)/2.0f;
-
+
/* the buffers */
zspan->arectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "Arectz");
zspan->apixbuf= APixbuf;
zspan->apsmbase= apsmbase;
-
+
if (negzmask)
zspan->rectmask= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "Arectmask");
@@ -2759,10 +2759,10 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
zspan->zofsx -= 0.5f;
zspan->zofsy -= 0.5f;
}
-
+
/* we use this to test if nothing was filled in */
zvlnr= 0;
-
+
for (i=0, obi=re->instancetable.first; obi; i++, obi=obi->next) {
obr= obi->obr;
@@ -2783,7 +2783,7 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
if ((v & 255)==0)
vlr= obr->vlaknodes[v>>8].vlak;
else vlr++;
-
+
if (vlr->mat!=ma) {
ma= vlr->mat;
if (shadow)
@@ -2791,11 +2791,11 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
else
dofill= (((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP)) && !(ma->mode & MA_ONLYCAST));
}
-
+
if (dofill) {
if (!(vlr->flag & R_HIDDEN) && (obi->lay & lay)) {
unsigned short partclip;
-
+
v1= vlr->v1;
v2= vlr->v2;
v3= vlr->v3;
@@ -2819,7 +2819,7 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
zval= mul*(1.0f+ho1[2]/ho1[3]);
copy_v3_v3(vec, v1->co);
- /* z is negative, otherwise its being clipped */
+ /* z is negative, otherwise its being clipped */
vec[2]-= ma->zoffs;
projectverto(vec, obwinmat, hoco);
fval= mul*(1.0f+hoco[2]/hoco[3]);
@@ -2827,7 +2827,7 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
polygon_offset= (int)fabsf(zval - fval);
}
else polygon_offset= 0;
-
+
zvlnr= v+1;
c1= testclip(ho1);
@@ -2839,7 +2839,7 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
for (zsample=0; zsample<samples; zsample++) {
zspan= &zspans[zsample];
zspan->polygon_offset= polygon_offset;
-
+
if (ma->material_type == MA_TYPE_WIRE) {
if (v4)
zbufclipwire(zspan, i, zvlnr, vlr->ec, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
@@ -2858,16 +2858,16 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
}
}
}
- if ((v & 255)==255)
- if (re->test_break(re->tbh))
- break;
+ if ((v & 255)==255)
+ if (re->test_break(re->tbh))
+ break;
}
}
}
if (re->test_break(re->tbh)) break;
}
-
+
for (zsample=0; zsample<samples; zsample++) {
zspan= &zspans[zsample];
MEM_freeN(zspan->arectz);
@@ -2875,7 +2875,7 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
MEM_freeN(zspan->rectmask);
zbuf_free_span(zspan);
}
-
+
return zvlnr;
}
@@ -2893,7 +2893,7 @@ static int zbuffer_abuf_render(RenderPart *pa, APixstr *APixbuf, APixstrand *APi
jit= &R.mblur_jit[R.i.curblur-1];
else
jit= NULL;
-
+
zbuf_make_winmat(&R, winmat);
if (rl->layflag & SCE_LAY_ZTRA)
@@ -2931,11 +2931,11 @@ void zbuffer_abuf_shadow(Render *re, LampRen *lar, float winmat[4][4], APixstr *
static void add_transp_speed(RenderLayer *rl, int offset, float speed[4], float alpha, intptr_t *rdrect)
{
RenderPass *rpass;
-
+
for (rpass= rl->passes.first; rpass; rpass= rpass->next) {
if (STREQ(rpass->name, RE_PASSNAME_VECTOR)) {
float *fp= rpass->rect + 4*offset;
-
+
if (speed==NULL) {
/* clear */
if (fp[0]==PASS_VECTOR_MAX) fp[0]= 0.0f;
@@ -2965,7 +2965,7 @@ static void add_transp_speed(RenderLayer *rl, int offset, float speed[4], float
static void add_transp_obindex(RenderLayer *rl, int offset, Object *ob)
{
RenderPass *rpass;
-
+
for (rpass= rl->passes.first; rpass; rpass= rpass->next) {
if (STREQ(rpass->name, RE_PASSNAME_INDEXOB)) {
float *fp= rpass->rect + offset;
@@ -2978,7 +2978,7 @@ static void add_transp_obindex(RenderLayer *rl, int offset, Object *ob)
static void add_transp_material_index(RenderLayer *rl, int offset, Material *mat)
{
RenderPass *rpass;
-
+
for (rpass= rl->passes.first; rpass; rpass= rpass->next) {
if (STREQ(rpass->name, RE_PASSNAME_INDEXMA)) {
float *fp= rpass->rect + offset;
@@ -2995,11 +2995,11 @@ static void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
RenderPass *rpass;
float weight= 1.0f/((float)R.osa);
int delta= sizeof(ShadeResult)/4;
-
+
for (rpass= rl->passes.first; rpass; rpass= rpass->next) {
float *col = NULL;
int pixsize = 3;
-
+
if (STREQ(rpass->name, RE_PASSNAME_RGBA)) {
col = shr->col;
pixsize = 4;
@@ -3049,10 +3049,10 @@ static void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
/* add minimum speed in pixel */
for (samp = 1; samp<R.osa; samp++, shr_t++) {
-
+
if (shr_t->combined[3] > 0.0f) {
const float *speed = shr_t->winspeed;
-
+
if ( (ABS(speed[0]) + ABS(speed[1]))< (ABS(fp[0]) + ABS(fp[1])) ) {
fp[0] = speed[0];
fp[1] = speed[1];
@@ -3068,7 +3068,7 @@ static void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
if (col) {
const float *fp= col+delta;
int samp;
-
+
for (samp= 1; samp<R.osa; samp++, fp+=delta) {
col[0]+= fp[0];
if (pixsize>1) {
@@ -3085,17 +3085,17 @@ static void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
}
}
}
-
+
}
static void add_transp_passes(RenderLayer *rl, int offset, ShadeResult *shr, float alpha)
{
RenderPass *rpass;
-
+
for (rpass= rl->passes.first; rpass; rpass= rpass->next) {
float *fp, *col= NULL;
int pixsize= 3;
-
+
if (STREQ(rpass->name, RE_PASSNAME_Z)) {
fp = rpass->rect + offset;
if (shr->z < *fp)
@@ -3223,23 +3223,23 @@ static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int
{
ShadeInput *shi= ssamp->shi;
float xs, ys;
-
+
ssamp->tot= 0;
shade_input_set_triangle(shi, obi, facenr, 1);
-
+
/* officially should always be true... we have no sky info */
if (shi->vlr) {
-
+
/* full osa is only set for OSA renders */
if (shi->vlr->flag & R_FULL_OSA) {
short shi_inc= 0, samp;
-
+
for (samp=0; samp<R.osa; samp++) {
if (curmask & (1<<samp)) {
xs= (float)x + R.jit[samp][0] + 0.5f; /* zbuffer has this inverse corrected, ensures (xs, ys) are inside pixel */
ys= (float)y + R.jit[samp][1] + 0.5f;
-
+
if (shi_inc) {
shade_input_copy_triangle(shi+1, shi);
shi++;
@@ -3252,7 +3252,7 @@ static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int
shade_input_set_normals(shi);
else /* XXX shi->flippednor messes up otherwise */
shade_input_set_vertex_normals(shi);
-
+
shi_inc= 1;
}
}
@@ -3277,7 +3277,7 @@ static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int
shade_input_set_uv(shi);
shade_input_set_normals(shi);
}
-
+
/* total sample amount, shi->sample is static set in initialize */
ssamp->tot= shi->sample+1;
}
@@ -3291,21 +3291,21 @@ static int shade_tra_samples(ShadeSample *ssamp, StrandShadeCache *cache, int x,
}
shade_tra_samples_fill(ssamp, x, y, row->z, row->obi, row->p, row->mask);
-
+
if (ssamp->tot) {
ShadeInput *shi= ssamp->shi;
ShadeResult *shr= ssamp->shr;
int samp;
-
+
/* if AO? */
shade_samples_do_AO(ssamp);
-
+
/* if shade (all shadepinputs have same passflag) */
if (shi->passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) {
for (samp=0; samp<ssamp->tot; samp++, shi++, shr++) {
shade_input_set_shade_texco(shi);
shade_input_do_shade(shi, shr);
-
+
/* include lamphalos for ztra, since halo layer was added already */
if (R.flag & R_LAMPHALO)
if (shi->layflag & SCE_LAY_HALO)
@@ -3325,18 +3325,18 @@ static int shade_tra_samples(ShadeSample *ssamp, StrandShadeCache *cache, int x,
static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassflag)
{
int a, sample, osa = (R.osa? R.osa: 1), retval = osa;
-
+
for (a=0; a < osa; a++, samp_shr++) {
ShadeInput *shi= ssamp->shi;
ShadeResult *shr= ssamp->shr;
-
+
for (sample=0; sample<ssamp->tot; sample++, shi++, shr++) {
-
+
if (shi->mask & (1<<a)) {
float fac= (1.0f - samp_shr->combined[3])*shr->combined[3];
-
+
addAlphaUnderFloat(samp_shr->combined, shr->combined);
-
+
samp_shr->z = min_ff(samp_shr->z, shr->z);
if (addpassflag & SCE_PASS_VECTOR) {
@@ -3344,10 +3344,10 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf
}
/* optim... */
if (addpassflag & ~(SCE_PASS_VECTOR)) {
-
+
if (addpassflag & SCE_PASS_RGBA)
addAlphaUnderFloat(samp_shr->col, shr->col);
-
+
if (addpassflag & SCE_PASS_NORMAL)
madd_v3_v3fl(samp_shr->nor, shr->nor, fac);
@@ -3356,7 +3356,7 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf
if (addpassflag & SCE_PASS_DIFFUSE)
madd_v3_v3fl(samp_shr->diff, shr->diff, fac);
-
+
if (addpassflag & SCE_PASS_SPEC)
madd_v3_v3fl(samp_shr->spec, shr->spec, fac);
@@ -3374,17 +3374,17 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf
if (addpassflag & SCE_PASS_REFLECT)
madd_v3_v3fl(samp_shr->refl, shr->refl, fac);
-
+
if (addpassflag & SCE_PASS_REFRACT)
madd_v3_v3fl(samp_shr->refr, shr->refr, fac);
-
+
if (addpassflag & SCE_PASS_MIST)
samp_shr->mist= samp_shr->mist+fac*shr->mist;
}
}
}
-
+
if (samp_shr->combined[3]>0.999f) retval--;
}
return retval;
@@ -3396,11 +3396,11 @@ static void reset_sky_speedvectors(RenderPart *pa, RenderLayer *rl, float *rectf
/* for all pixels with alpha zero, we re-initialize speed again then */
float *fp, *col;
int a;
-
+
fp = RE_RenderLayerGetPass(rl, RE_PASSNAME_VECTOR, R.viewname);
if (fp==NULL) return;
col= rectf+3;
-
+
for (a= 4*pa->rectx*pa->recty -4; a>=0; a-=4) {
if (col[a]==0.0f) {
fp[a]= PASS_VECTOR_MAX;
@@ -3437,13 +3437,13 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
/* looks nicer for calling code */
if (R.test_break(R.tbh))
return NULL;
-
+
if (R.osa > 16) { /* MAX_OSA */
printf("zbuffer_transp_shade: osa too large\n");
G.is_break = true;
return NULL;
}
-
+
APixbuf= MEM_callocN(pa->rectx*pa->recty*sizeof(APixstr), "APixbuf");
if (R.totstrand && (rl->layflag & SCE_LAY_STRAND)) {
APixbufstrand= MEM_callocN(pa->rectx*pa->recty*sizeof(APixstrand), "APixbufstrand");
@@ -3453,12 +3453,12 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
/* general shader info, passes */
shade_sample_initialize(&ssamp, pa, rl);
addpassflag= rl->passflag & ~(SCE_PASS_COMBINED);
-
+
if (R.osa)
sampalpha= 1.0f/(float)R.osa;
else
sampalpha= 1.0f;
-
+
/* fill the Apixbuf */
doztra= zbuffer_abuf_render(pa, APixbuf, APixbufstrand, &apsmbase, rl, sscache);
@@ -3479,7 +3479,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
/* needed for correct zbuf/index pass */
totfullsample= get_sample_layers(pa, rl, rlpp);
-
+
/* irregular shadowb buffer creation */
if (R.r.mode & R_SHADOW)
ISB_create(pa, APixbuf);
@@ -3502,26 +3502,26 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
aprect+= offs;
aprectstrand+= offs;
}
-
+
/* init scanline updates */
rr->renrect.ymin = 0;
rr->renrect.ymax = -pa->crop;
rr->renlay= rl;
-
+
/* render the tile */
for (y=pa->disprect.ymin+crop; y<pa->disprect.ymax-crop; y++, rr->renrect.ymax++) {
pass= passrect;
ap= aprect;
apstrand= aprectstrand;
od= offs;
-
+
if (R.test_break(R.tbh))
break;
-
+
for (x=pa->disprect.xmin+crop; x<pa->disprect.xmax-crop; x++, ap++, apstrand++, pass+=4, od++) {
-
+
if (ap->p[0]==0 && (!APixbufstrand || apstrand->p[0]==0)) {
- if (addpassflag & SCE_PASS_VECTOR)
+ if (addpassflag & SCE_PASS_VECTOR)
add_transp_speed(rl, od, NULL, 0.0f, rdrect);
}
else {
@@ -3576,12 +3576,12 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
if (zrow[0].z < zrow[1].z) {
SWAP(ZTranspRow, zrow[0], zrow[1]);
}
-
+
}
else if (totface>2) {
qsort(zrow, totface, sizeof(ZTranspRow), vergzvlak);
}
-
+
/* front face does index pass for transparent, no AA or filters, but yes FSA */
if (addpassflag & SCE_PASS_INDEXOB) {
ObjectRen *obr= R.objectinstance[zrow[totface-1].obi].obr;
@@ -3633,11 +3633,11 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
if (R.osa==0) {
while (totface>0) {
totface--;
-
+
if (shade_tra_samples(&ssamp, sscache, x, y, &zrow[totface], addpassflag)) {
filled= addtosamp_shr(samp_shr, &ssamp, addpassflag);
addAlphaUnderFloat(pass, ssamp.shr[0].combined);
-
+
if (filled == 0) {
if (sscache)
unref_strand_samples(sscache, zrow, totface);
@@ -3655,13 +3655,13 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
}
else {
short *sp= (short *)(ztramask+od);
-
+
while (totface>0) {
totface--;
-
+
if (shade_tra_samples(&ssamp, sscache, x, y, &zrow[totface], addpassflag)) {
filled= addtosamp_shr(samp_shr, &ssamp, addpassflag);
-
+
if (ztramask)
*sp |= zrow[totface].mask;
if (filled==0) {
@@ -3671,7 +3671,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
}
}
}
-
+
/* multisample buffers or filtered mask filling? */
if (pa->fullresult.first) {
for (a=0; a<R.osa; a++) {
@@ -3681,7 +3681,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
float *rect = RE_RenderLayerGetPass(rl_other , RE_PASSNAME_COMBINED, R.viewname);
addAlphaOverFloat(rect + 4 * od, samp_shr[a].combined);
-
+
add_transp_passes(rl_other , od, &samp_shr[a], alpha);
if (addpassflag & SCE_PASS_VECTOR)
add_transp_speed(rl_other , od, samp_shr[a].winspeed, alpha, rdrect);
@@ -3696,10 +3696,10 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
add_filt_fmask(1<<a, samp_shr[a].combined, pass, rr->rectx);
alpha+= samp_shr[a].combined[3];
}
-
+
if (addpassflag) {
alpha*= sampalpha;
-
+
/* merge all in one, and then add */
merge_transp_passes(rl, samp_shr);
add_transp_passes(rl, od, samp_shr, alpha);
@@ -3711,7 +3711,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
}
}
}
-
+
aprect+= pa->rectx;
aprectstrand+= pa->rectx;
passrect+= 4*pa->rectx;