diff options
Diffstat (limited to 'source/blender/render')
29 files changed, 243 insertions, 257 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 42c91b7315b..caa0e0a9a41 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -38,9 +38,9 @@ IF(WIN32) SET(INC ${INC} ${PTHREADS_INC}) ENDIF(WIN32) -IF(WITH_OPENEXR) +IF(WITH_IMAGE_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) -ENDIF(WITH_OPENEXR) +ENDIF(WITH_IMAGE_OPENEXR) IF(WITH_QUICKTIME) SET(INC ${INC} ../quicktime ${QUICKTIME_INC}) @@ -54,9 +54,4 @@ IF(APPLE) ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64") ENDIF(APPLE) -#TODO -#if env['OURPLATFORM']=='linux2': -# cflags='-pthread' - BLENDERLIB_NOLIST(blender_render "${SRC}" "${INC}") -#env.BlenderLib ( libname = 'blender_render', sources = sources, includes = Split(incs), defines=defs, libtype='core', priority=45, compileflags=cflags ) diff --git a/source/blender/render/Makefile b/source/blender/render/Makefile index 11ddbad0b94..7be54ac359f 100644 --- a/source/blender/render/Makefile +++ b/source/blender/render/Makefile @@ -15,7 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. # All rights reserved. diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript index def2a8e777a..479c9d1ad40 100644 --- a/source/blender/render/SConscript +++ b/source/blender/render/SConscript @@ -8,36 +8,37 @@ incs = 'intern/include #/intern/guardedalloc ../blenlib ../makesdna ../makesrna' incs += ' extern/include ../blenkernel ../radiosity/extern/include ../imbuf' incs += ' ../include ../blenloader ../../../intern/smoke/extern ../bmesh' -cflags = env['CCFLAGS'] -cxxflags = env['CXXFLAGS'] +cflags_raytrace = env['CCFLAGS'] +cxxflags_raytrace = env['CXXFLAGS'] defs = [] +defs_raytrace = [] if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'): if env['WITH_BF_RAYOPTIMIZATION']: - cflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] - cxxflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cxxflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] if env['OURPLATFORM'] == 'win32-mingw': if env['WITH_BF_RAYOPTIMIZATION']: - cflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] - cxxflags = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cxxflags_raytrace = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] if env['OURPLATFORM'] == 'darwin': if env['MACOSX_ARCHITECTURE'] in ('i386', 'x86_64') and env['WITH_BF_RAYOPTIMIZATION']: - cflags = env['CFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] - cxxflags = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cflags_raytrace = env['CFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cxxflags_raytrace = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] if env['OURPLATFORM'] == 'linux2': if env['WITH_BF_RAYOPTIMIZATION']: - cflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] - cxxflags = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cxxflags_raytrace = env['CXXFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] incs += ' ../../../extern/binreloc/include' if env['OURPLATFORM'] == 'linuxcross': if env['WITH_BF_RAYOPTIMIZATION']: - cflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] - cxxflags = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] + cxxflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] if env['WITH_BF_QUICKTIME']: defs.append('WITH_QUICKTIME') @@ -53,10 +54,12 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): # HACK: To fix problem with error 'MMX instruction set not enabled' from mmintrin.h # if env['OURPLATFORM'] == 'linuxcross': - defs.append('__MMX__') + defs.append('__SSE__') + defs_raytrace.append('__MMX__') if env['WITH_BF_RAYOPTIMIZATION']: defs.append('__SSE__') + defs_raytrace.append('__SSE__') -env.BlenderLib ( libname = 'bf_render', sources = sources, includes = Split(incs), defines=defs, libtype='core', priority=145, compileflags=cflags ) -env.BlenderLib ( libname = 'bf_render_raytrace', sources = raysources, includes = Split(incs), defines=defs, libtype='core', priority=145, compileflags=cflags, cxx_compileflags=cxxflags ) +env.BlenderLib ( libname = 'bf_render', sources = sources, includes = Split(incs), defines=defs, libtype='core', priority=145 ) +env.BlenderLib ( libname = 'bf_render_raytrace', sources = raysources, includes = Split(incs), defines=defs_raytrace, libtype='core', priority=145, compileflags=cflags_raytrace, cxx_compileflags=cxxflags_raytrace ) diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 802703d476c..b12e45ecd9c 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -37,14 +37,15 @@ struct bNodeTree; struct Image; +struct Main; struct NodeBlurData; struct Object; -struct ReportList; struct RenderData; struct RenderEngine; struct RenderEngineType; struct RenderResult; struct ReportList; +struct ReportList; struct Scene; struct SceneRenderLayer; @@ -192,7 +193,7 @@ void RE_SetPixelSize(struct Render *re, float pixsize); void RE_SetView (struct Render *re, float mat[][4]); /* make or free the dbase */ -void RE_Database_FromScene(struct Render *re, struct Scene *scene, unsigned int lay, int use_camera_view); +void RE_Database_FromScene(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view); void RE_Database_Free (struct Render *re); /* project dbase again, when viewplane/perspective changed */ @@ -208,11 +209,11 @@ void RE_init_threadcount(Render *re); void RE_TileProcessor(struct Render *re); /* only RE_NewRender() needed, main Blender render calls */ -void RE_BlenderFrame(struct Render *re, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame); -void RE_BlenderAnim(struct Render *re, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports); +void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame); +void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports); /* main preview render call */ -void RE_PreviewRender(struct Render *re, struct Scene *scene); +void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene); void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode); void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress); @@ -248,7 +249,7 @@ void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, #define RE_BAKE_DISPLACEMENT 5 #define RE_BAKE_SHADOW 6 -void RE_Database_Baking(struct Render *re, struct Scene *scene, unsigned int lay, int type, struct Object *actob); +void RE_Database_Baking(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int type, struct Object *actob); void RE_DataBase_GetView(struct Render *re, float mat[][4]); void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]); diff --git a/source/blender/render/intern/Makefile b/source/blender/render/intern/Makefile index 4fce37df175..4043902a40f 100644 --- a/source/blender/render/intern/Makefile +++ b/source/blender/render/intern/Makefile @@ -15,7 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. # All rights reserved. diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index 331474a85e3..b124102f50b 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -55,6 +55,7 @@ struct RenderBuckets; struct ObjectInstanceRen; struct RayObject; struct RayFace; +struct Main; #define TABLEINITSIZE 1024 #define LAMPINITSIZE 256 @@ -170,7 +171,8 @@ struct Render /* shadow counter, detect shadow-reuse for shaders */ int shadowsamplenr[BLENDER_MAX_THREADS]; - /* scene, and its full copy of renderdata and world */ + /* main, scene, and its full copy of renderdata and world */ + struct Main *main; Scene *scene; RenderData r; World wrld; @@ -464,6 +466,7 @@ typedef struct VolPrecachePart struct RayObject *tree; struct ShadeInput *shi; struct ObjectInstanceRen *obi; + float viewmat[4][4]; int num; int minx, maxx; int miny, maxy; @@ -477,6 +480,7 @@ typedef struct VolPrecachePart typedef struct VolumePrecache { int res[3]; + float *bbmin, *bbmax; float *data_r; float *data_g; float *data_b; @@ -585,23 +589,21 @@ typedef struct LampRen { #define R_HALO 2 #define R_SEC_FIELD 4 #define R_LAMPHALO 8 -#define R_GLOB_NOPUNOFLIP 16 -#define R_NEED_TANGENT 32 -#define R_BAKE_TRACE 128 -#define R_BAKING 256 +#define R_NEED_TANGENT 16 +#define R_BAKE_TRACE 32 +#define R_BAKING 64 /* vlakren->flag (vlak = face in dutch) char!!! */ #define R_SMOOTH 1 #define R_HIDDEN 2 /* strand flag, means special handling */ #define R_STRAND 4 -#define R_NOPUNOFLIP 8 -#define R_FULL_OSA 16 -#define R_FACE_SPLIT 32 +#define R_FULL_OSA 8 +#define R_FACE_SPLIT 16 /* Tells render to divide face other way. */ -#define R_DIVIDE_24 64 +#define R_DIVIDE_24 32 /* vertex normals are tangent or view-corrected vector, for hair strands */ -#define R_TANGENT 128 +#define R_TANGENT 64 /* strandbuffer->flag */ #define R_STRAND_BSPLINE 1 diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h index 2a0086b436c..4c80616665d 100644 --- a/source/blender/render/intern/include/renderdatabase.h +++ b/source/blender/render/intern/include/renderdatabase.h @@ -34,6 +34,7 @@ struct Object; struct VlakRen; struct VertRen; struct HaloRen; +struct Main; struct Material; struct Render; struct MCol; @@ -115,7 +116,7 @@ struct MCol *RE_vlakren_get_mcol(struct ObjectRen *obr, VlakRen *ren, int n, cha float *RE_vlakren_get_surfnor(struct ObjectRen *obr, VlakRen *ren, int verify); float *RE_vlakren_get_nmap_tangent(struct ObjectRen *obr, VlakRen *ren, int verify); RadFace **RE_vlakren_get_radface(struct ObjectRen *obr, VlakRen *ren, int verify); -int RE_vlakren_get_normal(struct Render *re, struct ObjectInstanceRen *obi, struct VlakRen *vlr, float *nor); +void RE_vlakren_get_normal(struct Render *re, struct ObjectInstanceRen *obi, struct VlakRen *vlr, float *nor); float *RE_strandren_get_surfnor(struct ObjectRen *obr, struct StrandRen *strand, int verify); float *RE_strandren_get_uv(struct ObjectRen *obr, struct StrandRen *strand, int n, char **name, int verify); @@ -137,7 +138,7 @@ void RE_set_customdata_names(struct ObjectRen *obr, struct CustomData *data); /* convertblender.c */ void init_render_world(Render *re); -void RE_Database_FromScene_Vectors(Render *re, struct Scene *sce, unsigned int lay); +void RE_Database_FromScene_Vectors(Render *re, struct Main *bmain, struct Scene *sce, unsigned int lay); #endif /* RENDERDATABASE_H */ diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h index 436b365b352..fb941d1b7f3 100644 --- a/source/blender/render/intern/include/texture.h +++ b/source/blender/render/intern/include/texture.h @@ -65,7 +65,7 @@ void do_lamp_tex(LampRen *la, float *lavec, struct ShadeInput *shi, float *colf, void do_volume_tex(struct ShadeInput *shi, float *xyz, int mapto_flag, float *col, float *val); void init_render_textures(Render *re); -void end_render_textures(void); +void end_render_textures(Render *re); void render_realtime_texture(struct ShadeInput *shi, struct Image *ima); diff --git a/source/blender/render/intern/include/volume_precache.h b/source/blender/render/intern/include/volume_precache.h index 73e0a3e0415..3ddf8380241 100644 --- a/source/blender/render/intern/include/volume_precache.h +++ b/source/blender/render/intern/include/volume_precache.h @@ -25,9 +25,11 @@ * * ***** END GPL LICENSE BLOCK ***** */ - + +void global_bounds_obi(Render *re, ObjectInstanceRen *obi, float *bbmin, float *bbmax); +int point_inside_volume_objectinstance(Render *re, ObjectInstanceRen *obi, float *co); + void volume_precache(Render *re); void free_volume_precache(Render *re); -int point_inside_volume_objectinstance(Render *re, ObjectInstanceRen *obi, float *co); #define VOL_MS_TIMESTEP 0.1f diff --git a/source/blender/render/intern/raytrace/Makefile b/source/blender/render/intern/raytrace/Makefile index c136f945ca5..2da8038c610 100644 --- a/source/blender/render/intern/raytrace/Makefile +++ b/source/blender/render/intern/raytrace/Makefile @@ -63,3 +63,7 @@ endif ifeq ($(WITH_OPENEXR),true) CPPFLAGS += -DWITH_OPENEXR endif + +ifeq ($(WITH_BF_RAYOPTIMIZATION), true) + CPPFLAGS += -D__SSE__ +endif diff --git a/source/blender/render/intern/raytrace/bvh.h b/source/blender/render/intern/raytrace/bvh.h index e3efb90ec04..133a3d4a005 100644 --- a/source/blender/render/intern/raytrace/bvh.h +++ b/source/blender/render/intern/raytrace/bvh.h @@ -28,7 +28,6 @@ */ #include "rayobject.h" #include "raycounter.h" -#include "MEM_guardedalloc.h" #include "rayobject_rtbuild.h" #include "rayobject_hint.h" diff --git a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp index afffdd44f1f..c510af540db 100644 --- a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp +++ b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp @@ -26,6 +26,7 @@ * * ***** END GPL LICENSE BLOCK ***** */ +#include "MEM_guardedalloc.h" #include "vbvh.h" #include "svbvh.h" #include "reorganize.h" diff --git a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp index 389512ce469..647c5771e4f 100644 --- a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp +++ b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp @@ -26,6 +26,8 @@ * * ***** END GPL LICENSE BLOCK ***** */ +#include "MEM_guardedalloc.h" + #include "vbvh.h" #include "svbvh.h" #include "reorganize.h" diff --git a/source/blender/render/intern/raytrace/reorganize.h b/source/blender/render/intern/raytrace/reorganize.h index 34bbb0b6b84..f4cd3a4330d 100644 --- a/source/blender/render/intern/raytrace/reorganize.h +++ b/source/blender/render/intern/raytrace/reorganize.h @@ -269,7 +269,7 @@ void pushdown(Node *parent) /* * BVH refit - * reajust nodes BB (useful if nodes childs where modified) + * readjust nodes BB (useful if nodes childs where modified) */ template<class Node> float bvh_refit(Node *node) @@ -295,7 +295,7 @@ float bvh_refit(Node *node) /* - * this finds the best way to packing a tree acording to a given test cost function + * this finds the best way to packing a tree according to a given test cost function * with the purpose to reduce the expected cost (eg.: number of BB tests). */ #include <vector> diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index a87518bd668..7c7f48e9fb1 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -356,17 +356,6 @@ static void split_v_renderfaces(ObjectRen *obr, int startvlak, int startvert, in } /* ------------------------------------------------------------------------- */ - -static int check_vnormal(float *n, float *veno) -{ - float inp; - - inp=n[0]*veno[0]+n[1]*veno[1]+n[2]*veno[2]; - if(inp < -FLT_EPSILON10) return 1; - return 0; -} - -/* ------------------------------------------------------------------------- */ /* Stress, tangents and normals */ /* ------------------------------------------------------------------------- */ @@ -536,9 +525,6 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d float n1[3], n2[3], n3[3], n4[3]; float fac1, fac2, fac3, fac4=0.0f; - if(re->flag & R_GLOB_NOPUNOFLIP) - vlr->flag |= R_NOPUNOFLIP; - sub_v3_v3v3(n1, v2->co, v1->co); normalize_v3(n1); sub_v3_v3v3(n2, v3->co, v2->co); @@ -562,21 +548,11 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d fac3= saacos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2]); fac4= saacos(-n3[0]*n4[0]-n3[1]*n4[1]-n3[2]*n4[2]); - if(!(vlr->flag & R_NOPUNOFLIP)) { - if( check_vnormal(vlr->n, v4->n) ) fac4= -fac4; - } - v4->n[0] +=fac4*vlr->n[0]; v4->n[1] +=fac4*vlr->n[1]; v4->n[2] +=fac4*vlr->n[2]; } - if(!(vlr->flag & R_NOPUNOFLIP)) { - if( check_vnormal(vlr->n, v1->n) ) fac1= -fac1; - if( check_vnormal(vlr->n, v2->n) ) fac2= -fac2; - if( check_vnormal(vlr->n, v3->n) ) fac3= -fac3; - } - v1->n[0] +=fac1*vlr->n[0]; v1->n[1] +=fac1*vlr->n[1]; v1->n[2] +=fac1*vlr->n[2]; @@ -1021,7 +997,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par else width= 1.0f; if(ma->mode & MA_TANGENT_STR) - flag= R_SMOOTH|R_NOPUNOFLIP|R_TANGENT; + flag= R_SMOOTH|R_TANGENT; else flag= R_SMOOTH; @@ -1550,9 +1526,12 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if(part->phystype==PART_PHYS_KEYED) psys_count_keyed_targets(&sim); - psys_update_children(&sim); totchild=psys->totchild; + /* can happen for disconnected/global hair */ + if(part->type==PART_HAIR && !psys->childcache) + totchild= 0; + if(G.rendering == 0) { /* preview render */ totchild = (int)((float)totchild * (float)part->disp / 100.0f); } @@ -1655,9 +1634,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem transpose_m3(nmat); /* 2.6 setup strand rendering */ - if(part->ren_as == PART_DRAW_PATH && psys->pathcache==NULL) - psys_update_path_cache(&sim, cfra); - if(part->ren_as == PART_DRAW_PATH && psys->pathcache){ path_nbr=(int)pow(2.0,(double) part->ren_step); @@ -2435,7 +2411,7 @@ static void init_render_mball(Render *re, ObjectRen *obr) normal_tri_v3( vlr->n,vlr->v3->co, vlr->v2->co, vlr->v1->co); vlr->mat= ma; - vlr->flag= ME_SMOOTH+R_NOPUNOFLIP; + vlr->flag= ME_SMOOTH; vlr->ec= 0; /* mball -too bad- always has triangles, because quads can be non-planar */ @@ -2464,10 +2440,8 @@ static void init_render_mball(Render *re, ObjectRen *obr) /* returns amount of vertices added for orco */ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, float *orco, float mat[4][4]) { - Object *ob= obr->ob; VertRen *v1, *v2, *v3, *v4, *ver; VlakRen *vlr, *vlr1, *vlr2, *vlr3; - Curve *cu= ob->data; float *data, n1[3]; int u, v, orcoret= 0; int p1, p2, p3, p4, a; @@ -2547,9 +2521,6 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, vlr->mat= matar[ dl->col]; vlr->ec= ME_V1V2+ME_V2V3; vlr->flag= dl->rt; - if( (cu->flag & CU_NOPUNOFLIP) ) { - vlr->flag |= R_NOPUNOFLIP; - } add_v3_v3(v1->n, n1); add_v3_v3(v2->n, n1); @@ -2698,9 +2669,6 @@ static void init_render_dm(DerivedMesh *dm, Render *re, ObjectRen *obr, vlr->mat= ma; vlr->flag= flag; - if(cu &&(cu->flag & ME_NOPUNOFLIP)) { - vlr->flag |= R_NOPUNOFLIP; - } vlr->ec= 0; /* mesh edges rendered separately */ if(len==0) obr->totvlak--; @@ -2852,7 +2820,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) } while(dl) { - if(dl->type==DL_INDEX3) { + if(dl->col > ob->totcol) { + /* pass */ + } + else if(dl->type==DL_INDEX3) { int *index; startvert= obr->totvert; @@ -2905,9 +2876,6 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) vlr->mat= matar[ dl->col ]; vlr->flag= 0; - if( (cu->flag & CU_NOPUNOFLIP) ) { - vlr->flag |= R_NOPUNOFLIP; - } vlr->ec= 0; } } @@ -3392,9 +3360,6 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) vlr->mat= ma; vlr->flag= flag; - if((me->flag & ME_NOPUNOFLIP) ) { - vlr->flag |= R_NOPUNOFLIP; - } vlr->ec= 0; /* mesh edges rendered separately */ if(len==0) obr->totvlak--; @@ -3894,12 +3859,12 @@ static void set_material_lightgroups(Render *re) if(re->scene->r.scemode & R_PREVIEWBUTS) return; - for(group= G.main->group.first; group; group=group->id.next) + for(group= re->main->group.first; group; group=group->id.next) group->id.flag |= LIB_DOIT; /* it's a bit too many loops in loops... but will survive */ /* hola! materials not in use...? */ - for(ma= G.main->mat.first; ma; ma=ma->id.next) { + for(ma= re->main->mat.first; ma; ma=ma->id.next) { if(ma->group && (ma->group->id.flag & LIB_DOIT)) add_lightgroup(re, ma->group, ma->mode & MA_GROUP_NOLAY); } @@ -4581,8 +4546,8 @@ void RE_Database_Free(Render *re) #if 0 /* radio can be redone better */ end_radio_render(); #endif - end_render_materials(); - end_render_textures(); + end_render_materials(re->main); + end_render_textures(re); free_pointdensities(re); @@ -4907,7 +4872,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp /* objects in groups with OB_RENDER_DUPLI set still need to be created, * since they may not be part of the scene */ - for(group= G.main->group.first; group; group=group->id.next) + for(group= re->main->group.first; group; group=group->id.next) add_group_render_dupli_obs(re, group, nolamps, onlyselected, actob, timeoffset, renderlay, 0); /* imat objects has to be done again, since groups can mess it up */ @@ -4924,13 +4889,14 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp } /* used to be 'rotate scene' */ -void RE_Database_FromScene(Render *re, Scene *scene, unsigned int lay, int use_camera_view) +void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int lay, int use_camera_view) { extern int slurph_opt; /* key.c */ Scene *sce; float mat[4][4]; float amb[3]; + re->main= bmain; re->scene= scene; re->lay= lay; @@ -4955,7 +4921,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, unsigned int lay, int use_c /* applies changes fully */ if((re->r.scemode & R_PREVIEWBUTS)==0) - scene_update_for_newframe(re->scene, lay); + scene_update_for_newframe(re->main, re->scene, lay); /* if no camera, viewmat should have been set! */ if(use_camera_view && re->scene->camera) { @@ -4982,7 +4948,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, unsigned int lay, int use_c /* still bad... doing all */ init_render_textures(re); VECCOPY(amb, &re->wrld.ambr); - init_render_materials(re->r.mode, amb); + init_render_materials(re->main, re->r.mode, amb); set_node_shader_lamp_loop(shade_material_loop); /* MAKE RENDER DATA */ @@ -5109,7 +5075,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la /* applies changes fully */ scene->r.cfra += timeoffset; - scene_update_for_newframe(re->scene, lay); + scene_update_for_newframe(re->main, re->scene, lay); /* if no camera, viewmat should have been set! */ if(re->scene->camera) { @@ -5468,7 +5434,7 @@ static void free_dbase_object_vectors(ListBase *lb) BLI_freelistN(lb); } -void RE_Database_FromScene_Vectors(Render *re, Scene *sce, unsigned int lay) +void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned int lay) { ObjectInstanceRen *obi, *oldobi; StrandSurface *mesh; @@ -5510,7 +5476,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce, unsigned int lay) re->strandsurface= strandsurface; if(!re->test_break(re->tbh)) - RE_Database_FromScene(re, sce, lay, 1); + RE_Database_FromScene(re, bmain, sce, lay, 1); if(!re->test_break(re->tbh)) { for(step= 0; step<2; step++) { @@ -5599,12 +5565,13 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce, unsigned int lay) RE_BAKE_DISPLACEMENT:for baking, no lamps, only selected objects RE_BAKE_SHADOW: for baking, only shadows, but all objects */ -void RE_Database_Baking(Render *re, Scene *scene, unsigned int lay, int type, Object *actob) +void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, int type, Object *actob) { float mat[4][4]; float amb[3]; int onlyselected, nolamps; + re->main= bmain; re->scene= scene; re->lay= lay; @@ -5613,7 +5580,6 @@ void RE_Database_Baking(Render *re, Scene *scene, unsigned int lay, int type, Ob RE_init_threadcount(re); - re->flag |= R_GLOB_NOPUNOFLIP; re->flag |= R_BAKING; re->excludeob= actob; if(actob) @@ -5666,7 +5632,7 @@ void RE_Database_Baking(Render *re, Scene *scene, unsigned int lay, int type, Ob init_render_textures(re); VECCOPY(amb, &re->wrld.ambr); - init_render_materials(re->r.mode, amb); + init_render_materials(re->main, re->r.mode, amb); set_node_shader_lamp_loop(shade_material_loop); diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 1accb0fdb60..8977bc7f379 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -46,7 +46,6 @@ #include "BKE_library.h" #include "BKE_main.h" -#include "BKE_global.h" #include "BKE_image.h" // BKE_write_ibuf #include "BKE_texture.h" #include "BKE_utildefines.h" @@ -508,7 +507,7 @@ void make_envmaps(Render *re) /* 5 = hardcoded max recursion level */ while(depth<5) { - tex= G.main->tex.first; + tex= re->main->tex.first; while(tex) { if(tex->id.us && tex->type==TEX_ENVMAP) { if(tex->env && tex->env->object) { diff --git a/source/blender/render/intern/source/gammaCorrectionTables.c b/source/blender/render/intern/source/gammaCorrectionTables.c index d88638f423c..818c3c72118 100644 --- a/source/blender/render/intern/source/gammaCorrectionTables.c +++ b/source/blender/render/intern/source/gammaCorrectionTables.c @@ -117,7 +117,7 @@ void makeGammaTables(float gamma) /* The end of the table should match 1.0 carefully. In order to avoid */ /* rounding errors, we just set this explicitly. The last segment may */ - /* have a different lenght than the other segments, but our */ + /* have a different length than the other segments, but our */ /* interpolation is insensitive to that. */ color_domain_table[RE_GAMMA_TABLE_SIZE] = 1.0; gamma_range_table[RE_GAMMA_TABLE_SIZE] = 1.0; diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c index ff718359a3e..fb69519236a 100644 --- a/source/blender/render/intern/source/occlusion.c +++ b/source/blender/render/intern/source/occlusion.c @@ -1390,8 +1390,7 @@ static void sample_occ_tree(Render *re, OcclusionTree *tree, OccFace *exclude, f if(onlyshadow) envcolor= WO_AOPLAIN; - VECCOPY(nn, n); - negate_v3(nn); + negate_v3_v3(nn, n); occ_lookup(tree, thread, exclude, co, nn, &occ, (tree->doindirect)? rad: NULL, (env && envcolor)? bn: NULL); diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index fd91bf8a2c2..502bd09c2de 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -39,6 +39,8 @@ #include "DNA_sequence_types.h" #include "DNA_userdef_types.h" +#include "MEM_guardedalloc.h" + #include "BKE_utildefines.h" #include "BKE_global.h" #include "BKE_image.h" @@ -52,8 +54,6 @@ #include "BKE_pointcache.h" #include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */ -#include "MEM_guardedalloc.h" - #include "BLI_math.h" #include "BLI_blenlib.h" #include "BLI_rand.h" @@ -1768,9 +1768,9 @@ static void do_render_3d(Render *re) /* make render verts/faces/halos/lamps */ if(render_scene_needs_vector(re)) - RE_Database_FromScene_Vectors(re, re->scene, re->lay); + RE_Database_FromScene_Vectors(re, re->main, re->scene, re->lay); else - RE_Database_FromScene(re, re->scene, re->lay, 1); + RE_Database_FromScene(re, re->main, re->scene, re->lay, 1); threaded_tile_processor(re); @@ -2142,11 +2142,12 @@ static void render_scene(Render *re, Scene *sce, int cfra) RE_InitState(resc, re, &sce->r, NULL, winx, winy, &re->disprect); /* still unsure entity this... */ + resc->main= re->main; resc->scene= sce; resc->lay= sce->lay; /* ensure scene has depsgraph, base flags etc OK */ - set_scene_bg(sce); + set_scene_bg(re->main, sce); /* copy callbacks */ resc->display_draw= re->display_draw; @@ -2164,7 +2165,7 @@ static void tag_scenes_for_render(Render *re) bNode *node; Scene *sce; - for(sce= G.main->scene.first; sce; sce= sce->id.next) + for(sce= re->main->scene.first; sce; sce= sce->id.next) sce->id.flag &= ~LIB_DOIT; re->scene->id.flag |= LIB_DOIT; @@ -2319,7 +2320,7 @@ void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree) /* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */ /* tag scenes unread */ - for(scene= G.main->scene.first; scene; scene= scene->id.next) + for(scene= re->main->scene.first; scene; scene= scene->id.next) scene->id.flag |= LIB_DOIT; for(node= ntree->nodes.first; node; node= node->next) { @@ -2394,7 +2395,7 @@ static void do_render_composite_fields_blur_3d(Render *re) R.stats_draw= re->stats_draw; if (update_newframe) - scene_update_for_newframe(re->scene, re->lay); + scene_update_for_newframe(re->main, re->scene, re->lay); if(re->r.scemode & R_FULL_SAMPLE) do_merge_fullsample(re, ntree); @@ -2453,14 +2454,16 @@ static void do_render_seq(Render * re) RenderResult *rr = re->result; int cfra = re->r.cfra; + re->i.cfra= cfra; + if(recurs_depth==0) { /* otherwise sequencer animation isnt updated */ - BKE_animsys_evaluate_all_animation(G.main, (float)cfra); // XXX, was BKE_curframe(re->scene) + BKE_animsys_evaluate_all_animation(re->main, (float)cfra); // XXX, was BKE_curframe(re->scene) } recurs_depth++; - ibuf= give_ibuf_seq(re->scene, rr->rectx, rr->recty, cfra, 0, 100.0); + ibuf= give_ibuf_seq(re->main, re->scene, rr->rectx, rr->recty, cfra, 0, 100.0); recurs_depth--; @@ -2508,9 +2511,10 @@ static void do_render_seq(Render * re) if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */ Editing * ed = re->scene->ed; if (ed) { - free_imbuf_seq(re->scene, &ed->seqbase, TRUE); + free_imbuf_seq(re->scene, &ed->seqbase, TRUE, TRUE); } } + IMB_freeImBuf(ibuf); } else { /* render result is delivered empty in most cases, nevertheless we handle all cases */ @@ -2676,6 +2680,7 @@ static void update_physics_cache(Render *re, Scene *scene, int anim_init) { PTCacheBaker baker; + baker.main = re->main; baker.scene = scene; baker.pid = NULL; baker.bake = 0; @@ -2689,7 +2694,7 @@ static void update_physics_cache(Render *re, Scene *scene, int anim_init) BKE_ptcache_make_cache(&baker); } /* evaluating scene options for general Blender render */ -static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int anim, int anim_init) +static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int anim, int anim_init) { int winx, winy; rcti disprect; @@ -2715,6 +2720,7 @@ static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLay disprect.ymax= winy; } + re->main= bmain; re->scene= scene; re->lay= lay; @@ -2757,14 +2763,14 @@ static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLay } /* general Blender frame render call */ -void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame) +void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame) { /* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */ G.rendering= 1; scene->r.cfra= frame; - if(render_initialize_from_scene(re, scene, srl, lay, 0, 0)) { + if(render_initialize_from_main(re, bmain, scene, srl, lay, 0, 0)) { MEM_reset_peak_memory(); do_render_all_options(re); } @@ -2860,14 +2866,14 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R } /* saves images to disk */ -void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int efra, int tfra, ReportList *reports) +void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int sfra, int efra, int tfra, ReportList *reports) { bMovieHandle *mh= BKE_get_movie_handle(scene->r.imtype); int cfrao= scene->r.cfra; int nfra; /* do not fully call for each frame, it initializes & pops output window */ - if(!render_initialize_from_scene(re, scene, NULL, lay, 0, 1)) + if(!render_initialize_from_main(re, bmain, scene, NULL, lay, 0, 1)) return; /* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */ @@ -2900,7 +2906,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int ef char name[FILE_MAX]; /* only border now, todo: camera lens. (ton) */ - render_initialize_from_scene(re, scene, NULL, lay, 1, 0); + render_initialize_from_main(re, bmain, scene, NULL, lay, 1, 0); if(nfra!=scene->r.cfra) { /* @@ -2915,7 +2921,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int ef else updatelay= re->lay; - scene_update_for_newframe(scene, updatelay); + scene_update_for_newframe(bmain, scene, updatelay); continue; } else @@ -2971,7 +2977,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, unsigned int lay, int sfra, int ef G.rendering= 0; } -void RE_PreviewRender(Render *re, Scene *sce) +void RE_PreviewRender(Render *re, Main *bmain, Scene *sce) { int winx, winy; @@ -2980,6 +2986,7 @@ void RE_PreviewRender(Render *re, Scene *sce) RE_InitState(re, NULL, &sce->r, NULL, winx, winy, NULL); + re->main = bmain; re->scene = sce; re->lay = sce->lay; diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index 4f23df3c18c..67f1fee4f41 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -226,6 +226,9 @@ static void pointdensity_cache_object(Render *re, PointDensity *pd, Object *ob) static void cache_pointdensity(Render *re, Tex *tex) { PointDensity *pd = tex->pd; + + if(!pd) + return; if (pd->point_tree) { BLI_bvhtree_free(pd->point_tree); @@ -279,7 +282,7 @@ void make_pointdensities(Render *re) re->i.infostr= "Caching Point Densities"; re->stats_draw(re->sdh, &re->i); - for (tex= G.main->tex.first; tex; tex= tex->id.next) { + for (tex= re->main->tex.first; tex; tex= tex->id.next) { if(tex->id.us && tex->type==TEX_POINTDENSITY) { cache_pointdensity(re, tex); } @@ -296,7 +299,7 @@ void free_pointdensities(Render *re) if(re->scene->r.scemode & R_PREVIEWBUTS) return; - for (tex= G.main->tex.first; tex; tex= tex->id.next) { + for (tex= re->main->tex.first; tex; tex= tex->id.next) { if(tex->id.us && tex->type==TEX_POINTDENSITY) { free_pointdensity(re, tex); } diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index ed52f37fcfa..724fd9a3110 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -531,10 +531,6 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr) shade_input_set_normals(shi); - /* point normals to viewing direction */ - if(INPR(shi->facenor, shi->view) < 0.0f) - shade_input_flip_normals(shi); - shade_input_set_shade_texco(shi); if (shi->mat->material_type == MA_TYPE_VOLUME) { if(ELEM(is->mode, RE_RAY_SHADOW, RE_RAY_SHADOW_TRA)) { @@ -558,19 +554,9 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr) shi->mat= vlr->mat; /* shi->mat is being set in nodetree */ } else { - int tempdepth; - /* XXX dodgy business here, set ray depth to -1 - * to ignore raytrace in shade_material_loop() - * this could really use a refactor --Matt */ - if (shi->volume_depth == 0) { - tempdepth = shi->depth; - shi->depth = -1; - shade_material_loop(shi, shr); - shi->depth = tempdepth; - } else { - shade_material_loop(shi, shr); - } + shade_material_loop(shi, shr); } + /* raytrace likes to separate the spec color */ VECSUB(shr->diff, shr->combined, shr->spec); } diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c index 2bfc8f6c1ef..ce55935d392 100644 --- a/source/blender/render/intern/source/renderdatabase.c +++ b/source/blender/render/intern/source/renderdatabase.c @@ -440,10 +440,9 @@ VlakRen *RE_vlakren_copy(ObjectRen *obr, VlakRen *vlr) return vlr1; } -int RE_vlakren_get_normal(Render *re, ObjectInstanceRen *obi, VlakRen *vlr, float *nor) +void RE_vlakren_get_normal(Render *re, ObjectInstanceRen *obi, VlakRen *vlr, float *nor) { - float v1[3], (*nmat)[3]= obi->nmat; - int flipped= 0; + float (*nmat)[3]= obi->nmat; if(obi->flag & R_TRANSFORMED) { VECCOPY(nor, vlr->n); @@ -453,29 +452,6 @@ int RE_vlakren_get_normal(Render *re, ObjectInstanceRen *obi, VlakRen *vlr, floa } else VECCOPY(nor, vlr->n); - - if((vlr->flag & R_NOPUNOFLIP)==0) { - if(re->r.mode & R_ORTHO) { - if(nor[2] > 0.0f) - flipped= 1; - } - else { - VECCOPY(v1, vlr->v1->co); - if(obi->flag & R_TRANSFORMED) - mul_m4_v3(obi->mat, v1); - if(INPR(v1, nor) < 0.0f) { - flipped= 1; - } - } - - if(flipped) { - nor[0]= -nor[0]; - nor[1]= -nor[1]; - nor[2]= -nor[2]; - } - } - - return flipped; } void RE_set_customdata_names(ObjectRen *obr, CustomData *data) diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 5938e2ce2e0..56ab56d0411 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -130,7 +130,7 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr) } /* depth >= 1 when ray-shading */ - if(shi->depth==0) { + if(shi->depth==0 || shi->volume_depth > 0) { if(R.r.mode & R_RAYTRACE) { if(shi->ray_mirror!=0.0f || ((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) { /* ray trace works on combined, but gives pass info */ @@ -142,11 +142,6 @@ 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); - } } @@ -168,8 +163,12 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr) shade_input_init_material(shi); if (shi->mat->material_type == MA_TYPE_VOLUME) { - if(R.r.mode & R_RAYTRACE) - shade_volume_outside(shi, shr); + if(R.r.mode & R_RAYTRACE) { + if (R.render_volumes_inside.first) + shade_volume_inside(shi, shr); + else + shade_volume_outside(shi, shr); + } } else { /* MA_TYPE_SURFACE, MA_TYPE_WIRE */ shade_material_loop(shi, shr); } @@ -274,7 +273,8 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen shi->mode= shi->mat->mode_l; /* or-ed result for all nodes */ /* facenormal copy, can get flipped */ - shi->flippednor= RE_vlakren_get_normal(&R, obi, vlr, shi->facenor); + shi->flippednor= 0; + RE_vlakren_get_normal(&R, obi, vlr, shi->facenor); /* calculate vertexnormals */ if(vlr->flag & R_SMOOTH) { @@ -287,24 +287,6 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen mul_m3_v3(obi->nmat, shi->n2); mul_m3_v3(obi->nmat, shi->n3); } - - if(!(vlr->flag & (R_NOPUNOFLIP|R_TANGENT))) { - if(INPR(shi->facenor, shi->n1) < 0.0f) { - shi->n1[0]= -shi->n1[0]; - shi->n1[1]= -shi->n1[1]; - shi->n1[2]= -shi->n1[2]; - } - if(INPR(shi->facenor, shi->n2) < 0.0f) { - shi->n2[0]= -shi->n2[0]; - shi->n2[1]= -shi->n2[1]; - shi->n2[2]= -shi->n2[2]; - } - if(INPR(shi->facenor, shi->n3) < 0.0f) { - shi->n3[0]= -shi->n3[0]; - shi->n3[1]= -shi->n3[1]; - shi->n3[2]= -shi->n3[2]; - } - } } } @@ -827,6 +809,10 @@ void shade_input_set_normals(ShadeInput *shi) /* used in nodes */ VECCOPY(shi->vno, shi->vn); + /* flip normals to viewing direction */ + if(!(shi->vlr->flag & R_TANGENT)) + if(dot_v3v3(shi->facenor, shi->view) < 0.0f) + shade_input_flip_normals(shi); } /* use by raytrace, sss, bake to flip into the right direction */ diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 033a753bd62..245364b3bed 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -1625,7 +1625,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) 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))) { /* AO was calculated for scanline already */ - if(shi->depth) + if(shi->depth || shi->volume_depth) ambient_occlusion(shi); VECCOPY(shr->ao, shi->ao); VECCOPY(shr->env, shi->env); // XXX multiply diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c index aa285401524..e8c95a34ac4 100644 --- a/source/blender/render/intern/source/sss.c +++ b/source/blender/render/intern/source/sss.c @@ -56,7 +56,6 @@ #include "DNA_material_types.h" #include "BKE_colortools.h" -#include "BKE_global.h" #include "BKE_main.h" #include "BKE_material.h" #include "BKE_node.h" @@ -993,7 +992,7 @@ void make_sss_tree(Render *re) re->i.infostr= "SSS preprocessing"; re->stats_draw(re->sdh, &re->i); - for(mat= G.main->mat.first; mat; mat= mat->id.next) + 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)) sss_create_tree_mat(re, mat); } diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index e982c1a12a7..0e98069f884 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -131,7 +131,7 @@ void init_render_textures(Render *re) { Tex *tex; - tex= G.main->tex.first; + tex= re->main->tex.first; while(tex) { if(tex->id.us) init_render_texture(re, tex); tex= tex->id.next; @@ -144,10 +144,10 @@ void end_render_texture(Tex *tex) ntreeEndExecTree(tex->nodetree); } -void end_render_textures(void) +void end_render_textures(Render *re) { Tex *tex; - for(tex= G.main->tex.first; tex; tex= tex->id.next) + for(tex= re->main->tex.first; tex; tex= tex->id.next) if(tex->id.us) end_render_texture(tex); } @@ -1731,7 +1731,7 @@ void do_material_tex(ShadeInput *shi) co= shi->tang; dx= shi->dxno; dy= shi->dyno; } else if(mtex->texco==TEXCO_GLOB) { - co= shi->gl; dx= shi->dxco; dy= shi->dyco; + co= shi->gl; dx= shi->dxgl; dy= shi->dygl; } else if(mtex->texco==TEXCO_UV) { if(mtex->texflag & MTEX_DUPLI_MAPTO) { @@ -1762,7 +1762,7 @@ void do_material_tex(ShadeInput *shi) // NOTE: test for shi->obr->ob here, since vlr/obr/obi can be 'fake' when called from fastshade(), another reason to move it.. // NOTE: shi->v1 is NULL when called from displace_render_vert, assigning verts in this case is not trivial because the shi quad face side is not know. if ((mtex->texflag & MTEX_NEW_BUMP) && shi->obr && shi->obr->ob && shi->v1) { - if(mtex->mapto & (MAP_NORM|MAP_DISPLACE|MAP_WARP) && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) { + if(mtex->mapto & (MAP_NORM|MAP_WARP) && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) { MTFace* tf = RE_vlakren_get_tface(shi->obr, shi->vlr, i, NULL, 0); int j1 = shi->i1, j2 = shi->i2, j3 = shi->i3; @@ -1833,7 +1833,7 @@ void do_material_tex(ShadeInput *shi) else continue; // can happen when texco defines disappear and it renders old files /* the pointer defines if bumping happens */ - if(mtex->mapto & (MAP_NORM|MAP_DISPLACE|MAP_WARP)) { + if(mtex->mapto & (MAP_NORM|MAP_WARP)) { texres.nor= norvec; norvec[0]= norvec[1]= norvec[2]= 0.0; } @@ -2219,8 +2219,7 @@ void do_material_tex(ShadeInput *shi) } if(rgbnor & TEX_RGB) { - if(texres.talpha) texres.tin= texres.ta; - else texres.tin= (0.35f*texres.tr+0.45f*texres.tg+0.2f*texres.tb); + texres.tin= (0.35f*texres.tr+0.45f*texres.tg+0.2f*texres.tb); } factt= (0.5f-texres.tin)*mtex->dispfac*stencilTin; facmm= 1.0f-factt; @@ -2510,6 +2509,7 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf) 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 */ @@ -2882,6 +2882,9 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef if(la->type==LA_SPOT) { tempvec[0]*= la->spottexfac; tempvec[1]*= la->spottexfac; + /* project from 3d to 2d */ + tempvec[0] /= -tempvec[2]; + tempvec[1] /= -tempvec[2]; } co= tempvec; diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c index 0af05c3cdee..d3e8f4058c5 100644 --- a/source/blender/render/intern/source/volume_precache.c +++ b/source/blender/render/intern/source/volume_precache.c @@ -115,6 +115,47 @@ int point_inside_obi(RayObject *tree, ObjectInstanceRen *obi, float *co) else return 1; } +/* find the bounding box of an objectinstance in global space */ +void global_bounds_obi(Render *re, ObjectInstanceRen *obi, float *bbmin, float *bbmax) +{ + ObjectRen *obr = obi->obr; + VolumePrecache *vp = obi->volume_precache; + VertRen *ver= NULL; + float co[3]; + int a; + + if (vp->bbmin != NULL && vp->bbmax != NULL) { + copy_v3_v3(bbmin, vp->bbmin); + copy_v3_v3(bbmax, vp->bbmax); + return; + } + + vp->bbmin = MEM_callocN(sizeof(float)*3, "volume precache min boundbox corner"); + vp->bbmax = MEM_callocN(sizeof(float)*3, "volume precache max boundbox corner"); + + INIT_MINMAX(bbmin, bbmax); + + for(a=0; a<obr->totvert; a++) { + if((a & 255)==0) ver= obr->vertnodes[a>>8].vert; + else ver++; + + copy_v3_v3(co, ver->co); + + /* transformed object instance in camera space */ + if(obi->flag & R_TRANSFORMED) + mul_m4_v3(obi->mat, co); + + /* convert to global space */ + mul_m4_v3(re->viewinv, co); + + DO_MINMAX(co, vp->bbmin, vp->bbmax); + } + + copy_v3_v3(bbmin, vp->bbmin); + copy_v3_v3(bbmax, vp->bbmax); + +} + /* *** light cache filtering *** */ static float get_avg_surrounds(float *cache, int *res, int xx, int yy, int zz) @@ -443,7 +484,7 @@ static void *vol_precache_part(void *data) RayObject *tree = pa->tree; ShadeInput *shi = pa->shi; float scatter_col[3] = {0.f, 0.f, 0.f}; - float co[3]; + float co[3], cco[3]; int x, y, z, i; const int res[3]= {pa->res[0], pa->res[1], pa->res[2]}; @@ -455,24 +496,29 @@ static void *vol_precache_part(void *data) for (x=pa->minx; x < pa->maxx; x++) { co[0] = pa->bbmin[0] + (pa->voxel[0] * (x + 0.5f)); - + + /* convert from world->camera space for shading */ + mul_v3_m4v3(cco, pa->viewmat, co); + i= V_I(x, y, z, res); // don't bother if the point is not inside the volume mesh - if (!point_inside_obi(tree, obi, co)) { + if (!point_inside_obi(tree, obi, cco)) { obi->volume_precache->data_r[i] = -1.0f; obi->volume_precache->data_g[i] = -1.0f; obi->volume_precache->data_b[i] = -1.0f; continue; } - copy_v3_v3(shi->view, co); + /* this view coordinate is very wrong! */ + copy_v3_v3(shi->view, cco); normalize_v3(shi->view); - vol_get_scattering(shi, scatter_col, co); + vol_get_scattering(shi, scatter_col, cco); 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]; + } } } @@ -503,7 +549,7 @@ static void precache_init_parts(Render *re, RayObject *tree, ShadeInput *shi, Ob int i=0, x, y, z; float voxel[3]; int sizex, sizey, sizez; - float *bbmin=obi->obr->boundbox[0], *bbmax=obi->obr->boundbox[1]; + float bbmin[3], bbmax[3]; int *res; int minx, maxx; int miny, maxy; @@ -517,11 +563,13 @@ static void precache_init_parts(Render *re, RayObject *tree, ShadeInput *shi, Ob parts[0] = parts[1] = parts[2] = totthread; res = vp->res; + /* using boundbox in worldspace */ + global_bounds_obi(re, obi, bbmin, bbmax); sub_v3_v3v3(voxel, bbmax, bbmin); - voxel[0] /= res[0]; - voxel[1] /= res[1]; - voxel[2] /= res[2]; + voxel[0] /= (float)res[0]; + voxel[1] /= (float)res[1]; + voxel[2] /= (float)res[2]; for (x=0; x < parts[0]; x++) { sizex = ceil(res[0] / (float)parts[0]); @@ -550,8 +598,10 @@ static void precache_init_parts(Render *re, RayObject *tree, ShadeInput *shi, Ob pa->tree = tree; pa->shi = shi; pa->obi = obi; - VECCOPY(pa->bbmin, bbmin); - VECCOPY(pa->voxel, voxel); + copy_m4_m4(pa->viewmat, re->viewmat); + + copy_v3_v3(pa->bbmin, bbmin); + copy_v3_v3(pa->voxel, voxel); VECCOPY(pa->res, res); pa->minx = minx; pa->maxx = maxx; @@ -582,10 +632,14 @@ static VolPrecachePart *precache_get_new_part(Render *re) return nextpa; } -static int precache_resolution(VolumePrecache *vp, float *bbmin, float *bbmax, int res) +/* calculate resolution from bounding box in world space */ +static int precache_resolution(Render *re, VolumePrecache *vp, ObjectInstanceRen *obi, int res) { 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 = MAX3(dim[0], dim[1], dim[2]); @@ -593,9 +647,9 @@ static int precache_resolution(VolumePrecache *vp, float *bbmin, float *bbmax, i dim[1] /= div; dim[2] /= div; - vp->res[0] = dim[0] * (float)res; - vp->res[1] = dim[1] * (float)res; - vp->res[2] = dim[2] * (float)res; + 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; @@ -615,7 +669,6 @@ void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *obi, Mat RayObject *tree; ShadeInput shi; ListBase threads; - float *bbmin=obi->obr->boundbox[0], *bbmax=obi->obr->boundbox[1]; int parts[3] = {1, 1, 1}, totparts; int caching=1, counter=0; @@ -627,15 +680,13 @@ void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *obi, Mat /* create a raytree with just the faces of the instanced ObjectRen, * used for checking if the cached point is inside or outside. */ - //tree = create_raytree_obi(obi, bbmin, bbmax); tree = makeraytree_object(&R, obi); if (!tree) return; - INIT_MINMAX(bbmin, bbmax); - RE_rayobject_merge_bb( tree, bbmin, bbmax); vp = MEM_callocN(sizeof(VolumePrecache), "volume light cache"); + obi->volume_precache = vp; - if (!precache_resolution(vp, bbmin, bbmax, ma->vol.precache_resolution)) { + if (!precache_resolution(re, vp, obi, ma->vol.precache_resolution)) { MEM_freeN(vp); vp = NULL; return; @@ -649,7 +700,6 @@ void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *obi, Mat vp = NULL; return; } - obi->volume_precache = vp; /* Need a shadeinput to calculate scattering */ precache_setup_shadeinput(re, obi, ma, &shi); @@ -749,6 +799,8 @@ void free_volume_precache(Render *re) MEM_freeN(obi->volume_precache->data_r); MEM_freeN(obi->volume_precache->data_g); MEM_freeN(obi->volume_precache->data_b); + MEM_freeN(obi->volume_precache->bbmin); + MEM_freeN(obi->volume_precache->bbmax); MEM_freeN(obi->volume_precache); obi->volume_precache = NULL; } diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c index c74bb9d4a55..a58d96736d5 100644 --- a/source/blender/render/intern/source/volumetric.c +++ b/source/blender/render/intern/source/volumetric.c @@ -193,7 +193,7 @@ static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *co isect.labda = FLT_MAX; isect.mode= RE_RAY_MIRROR; - isect.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK; + isect.skip = RE_SKIP_VLR_NEIGHBOUR; isect.orig.ob = (void*) shi->obi; isect.orig.face = (void*)vlr; isect.last_hit = NULL; @@ -205,27 +205,28 @@ static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *co } else { shadeSkyView(col, co, shi->view, NULL, shi->thread); shadeSunView(col, shi->view); - } + } } /* trilinear interpolation */ -static void vol_get_precached_scattering(ShadeInput *shi, float *scatter_col, float *co) +static void vol_get_precached_scattering(Render *re, ShadeInput *shi, float *scatter_col, float *co) { VolumePrecache *vp = shi->obi->volume_precache; float bbmin[3], bbmax[3], dim[3]; - float sample_co[3]; + float world_co[3], sample_co[3]; if (!vp) return; - /* convert input coords to 0.0, 1.0 */ - VECCOPY(bbmin, shi->obi->obr->boundbox[0]); - VECCOPY(bbmax, shi->obi->obr->boundbox[1]); + /* 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); + mul_v3_m4v3(world_co, re->viewinv, co); - sample_co[0] = ((co[0] - bbmin[0]) / dim[0]); - sample_co[1] = ((co[1] - bbmin[1]) / dim[1]); - sample_co[2] = ((co[2] - bbmin[2]) / dim[2]); + /* sample_co in 0.0-1.0 */ + sample_co[0] = (world_co[0] - bbmin[0]) / dim[0]; + sample_co[1] = (world_co[1] - bbmin[1]) / dim[1]; + sample_co[2] = (world_co[2] - bbmin[2]) / dim[2]; scatter_col[0] = voxel_sample_triquadratic(vp->data_r, vp->res, sample_co); scatter_col[1] = voxel_sample_triquadratic(vp->data_g, vp->res, sample_co); @@ -445,7 +446,7 @@ static void vol_get_transmittance(ShadeInput *shi, float *tr, float *co, float * const float stepd = (t0 - pt0) * d; float sigma_t[3]; - vol_get_sigma_t(shi, sigma_t, co); + vol_get_sigma_t(shi, sigma_t, p); tau[0] += stepd * sigma_t[0]; tau[1] += stepd * sigma_t[1]; @@ -602,13 +603,16 @@ static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float const float density = vol_get_density(shi, p); if (density > 0.01f) { - float scatter_col[3], emit_col[3]; + 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 (luminance(tr) < shi->mat->vol.depth_cutoff) break; + if (t0 > t1 * 0.25) { + /* only use depth cutoff after we've traced a little way into the volume */ + if (luminance(tr) < shi->mat->vol.depth_cutoff) break; + } vol_get_emission(shi, emit_col, p); @@ -619,7 +623,7 @@ static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float p2[1] = p[1] + (step_vec[1] * 0.5); p2[2] = p[2] + (step_vec[2] * 0.5); - vol_get_precached_scattering(shi, scatter_col, p2); + vol_get_precached_scattering(&R, shi, scatter_col, p2); } else vol_get_scattering(shi, scatter_col, p); @@ -782,10 +786,7 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr) MatInside *m; Material *mat_backup; ObjectInstanceRen *obi_backup; - float prev_alpha = shr->alpha; - - //if (BLI_countlist(&R.render_volumes_inside) == 0) return; - + /* XXX: extend to multiple volumes perhaps later */ mat_backup = shi->mat; obi_backup = shi->obi; @@ -795,10 +796,10 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr) shi->obi = m->obi; shi->obr = m->obi->obr; - volume_trace(shi, shr, VOL_SHADE_INSIDE); - shr->alpha += prev_alpha; - CLAMP(shr->alpha, 0.f, 1.f); + memset(shr, 0, sizeof(ShadeResult)); + volume_trace(shi, shr, VOL_SHADE_INSIDE); + shi->mat = mat_backup; shi->obi = obi_backup; shi->obr = obi_backup->obr; diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c index 64ba206bb86..076d6355585 100644 --- a/source/blender/render/intern/source/voxeldata.c +++ b/source/blender/render/intern/source/voxeldata.c @@ -39,7 +39,6 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "BKE_global.h" #include "BKE_image.h" #include "BKE_main.h" #include "BKE_modifier.h" @@ -318,7 +317,7 @@ void make_voxeldata(struct Render *re) re->stats_draw(re->sdh, &re->i); /* XXX: should be doing only textures used in this render */ - for (tex= G.main->tex.first; tex; tex= tex->id.next) { + for (tex= re->main->tex.first; tex; tex= tex->id.next) { if(tex->id.us && tex->type==TEX_VOXELDATA) { cache_voxeldata(re, tex); } |