From a25c11fd8d602236f36c34c342453149bdc1d909 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 8 Jun 2018 08:07:48 +0200 Subject: Cleanup: trailing space Remove from blender/nodes, collada, blenfont & render. --- source/blender/render/CMakeLists.txt | 2 +- source/blender/render/extern/include/RE_pipeline.h | 22 +- .../blender/render/extern/include/RE_shader_ext.h | 28 +- source/blender/render/intern/include/envmap.h | 2 +- source/blender/render/intern/include/initrender.h | 2 +- .../blender/render/intern/include/pixelblending.h | 2 +- .../blender/render/intern/include/pixelshading.h | 2 +- .../blender/render/intern/include/pointdensity.h | 2 +- source/blender/render/intern/include/raycounter.h | 2 +- .../render/intern/include/rayintersection.h | 8 +- .../blender/render/intern/include/render_types.h | 94 +-- source/blender/render/intern/include/rendercore.h | 2 +- source/blender/render/intern/include/shading.h | 4 +- source/blender/render/intern/include/strand.h | 2 +- source/blender/render/intern/include/sunsky.h | 2 +- .../blender/render/intern/include/texture_ocean.h | 2 +- source/blender/render/intern/include/voxeldata.h | 2 +- source/blender/render/intern/include/zbuf.h | 12 +- source/blender/render/intern/raytrace/bvh.h | 26 +- .../blender/render/intern/raytrace/rayobject.cpp | 16 +- .../render/intern/raytrace/rayobject_hint.h | 2 +- .../render/intern/raytrace/rayobject_instance.cpp | 4 +- .../render/intern/raytrace/rayobject_octree.cpp | 136 ++--- .../render/intern/raytrace/rayobject_qbvh.cpp | 14 +- .../intern/raytrace/rayobject_raycounter.cpp | 2 +- .../render/intern/raytrace/rayobject_rtbuild.cpp | 66 +-- .../render/intern/raytrace/rayobject_rtbuild.h | 10 +- .../render/intern/raytrace/rayobject_svbvh.cpp | 14 +- .../render/intern/raytrace/rayobject_vbvh.cpp | 16 +- source/blender/render/intern/raytrace/reorganize.h | 68 +-- source/blender/render/intern/raytrace/svbvh.h | 26 +- source/blender/render/intern/raytrace/vbvh.h | 26 +- source/blender/render/intern/source/bake.c | 50 +- .../blender/render/intern/source/convertblender.c | 612 ++++++++++---------- source/blender/render/intern/source/envmap.c | 166 +++--- .../blender/render/intern/source/external_engine.c | 8 +- source/blender/render/intern/source/imagetexture.c | 134 ++--- source/blender/render/intern/source/initrender.c | 94 +-- .../blender/render/intern/source/multires_bake.c | 2 +- source/blender/render/intern/source/occlusion.c | 38 +- source/blender/render/intern/source/pipeline.c | 404 ++++++------- .../blender/render/intern/source/pixelblending.c | 68 +-- source/blender/render/intern/source/pixelshading.c | 156 ++--- source/blender/render/intern/source/pointdensity.c | 48 +- source/blender/render/intern/source/rayshade.c | 508 ++++++++--------- .../blender/render/intern/source/render_result.c | 84 +-- .../blender/render/intern/source/render_texture.c | 480 ++++++++-------- source/blender/render/intern/source/rendercore.c | 426 +++++++------- .../blender/render/intern/source/renderdatabase.c | 160 +++--- source/blender/render/intern/source/shadbuf.c | 500 ++++++++-------- source/blender/render/intern/source/shadeinput.c | 206 +++---- source/blender/render/intern/source/shadeoutput.c | 410 +++++++------- source/blender/render/intern/source/sss.c | 30 +- source/blender/render/intern/source/strand.c | 32 +- source/blender/render/intern/source/sunsky.c | 54 +- .../blender/render/intern/source/volume_precache.c | 172 +++--- source/blender/render/intern/source/volumetric.c | 208 +++---- source/blender/render/intern/source/voxeldata.c | 70 +-- source/blender/render/intern/source/zbuf.c | 630 ++++++++++----------- 59 files changed, 3184 insertions(+), 3184 deletions(-) (limited to 'source/blender/render') 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 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(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 *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 *obj) BLI_memarena_free(arena2); return; } - + if (root) { pushup_simd(root); obj->root = Reorganize_SVBVH(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 static RayObjectAPI make_api() { - static RayObjectAPI api = + static RayObjectAPI api = { (RE_rayobject_raycast_callback) ((int (*)(Tree *, Isect *)) & intersect), (RE_rayobject_add_callback) ((void (*)(Tree *, RayObject *)) & bvh_add), @@ -130,7 +130,7 @@ static RayObjectAPI make_api() (RE_rayobject_cost_callback) ((float (*)(Tree *)) & bvh_cost), (RE_rayobject_hint_bb_callback) ((void (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb) }; - + return api; } @@ -138,7 +138,7 @@ template RayObjectAPI *bvh_get_api(int maxstacksize) { static RayObjectAPI bvh_api256 = make_api(); - + 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 *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 *obj) BLI_memarena_free(arena2); return; } - + reorganize(root); remove_useless(root, &root); bvh_refit(root); @@ -114,10 +114,10 @@ void bvh_done(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 static RayObjectAPI make_api() { - static RayObjectAPI api = + static RayObjectAPI api = { (RE_rayobject_raycast_callback) ((int (*)(Tree *, Isect *)) & intersect), (RE_rayobject_add_callback) ((void (*)(Tree *, RayObject *)) & bvh_add), @@ -162,7 +162,7 @@ static RayObjectAPI make_api() (RE_rayobject_cost_callback) ((float (*)(Tree *)) & bvh_cost), (RE_rayobject_hint_bb_callback) ((void (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb) }; - + return api; } @@ -170,7 +170,7 @@ template static RayObjectAPI *bvh_get_api(int maxstacksize) { static RayObjectAPI bvh_api256 = make_api(); - + 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 *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(arena1, &obj->rayobj.control).transform(obj->builder); @@ -96,7 +96,7 @@ void bvh_done(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 *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(arena2).transform(obj->builder); VBVH_optimalPackSIMD(PackCost()).transform(root); obj->root = Reorganize_VBVH(arena1).transform(root); - + BLI_memarena_free(arena2); #endif } @@ -176,7 +176,7 @@ static void bfree(VBVHTree *tree) template static RayObjectAPI make_api() { - static RayObjectAPI api = + static RayObjectAPI api = { (RE_rayobject_raycast_callback) ((int (*)(Tree *, Isect *)) & intersect), (RE_rayobject_add_callback) ((void (*)(Tree *, RayObject *)) & bvh_add), @@ -186,7 +186,7 @@ static RayObjectAPI make_api() (RE_rayobject_cost_callback) ((float (*)(Tree *)) & bvh_cost), (RE_rayobject_hint_bb_callback) ((void (*)(Tree *, LCTSHint *, float *, float *)) & bvh_hint_bb) }; - + return api; } @@ -194,7 +194,7 @@ template RayObjectAPI *bvh_get_api(int maxstacksize) { static RayObjectAPI bvh_api256 = make_api(); - + 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 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 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 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(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 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 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; atotvert; 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; atotvlak; a++) { @@ -225,7 +225,7 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me) } } } - + for (a=0; atotvert; 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; atotvert; 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; amtex[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; itotvert; 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; amat_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; indexfaceData.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; a1flag&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; cmtex[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; awrld.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; itotvlak; 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; bstrandbuf->totbound; b++, sbound++) { - + INIT_MINMAX(smin, smax); for (a=sbound->start; aend; 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; atotvert; 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; atotvert; 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; atotvert; 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 #include #include -#ifndef WIN32 +#ifndef WIN32 #include #else #include @@ -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(¶ms, re->winx, re->winy, 1.0f, 1.0f); BKE_camera_params_compute_matrix(¶ms); @@ -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 (inprmode & 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;vtotvlak;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;vtotvlak;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;vtotvlak;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; aaosamp*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; aaosphere; aaosphere, 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; aobi; 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) || (wfturbul*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) || (wfturbul * 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 (maxyrepeat) 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_nrmat->septex & (1<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_nrmat->septex & (1<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_nrtex; 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_nrmtex[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_nrmtex[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<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; sampleadd); @@ -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; axs-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; yrectx + (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; xxs; 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; ydisprect.ymax; y++) { for (x=pa->disprect.xmin; xdisprect.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; samplefullresult, 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; ydisprect.ymax; y++) { for (x=pa->disprect.xmin; xdisprect.xmax; x++, od+=4) { float col[4]; int sample; bool done = false; - + for (sample= 0; samplethread); 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; ydisprect.ymax; y++) { for (x=pa->disprect.xmin; xdisprect.xmax; x++, od++) { int sample; - + for (sample=0; samplenext) { - - + + 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; ydisprect.ymax-crop; y++, rr->renrect.ymax++) { rd= rectdaps; od= offs; - + for (x=pa->disprect.xmin+crop; xdisprect.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; samplerecty; y++) for (x=0; xrectx; x++, rz++) (*rz)>>= 4; - + rz1= rectz; rz2= rz1+pa->rectx; rz3= rz2+pa->rectx; - + rf= rectf+pa->rectx+1; - + for (y=0; yrecty-2; y++) { for (x=0; xrectx-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; yrecty; y++) for (x=0; xrectx; 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; samplerectdaps; 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->samplesample+=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; ydisprect.ymax; y++, rr->renrect.ymax++) { for (x=pa->disprect.xmin; xdisprect.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 (ycrop || 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; xdisprect.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; yradsq) { - + 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; bflarec; 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; aflarec && (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; imtex[i] && (ma->septex & (1<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; aweight[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; aweight[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(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; atotvlak; 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; samplestotbuf; 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; ashb; 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; bdeepbuf[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; bzbuf); 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; atotvlak; 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; yirecty; yi++) { int y= ycos[yi]; for (xi=0; xirectx; 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; yrecty; y++) { for (x=0; xrectx; 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; samplemask & 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; yirecty; yi++) { int y= ycos[yi]; for (xi=0; xirectx; 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; yrecty; y++) { for (x=0; xrectx; 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; samplemask[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 && t0shb && 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; atotvert; 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; atotvert; 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; mdata_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]= 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 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 (my2rectx; 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 && yrecty) { 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]=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 && xrectx) { 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 && yrecty) { 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 && xrectx) { 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]=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 && yrecty) { 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 && xrectx) { 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 (my2rectx; 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 (my2span1[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 (my2span1+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; vclipcrop); 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; xlayflag & 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; zsamplemode & 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; zsampletest_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 (my2span1[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; vtotvlak; 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<recty; y++) { for (x=0; xrectx; 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; zsamplepolygon_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; zsamplearectz); @@ -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; sampcombined[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; samp1) { @@ -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; sampflippednor 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; samptot; 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; sampletot; sample++, shi++, shr++) { - + if (shi->mask & (1<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; ydisprect.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; xdisprect.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; arectx); 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; -- cgit v1.2.3