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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/CMakeLists.txt9
-rw-r--r--source/blender/render/Makefile2
-rw-r--r--source/blender/render/SConscript33
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h13
-rw-r--r--source/blender/render/intern/Makefile2
-rw-r--r--source/blender/render/intern/include/render_types.h22
-rw-r--r--source/blender/render/intern/include/renderdatabase.h5
-rw-r--r--source/blender/render/intern/include/texture.h2
-rw-r--r--source/blender/render/intern/include/volume_precache.h6
-rw-r--r--source/blender/render/intern/raytrace/Makefile4
-rw-r--r--source/blender/render/intern/raytrace/bvh.h1
-rw-r--r--source/blender/render/intern/raytrace/rayobject_qbvh.cpp1
-rw-r--r--source/blender/render/intern/raytrace/rayobject_svbvh.cpp2
-rw-r--r--source/blender/render/intern/raytrace/reorganize.h4
-rw-r--r--source/blender/render/intern/source/convertblender.c84
-rw-r--r--source/blender/render/intern/source/envmap.c3
-rw-r--r--source/blender/render/intern/source/gammaCorrectionTables.c2
-rw-r--r--source/blender/render/intern/source/occlusion.c3
-rw-r--r--source/blender/render/intern/source/pipeline.c45
-rw-r--r--source/blender/render/intern/source/pointdensity.c7
-rw-r--r--source/blender/render/intern/source/rayshade.c18
-rw-r--r--source/blender/render/intern/source/renderdatabase.c28
-rw-r--r--source/blender/render/intern/source/shadeinput.c40
-rw-r--r--source/blender/render/intern/source/shadeoutput.c2
-rw-r--r--source/blender/render/intern/source/sss.c3
-rw-r--r--source/blender/render/intern/source/texture.c19
-rw-r--r--source/blender/render/intern/source/volume_precache.c94
-rw-r--r--source/blender/render/intern/source/volumetric.c43
-rw-r--r--source/blender/render/intern/source/voxeldata.c3
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);
}